Changes to gothicqueue.scroll.pub

root
root
25 days ago
Initial commit
body.html
Changed around line 1
+
+

GothicQueue

+
+
+
+
+
+

Create New Playlist

+
+
+
+
+
+
+
+
+

Your Playlists

+
+
+
+
+
+
+
+
+
+
index.scroll
Changed around line 1
+ buildHtml
+ baseUrl https://gothicqueue.scroll.pub
+ metaTags
+ description "A gothic-themed YouTube playlist organizer with tree structure visualization"
+ keywords "youtube playlists, gothic, video tracker, dark aesthetics"
+ editButton /edit.html
+ title GothicQueue - Dark Playlist Organizer
+ style.css
+ body.html
+ script.js
prompt.json
Changed around line 1
+ {
+ "id": "msg_01TSE8urWhvC1y2yhphbM88q",
+ "type": "message",
+ "role": "assistant",
+ "model": "claude-3-5-sonnet-20241022",
+ "content": [
+ {
+ "type": "text",
+ "text": "I'll help create a gothic video playlist tracker website. For the domain, I suggest:\n\ngothicqueue.scroll.pub\n\nThis combines \"gothic\" with \"queue\" (for playlist), is memorable, and represents the site's purpose.\n\n---domain---\ngothicqueue.scroll.pub\n---index.scroll---\nbuildHtml\nbaseUrl https://gothicqueue.scroll.pub\nmetaTags\n description \"A gothic-themed YouTube playlist organizer with tree structure visualization\"\n keywords \"youtube playlists, gothic, video tracker, dark aesthetics\"\neditButton /edit.html\ntitle GothicQueue - Dark Playlist Organizer\nstyle.css\nbody.html\nscript.js\n---body.html---\n
\n

GothicQueue

\n \n
\n\n
\n
\n

Create New Playlist

\n
\n \n \n \n
\n
\n\n
\n

Your Playlists

\n
\n \n
\n
\n
\n\n\n---style.css---\n:root {\n --primary-color: #800020;\n --secondary-color: #2a0a0a;\n --accent-color: #c41e3a;\n --text-color: #d3d3d3;\n --background: #1a1a1a;\n}\n\n* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n background-color: var(--background);\n color: var(--text-color);\n font-family: \"Gothic\", \"Crimson Text\", serif;\n line-height: 1.6;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n}\n\nheader {\n background: linear-gradient(to bottom, var(--secondary-color), var(--background));\n padding: 2rem;\n text-align: center;\n border-bottom: 2px solid var(--accent-color);\n box-shadow: 0 0 20px rgba(196, 30, 58, 0.3);\n}\n\nh1 {\n font-size: 3rem;\n color: var(--accent-color);\n text-transform: uppercase;\n letter-spacing: 0.5rem;\n margin-bottom: 1rem;\n text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);\n}\n\n.auth-btn, .gothic-btn {\n background-color: var(--primary-color);\n color: var(--text-color);\n border: 1px solid var(--accent-color);\n padding: 0.8rem 1.5rem;\n cursor: pointer;\n transition: all 0.3s ease;\n font-family: inherit;\n text-transform: uppercase;\n}\n\n.auth-btn:hover, .gothic-btn:hover {\n background-color: var(--accent-color);\n transform: scale(1.05);\n box-shadow: 0 0 15px rgba(196, 30, 58, 0.5);\n}\n\nmain {\n flex: 1;\n padding: 2rem;\n max-width: 1200px;\n margin: 0 auto;\n width: 100%;\n}\n\n.playlist-creator {\n background: rgba(42, 10, 10, 0.5);\n padding: 2rem;\n border-radius: 5px;\n margin-bottom: 2rem;\n border: 1px solid var(--primary-color);\n}\n\nform {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\ninput {\n background: rgba(26, 26, 26, 0.8);\n border: 1px solid var(--primary-color);\n padding: 0.8rem;\n color: var(--text-color);\n font-family: inherit;\n}\n\n.tree-structure {\n position: relative;\n padding: 1rem;\n}\n\n.tree-structure::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--accent-color);\n}\n\nfooter {\n background: var(--secondary-color);\n padding: 1rem;\n text-align: center;\n margin-top: auto;\n}\n\nfooter nav a {\n color: var(--text-color);\n text-decoration: none;\n margin: 0 1rem;\n transition: color 0.3s ease;\n}\n\nfooter nav a:hover {\n color: var(--accent-color);\n}\n\n@media (max-width: 768px) {\n header {\n padding: 1rem;\n }\n \n h1 {\n font-size: 2rem;\n }\n \n main {\n padding: 1rem;\n }\n \n form {\n gap: 0.5rem;\n }\n}\n---script.js---\ndocument.addEventListener('DOMContentLoaded', () => {\n const authButton = document.getElementById('authButton');\n const playlistForm = document.getElementById('playlistForm');\n const playlistContainer = document.getElementById('playlistContainer');\n \n let isAuthenticated = false;\n let playlists = [];\n\n // Simulated authentication\n authButton.addEventListener('click', () => {\n if (!isAuthenticated) {\n authButton.textContent = 'Sign Out';\n isAuthenticated = true;\n // Would implement actual Google OAuth here\n } else {\n authButton.textContent = 'Sign in with Google';\n isAuthenticated = false;\n clearPlaylists();\n }\n });\n\n playlistForm.addEventListener('submit', (e) => {\n e.preventDefault();\n if (!isAuthenticated) {\n alert('Please sign in first');\n return;\n }\n\n const title = document.getElementById('playlistTitle').value;\n const videoUrl = document.getElementById('videoUrl').value;\n \n if (videoUrl && !isValidYouTubeUrl(videoUrl)) {\n alert('Please enter a valid YouTube URL');\n return;\n }\n\n addPlaylist(title, videoUrl);\n playlistForm.reset();\n });\n\n function isValidYouTubeUrl(url) {\n const pattern = /^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/;\n return pattern.test(url);\n }\n\n function addPlaylist(title, videoUrl) {\n const playlist = {\n id: Date.now(),\n title,\n videos: videoUrl ? [{url: videoUrl, completed: false}] : [],\n expanded: false\n };\n\n playlists.push(playlist);\n renderPlaylists();\n }\n\n function renderPlaylists() {\n playlistContainer.innerHTML = '';\n playlists.forEach(playlist => {\n const playlistElement = createPlaylistElement(playlist);\n playlistContainer.appendChild(playlistElement);\n });\n }\n\n function createPlaylistElement(playlist) {\n const div = document.createElement('div');\n div.className = 'playlist-item';\n div.innerHTML = `\n

${playlist.title}

\n \n `;\n\n if (playlist.expanded) {\n const videoList = document.createElement('ul');\n playlist.videos.forEach(video => {\n const li = document.createElement('li');\n li.innerHTML = `\n \n \n ${video.url}\n \n `;\n videoList.appendChild(li);\n });\n div.appendChild(videoList);\n }\n\n div.querySelector('.toggle-btn').addEventListener('click', () => {\n playlist.expanded = !playlist.expanded;\n renderPlaylists();\n });\n\n return div;\n }\n\n function clearPlaylists() {\n playlists = [];\n renderPlaylists();\n }\n});\n---end---\n\nThis implementation features:\n- Gothic color scheme with deep reds and blacks\n- Smooth animations and transitions\n- Tree-like structure for playlists\n- Responsive design\n- Form validation\n- YouTube URL validation\n- Expandable/collapsible playlists\n- Checkbox tracking for completed videos\n- Clean, semantic HTML\n- Accessibility considerations\n- Modern CSS features like custom properties\n- Error handling\n\nNote that the Google authentication would need to be implemented using the actual Google OAuth API in a production environment. This is a frontend-only implementation that demonstrates the UI/UX and structure."
+ }
+ ],
+ "stop_reason": "end_turn",
+ "stop_sequence": null,
+ "usage": {
+ "input_tokens": 327,
+ "cache_creation_input_tokens": 0,
+ "cache_read_input_tokens": 0,
+ "output_tokens": 2409
+ }
+ }
readme.scroll
Changed around line 1
+ # gothicqueue.scroll.pub
+ Website generated by Claude from prompt: a very aesthetic gothic looking website. where youtube links can be posted along with title in a tree like structure ,which then displays all the videos in the playlist in the order and keeps track of all the videos being completed in the youtube playlist ( via syncing youtube account gmail with it )
script.js
Changed around line 1
+ document.addEventListener('DOMContentLoaded', () => {
+ const authButton = document.getElementById('authButton');
+ const playlistForm = document.getElementById('playlistForm');
+ const playlistContainer = document.getElementById('playlistContainer');
+
+ let isAuthenticated = false;
+ let playlists = [];
+
+ // Simulated authentication
+ authButton.addEventListener('click', () => {
+ if (!isAuthenticated) {
+ authButton.textContent = 'Sign Out';
+ isAuthenticated = true;
+ // Would implement actual Google OAuth here
+ } else {
+ authButton.textContent = 'Sign in with Google';
+ isAuthenticated = false;
+ clearPlaylists();
+ }
+ });
+
+ playlistForm.addEventListener('submit', (e) => {
+ e.preventDefault();
+ if (!isAuthenticated) {
+ alert('Please sign in first');
+ return;
+ }
+
+ const title = document.getElementById('playlistTitle').value;
+ const videoUrl = document.getElementById('videoUrl').value;
+
+ if (videoUrl && !isValidYouTubeUrl(videoUrl)) {
+ alert('Please enter a valid YouTube URL');
+ return;
+ }
+
+ addPlaylist(title, videoUrl);
+ playlistForm.reset();
+ });
+
+ function isValidYouTubeUrl(url) {
+ const pattern = /^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/;
+ return pattern.test(url);
+ }
+
+ function addPlaylist(title, videoUrl) {
+ const playlist = {
+ id: Date.now(),
+ title,
+ videos: videoUrl ? [{url: videoUrl, completed: false}] : [],
+ expanded: false
+ };
+
+ playlists.push(playlist);
+ renderPlaylists();
+ }
+
+ function renderPlaylists() {
+ playlistContainer.innerHTML = '';
+ playlists.forEach(playlist => {
+ const playlistElement = createPlaylistElement(playlist);
+ playlistContainer.appendChild(playlistElement);
+ });
+ }
+
+ function createPlaylistElement(playlist) {
+ const div = document.createElement('div');
+ div.className = 'playlist-item';
+ div.innerHTML = `
+

${playlist.title}

+
+ ${playlist.expanded ? 'Collapse' : 'Expand'}
+
+ `;
+
+ if (playlist.expanded) {
+ const videoList = document.createElement('ul');
+ playlist.videos.forEach(video => {
+ const li = document.createElement('li');
+ li.innerHTML = `
+
+ ${video.completed ? 'checked' : ''}>
+
+ `;
+ videoList.appendChild(li);
+ });
+ div.appendChild(videoList);
+ }
+
+ div.querySelector('.toggle-btn').addEventListener('click', () => {
+ playlist.expanded = !playlist.expanded;
+ renderPlaylists();
+ });
+
+ return div;
+ }
+
+ function clearPlaylists() {
+ playlists = [];
+ renderPlaylists();
+ }
+ });
style.css
Changed around line 1
+ :root {
+ --primary-color: #800020;
+ --secondary-color: #2a0a0a;
+ --accent-color: #c41e3a;
+ --text-color: #d3d3d3;
+ --background: #1a1a1a;
+ }
+
+ * {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+ body {
+ background-color: var(--background);
+ color: var(--text-color);
+ font-family: "Gothic", "Crimson Text", serif;
+ line-height: 1.6;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ }
+
+ header {
+ background: linear-gradient(to bottom, var(--secondary-color), var(--background));
+ padding: 2rem;
+ text-align: center;
+ border-bottom: 2px solid var(--accent-color);
+ box-shadow: 0 0 20px rgba(196, 30, 58, 0.3);
+ }
+
+ h1 {
+ font-size: 3rem;
+ color: var(--accent-color);
+ text-transform: uppercase;
+ letter-spacing: 0.5rem;
+ margin-bottom: 1rem;
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
+ }
+
+ .auth-btn, .gothic-btn {
+ background-color: var(--primary-color);
+ color: var(--text-color);
+ border: 1px solid var(--accent-color);
+ padding: 0.8rem 1.5rem;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-family: inherit;
+ text-transform: uppercase;
+ }
+
+ .auth-btn:hover, .gothic-btn:hover {
+ background-color: var(--accent-color);
+ transform: scale(1.05);
+ box-shadow: 0 0 15px rgba(196, 30, 58, 0.5);
+ }
+
+ main {
+ flex: 1;
+ padding: 2rem;
+ max-width: 1200px;
+ margin: 0 auto;
+ width: 100%;
+ }
+
+ .playlist-creator {
+ background: rgba(42, 10, 10, 0.5);
+ padding: 2rem;
+ border-radius: 5px;
+ margin-bottom: 2rem;
+ border: 1px solid var(--primary-color);
+ }
+
+ form {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ input {
+ background: rgba(26, 26, 26, 0.8);
+ border: 1px solid var(--primary-color);
+ padding: 0.8rem;
+ color: var(--text-color);
+ font-family: inherit;
+ }
+
+ .tree-structure {
+ position: relative;
+ padding: 1rem;
+ }
+
+ .tree-structure::before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: 2px;
+ background: var(--accent-color);
+ }
+
+ footer {
+ background: var(--secondary-color);
+ padding: 1rem;
+ text-align: center;
+ margin-top: auto;
+ }
+
+ footer nav a {
+ color: var(--text-color);
+ text-decoration: none;
+ margin: 0 1rem;
+ transition: color 0.3s ease;
+ }
+
+ footer nav a:hover {
+ color: var(--accent-color);
+ }
+
+ @media (max-width: 768px) {
+ header {
+ padding: 1rem;
+ }
+
+ h1 {
+ font-size: 2rem;
+ }
+
+ main {
+ padding: 1rem;
+ }
+
+ form {
+ gap: 0.5rem;
+ }
+ }