From 187d7d3751452dcaa3c68a593ed7f9d82d546d19 Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 22 May 2026 02:02:13 +0200 Subject: [PATCH] refactor(date-picker): MonthView / YearView delegate to MonthGrid / YearGrid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit date-picker-month-view.svelte and date-picker-year-view.svelte previously rolled their own 3×4 grids with custom data-date-picker-{month,year}-view-* markers and ~90 lines of selection / nav / formatter logic. They now render the standalone MonthGrid / YearGrid primitives (introduced in #70) and bridge a thin DatePickerProvider context adapter: - value: CalendarDate ↔ {year, month?} / {year} - placeholder: CalendarDate ↔ {year} - onValueChange → new CalendarDate(year, month, 1) + handleDateSelect - onPlaceholderChange → mutate provider.placeholder.year - forwards locale / disabled / readonly straight from the provider CSS: removed the data-date-picker-{month,year}-view-* selector block (~90 lines of dead code). Visuals now come from month-grid.css / year-grid.css, which means the views also inherit the size='xs' work, roving tabindex, RTL keyboard flip and sema events for free. Verified in browser at /uix/components/date-picker: - kind='month' → MonthGrid renders 12 cells (Jan..Dec) inside the popover - click Mar → value becomes 2026-03-01, input segments update to 03/2026 - kind='year' → YearGrid renders the 2016–2027 page - svelte-check --threshold error → 0 errors / 0 warnings / 4572 files date-range-picker MonthView / YearView left untouched — their range state machine (start/end/in-range markers, complete-vs-pending swap) is not modelled by the standalone grids. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../date-picker/date-picker-month-view.svelte | 120 +++++++----------- .../date-picker/date-picker-year-view.svelte | 120 +++++++----------- .../components/date-picker/date-picker.css | 91 +------------ 3 files changed, 99 insertions(+), 232 deletions(-) diff --git a/src/uix/eidos/components/date-picker/date-picker-month-view.svelte b/src/uix/eidos/components/date-picker/date-picker-month-view.svelte index cc209edc9..d083f58f3 100644 --- a/src/uix/eidos/components/date-picker/date-picker-month-view.svelte +++ b/src/uix/eidos/components/date-picker/date-picker-month-view.svelte @@ -1,94 +1,72 @@ -
-
- - {year} - -
-
- {#each months as month (month)} - - {/each} -
-
+ {#snippet children({ months }: MonthGridProviderSnippetProps)} + + < + + > + + + {#each months as month (month)} + + {/each} + + {/snippet} + diff --git a/src/uix/eidos/components/date-picker/date-picker-year-view.svelte b/src/uix/eidos/components/date-picker/date-picker-year-view.svelte index 0866d0d07..f890e0e64 100644 --- a/src/uix/eidos/components/date-picker/date-picker-year-view.svelte +++ b/src/uix/eidos/components/date-picker/date-picker-year-view.svelte @@ -1,97 +1,71 @@ -
-
- - - {decadeStart} – {decadeStart + 11} - - -
-
- {#each years as year (year)} - - {/each} -
-
+ {#snippet children({ years }: YearGridProviderSnippetProps)} + + < + + > + + + {#each years as year (year)} + + {/each} + + {/snippet} + diff --git a/src/uix/eidos/components/date-picker/date-picker.css b/src/uix/eidos/components/date-picker/date-picker.css index 99035b37c..952d1a0a4 100644 --- a/src/uix/eidos/components/date-picker/date-picker.css +++ b/src/uix/eidos/components/date-picker/date-picker.css @@ -195,97 +195,12 @@ /* ── Year-view + Month-view (kind='year' / 'month') ──────────────────────── */ - -[data-date-picker-year-view], -[data-date-picker-month-view] { - display: flex; - flex-direction: column; - gap: var(--space-3); - inline-size: min(20rem, 100%); -} - -[data-date-picker-year-view-header], -[data-date-picker-month-view-header] { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-2); -} - -[data-date-picker-year-view-heading], -[data-date-picker-month-view-heading] { - font-weight: var(--font-weight-semibold); - color: var(--color-content-primary); -} - -[data-date-picker-year-view-prev], -[data-date-picker-year-view-next], -[data-date-picker-month-view-prev], -[data-date-picker-month-view-next] { - min-block-size: var(--control-height-sm); - min-inline-size: var(--control-height-sm); - border-radius: var(--radius-md); - border: var(--border-width) solid transparent; - background: transparent; - color: var(--color-content-primary); - cursor: pointer; - font: inherit; - font-size: var(--font-size-md); -} - -[data-date-picker-year-view-prev]:hover, -[data-date-picker-year-view-next]:hover, -[data-date-picker-month-view-prev]:hover, -[data-date-picker-month-view-next]:hover { - background: var(--color-surface-overlay); -} - -[data-date-picker-year-view-grid], -[data-date-picker-month-view-grid] { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: var(--space-2); -} - -[data-date-picker-year-view-cell], -[data-date-picker-month-view-cell] { - min-block-size: var(--control-height-md); - border-radius: var(--radius-md); - border: var(--border-width) solid transparent; - background: transparent; - color: var(--color-content-primary); - cursor: pointer; - font: inherit; - font-size: var(--font-size-sm); - transition: - background var(--duration-fast) var(--ease-default), - color var(--duration-fast) var(--ease-default); -} - -[data-date-picker-year-view-cell]:hover, -[data-date-picker-month-view-cell]:hover { - background: var(--color-surface-overlay); -} - -[data-date-picker-year-view-cell][data-selected], -[data-date-picker-month-view-cell][data-selected] { - background: var(--color-primary-solid); - color: var(--color-content-on-solid); - border-color: var(--color-primary-border); -} - -[data-date-picker-year-view-cell]:focus-visible, -[data-date-picker-month-view-cell]:focus-visible { - outline: var(--focus-ring-width) solid var(--color-primary-border); - outline-offset: var(--focus-ring-offset); -} +/* DatePicker.MonthView and DatePicker.YearView now delegate to the + standalone MonthGrid / YearGrid primitives, so their visuals come from + `month-grid.css` and `year-grid.css`. No local rules needed. */ @media (prefers-reduced-motion: reduce) { [data-date-picker-trigger] { transition: none; } - [data-date-picker-year-view-cell], - [data-date-picker-month-view-cell] { - transition: none; - } }