Add a new sandbox.css stylesheet defining absolute-positioned star elements with a twinkle keyframe animation, and a sandbox.html template that generates 200 randomized stars (position, size, animation duration/delay) via JavaScript. Include both files in app.html via link and include directive.
Refactor the chat input area in web.html to use the new ChatInputElement custom component instead of inline HTML. Move autocomplete handler from a function-based getInputField() to directly attaching to the chat-input element's autoCompletions property. Remove the legacy initInputField function and its associated keydown/input event listeners, consolidating all input behavior into the component. Add the chat-input.js module script to app.html to ensure the custom element is registered globally.
Implement MessageList custom element with real-time message text updates and typing glow animation, add UserList component with relative time formatting, introduce LoadBalancer class for backend process management, create DatasetWebSocketView for key-value sync over WebSocket, override save method in ChannelMessageService to render HTML templates, and return channel_message object from ChatService instead of boolean.
- Register RepositoryView and DriveView routes for repository and drive browsing
- Add `is_available` boolean field to DriveItemModel with default True
- Implement `get_by_username` method in UserService for username-based queries
- Comment out repository deletion logic in GitApplication
- Include file-manager.js script and Font Awesome CDN stylesheet in app template
- Fix repository URL paths in settings template to use correct attribute access
- Refactor DriveView with full directory listing and file serving capabilities
- Pass user object to repositories index template for template rendering
Introduce an authentication middleware that attaches the user object to requests based on session data, register the UserPropertyMapper and UserPropertyModel in the service layer, replace the monolithic SettingsView with dedicated SettingsIndexView and SettingsProfileView, update the settings template to remove inline Monaco editor, delete the old sidebar_settings partial, and wire the settings gear icon in the app navigation to /settings/index.html.
- Added `width:100%` to anchor element in base.css to ensure full-width layout
- Removed `float:right` from nav element in app.html to prevent layout overflow issues
Create a new polyfill script at src/snek/static/polyfills/Promise.withResolvers.js that provides a fallback implementation of Promise.withResolvers for environments lacking native support. Include the polyfill as a module script in both app.html and base.html templates, ensuring it is loaded before app.js to guarantee availability at runtime.
The polyfill provides a static method on Promise that returns an object with resolve and reject functions exposed, enabling external resolution of a promise. It is loaded as a module script in both app.html and base.html to ensure compatibility before app.js runs.
- Split header padding into individual properties (top, left, right) in base.css
- Reduce logo font size from 1.5em to 1.2em in base.css
- Hide static "Snek" logo div with inline display:none in app.html
- Add new logo div with block header_text template block in app.html
- Move chat header h2 from web.html into the new header_text block in app.html
Inject the umami analytics script with website ID d127c3e4-dc70-4041-a1c8-bcc32c2492ea into app.html, base.html, and index.html templates for visitor tracking
Convert all JavaScript classes in app.js and schedule.js from implicit globals to ES module exports, add import statements in template scripts for the app instance, and mark all script tags with type="module" to enable module scoping. Also fix a potential null reference in web.html by using optional chaining on lastMessage.scrollIntoView and hoist the lastMessage variable to outer scope for proper closure behavior.
- Add unique index on username column in user table and composite indexes on channel_member and channel_message tables during app initialization
- Introduce .container CSS class with flex layout, padding, and nested styling for links and lists in base.css
- Change PWA manifest scope from /web.html to / to cover entire app
- Remove commented-out YouTube embed code from template.py and add .jpg to supported image extensions
- Rename "Chat Rooms" heading to "Channels" in app.html template
- Restructure search_user.html template with proper indentation and container class for form and results
- Strip sensitive fields (email, password, message, html) from RPC query results before returning them
- Extend manifest.json with id, orientation, scope, theme/background colors, related_applications, screenshots, dir, lang, launch_path, display_override, and short_name for full PWA compliance
- Move manifest link element to head section and add missing rel attribute
- Comment out push.js script tag to disable legacy push functionality
- Refactor beforeinstallprompt handler: remove preventDefault call, show install button immediately on event, and clean up nested DOMContentLoaded listener
- Add get_other_dm_user method to ChannelMemberService to retrieve the other participant in a DM channel
- Update WebView to display DM partner's nickname instead of channel label in sidebar
- Change sidebar links to use channel uid and name from the new channel list structure
- Fix message offset query to silently handle errors instead of crashing
- Replace scroll-to-bottom with scrollIntoView on last message for smoother UX
- Increase initial layout update delay from 200ms to 1000ms for better timing
Implement `ChannelService.get_for_user` to fetch non-banned, non-deleted channels for a given user by iterating through channel memberships. Replace hardcoded sidebar links in `app.html` with Jinja2 template loop rendering channels from the context, enabling dynamic display of user-accessible chat rooms.
Add `color` field to message template context in ChannelMessageService. Implement `to_extended_dict` method to return full message data including user color and username. Add `offset` method for paginated message queries with descending order by creation time. Fix WebSocket event emission in app.js to use correct event name. Add `timeDescription` and `timeAgo` utility functions for client-side timestamp formatting. Enable scrollable chat messages container with overflow-y auto. Add CSS rules for message content block display and responsive image sizing. Fix scrollIntoView behavior to align to block end. Correct service worker registration path. Fix upload button to use local channelUid attribute. Strip trailing dots from link hrefs and exclude trailing dots from URL regex. Remove redundant script imports from app.html template. Uncomment message HTML template structure with proper time element. Replace chat-window element with server-rendered message list in web.html template. Refactor RPC get_messages to use new offset-based query with extended message dict.
Add a reusable `.no-select` CSS class with cross-browser user-select: none properties
and apply it to navigation links, sidebar headings, chat room links, and avatar
elements in the message list to improve UI consistency and prevent accidental
text selection during interaction.
- Replace generic-form with custom form containing text input and fancy-button
- Add CSS for anchor links, chat-area list items, and text input styling
- Update search_user view to handle query parameter and render user results
- Register fancy-button and generic-form scripts in app.html template
- Modify fancy-button to support form submission via 'submit' url attribute
Add SearchUserView with HTML and JSON endpoints, create search-user.html template extending app.html with navigation link, implement push.js for service worker registration and push subscription handling, add service-worker.js for push event display and notification click handling, and fix install prompt event listener registration in app.html
Create the main application template for the Snek chat interface, including header navigation with home, install, users, settings, and logout links, a sidebar listing chat rooms (General, Development, Support, Random), and a chat-window component in the main content area. Include script references for push, upload-button, html-frame, schedule, app, models, message-list, message-list-manager, chat-input, and chat-window modules, along with base.css stylesheet and manifest.json for PWA support. Add a beforeinstallprompt event listener that stores the install prompt event and displays an alert for triggering the PWA installation flow.