Skip to content

Beta - #1138

Merged
davidcralph merged 36 commits into
mainfrom
beta
Jan 27, 2026
Merged

Beta#1138
davidcralph merged 36 commits into
mainfrom
beta

Conversation

@alexsparkes

Copy link
Copy Markdown
Member
  • remove mui
  • overhaul custom
  • fix clock
  • fix author details

alexsparkes and others added 30 commits January 25, 2026 17:29
… (#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
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.
Copilot AI review requested due to automatic review settings January 27, 2026 12:32
@davidcralph
davidcralph merged commit e5d8bfe into main Jan 27, 2026
15 of 16 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Comment on lines +54 to +65
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,
};

Copilot AI Jan 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.
Comment on lines +124 to +128
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
}

Copilot AI Jan 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.
Comment on lines +178 to 185
// 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 } }));
}
}

Copilot AI Jan 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +16
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('');
};

Copilot AI Jan 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.
Comment on lines +267 to +288
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);
});
}

Copilot AI Jan 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.
Comment on lines +115 to 120
<Textarea
placeholder={t('widgets.navbar.notes.placeholder')}
value={notes}
onChange={handleSetNotes}
minRows={5}
maxLength={10000}
/>

Copilot AI Jan 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.
import { randomColourStyleBuilder } from './randomColour';
import videoCheck from './videoCheck';
import { getAllBackgrounds } from 'utils/customBackgroundDB';
import { getAllBackgrounds, getAllBackgroundsWithMetadata } from 'utils/customBackgroundDB';

Copilot AI Jan 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import getAllBackgrounds.

Copilot uses AI. Check for mistakes.
Comment on lines +28 to +36
import {
getImageDimensions,
generateBlurHash,
getDataUrlSize,
getFileName,
calculateStorageSize,
calculateTotalStorageSize,
formatBytes,
} from 'utils/imageMetadata';

Copilot AI Jan 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import calculateStorageSize.

Copilot uses AI. Check for mistakes.

This branch was successfully deployed

1 active and 1 inactive deployments
production f8746a31 Deployed Jan 27, 2026 by davidcralph via build-and-release #5
beta f8746a31 Deployed Jan 27, 2026 by alexsparkes via build-and-release #5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants