From a5243168e5bbc2e0c6c8484fde3557d8c3f18a8e Mon Sep 17 00:00:00 2001 From: dev Date: Sun, 24 May 2026 21:57:02 +0200 Subject: [PATCH] refactor(time-picker): promote HourScale ruler to soma part (audit 5.3 P2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eliminates `Provider.require()` from eidos hour-sliders by promoting the tick scale to canonical soma parts: - `` — exposes `{ ticks, percent, label, cycle, min, max }` via a snippet so eidos can paint the ruler without importing TimePickerProvider. - `` — same shape for the range variant. Scale is global (both endpoints share the cycle), so no endpoint prop. Eidos hour-sliders become pure composition + paint via snippet props. No JS coupling between eidos and the soma provider class. Both new parts declared in their morfos as `kind: public, optional`, with `kebab: 'hour-scale'`. Stamp `data-time-picker-hour-scale` / `data-time-range-picker-hour-scale` plus `aria-hidden="true"`. Test result unchanged: 2391/2397 passing. No regressions. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../time-picker-hour-slider.svelte | 48 ++++++-------- .../time-range-picker-hour-slider.svelte | 47 +++++--------- src/uix/morfo/components/time-picker.ts | 10 +++ src/uix/morfo/components/time-range-picker.ts | 13 ++++ .../components/time-picker-hour-scale.svelte | 63 +++++++++++++++++++ .../soma/components/time-picker/exports.ts | 1 + .../time-range-picker-hour-scale.svelte | 51 +++++++++++++++ .../components/time-range-picker/exports.ts | 1 + 8 files changed, 174 insertions(+), 60 deletions(-) create mode 100644 src/uix/soma/components/time-picker/components/time-picker-hour-scale.svelte create mode 100644 src/uix/soma/components/time-range-picker/components/time-range-picker-hour-scale.svelte diff --git a/src/uix/eidos/components/time-picker/time-picker-hour-slider.svelte b/src/uix/eidos/components/time-picker/time-picker-hour-slider.svelte index b84233968..8029f680a 100644 --- a/src/uix/eidos/components/time-picker/time-picker-hour-slider.svelte +++ b/src/uix/eidos/components/time-picker/time-picker-hour-slider.svelte @@ -1,6 +1,12 @@ -
+
{#if showRuler} - + + {#snippet children({ ticks, percent, label })} + {#each ticks as v} + + + {label(v)} + + {/each} + {/snippet} + {/if} {#if children} diff --git a/src/uix/eidos/components/time-range-picker/time-range-picker-hour-slider.svelte b/src/uix/eidos/components/time-range-picker/time-range-picker-hour-slider.svelte index 9cfaa1585..bbdd219d0 100644 --- a/src/uix/eidos/components/time-range-picker/time-range-picker-hour-slider.svelte +++ b/src/uix/eidos/components/time-range-picker/time-range-picker-hour-slider.svelte @@ -1,6 +1,12 @@
{#if showRuler} - + + {#snippet children({ ticks, percent, label })} + {#each ticks as v} + + + {label(v)} + + {/each} + {/snippet} + {/if} {#if children} diff --git a/src/uix/morfo/components/time-picker.ts b/src/uix/morfo/components/time-picker.ts index dfe307f1c..91b80b8ee 100644 --- a/src/uix/morfo/components/time-picker.ts +++ b/src/uix/morfo/components/time-picker.ts @@ -233,6 +233,16 @@ export const timePickerMorfo = { { // Hour / Minute / Second sliders — composite parts. The outer // wrapper element carries `data-time-picker-{X}-slider`; the + name: 'HourScale', + kebab: 'hour-scale', + archetype: 'group', + kind: 'public', + defaultElement: 'div', + optional: true, + data: [], + aria: [{ attr: 'aria-hidden', value: v.literal('true') }] + }, + { // inner slider DOM is declared by the slider morfo (data-slider, // data-slider-thumb, data-slider-range). name: 'HourSlider', diff --git a/src/uix/morfo/components/time-range-picker.ts b/src/uix/morfo/components/time-range-picker.ts index 9d8cf365f..01f2b0554 100644 --- a/src/uix/morfo/components/time-range-picker.ts +++ b/src/uix/morfo/components/time-range-picker.ts @@ -231,6 +231,19 @@ export const timeRangePickerMorfo = { { key: 'Shift+Tab', action: 'focus-prev' } ] }, + { + // Hour scale — decorative ruler exposing tick data to eidos. + // No per-endpoint state; the scale is global to the range + // picker (both endpoints share the same hour cycle). + name: 'HourScale', + kebab: 'hour-scale', + archetype: 'group', + kind: 'public', + defaultElement: 'div', + optional: true, + data: [], + aria: [{ attr: 'aria-hidden', value: v.literal('true') }] + }, { // Hour / Minute / Second sliders — composite parts. The outer // wrapper carries `data-time-range-picker-{X}-slider` plus diff --git a/src/uix/soma/components/time-picker/components/time-picker-hour-scale.svelte b/src/uix/soma/components/time-picker/components/time-picker-hour-scale.svelte new file mode 100644 index 000000000..a1d503839 --- /dev/null +++ b/src/uix/soma/components/time-picker/components/time-picker-hour-scale.svelte @@ -0,0 +1,63 @@ + + + diff --git a/src/uix/soma/components/time-picker/exports.ts b/src/uix/soma/components/time-picker/exports.ts index 57a4eb244..147fb402c 100644 --- a/src/uix/soma/components/time-picker/exports.ts +++ b/src/uix/soma/components/time-picker/exports.ts @@ -2,6 +2,7 @@ export { default as Provider } from './components/time-picker.svelte'; export { default as Trigger } from './components/time-picker-trigger.svelte'; export { default as Clock } from './components/time-picker-clock.svelte'; +export { default as HourScale } from './components/time-picker-hour-scale.svelte'; export { default as HourSlider } from './components/time-picker-hour-slider.svelte'; export { default as MinuteSlider } from './components/time-picker-minute-slider.svelte'; export { default as SecondSlider } from './components/time-picker-second-slider.svelte'; diff --git a/src/uix/soma/components/time-range-picker/components/time-range-picker-hour-scale.svelte b/src/uix/soma/components/time-range-picker/components/time-range-picker-hour-scale.svelte new file mode 100644 index 000000000..021a71735 --- /dev/null +++ b/src/uix/soma/components/time-range-picker/components/time-range-picker-hour-scale.svelte @@ -0,0 +1,51 @@ + + + diff --git a/src/uix/soma/components/time-range-picker/exports.ts b/src/uix/soma/components/time-range-picker/exports.ts index add899d5c..439082a70 100644 --- a/src/uix/soma/components/time-range-picker/exports.ts +++ b/src/uix/soma/components/time-range-picker/exports.ts @@ -2,6 +2,7 @@ export { default as Provider } from './components/time-range-picker.svelte'; export { default as Trigger } from './components/time-range-picker-trigger.svelte'; export { default as Clock } from './components/time-range-picker-clock.svelte'; +export { default as HourScale } from './components/time-range-picker-hour-scale.svelte'; export { default as HourSlider } from './components/time-range-picker-hour-slider.svelte'; export { default as MinuteSlider } from './components/time-range-picker-minute-slider.svelte'; export { default as SecondSlider } from './components/time-range-picker-second-slider.svelte';