From bf7e116af92db87fe5af2bb0de08e212f9f2dc88 Mon Sep 17 00:00:00 2001 From: dev Date: Sun, 24 May 2026 23:31:19 +0200 Subject: [PATCH] =?UTF-8?q?refactor(soma):=20route=20FieldProvider=20throu?= =?UTF-8?q?gh=20field/internals=20barrel=20+=20register=20DRP=20view=20sub?= =?UTF-8?q?-parts=20(audit=20Round=203=20=C2=A73=20#23=20+=20P4=20follow-u?= =?UTF-8?q?p)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two related housekeeping items in one commit: **1. FieldProvider via barrel (audit Round 3 §3 #23)** 37 consumer files across soma imported `FieldProvider` from the deep path `'../field/field-provider.svelte'`, mirroring the same pattern that motivated `internals.ts` indirection on the 5 pickers earlier. Adds `src/uix/soma/components/field/internals.ts` re-exporting `FieldProvider` and exposes it from the barrel `exports.ts`. The 37 imports become the canonical `from '../field'`. Consistency only — no behavioral change. **2. DateRangePicker view sub-parts (P4 follow-up)** The MonthView/YearView soma parts created in commit `e93c0c73` stamp internal layout data-attrs (`-header`, `-prev`, `-heading`, `-next`, `-grid`, `-cell`) that weren't declared in the morfo, surfacing as 12 hardcoded-data-attr violations once the contract suite caught up. Declares the 12 sub-parts in the morfo with the canonical kebab prefix (`month-view-*`, `year-view-*`). Each entry minimal (data: [], aria: []) except `*-prev` / `*-next` which stamp `type='button'` and `*-cell` which surfaces the `data-range-{start,end,in-range}` classification states used by the eidos range tinting CSS. Test result: 2393/2399 passing — back to the canonical 6 fails (Words + cookie infra). The 13 transient regressions are closed. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/uix/morfo/components/date-range-picker.ts | 138 ++++++++++++++++++ .../button/button-provider.svelte.ts | 2 +- .../color-field-provider.svelte.test.ts | 2 +- .../color-field-provider.svelte.ts | 2 +- .../color-picker-provider.svelte.test.ts | 2 +- .../color-picker-provider.svelte.ts | 2 +- .../date-field-provider.svelte.test.ts | 2 +- .../date-field/date-field-provider.svelte.ts | 2 +- .../date-range-field-provider.svelte.test.ts | 2 +- .../date-range-field-provider.svelte.ts | 2 +- src/uix/soma/components/field/exports.ts | 5 + src/uix/soma/components/field/internals.ts | 15 ++ .../file-upload-provider.svelte.test.ts | 2 +- .../file-upload-provider.svelte.ts | 2 +- .../grid-list/grid-list-provider.svelte.ts | 2 +- .../listbox/listbox-provider.svelte.test.ts | 2 +- .../listbox/listbox-provider.svelte.ts | 2 +- .../number-field-provider.svelte.test.ts | 2 +- .../number-field-provider.svelte.ts | 2 +- .../password-field-provider.svelte.ts | 2 +- .../pin-input/pin-input-provider.svelte.ts | 2 +- .../radio-group-provider.svelte.test.ts | 2 +- .../radio-group-provider.svelte.ts | 2 +- .../rating-group-provider.svelte.ts | 2 +- .../search-field-provider.svelte.test.ts | 2 +- .../search-field-provider.svelte.ts | 2 +- .../slider/slider-provider.svelte.test.ts | 2 +- .../slider/slider-provider.svelte.ts | 2 +- .../switch/switch-provider.svelte.test.ts | 2 +- .../switch/switch-provider.svelte.ts | 2 +- .../textarea/textarea-provider.svelte.ts | 2 +- .../time-field-provider.svelte.test.ts | 2 +- .../time-field/time-field-provider.svelte.ts | 2 +- .../time-range-field-provider.svelte.test.ts | 2 +- .../time-range-field-provider.svelte.ts | 2 +- .../toggle/toggle-provider.svelte.test.ts | 2 +- .../toggle/toggle-provider.svelte.ts | 2 +- 37 files changed, 192 insertions(+), 34 deletions(-) create mode 100644 src/uix/soma/components/field/internals.ts diff --git a/src/uix/morfo/components/date-range-picker.ts b/src/uix/morfo/components/date-range-picker.ts index 92dd9aadf..870544416 100644 --- a/src/uix/morfo/components/date-range-picker.ts +++ b/src/uix/morfo/components/date-range-picker.ts @@ -258,6 +258,75 @@ export const dateRangePickerMorfo = { } ] }, + // MonthView internal layout slots — stamped by soma, targeted + // by eidos CSS. Flat in the morfo per `month-view-*` namespacing. + { + name: 'MonthViewHeader', + kebab: 'month-view-header', + archetype: 'header', + kind: 'public', + defaultElement: 'div', + optional: true, + data: [], + aria: [] + }, + { + name: 'MonthViewPrev', + kebab: 'month-view-prev', + archetype: 'trigger', + kind: 'public', + defaultElement: 'button', + role: 'button', + optional: true, + data: [], + aria: [{ attr: 'type', value: v.literal('button') }] + }, + { + name: 'MonthViewHeading', + kebab: 'month-view-heading', + archetype: 'label', + kind: 'public', + defaultElement: 'span', + optional: true, + data: [], + aria: [] + }, + { + name: 'MonthViewNext', + kebab: 'month-view-next', + archetype: 'trigger', + kind: 'public', + defaultElement: 'button', + role: 'button', + optional: true, + data: [], + aria: [{ attr: 'type', value: v.literal('button') }] + }, + { + name: 'MonthViewGrid', + kebab: 'month-view-grid', + archetype: 'group', + kind: 'public', + defaultElement: 'div', + optional: true, + data: [], + aria: [] + }, + { + name: 'MonthViewCell', + kebab: 'month-view-cell', + archetype: 'item', + kind: 'public', + defaultElement: 'button', + role: 'button', + optional: true, + data: [ + { attr: 'data-range-start', severity: 'optional' }, + { attr: 'data-range-end', severity: 'optional' }, + { attr: 'data-in-range', severity: 'optional' } + ], + aria: [{ attr: 'type', value: v.literal('button') }] + }, { // Year-view range bridge for `kind='year'`. Symmetric to the // MonthView but with decade pagination. @@ -276,6 +345,75 @@ export const dateRangePickerMorfo = { severity: 'optional' } ] + }, + // YearView internal layout slots — same shape as MonthView's, with + // decade navigation labels. + { + name: 'YearViewHeader', + kebab: 'year-view-header', + archetype: 'header', + kind: 'public', + defaultElement: 'div', + optional: true, + data: [], + aria: [] + }, + { + name: 'YearViewPrev', + kebab: 'year-view-prev', + archetype: 'trigger', + kind: 'public', + defaultElement: 'button', + role: 'button', + optional: true, + data: [], + aria: [{ attr: 'type', value: v.literal('button') }] + }, + { + name: 'YearViewHeading', + kebab: 'year-view-heading', + archetype: 'label', + kind: 'public', + defaultElement: 'span', + optional: true, + data: [], + aria: [] + }, + { + name: 'YearViewNext', + kebab: 'year-view-next', + archetype: 'trigger', + kind: 'public', + defaultElement: 'button', + role: 'button', + optional: true, + data: [], + aria: [{ attr: 'type', value: v.literal('button') }] + }, + { + name: 'YearViewGrid', + kebab: 'year-view-grid', + archetype: 'group', + kind: 'public', + defaultElement: 'div', + optional: true, + data: [], + aria: [] + }, + { + name: 'YearViewCell', + kebab: 'year-view-cell', + archetype: 'item', + kind: 'public', + defaultElement: 'button', + role: 'button', + optional: true, + data: [ + { attr: 'data-range-start', severity: 'optional' }, + { attr: 'data-range-end', severity: 'optional' }, + { attr: 'data-in-range', severity: 'optional' } + ], + aria: [{ attr: 'type', value: v.literal('button') }] } // Footer / Clear / Cancel / Close — chrome shared via picker-shell; // not declared here. Eidos `(fn: () => T): { result: T; cleanup: () => void } { let result!: T; diff --git a/src/uix/soma/components/radio-group/radio-group-provider.svelte.ts b/src/uix/soma/components/radio-group/radio-group-provider.svelte.ts index 018dbef7f..4456d6966 100644 --- a/src/uix/soma/components/radio-group/radio-group-provider.svelte.ts +++ b/src/uix/soma/components/radio-group/radio-group-provider.svelte.ts @@ -6,7 +6,7 @@ import type { Orientation, Direction, SomaMouseEvent, SomaKeyboardEvent } from ' import { getDirectionalKeys } from '../../keyboard'; import { Soma } from '../../core/soma.svelte'; import type { SomaRuntime, SomaRuntimePart } from '../../runtime.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { radioGroupMorfo } from '../../../morfo/components/radio-group'; diff --git a/src/uix/soma/components/rating-group/rating-group-provider.svelte.ts b/src/uix/soma/components/rating-group/rating-group-provider.svelte.ts index 22d115496..0d7c66065 100644 --- a/src/uix/soma/components/rating-group/rating-group-provider.svelte.ts +++ b/src/uix/soma/components/rating-group/rating-group-provider.svelte.ts @@ -10,7 +10,7 @@ import type { } from '../../types'; import { KEYS, getDirectionalKeys } from '../../keyboard'; import { Soma } from '../../core/soma.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { RATING_GROUP_LANGS } from './langs'; import type { RatingItemDescriptor, RatingItemState } from './types'; diff --git a/src/uix/soma/components/search-field/search-field-provider.svelte.test.ts b/src/uix/soma/components/search-field/search-field-provider.svelte.test.ts index 136e96ee4..eb489aef4 100644 --- a/src/uix/soma/components/search-field/search-field-provider.svelte.test.ts +++ b/src/uix/soma/components/search-field/search-field-provider.svelte.test.ts @@ -8,7 +8,7 @@ import { state } from '$libs/reactive'; import type { Morfo } from '$uix/morfo'; import { Soma } from '$soma/core/soma.svelte'; import { createSomaRuntime, type SomaRuntimeSources } from '$soma/runtime.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { SearchFieldClearTriggerProvider, diff --git a/src/uix/soma/components/search-field/search-field-provider.svelte.ts b/src/uix/soma/components/search-field/search-field-provider.svelte.ts index e13126394..2efa827e2 100644 --- a/src/uix/soma/components/search-field/search-field-provider.svelte.ts +++ b/src/uix/soma/components/search-field/search-field-provider.svelte.ts @@ -16,7 +16,7 @@ import type { } from '../../types'; import { KEYS } from '../../keyboard'; import { Soma } from '../../core/soma.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { SEARCH_FIELD_LANGS } from './langs'; import { searchFieldMorfo } from '../../../morfo/components/search-field'; diff --git a/src/uix/soma/components/slider/slider-provider.svelte.test.ts b/src/uix/soma/components/slider/slider-provider.svelte.test.ts index 9a7165819..adb279534 100644 --- a/src/uix/soma/components/slider/slider-provider.svelte.test.ts +++ b/src/uix/soma/components/slider/slider-provider.svelte.test.ts @@ -8,7 +8,7 @@ import { state } from '$libs/reactive'; import type { Morfo } from '$uix/morfo'; import { Soma } from '$soma/core/soma.svelte'; import { createSomaRuntime, type SomaRuntimeSources } from '$soma/runtime.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { SliderProvider, diff --git a/src/uix/soma/components/slider/slider-provider.svelte.ts b/src/uix/soma/components/slider/slider-provider.svelte.ts index cff8fe184..d544acb69 100644 --- a/src/uix/soma/components/slider/slider-provider.svelte.ts +++ b/src/uix/soma/components/slider/slider-provider.svelte.ts @@ -6,7 +6,7 @@ import { KEYS, getDirectionalKeys } from '../../keyboard'; import { sliderMorfo } from '../../../morfo/components/slider'; import { Soma } from '../../core/soma.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import type { SomaRuntime, SomaRuntimePart } from '../../runtime.svelte'; import { resolveSliderDragSound, type SemaSignatureOverride } from '$uix/sema'; import type { SliderType } from './types'; diff --git a/src/uix/soma/components/switch/switch-provider.svelte.test.ts b/src/uix/soma/components/switch/switch-provider.svelte.test.ts index 835079b10..ae1342774 100644 --- a/src/uix/soma/components/switch/switch-provider.svelte.test.ts +++ b/src/uix/soma/components/switch/switch-provider.svelte.test.ts @@ -8,7 +8,7 @@ import { state } from '$libs/reactive'; import type { Morfo } from '$uix/morfo'; import { Soma } from '$soma/core/soma.svelte'; import { createSomaRuntime, type SomaRuntimeSources } from '$soma/runtime.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { SwitchProvider, SwitchThumbProvider } from './switch-provider.svelte'; diff --git a/src/uix/soma/components/switch/switch-provider.svelte.ts b/src/uix/soma/components/switch/switch-provider.svelte.ts index 5faeaf7e8..561df5c79 100644 --- a/src/uix/soma/components/switch/switch-provider.svelte.ts +++ b/src/uix/soma/components/switch/switch-provider.svelte.ts @@ -4,7 +4,7 @@ import type { OptsFromProps } from '../../provider'; import type { OnChangeFn, SomaMouseEvent } from '../../types'; import { Soma } from '../../core/soma.svelte'; import type { SomaRuntime, SomaRuntimePart } from '../../runtime.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { switchMorfo } from '../../../morfo/components/switch'; import type { SwitchProps } from './types'; diff --git a/src/uix/soma/components/textarea/textarea-provider.svelte.ts b/src/uix/soma/components/textarea/textarea-provider.svelte.ts index 33955a694..3456a92c2 100644 --- a/src/uix/soma/components/textarea/textarea-provider.svelte.ts +++ b/src/uix/soma/components/textarea/textarea-provider.svelte.ts @@ -15,7 +15,7 @@ import type { } from '../../types'; import { KEYS } from '../../keyboard'; import { Soma } from '../../core/soma.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { TEXTAREA_LANGS } from './langs'; import { textareaMorfo } from '../../../morfo/components/textarea'; diff --git a/src/uix/soma/components/time-field/time-field-provider.svelte.test.ts b/src/uix/soma/components/time-field/time-field-provider.svelte.test.ts index 3f0fba1e6..f47a24141 100644 --- a/src/uix/soma/components/time-field/time-field-provider.svelte.test.ts +++ b/src/uix/soma/components/time-field/time-field-provider.svelte.test.ts @@ -16,7 +16,7 @@ import { state } from '$libs/reactive'; import type { Morfo } from '$uix/morfo'; import { Soma } from '$soma/core/soma.svelte'; import { createSomaRuntime, type SomaRuntimeSources } from '$soma/runtime.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { TimeFieldProvider } from './time-field-provider.svelte'; diff --git a/src/uix/soma/components/time-field/time-field-provider.svelte.ts b/src/uix/soma/components/time-field/time-field-provider.svelte.ts index 4a890d006..54990df45 100644 --- a/src/uix/soma/components/time-field/time-field-provider.svelte.ts +++ b/src/uix/soma/components/time-field/time-field-provider.svelte.ts @@ -53,7 +53,7 @@ import { setDescription, type Announcer } from '../../datetime'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { TIME_FIELD_LANGS } from './langs'; // ── Contract ───────────────────────────────────────────────────────────────── diff --git a/src/uix/soma/components/time-range-field/time-range-field-provider.svelte.test.ts b/src/uix/soma/components/time-range-field/time-range-field-provider.svelte.test.ts index f161601ca..5ab520468 100644 --- a/src/uix/soma/components/time-range-field/time-range-field-provider.svelte.test.ts +++ b/src/uix/soma/components/time-range-field/time-range-field-provider.svelte.test.ts @@ -18,7 +18,7 @@ import type { Morfo } from '$uix/morfo'; import { Soma } from '$soma/core/soma.svelte'; import { createSomaRuntime, type SomaRuntimeSources } from '$soma/runtime.svelte'; import type { Direction } from '../../types'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { TimeRangeFieldLabelProvider, diff --git a/src/uix/soma/components/time-range-field/time-range-field-provider.svelte.ts b/src/uix/soma/components/time-range-field/time-range-field-provider.svelte.ts index 6ed06e900..5e122a78e 100644 --- a/src/uix/soma/components/time-range-field/time-range-field-provider.svelte.ts +++ b/src/uix/soma/components/time-range-field/time-range-field-provider.svelte.ts @@ -14,7 +14,7 @@ import { type TimeGranularity, type HourCycle } from '$libs/days'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { timeRangeFieldMorfo } from '../../../morfo/components/time-range-field'; diff --git a/src/uix/soma/components/toggle/toggle-provider.svelte.test.ts b/src/uix/soma/components/toggle/toggle-provider.svelte.test.ts index 39b5380cf..ff3acd28f 100644 --- a/src/uix/soma/components/toggle/toggle-provider.svelte.test.ts +++ b/src/uix/soma/components/toggle/toggle-provider.svelte.test.ts @@ -8,7 +8,7 @@ import { state } from '$libs/reactive'; import type { Morfo } from '$uix/morfo'; import { Soma } from '$soma/core/soma.svelte'; import { createSomaRuntime, type SomaRuntimeSources } from '$soma/runtime.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { ToggleProvider } from './toggle-provider.svelte'; diff --git a/src/uix/soma/components/toggle/toggle-provider.svelte.ts b/src/uix/soma/components/toggle/toggle-provider.svelte.ts index e6bfac270..50877c440 100644 --- a/src/uix/soma/components/toggle/toggle-provider.svelte.ts +++ b/src/uix/soma/components/toggle/toggle-provider.svelte.ts @@ -1,5 +1,5 @@ import { Soma } from '../../core/soma.svelte'; -import { FieldProvider } from '../field/field-provider.svelte'; +import { FieldProvider } from '../field'; import { toggleMorfo } from '../../../morfo/components/toggle'; import type { OptsFromProps } from '../../provider'; import type { OnChangeFn, SomaMouseEvent } from '../../types';