Beta - #1138
Beta#1138
Conversation
alexsparkes
commented
Jan 27, 2026
- remove mui
- overhaul custom
- fix clock
- fix author details
… (#1130) - Add version-bump workflow for semantic versioning across all files - Add beta-release workflow for automated pre-release testing - Add production-release workflow with manual approval gates - Add hotfix-release workflow for emergency patches - Create comprehensive CONTRIBUTING.md with workflow guide - Create detailed RELEASE_PROCESS.md for maintainers - Add PR template with release checklists - Update CODEOWNERS to protect workflow files - Update README with contribution links - Remove /docs from .gitignore to allow documentation This implements a dev beta main branching strategy with: - Automated version management across 6 files - Changelog generation from conventional commits - GitHub Releases with build artifacts - Environment-based approvals for production - Back-merge support for hotfixes
* feat: add professional three-branch release workflow automation (#1129) - Add version-bump workflow for semantic versioning across all files - Add beta-release workflow for automated pre-release testing - Add production-release workflow with manual approval gates - Add hotfix-release workflow for emergency patches - Create comprehensive CONTRIBUTING.md with workflow guide - Create detailed RELEASE_PROCESS.md for maintainers - Add PR template with release checklists - Update CODEOWNERS to protect workflow files - Update README with contribution links - Remove /docs from .gitignore to allow documentation This implements a dev beta main branching strategy with: - Automated version management across 6 files - Changelog generation from conventional commits - GitHub Releases with build artifacts - Environment-based approvals for production - Back-merge support for hotfixes * fix(workflows): prevent beta release for non-beta versions * Fix/beta workflow version check (#1131) * fix(workflows): prevent beta release for non-beta versions * fix(workflows): address copilot PR review feedback - Support iterative beta versions (7.6.0-beta.1 -> 7.6.0-beta.2) - Remove tag trigger from beta workflow to prevent premature releases - Fix tag format in docs/summaries to include 'v' prefix - Clarify deployment approval wording --------- Signed-off-by: Alex Sparkes <alexsparkes@gmail.com>
… Checkbox, Dropdown, Radio, Slider, and Text
…location reset functionality
…z-index adjustments
Signed-off-by: Alex Sparkes <alexsparkes@gmail.com>
* feat: add professional three-branch release workflow automation (#1129) - Add version-bump workflow for semantic versioning across all files - Add beta-release workflow for automated pre-release testing - Add production-release workflow with manual approval gates - Add hotfix-release workflow for emergency patches - Create comprehensive CONTRIBUTING.md with workflow guide - Create detailed RELEASE_PROCESS.md for maintainers - Add PR template with release checklists - Update CODEOWNERS to protect workflow files - Update README with contribution links - Remove /docs from .gitignore to allow documentation This implements a dev beta main branching strategy with: - Automated version management across 6 files - Changelog generation from conventional commits - GitHub Releases with build artifacts - Environment-based approvals for production - Back-merge support for hotfixes * feat: new default quotes experience, improve added page * Fix/beta workflow version check (#1131) * fix(workflows): prevent beta release for non-beta versions * fix(workflows): address copilot PR review feedback - Support iterative beta versions (7.6.0-beta.1 -> 7.6.0-beta.2) - Remove tag trigger from beta workflow to prevent premature releases - Fix tag format in docs/summaries to include 'v' prefix - Clarify deployment approval wording * feat: replace mui with new style * feat: improve time formatting in Clock component with padded digits * fix: change Checkbox component from label to div for better semantics * fix: change Switch component from label to div for better semantics * feat: add smooth animation to reset functionality in Slider component * feat: enhance accessibility and styling for form components including Checkbox, Dropdown, Radio, Slider, and Text * feat: enhance WeatherOptions component with improved layout and auto location reset functionality * feat: update Slider and Dropdown components with improved layout and z-index adjustments * feat: add reset functionality to Dropdown component with toast notification * feat: update Dropdown component styles for improved layout and structure * feat: update languageSettings component with increased padding for better spacing * feat: bump version to 7.6.0 across all manifests and documentation --------- Signed-off-by: Alex Sparkes <alexsparkes@gmail.com> Co-authored-by: David Ralph <me@davidcralph.co.uk>
- Added new localization strings for image management, including upload and storage information. - Refactored custom background database functions to support metadata and backward compatibility. - Introduced a new FolderTaggingModal component for organizing images into folders. - Created utility functions for image metadata extraction, including dimensions, blur hash generation, and file size calculation. - Implemented functions to delete multiple backgrounds and update background metadata.
…ions - Updated localization files for multiple languages (Hungarian, Indonesian, Japanese, Lithuanian, Latvian, Dutch, Norwegian, Persian, Portuguese, Brazilian Portuguese, Russian, Slovenian, Swedish, Tamil, Turkish, Ukrainian, Vietnamese, Simplified Chinese, Traditional Chinese) to include new strings for image management features such as "Delete Selected", "Uploading", "Tag Images", and storage information. - Enhanced the `getDataUrlSize` and `formatBytes` functions in `imageMetadata.js` for better readability and maintainability by adding braces for conditional statements.
Signed-off-by: Alex Sparkes <alexsparkes@gmail.com>
There was a problem hiding this comment.
Pull request overview
This pull request implements a "Beta" release (v7.6.0) that removes Material-UI dependencies and overhauls the custom background system, along with fixes for the clock and quote author details.
Changes:
- Complete removal of MUI (@mui/material, @emotion/react, @emotion/styled) and replacement with custom form components (Checkbox, Radio, Slider, Switch, Dropdown, Textarea, SearchInput, ChipSelect)
- Enhanced custom background system with metadata support (blur hash, dimensions, file size, folders, upload dates)
- Fixed clock time formatting to properly handle locale-specific numerals with padding
- Migrated quote system from API to quote_pack as default, with improved author image handling
- Version bump from 7.5.0 to 7.6.0 across all manifests and configuration files
- Font family change from Montserrat to Inter throughout the application
- Toast notification styling overhaul with glassmorphism effects
- Added default quote pack auto-installation on first run
- Updated marketplace item display and uninstall functionality
- Extensive localization updates (though many new strings remain untranslated)
Reviewed changes
Copilot reviewed 101 out of 103 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| package.json | Removed MUI dependencies, added Inter font and blurhash library, version bump to 7.6.0 |
| src/components/Form/Settings/* | Complete reimplementation of form components without MUI |
| src/utils/customBackgroundDB.js | Enhanced with metadata support for backgrounds |
| src/utils/imageMetadata.js | New utility for image dimension extraction, blur hash generation, and storage calculation |
| src/features/time/Clock.jsx | Fixed time formatting to properly handle locale-specific numeral padding |
| src/features/quote/hooks/useQuoteLoader.js | Removed API quote source, added noAuthorImg support, improved author image handling |
| src/features/misc/modals/Modals.jsx | Added default pack installation logic |
| src/scss/* | Updated styles for Inter font, toast notifications, custom backgrounds |
| src/i18n/locales/* | Added new translation keys (many untranslated) |
| manifest/* | Version bumps across all browser manifests |
| if (typeof item.url === 'string' && !item.name) { | ||
| // Old format - migrate to new format | ||
| return { | ||
| id: item.id, | ||
| url: item.url, | ||
| name: `Image ${item.id}`, | ||
| uploadDate: item.createdAt || Date.now(), | ||
| dimensions: null, | ||
| fileSize: null, | ||
| folder: '', | ||
| blurHash: null, | ||
| }; |
There was a problem hiding this comment.
The migration logic from old format to new format in getAllBackgroundsWithMetadata uses item.createdAt for the uploadDate field if available, but the schema uses different field names (createdAt vs uploadDate). This could lead to inconsistency. Recommend standardizing on a single field name throughout the codebase.
| export function calculateStorageSize() { | ||
| // This is now just an estimate - actual storage is in IndexedDB | ||
| // We'll calculate it properly from the actual background data | ||
| return 0; // Will be calculated from actual backgrounds in the component | ||
| } |
There was a problem hiding this comment.
The calculateStorageSize function returns 0 with a comment saying "Will be calculated from actual backgrounds in the component", but this creates a misleading API. Consider removing this function entirely or renaming it to indicate it's deprecated/unused, or implement the actual calculation here.
| // Fallback to localStorage URLs if IndexedDB is empty | ||
| if (!backgrounds || backgrounds.length === 0) { | ||
| backgrounds = parseJSON('customBackground', []); | ||
| const urls = parseJSON('customBackground', []); | ||
| if (urls && urls.length > 0) { | ||
| // Convert old URL format to metadata format | ||
| backgrounds = urls.map((url) => ({ url, photoInfo: { hidden: true } })); | ||
| } | ||
| } |
There was a problem hiding this comment.
The background fallback logic in getCustomBackground converts localStorage URLs to the new metadata format on-the-fly, but doesn't persist this migration. This means the conversion happens every time the background loads. Consider adding a one-time migration that updates localStorage to IndexedDB when old format is detected, similar to how migrateFromLocalStorage works.
| const formatPaddedDigits = (value) => { | ||
| const str = String(value); | ||
| // Format each digit individually to preserve padding with locale numerals | ||
| return str.split('').map(digit => formatDigits(digit)).join(''); | ||
| }; |
There was a problem hiding this comment.
The formatPaddedDigits function applies formatDigits to each character individually, which could cause issues with multi-digit locale numerals. For example, if a numeral like '12' is formatted character-by-character ('1', '2'), it will be passed to formatDigits as individual strings. This works because formatDigits handles single-character strings correctly, but the function name and comment suggest it's for "preserving padding" which isn't entirely accurate. The padding is preserved by the structure, not by any special handling in this function.
| export async function updateBackgroundMetadata(id, metadata) { | ||
| const db = await openDB(); | ||
| const transaction = db.transaction(STORE_NAME, 'readwrite'); | ||
| const store = transaction.objectStore(STORE_NAME); | ||
| const request = store.get(id); | ||
|
|
||
| return new Promise((resolve, reject) => { | ||
| request.onsuccess = () => { | ||
| const item = request.result; | ||
| if (item) { | ||
| Object.assign(item, metadata); | ||
| item.updatedAt = Date.now(); | ||
| const updateRequest = store.put(item); | ||
| updateRequest.onsuccess = () => resolve(); | ||
| updateRequest.onerror = () => reject(updateRequest.error); | ||
| } else { | ||
| reject(new Error('Background not found')); | ||
| } | ||
| }; | ||
| request.onerror = () => reject(request.error); | ||
| }); | ||
| } |
There was a problem hiding this comment.
The updateBackgroundMetadata function uses item.updatedAt to track when metadata was updated, but this timestamp is not used anywhere in the codebase for sorting or display purposes. Consider whether this field serves a functional purpose or if it's just for future use. If it's for future use, that's fine, but it should be documented.
| <Textarea | ||
| placeholder={t('widgets.navbar.notes.placeholder')} | ||
| value={notes} | ||
| onChange={handleSetNotes} | ||
| minRows={5} | ||
| maxLength={10000} | ||
| /> |
There was a problem hiding this comment.
The Textarea component doesn't implement a maxLength prop which was previously available on Material-UI's TextareaAutosize. This could allow users to enter unlimited text in notes, which was previously limited to 10000 characters. Consider adding maxLength support to prevent potential issues with localStorage quota or performance.
| import { randomColourStyleBuilder } from './randomColour'; | ||
| import videoCheck from './videoCheck'; | ||
| import { getAllBackgrounds } from 'utils/customBackgroundDB'; | ||
| import { getAllBackgrounds, getAllBackgroundsWithMetadata } from 'utils/customBackgroundDB'; |
There was a problem hiding this comment.
Unused import getAllBackgrounds.
| import { | ||
| getImageDimensions, | ||
| generateBlurHash, | ||
| getDataUrlSize, | ||
| getFileName, | ||
| calculateStorageSize, | ||
| calculateTotalStorageSize, | ||
| formatBytes, | ||
| } from 'utils/imageMetadata'; |
There was a problem hiding this comment.
Unused import calculateStorageSize.