• Create timeline/timeline.svelte as main entry point for timeline functionality
• Combine BaseTimeline, TimelineKeyboardActions, and TimelineAssetViewer
• Update all route imports from base-timeline to use Timeline component
• Move scrubber.svelte to timeline/base-components/
• Fix timeline-keyboard-actions date handling from result.dateTime to result.date
• Clean up unused imports and props
• Move timeline-viewer to timeline/base-components/base-timeline-viewer
• Move base-timeline to timeline/base-components/base-timeline
• Move skeleton to timeline/base-components/
• Move timeline-day to timeline/base-components/
• Move selectable-timeline-day to timeline/internal-components/
• Move timeline-asset-viewer to timeline/internal-components/
• Move timeline actions to timeline/actions/
• Update all imports to reference new locations
• Rename asset-grid.svelte to base-timeline.svelte
• Move asset-grid-actions.svelte to timeline-keyboard-actions.svelte in timeline-viewer/actions/
• Move delete-asset-dialog.svelte to timeline-viewer/actions/
• Update all imports across routes and components
• Move asset-grid-asset-viewer to timeline-asset-viewer in timeline-viewer/
• Move asset-date-group-selection-aware to selectable-timeline-day in timeline-viewer/timeline-day/
• Move asset-date-group-comp to timeline-day in timeline-viewer/timeline-day/
• Update all imports in timeline-viewer.svelte
• Rename asset-grid-without-scrubber.svelte to timeline-viewer.svelte
• Move timeline-viewer.svelte to lib/components/timeline-viewer/
• Move skeleton.svelte to lib/components/timeline-viewer/
• Update imports in asset-grid.svelte
• Update asset-grid-without-scrubber to use AssetDateGroupSelectionAware
• Remove original asset-date-group.svelte component
• Remove date-group-actions-lib.svelte.ts class
• Rename asset-date-group.svelte to asset-date-group-comp.svelte as generic base
• Create asset-date-group-selection-aware.svelte wrapper for selection logic
• Extract selection-specific callbacks into separate handlers
• Update onDateGroupSelect to onDayGroupSelect with DayGroup parameter
• Rename handleScrollCompensation to scrollCompensation
• Rename scrollTop prop to onScrollToTop to match event handler pattern
• Add onScrollCompensation alias for consistency with other event handlers
• Convert asset-date-group-actions.svelte to date-group-actions-lib.svelte.ts class
• Remove complex prop binding between asset-grid-without-scrubber and asset-date-group
• Use class instance in asset-date-group with direct method access
• Move all timeline rendering and scrolling logic to new component
• Keep scrubber logic and interaction handlers in original asset-grid
• Use composition pattern with header snippet for scrubber integration
• Simplify asset-grid to ~450 lines by extracting ~390 lines of core logic
• Add i18n support for navigate button and dialog title
• Update ChangeDate component to return DateTime object alongside ISO string
• Fix closest date finding algorithm to handle cases where exact month doesn't exist
• Add navigate to time (g) shortcut to keyboard shortcuts modal
• Move all keyboard shortcut handling and focus navigation logic from asset-grid
• Extract asset operation handlers (delete, force delete, stack, archive)
• Move delete confirmation dialog and date picker to new component
• Consolidate ~230 lines of action-related code into dedicated module
• Move multi-asset selection handlers (shift-click range selection) from asset-grid
• Extract date group selection logic for bulk selecting assets by date
• Consolidate keyboard event handling for shift key detection
• Clean up asset-grid by removing ~200 lines of selection-related code
* upload using dart client
* add connectivity api
* respect backup network setting
* comment as to why we need to wait for setForegroundAsync call
* log assets skipped due to network constraint
* dynamic spawning -> false
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* docs: improve and clarify XMP sidecar behavior
- Simplified and reorganized the documentation for XMP sidecars
- Clearly separated CLI import vs. external library behavior
- Clarified what metadata fields are stored in the database
- Documented filename rules and storage behavior
- Explained write-back behavior, including permission requirements
* Clarify sidecar write-back behavior for external libraries
Updated documentation to reflect that Immich does not write metadata to sidecar files in external libraries unless the mount is writable.
Mentions silent fail behavior as described in Issue #10538.
* Update xmp-sidecars.md
* Refactor section 1: clarify XMP fields Immich reads and writes
- Rewrote section 1 with a simplified 3-column table: Metadata · Writes to · Reads from
- Corrected date field logic with prioritized read order
- Clarified that Immich only updates fields that have changed
- Removed incorrect mention of dc:title
* docs: clarify tag reading priority (TagsList, HierarchicalSubject, IPTC:Keywords)
Updated the documentation for tag metadata extraction to clarify the prioritized order in which Immich reads tags from imported media:
1. digiKam:TagsList
2. lr:HierarchicalSubject
3. IPTC:Keywords
This reflects the actual logic used in the getTagList()