diff --git a/src/uix/eidos/components/date-range-picker/date-range-picker-month-view.svelte b/src/uix/eidos/components/date-range-picker/date-range-picker-month-view.svelte new file mode 100644 index 000000000..42783afec --- /dev/null +++ b/src/uix/eidos/components/date-range-picker/date-range-picker-month-view.svelte @@ -0,0 +1,124 @@ + + +
+
+ + {year} + +
+
+ {#each months as month (month)} + {@const c = classFor(month)} + + {/each} +
+
diff --git a/src/uix/eidos/components/date-range-picker/date-range-picker-year-view.svelte b/src/uix/eidos/components/date-range-picker/date-range-picker-year-view.svelte new file mode 100644 index 000000000..8126767db --- /dev/null +++ b/src/uix/eidos/components/date-range-picker/date-range-picker-year-view.svelte @@ -0,0 +1,110 @@ + + +
+
+ + + {decadeStart} – {decadeStart + 11} + + +
+
+ {#each years as year (year)} + {@const c = classFor(year)} + + {/each} +
+
diff --git a/src/uix/eidos/components/date-range-picker/date-range-picker.css b/src/uix/eidos/components/date-range-picker/date-range-picker.css index dba13c232..e02cfa4f2 100644 --- a/src/uix/eidos/components/date-range-picker/date-range-picker.css +++ b/src/uix/eidos/components/date-range-picker/date-range-picker.css @@ -824,6 +824,115 @@ } } +/* ── Range Year-view + Month-view (kind='year' / 'month') ────────────────── */ + +[data-date-range-picker-year-view], +[data-date-range-picker-month-view] { + display: flex; + flex-direction: column; + gap: var(--space-3); + inline-size: min(20rem, 100%); +} + +[data-date-range-picker-year-view-header], +[data-date-range-picker-month-view-header] { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-2); +} + +[data-date-range-picker-year-view-heading], +[data-date-range-picker-month-view-heading] { + font-weight: var(--font-weight-semibold); + color: var(--color-content-primary); +} + +[data-date-range-picker-year-view-prev], +[data-date-range-picker-year-view-next], +[data-date-range-picker-month-view-prev], +[data-date-range-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-range-picker-year-view-prev]:hover, +[data-date-range-picker-year-view-next]:hover, +[data-date-range-picker-month-view-prev]:hover, +[data-date-range-picker-month-view-next]:hover { + background: var(--color-surface-overlay); +} + +[data-date-range-picker-year-view-grid], +[data-date-range-picker-month-view-grid] { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: var(--space-2); +} + +[data-date-range-picker-year-view-cell], +[data-date-range-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-range-picker-year-view-cell]:hover, +[data-date-range-picker-month-view-cell]:hover { + background: var(--color-surface-overlay); +} + +/* Range stripe: in-range cells get a tinted background. Start and end + * cells overlay it with the solid primary fill. */ +[data-date-range-picker-year-view-cell][data-in-range], +[data-date-range-picker-month-view-cell][data-in-range] { + background: color-mix(in srgb, var(--color-primary-solid) 22%, transparent); + border-radius: 0; +} + +[data-date-range-picker-year-view-cell][data-range-start], +[data-date-range-picker-year-view-cell][data-range-end], +[data-date-range-picker-month-view-cell][data-range-start], +[data-date-range-picker-month-view-cell][data-range-end] { + background: var(--color-primary-solid); + color: var(--color-content-on-solid); + border-color: var(--color-primary-border); +} + +/* Round the open edge of the range strip on start / end cells. */ +[data-date-range-picker-year-view-cell][data-range-start], +[data-date-range-picker-month-view-cell][data-range-start] { + border-start-start-radius: var(--radius-md); + border-end-start-radius: var(--radius-md); +} + +[data-date-range-picker-year-view-cell][data-range-end], +[data-date-range-picker-month-view-cell][data-range-end] { + border-start-end-radius: var(--radius-md); + border-end-end-radius: var(--radius-md); +} + +[data-date-range-picker-year-view-cell]:focus-visible, +[data-date-range-picker-month-view-cell]:focus-visible { + outline: var(--focus-ring-width) solid var(--color-primary-border); + outline-offset: var(--focus-ring-offset); +} + /* ── Footer (Clear / Cancel / Close action row) ──────────────────────────── */ [data-date-range-picker-footer] { diff --git a/src/uix/eidos/components/date-range-picker/index.ts b/src/uix/eidos/components/date-range-picker/index.ts index ed32270d1..d1447437e 100644 --- a/src/uix/eidos/components/date-range-picker/index.ts +++ b/src/uix/eidos/components/date-range-picker/index.ts @@ -10,6 +10,8 @@ import Overlay from '../popover/popover-overlay.svelte'; import Arrow from '../popover/popover-arrow.svelte'; import Close from './date-range-picker-close.svelte'; import Footer from './date-range-picker-footer.svelte'; +import YearView from './date-range-picker-year-view.svelte'; +import MonthView from './date-range-picker-month-view.svelte'; import Clear from './date-range-picker-clear.svelte'; import Cancel from './date-range-picker-cancel.svelte'; import Header from './date-range-picker-header.svelte'; @@ -36,6 +38,8 @@ type DateRangePickerNamespace = typeof DateRangePickerComponent & { Arrow: typeof Arrow; Close: typeof Close; Footer: typeof Footer; + YearView: typeof YearView; + MonthView: typeof MonthView; Clear: typeof Clear; Cancel: typeof Cancel; Label: typeof Label; @@ -66,6 +70,8 @@ DateRangePicker.Content = Content; DateRangePicker.Arrow = Arrow; DateRangePicker.Close = Close; DateRangePicker.Footer = Footer; +DateRangePicker.YearView = YearView; +DateRangePicker.MonthView = MonthView; DateRangePicker.Clear = Clear; DateRangePicker.Cancel = Cancel; DateRangePicker.Label = Label; diff --git a/web/routes/uix/components/date-range-picker/+page.svelte b/web/routes/uix/components/date-range-picker/+page.svelte index 56f8588b4..d5be678e1 100644 --- a/web/routes/uix/components/date-range-picker/+page.svelte +++ b/web/routes/uix/components/date-range-picker/+page.svelte @@ -539,11 +539,18 @@ - - {#snippet children(args: DateRangePickerCalendarSnippetProps)} - {@render calendarBody(args)} - {/snippet} - + {#if kind === 'year'} + + {:else if kind === 'month'} + + {:else} + + {#snippet children(args: DateRangePickerCalendarSnippetProps)} + {@render calendarBody(args)} + {/snippet} + + {/if} + {@render pickerFooter()} @@ -1082,7 +1089,6 @@ {/each} - {@render pickerFooter()} {/snippet} {#snippet pickerFooter()}