You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/src/uix/soma/components/date-picker/date-picker-provider.svelte.ts

118 lines
3.5 KiB

soma: tier 3 dates + tier 4 time (partial), dias/segments, docs Tier 3 (complete): DateField, DatePicker, DateRangeField, DateRangePicker Tier 4 (partial): TimeField, TimePicker (TimeRangeField pending) Core: $lib/util/dias/segments.ts — pure domain primitives for segmented date/time inputs (constants, guards, initializers, reconciliation, content generation, Intl opts) soma/external/dates re-exports everything (no façades inside soma) soma/datetime/ slimmed to UI-only helpers (announcer, DOM segment nav, SegmentState, KEYS predicates, description writers) Conventions established (A23–A29): A23 — never re-implement date helpers; extend dias A24 — readonlySegments without value anchor logs warning A25 — range components split readonly per-endpoint A26 — contenteditable segments use onbeforeinput to block IME/paste A27 — picker composition pattern with shared writableActive refs A28 — time placeholders render as hh/mm/ss via dias/segments A29 — demo pages are interactive testbeds, not static galleries Demo pages: Material Design 3 styled, every public prop wired to a live control, Field integration + state readout. Day-period uses real radio group in 12h mode. Auto-anchor on range pickers keeps the end month visible. 12h sliders map 0↔12 / 13-23↔1-11 correctly. Docs: COMPONENT_GUIDE.md + SOMA_ARCHITECTURE.md updated with A23–A29, checklist items 28–31, picker composition section, dias boundary, directory structure note for soma/datetime/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 months ago
import { Provider, context, type ProviderOpts } from '../../provider';
remove backward-compat re-export shims Per architectural feedback: when relocating code to its correct layer, do the migration completely — update every consumer directly and delete the original. No re-export barrels at the old paths. Removed shims: - `src/uix/soma/attrs/` — was re-exporting `createAttrs` / `registerContract` / `assertContract` / `getContract` from `$uix/morfo` and the bool/data-attr formatters from `$libs/dom`. All 66 importing files updated to import from the canonical locations directly. - `src/uix/soma/reactive/` — `reactive.svelte.ts` was a thin re-export of `$libs/reactive`. The 79 consumers (every soma provider + layers + types) now import primitives directly from `$libs/reactive`. The `opts.ts` Props↔Opts bridge moved to `src/uix/soma/provider/opts.ts` (its natural home — provider plumbing, not reactive primitives). - `attachRef` / `RefAttachment` re-export from `src/uix/soma/provider/provider.svelte.ts` and from `src/uix/soma/index.ts`. Both removed. Consumers (`floating.svelte.ts`, `date-field-provider.svelte.ts`) now import directly from `$libs/reactive`. Also: - Moved `ActiveProps<T>` / `StateProps<T>` types to `src/libs/reactive/types.ts` — they're trivial generic helpers over `Active<T>` / `State<T>` and shouldn't have lived in soma. - Stripped soma's root barrel (`src/uix/soma/index.ts`) of every re-export of libs/morfo concerns. It now only re-exports actually-soma surfaces (Provider base, mergeProps, css helpers, id, types, Soma class). Result: - `grep -r '\$soma' src/uix/morfo` → 0 matches - `grep -r '\$uix' src/libs` → 0 matches - `src/uix/soma/attrs/` and `src/uix/soma/reactive/` no longer exist - Every import statement now reflects the real architectural layer Verified: vitest 19/20 files / 214 tests (1 pre-existing air dead- branch fail using `bun:test`), smoke 68/68, morfo-check 66/66.
5 months ago
import {
createAttrs,
registerContract
} from '$uix/morfo';
soma: tier 3 dates + tier 4 time (partial), dias/segments, docs Tier 3 (complete): DateField, DatePicker, DateRangeField, DateRangePicker Tier 4 (partial): TimeField, TimePicker (TimeRangeField pending) Core: $lib/util/dias/segments.ts — pure domain primitives for segmented date/time inputs (constants, guards, initializers, reconciliation, content generation, Intl opts) soma/external/dates re-exports everything (no façades inside soma) soma/datetime/ slimmed to UI-only helpers (announcer, DOM segment nav, SegmentState, KEYS predicates, description writers) Conventions established (A23–A29): A23 — never re-implement date helpers; extend dias A24 — readonlySegments without value anchor logs warning A25 — range components split readonly per-endpoint A26 — contenteditable segments use onbeforeinput to block IME/paste A27 — picker composition pattern with shared writableActive refs A28 — time placeholders render as hh/mm/ss via dias/segments A29 — demo pages are interactive testbeds, not static galleries Demo pages: Material Design 3 styled, every public prop wired to a live control, Field integration + state readout. Day-period uses real radio group in 12h mode. Auto-anchor on range pickers keeps the end month visible. 12h sliders map 0↔12 / 13-23↔1-11 correctly. Docs: COMPONENT_GUIDE.md + SOMA_ARCHITECTURE.md updated with A23–A29, checklist items 28–31, picker composition section, dias boundary, directory structure note for soma/datetime/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 months ago
import {
type Active,
type ActiveProps,
type StateProps
remove backward-compat re-export shims Per architectural feedback: when relocating code to its correct layer, do the migration completely — update every consumer directly and delete the original. No re-export barrels at the old paths. Removed shims: - `src/uix/soma/attrs/` — was re-exporting `createAttrs` / `registerContract` / `assertContract` / `getContract` from `$uix/morfo` and the bool/data-attr formatters from `$libs/dom`. All 66 importing files updated to import from the canonical locations directly. - `src/uix/soma/reactive/` — `reactive.svelte.ts` was a thin re-export of `$libs/reactive`. The 79 consumers (every soma provider + layers + types) now import primitives directly from `$libs/reactive`. The `opts.ts` Props↔Opts bridge moved to `src/uix/soma/provider/opts.ts` (its natural home — provider plumbing, not reactive primitives). - `attachRef` / `RefAttachment` re-export from `src/uix/soma/provider/provider.svelte.ts` and from `src/uix/soma/index.ts`. Both removed. Consumers (`floating.svelte.ts`, `date-field-provider.svelte.ts`) now import directly from `$libs/reactive`. Also: - Moved `ActiveProps<T>` / `StateProps<T>` types to `src/libs/reactive/types.ts` — they're trivial generic helpers over `Active<T>` / `State<T>` and shouldn't have lived in soma. - Stripped soma's root barrel (`src/uix/soma/index.ts`) of every re-export of libs/morfo concerns. It now only re-exports actually-soma surfaces (Provider base, mergeProps, css helpers, id, types, Soma class). Result: - `grep -r '\$soma' src/uix/morfo` → 0 matches - `grep -r '\$uix' src/libs` → 0 matches - `src/uix/soma/attrs/` and `src/uix/soma/reactive/` no longer exist - Every import statement now reflects the real architectural layer Verified: vitest 19/20 files / 214 tests (1 pre-existing air dead- branch fail using `bun:test`), smoke 68/68, morfo-check 66/66.
5 months ago
} from '$libs/reactive';
soma: tier 3 dates + tier 4 time (partial), dias/segments, docs Tier 3 (complete): DateField, DatePicker, DateRangeField, DateRangePicker Tier 4 (partial): TimeField, TimePicker (TimeRangeField pending) Core: $lib/util/dias/segments.ts — pure domain primitives for segmented date/time inputs (constants, guards, initializers, reconciliation, content generation, Intl opts) soma/external/dates re-exports everything (no façades inside soma) soma/datetime/ slimmed to UI-only helpers (announcer, DOM segment nav, SegmentState, KEYS predicates, description writers) Conventions established (A23–A29): A23 — never re-implement date helpers; extend dias A24 — readonlySegments without value anchor logs warning A25 — range components split readonly per-endpoint A26 — contenteditable segments use onbeforeinput to block IME/paste A27 — picker composition pattern with shared writableActive refs A28 — time placeholders render as hh/mm/ss via dias/segments A29 — demo pages are interactive testbeds, not static galleries Demo pages: Material Design 3 styled, every public prop wired to a live control, Field integration + state readout. Day-period uses real radio group in 12h mode. Auto-anchor on range pickers keeps the end month visible. 12h sliders map 0↔12 / 13-23↔1-11 correctly. Docs: COMPONENT_GUIDE.md + SOMA_ARCHITECTURE.md updated with A23–A29, checklist items 28–31, picker composition section, dias boundary, directory structure note for soma/datetime/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 months ago
import type { OnChangeFn, Direction } from '../../types';
import { Soma } from '../../core/soma.svelte';
import type {
DateValue,
DateMatcher,
DateOnInvalid,
DateValidator,
EditableSegmentPart,
Granularity,
HourCycle,
WeekStartsOn
} from '../../external/dates';
// ── Contract ─────────────────────────────────────────────────────────────────
morfo: port 65 components + sium.lazy + morfo-check passes 66/66 All 65 soma components now consume their morfo as the cross-layer contract. createAttrs(morfo) and registerContract(morfo) overloads removed — the Morfo form is now mandatory. Each component provider has a 3-line morfo import + wire-up block instead of 20+ lines of inline declarations. Additions: sium/core/lazy.ts — lazy() combinator for recursive schemas (unblocks morfo's eventual lazy part-tree validation; tests included). sium/examples/ — booking, color, login, settings, signup, survey, tree form demos. Route demos at src/routes/test/sium/{booking,color,login,settings, signup,survey,tree}. Tooling: morfo-check.ts — now tolerates sibling parts sharing a physical element (Link variant of Item, etc.). Queries via allPartAttrs cross-scope. morfo-vocabulary-check.ts — 28 WARN (legitimate per-component vocabularies or subsets like switch missing "indeterminate"). All reviewed, none are bugs. Fixes caught by morfo-check: table: data-sorted / data-pinned marked severity:'optional' (only emitted when sorting/pinning active, not always). tree-grid: data-expanded on Row severity:'optional' (branches only). menubar: data-menubar-value declared on Trigger. splitter: data-splitter-panel-id declared on Panel. Verify: npm run check — 0 morfo errors (4 pre-existing in sium/examples, unrelated). npx vitest run src/uix/morfo — 7/7 tests pass. npm run smoke — 65/65 routes pass. npm run morfo:check — 66/66 morfos validate against real DOM. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 months ago
import { datePickerMorfo } from '../../../morfo/components/date-picker';
soma: tier 3 dates + tier 4 time (partial), dias/segments, docs Tier 3 (complete): DateField, DatePicker, DateRangeField, DateRangePicker Tier 4 (partial): TimeField, TimePicker (TimeRangeField pending) Core: $lib/util/dias/segments.ts — pure domain primitives for segmented date/time inputs (constants, guards, initializers, reconciliation, content generation, Intl opts) soma/external/dates re-exports everything (no façades inside soma) soma/datetime/ slimmed to UI-only helpers (announcer, DOM segment nav, SegmentState, KEYS predicates, description writers) Conventions established (A23–A29): A23 — never re-implement date helpers; extend dias A24 — readonlySegments without value anchor logs warning A25 — range components split readonly per-endpoint A26 — contenteditable segments use onbeforeinput to block IME/paste A27 — picker composition pattern with shared writableActive refs A28 — time placeholders render as hh/mm/ss via dias/segments A29 — demo pages are interactive testbeds, not static galleries Demo pages: Material Design 3 styled, every public prop wired to a live control, Field integration + state readout. Day-period uses real radio group in 12h mode. Auto-anchor on range pickers keeps the end month visible. 12h sliders map 0↔12 / 13-23↔1-11 correctly. Docs: COMPONENT_GUIDE.md + SOMA_ARCHITECTURE.md updated with A23–A29, checklist items 28–31, picker composition section, dias boundary, directory structure note for soma/datetime/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 months ago
morfo: port 65 components + sium.lazy + morfo-check passes 66/66 All 65 soma components now consume their morfo as the cross-layer contract. createAttrs(morfo) and registerContract(morfo) overloads removed — the Morfo form is now mandatory. Each component provider has a 3-line morfo import + wire-up block instead of 20+ lines of inline declarations. Additions: sium/core/lazy.ts — lazy() combinator for recursive schemas (unblocks morfo's eventual lazy part-tree validation; tests included). sium/examples/ — booking, color, login, settings, signup, survey, tree form demos. Route demos at src/routes/test/sium/{booking,color,login,settings, signup,survey,tree}. Tooling: morfo-check.ts — now tolerates sibling parts sharing a physical element (Link variant of Item, etc.). Queries via allPartAttrs cross-scope. morfo-vocabulary-check.ts — 28 WARN (legitimate per-component vocabularies or subsets like switch missing "indeterminate"). All reviewed, none are bugs. Fixes caught by morfo-check: table: data-sorted / data-pinned marked severity:'optional' (only emitted when sorting/pinning active, not always). tree-grid: data-expanded on Row severity:'optional' (branches only). menubar: data-menubar-value declared on Trigger. splitter: data-splitter-panel-id declared on Panel. Verify: npm run check — 0 morfo errors (4 pre-existing in sium/examples, unrelated). npx vitest run src/uix/morfo — 7/7 tests pass. npm run smoke — 65/65 routes pass. npm run morfo:check — 66/66 morfos validate against real DOM. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 months ago
const attrs = createAttrs(datePickerMorfo);
registerContract(datePickerMorfo);
soma: tier 3 dates + tier 4 time (partial), dias/segments, docs Tier 3 (complete): DateField, DatePicker, DateRangeField, DateRangePicker Tier 4 (partial): TimeField, TimePicker (TimeRangeField pending) Core: $lib/util/dias/segments.ts — pure domain primitives for segmented date/time inputs (constants, guards, initializers, reconciliation, content generation, Intl opts) soma/external/dates re-exports everything (no façades inside soma) soma/datetime/ slimmed to UI-only helpers (announcer, DOM segment nav, SegmentState, KEYS predicates, description writers) Conventions established (A23–A29): A23 — never re-implement date helpers; extend dias A24 — readonlySegments without value anchor logs warning A25 — range components split readonly per-endpoint A26 — contenteditable segments use onbeforeinput to block IME/paste A27 — picker composition pattern with shared writableActive refs A28 — time placeholders render as hh/mm/ss via dias/segments A29 — demo pages are interactive testbeds, not static galleries Demo pages: Material Design 3 styled, every public prop wired to a live control, Field integration + state readout. Day-period uses real radio group in 12h mode. Auto-anchor on range pickers keeps the end month visible. 12h sliders map 0↔12 / 13-23↔1-11 correctly. Docs: COMPONENT_GUIDE.md + SOMA_ARCHITECTURE.md updated with A23–A29, checklist items 28–31, picker composition section, dias boundary, directory structure note for soma/datetime/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 months ago
// ── Provider (context — shared state for DateField + Popover + Calendar) ────
interface DatePickerOpts
extends
ProviderOpts,
StateProps<{
value: DateValue | undefined;
placeholder: DateValue;
open: boolean;
}>,
ActiveProps<{
// Validation
validate: DateValidator | undefined;
onInvalid: DateOnInvalid | undefined;
minValue: DateValue | undefined;
maxValue: DateValue | undefined;
isDateDisabled: DateMatcher | undefined;
isDateUnavailable: DateMatcher | undefined;
// State flags
disabled: boolean;
readonly: boolean;
readonlySegments: EditableSegmentPart[];
required: boolean;
closeOnDateSelect: boolean;
// Format / i18n
granularity: Granularity | undefined;
hideTimeZone: boolean;
hourCycle: HourCycle | undefined;
locale: string | undefined;
dir: Direction;
// Calendar options
pagedNavigation: boolean;
weekStartsOn: WeekStartsOn | undefined;
weekdayFormat: Intl.DateTimeFormatOptions['weekday'];
fixedWeeks: boolean;
numberOfMonths: number;
calendarLabel: string | undefined;
disableDaysOutsideMonth: boolean;
preventDeselect: boolean;
initialFocus: boolean;
monthFormat: Intl.DateTimeFormatOptions['month'] | ((month: number) => string);
yearFormat: Intl.DateTimeFormatOptions['year'] | ((year: number) => string);
showWeekNumbers: boolean;
weekNumberFormat: 'iso' | 'simple';
isDateHoliday: DateMatcher | undefined;
announceNavigation: boolean;
// ARIA
errorMessageId: string | undefined;
// Callbacks
onOpenChangeComplete: OnChangeFn<boolean>;
}> {}
/**
* Shared-state coordinator for DatePicker. The wrapper also creates a
* `PopoverProvider` and a `DateFieldProvider` pointing at the same reactive
* sources; `DatePicker.Calendar` creates a `CalendarProvider` likewise. This
* class exists so every sub-part can reach the same value / placeholder /
* open flags through a single context.
*/
export class DatePickerProvider extends Provider<DatePickerOpts> {
static readonly ctx = context<DatePickerProvider>('DatePicker');
static get(): DatePickerProvider | undefined {
return this.ctx.getOr(undefined) as DatePickerProvider | undefined;
}
static require(): DatePickerProvider {
return this.ctx.get();
}
static create(opts: DatePickerOpts) {
return new DatePickerProvider(opts);
}
readonly soma = Soma.get();
private constructor(opts: DatePickerOpts) {
super(opts, 'DatePicker', 'provider', attrs.provider, DatePickerProvider.ctx);
soma: tier 3 dates + tier 4 time (partial), dias/segments, docs Tier 3 (complete): DateField, DatePicker, DateRangeField, DateRangePicker Tier 4 (partial): TimeField, TimePicker (TimeRangeField pending) Core: $lib/util/dias/segments.ts — pure domain primitives for segmented date/time inputs (constants, guards, initializers, reconciliation, content generation, Intl opts) soma/external/dates re-exports everything (no façades inside soma) soma/datetime/ slimmed to UI-only helpers (announcer, DOM segment nav, SegmentState, KEYS predicates, description writers) Conventions established (A23–A29): A23 — never re-implement date helpers; extend dias A24 — readonlySegments without value anchor logs warning A25 — range components split readonly per-endpoint A26 — contenteditable segments use onbeforeinput to block IME/paste A27 — picker composition pattern with shared writableActive refs A28 — time placeholders render as hh/mm/ss via dias/segments A29 — demo pages are interactive testbeds, not static galleries Demo pages: Material Design 3 styled, every public prop wired to a live control, Field integration + state readout. Day-period uses real radio group in 12h mode. Auto-anchor on range pickers keeps the end month visible. 12h sliders map 0↔12 / 13-23↔1-11 correctly. Docs: COMPONENT_GUIDE.md + SOMA_ARCHITECTURE.md updated with A23–A29, checklist items 28–31, picker composition section, dias boundary, directory structure note for soma/datetime/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 months ago
}
/** Close the popover if `closeOnDateSelect` is `true`. Called by the Calendar. */
handleDateSelect(): void {
if (this.opts.closeOnDateSelect.current) {
this.opts.open.current = false;
}
}
}
export { attrs as datePickerAttrs };

Powered by TurnKey Linux.