mrdreamers commited on
Commit
ec4fcc3
·
verified ·
1 Parent(s): b8f2aa0

implement all myspace functions the same way it was in 2003 when it was introduced

Browse files
Files changed (5) hide show
  1. components/comments-section.js +114 -0
  2. components/profile-editor.js +168 -0
  3. index.html +30 -3
  4. script.js +10 -1
  5. style.css +22 -2
components/comments-section.js ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomCommentsSection extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ .comments-section {
7
+ background: rgba(0,0,0,0.7);
8
+ padding: 20px;
9
+ border-radius: 10px;
10
+ margin-top: 20px;
11
+ }
12
+ .comments-header {
13
+ font-size: 1.2rem;
14
+ margin-bottom: 15px;
15
+ padding-bottom: 5px;
16
+ border-bottom: 1px solid #3b5998;
17
+ }
18
+ .comment-form textarea {
19
+ width: 100%;
20
+ padding: 10px;
21
+ margin-bottom: 10px;
22
+ border-radius: 5px;
23
+ border: 1px solid #ccc;
24
+ background: rgba(255,255,255,0.9);
25
+ }
26
+ .comment-form button {
27
+ background: #3b5998;
28
+ color: white;
29
+ border: none;
30
+ padding: 8px 15px;
31
+ border-radius: 5px;
32
+ cursor: pointer;
33
+ }
34
+ .comments-list {
35
+ margin-top: 20px;
36
+ }
37
+ .comment {
38
+ display: flex;
39
+ margin-bottom: 15px;
40
+ padding-bottom: 15px;
41
+ border-bottom: 1px solid rgba(255,255,255,0.1);
42
+ }
43
+ .comment-avatar {
44
+ width: 40px;
45
+ height: 40px;
46
+ border-radius: 50%;
47
+ margin-right: 10px;
48
+ }
49
+ .comment-content {
50
+ flex: 1;
51
+ }
52
+ .comment-author {
53
+ font-weight: bold;
54
+ margin-bottom: 5px;
55
+ }
56
+ .comment-date {
57
+ font-size: 0.8rem;
58
+ color: #aaa;
59
+ margin-bottom: 5px;
60
+ }
61
+ .comment-text {
62
+ line-height: 1.4;
63
+ }
64
+ </style>
65
+ <div class="comments-section">
66
+ <div class="comments-header">Comments</div>
67
+
68
+ <div class="comment-form">
69
+ <textarea placeholder="Write a comment..." rows="3"></textarea>
70
+ <button>Post Comment</button>
71
+ </div>
72
+
73
+ <div class="comments-list">
74
+ <div class="comment">
75
+ <img src="http://static.photos/people/200x200/2" class="comment-avatar">
76
+ <div class="comment-content">
77
+ <div class="comment-author">Tom Anderson</div>
78
+ <div class="comment-date">2 days ago</div>
79
+ <div class="comment-text">Welcome to MySpace! This is going to be awesome!</div>
80
+ </div>
81
+ </div>
82
+ <div class="comment">
83
+ <img src="http://static.photos/people/200x200/3" class="comment-avatar">
84
+ <div class="comment-content">
85
+ <div class="comment-author">Chris DeWolfe</div>
86
+ <div class="comment-date">1 day ago</div>
87
+ <div class="comment-text">Great profile! Check out the new features we added!</div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ `;
93
+
94
+ // Comment form submission
95
+ this.shadowRoot.querySelector('.comment-form button').addEventListener('click', () => {
96
+ const text = this.shadowRoot.querySelector('.comment-form textarea').value;
97
+ if (text.trim()) {
98
+ const comment = document.createElement('div');
99
+ comment.className = 'comment';
100
+ comment.innerHTML = `
101
+ <img src="http://static.photos/people/200x200/${Math.floor(Math.random()*10)+1}" class="comment-avatar">
102
+ <div class="comment-content">
103
+ <div class="comment-author">New User</div>
104
+ <div class="comment-date">Just now</div>
105
+ <div class="comment-text">${text}</div>
106
+ </div>
107
+ `;
108
+ this.shadowRoot.querySelector('.comments-list').prepend(comment);
109
+ this.shadowRoot.querySelector('.comment-form textarea').value = '';
110
+ }
111
+ });
112
+ }
113
+ }
114
+ customElements.define('custom-comments-section', CustomCommentsSection);
components/profile-editor.js ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomProfileEditor extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ .editor-container {
7
+ background: rgba(0,0,0,0.7);
8
+ padding: 20px;
9
+ border-radius: 10px;
10
+ color: white;
11
+ margin: 20px 0;
12
+ }
13
+ .editor-tabs {
14
+ display: flex;
15
+ margin-bottom: 15px;
16
+ }
17
+ .tab {
18
+ padding: 10px 20px;
19
+ background: #3b5998;
20
+ cursor: pointer;
21
+ margin-right: 5px;
22
+ border-radius: 5px 5px 0 0;
23
+ }
24
+ .tab.active {
25
+ background: #4a6ea9;
26
+ }
27
+ .editor-content {
28
+ background: rgba(0,0,0,0.5);
29
+ padding: 20px;
30
+ border-radius: 0 5px 5px 5px;
31
+ }
32
+ .form-group {
33
+ margin-bottom: 15px;
34
+ }
35
+ label {
36
+ display: block;
37
+ margin-bottom: 5px;
38
+ }
39
+ input, textarea, select {
40
+ width: 100%;
41
+ padding: 8px;
42
+ border-radius: 4px;
43
+ border: 1px solid #ccc;
44
+ background: rgba(255,255,255,0.9);
45
+ }
46
+ .color-picker {
47
+ display: flex;
48
+ gap: 10px;
49
+ margin-top: 10px;
50
+ }
51
+ .color-option {
52
+ width: 30px;
53
+ height: 30px;
54
+ border-radius: 50%;
55
+ cursor: pointer;
56
+ }
57
+ .save-btn {
58
+ background: #3b5998;
59
+ color: white;
60
+ border: none;
61
+ padding: 10px 20px;
62
+ border-radius: 5px;
63
+ cursor: pointer;
64
+ }
65
+ .save-btn:hover {
66
+ background: #4a6ea9;
67
+ }
68
+ </style>
69
+ <div class="editor-container">
70
+ <div class="editor-tabs">
71
+ <div class="tab active" data-tab="profile">Profile</div>
72
+ <div class="tab" data-tab="background">Background</div>
73
+ <div class="tab" data-tab="colors">Colors</div>
74
+ </div>
75
+ <div class="editor-content">
76
+ <div class="tab-content" id="profile-tab">
77
+ <div class="form-group">
78
+ <label for="profile-name">Display Name</label>
79
+ <input type="text" id="profile-name" value="John Doe">
80
+ </div>
81
+ <div class="form-group">
82
+ <label for="profile-headline">Headline</label>
83
+ <input type="text" id="profile-headline" value="MySpace Enthusiast">
84
+ </div>
85
+ <div class="form-group">
86
+ <label for="profile-bio">About Me</label>
87
+ <textarea id="profile-bio" rows="5">Welcome to my MySpace profile!</textarea>
88
+ </div>
89
+ </div>
90
+ <div class="tab-content" id="background-tab" style="display:none;">
91
+ <div class="form-group">
92
+ <label>Background Image</label>
93
+ <select id="background-select">
94
+ <option value="none">No Background</option>
95
+ <option value="space">Space Theme</option>
96
+ <option value="hearts">Hearts</option>
97
+ <option value="stars">Stars</option>
98
+ <option value="custom">Custom URL</option>
99
+ </select>
100
+ </div>
101
+ <div class="form-group" id="custom-bg-group" style="display:none;">
102
+ <label for="custom-bg-url">Custom Background URL</label>
103
+ <input type="text" id="custom-bg-url" placeholder="https://example.com/image.jpg">
104
+ </div>
105
+ </div>
106
+ <div class="tab-content" id="colors-tab" style="display:none;">
107
+ <div class="form-group">
108
+ <label>Text Color</label>
109
+ <div class="color-picker">
110
+ <div class="color-option" style="background:white;" data-color="white"></div>
111
+ <div class="color-option" style="background:black;" data-color="black"></div>
112
+ <div class="color-option" style="background:#ff0000;" data-color="#ff0000"></div>
113
+ <div class="color-option" style="background:#00ff00;" data-color="#00ff00"></div>
114
+ <div class="color-option" style="background:#0000ff;" data-color="#0000ff"></div>
115
+ </div>
116
+ </div>
117
+ <div class="form-group">
118
+ <label>Link Color</label>
119
+ <div class="color-picker">
120
+ <div class="color-option" style="background:#3b5998;" data-color="#3b5998"></div>
121
+ <div class="color-option" style="background:#ff00ff;" data-color="#ff00ff"></div>
122
+ <div class="color-option" style="background:#00ffff;" data-color="#00ffff"></div>
123
+ <div class="color-option" style="background:#ffff00;" data-color="#ffff00"></div>
124
+ <div class="color-option" style="background:#ff9900;" data-color="#ff9900"></div>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ <button class="save-btn">Save Changes</button>
129
+ </div>
130
+ </div>
131
+ `;
132
+
133
+ // Tab switching
134
+ this.shadowRoot.querySelectorAll('.tab').forEach(tab => {
135
+ tab.addEventListener('click', () => {
136
+ this.shadowRoot.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
137
+ this.shadowRoot.querySelectorAll('.tab-content').forEach(c => c.style.display = 'none');
138
+
139
+ tab.classList.add('active');
140
+ const tabId = tab.getAttribute('data-tab') + '-tab';
141
+ this.shadowRoot.getElementById(tabId).style.display = 'block';
142
+ });
143
+ });
144
+
145
+ // Background select change
146
+ this.shadowRoot.getElementById('background-select').addEventListener('change', (e) => {
147
+ const customGroup = this.shadowRoot.getElementById('custom-bg-group');
148
+ customGroup.style.display = e.target.value === 'custom' ? 'block' : 'none';
149
+ });
150
+
151
+ // Color picker
152
+ this.shadowRoot.querySelectorAll('.color-option').forEach(option => {
153
+ option.addEventListener('click', (e) => {
154
+ const color = e.target.getAttribute('data-color');
155
+ const pickerGroup = e.target.closest('.form-group');
156
+ const label = pickerGroup.querySelector('label').textContent.toLowerCase();
157
+ console.log(`Setting ${label} color to: ${color}`);
158
+ // Would apply this color to the appropriate elements
159
+ });
160
+ });
161
+
162
+ // Save button
163
+ this.shadowRoot.querySelector('.save-btn').addEventListener('click', () => {
164
+ alert('Profile saved! (This is a demo)');
165
+ });
166
+ }
167
+ }
168
+ customElements.define('custom-profile-editor', CustomProfileEditor);
index.html CHANGED
@@ -12,17 +12,21 @@
12
  <script src="components/footer.js"></script>
13
  <script src="components/profile-card.js"></script>
14
  <script src="components/friend-list.js"></script>
 
 
15
  </head>
16
  <body class="bg-gray-100">
17
  <custom-navbar></custom-navbar>
18
 
19
  <div class="container mx-auto px-4 py-8">
20
- <div class="flex flex-col lg:flex-row gap-8">
21
- <!-- Left Sidebar -->
22
  <div class="w-full lg:w-1/4">
23
  <custom-profile-card></custom-profile-card>
24
  <custom-friend-list></custom-friend-list>
25
- </div>
 
 
26
 
27
  <!-- Main Content -->
28
  <div class="w-full lg:w-2/4">
@@ -116,6 +120,29 @@
116
  feather.replace();
117
  </script>
118
  <script src="script.js"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
120
  </body>
121
  </html>
 
12
  <script src="components/footer.js"></script>
13
  <script src="components/profile-card.js"></script>
14
  <script src="components/friend-list.js"></script>
15
+ <script src="components/profile-editor.js"></script>
16
+ <script src="components/comments-section.js"></script>
17
  </head>
18
  <body class="bg-gray-100">
19
  <custom-navbar></custom-navbar>
20
 
21
  <div class="container mx-auto px-4 py-8">
22
+ <div class="flex flex-col lg:flex-row gap-8" id="profile-container">
23
+ <!-- Left Sidebar -->
24
  <div class="w-full lg:w-1/4">
25
  <custom-profile-card></custom-profile-card>
26
  <custom-friend-list></custom-friend-list>
27
+ <custom-profile-editor></custom-profile-editor>
28
+ <custom-comments-section></custom-comments-section>
29
+ </div>
30
 
31
  <!-- Main Content -->
32
  <div class="w-full lg:w-2/4">
 
120
  feather.replace();
121
  </script>
122
  <script src="script.js"></script>
123
+ <script>
124
+ // MySpace 2003-style profile customization
125
+ document.addEventListener('DOMContentLoaded', function() {
126
+ // Apply saved customization if it exists
127
+ if (localStorage.getItem('myspaceProfile')) {
128
+ const profile = JSON.parse(localStorage.getItem('myspaceProfile'));
129
+ applyProfileCustomization(profile);
130
+ }
131
+ });
132
+
133
+ function applyProfileCustomization(profile) {
134
+ const container = document.getElementById('profile-container');
135
+ if (profile.background) {
136
+ container.style.backgroundImage = `url('${profile.background}')`;
137
+ container.style.backgroundSize = 'cover';
138
+ container.style.backgroundAttachment = 'fixed';
139
+ }
140
+ if (profile.textColor) {
141
+ container.style.color = profile.textColor;
142
+ }
143
+ // More customization can be applied here
144
+ }
145
+ </script>
146
  <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
147
  </body>
148
  </html>
script.js CHANGED
@@ -48,9 +48,18 @@ function updateThemeIcon() {
48
  feather.replace();
49
  });
50
  }
 
 
 
 
 
 
 
 
 
51
  // Initialize theme icon on load
52
  document.addEventListener('DOMContentLoaded', function() {
53
- updateThemeIcon();
54
 
55
  // Auto-play music on page load
56
  const audio = document.querySelector('audio');
 
48
  feather.replace();
49
  });
50
  }
51
+ // MySpace 2003-style profile music player
52
+ function playProfileSong(url) {
53
+ const audio = document.createElement('audio');
54
+ audio.src = url;
55
+ audio.autoplay = true;
56
+ audio.volume = 0.5;
57
+ document.body.appendChild(audio);
58
+ }
59
+
60
  // Initialize theme icon on load
61
  document.addEventListener('DOMContentLoaded', function() {
62
+ updateThemeIcon();
63
 
64
  // Auto-play music on page load
65
  const audio = document.querySelector('audio');
style.css CHANGED
@@ -58,8 +58,10 @@ body {
58
  /* Retro mode specific styles */
59
  .retro-mode .profile-card,
60
  .retro-mode .friend-list,
61
- .retro-mode .bg-white {
62
- background-color: rgba(0, 0, 0, 0.7) !important;
 
 
63
  background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBmaWxsPSJyZ2JhKDAsMCwwLDAuNykiPjwvcmVjdD4KPHBhdGggZD0iTTAgNUw1IDBaTTYgNEw0IDZaTS0xIDFMMSAtMVoiIHN0cm9rZT0ibGltZSIgc3Ryb2tlLXdpZHRoPSIxIj48L3BhdGg+Cjwvc3ZnPg==') !important;
64
  border: 2px solid #0f0;
65
  color: #0f0;
@@ -81,6 +83,24 @@ body {
81
  .retro-mode .view-all {
82
  color: #0f0 !important;
83
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  /* Custom profile header */
85
  .profile-header {
86
  background: linear-gradient(to right, #3b5998, #4a6ea9);
 
58
  /* Retro mode specific styles */
59
  .retro-mode .profile-card,
60
  .retro-mode .friend-list,
61
+ .retro-mode .bg-white,
62
+ .retro-mode .editor-container,
63
+ .retro-mode .comments-section {
64
+ background-color: rgba(0, 0, 0, 0.7) !important;
65
  background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBmaWxsPSJyZ2JhKDAsMCwwLDAuNykiPjwvcmVjdD4KPHBhdGggZD0iTTAgNUw1IDBaTTYgNEw0IDZaTS0xIDFMMSAtMVoiIHN0cm9rZT0ibGltZSIgc3Ryb2tlLXdpZHRoPSIxIj48L3BhdGg+Cjwvc3ZnPg==') !important;
66
  border: 2px solid #0f0;
67
  color: #0f0;
 
83
  .retro-mode .view-all {
84
  color: #0f0 !important;
85
  }
86
+ /* MySpace 2003 profile HTML support */
87
+ .profile-html {
88
+ line-height: 1.6;
89
+ }
90
+ .profile-html a {
91
+ color: #3b5998;
92
+ text-decoration: none;
93
+ }
94
+ .profile-html a:hover {
95
+ text-decoration: underline;
96
+ }
97
+ .profile-html img {
98
+ max-width: 100%;
99
+ }
100
+ .profile-html iframe {
101
+ max-width: 100%;
102
+ }
103
+
104
  /* Custom profile header */
105
  .profile-header {
106
  background: linear-gradient(to right, #3b5998, #4a6ea9);