Normalize Soma picker runtimes

active-uix
dev 5 months ago
parent cde839dc5d
commit 0c37c7783f

@ -17,9 +17,9 @@ import type {
// ── Contract ───────────────────────────────────────────────────────────────── // ── Contract ─────────────────────────────────────────────────────────────────
import { datePickerMorfo } from '../../../morfo/components/date-picker'; import { datePickerMorfo } from '../../../morfo/components/date-picker';
import type { SomaRuntime, SomaRuntimePart } from '../../runtime.svelte';
const attrs = createAttrs(datePickerMorfo); const attrs = createAttrs(datePickerMorfo);
import type { SomaRuntimePart } from '../../runtime.svelte';
// ── Provider (context — shared state for DateField + Popover + Calendar) ──── // ── Provider (context — shared state for DateField + Popover + Calendar) ────
@ -84,6 +84,8 @@ interface DatePickerOpts
export class DatePickerProvider { export class DatePickerProvider {
readonly opts: DatePickerOpts; readonly opts: DatePickerOpts;
readonly runtimePart: SomaRuntimePart; readonly runtimePart: SomaRuntimePart;
readonly soma: Soma;
readonly runtime: SomaRuntime;
static readonly ctx = context<DatePickerProvider>('DatePicker'); static readonly ctx = context<DatePickerProvider>('DatePicker');
static get(): DatePickerProvider | undefined { static get(): DatePickerProvider | undefined {
return this.ctx.getOr(undefined) as DatePickerProvider | undefined; return this.ctx.getOr(undefined) as DatePickerProvider | undefined;
@ -96,18 +98,16 @@ export class DatePickerProvider {
return new DatePickerProvider(opts); return new DatePickerProvider(opts);
} }
readonly soma = Soma.get();
private constructor(opts: DatePickerOpts) { private constructor(opts: DatePickerOpts) {
this.opts = opts; this.opts = opts;
this.runtimePart = Soma.require() this.soma = Soma.require();
.runtime(datePickerMorfo, {}) this.runtime = this.soma.runtime(datePickerMorfo, {});
.part('provider', { this.runtimePart = this.runtime.part('provider', {
id: opts.id, id: opts.id,
ref: opts.ref, ref: opts.ref,
owner: this, owner: this,
context: DatePickerProvider.ctx context: DatePickerProvider.ctx
}); });
} }
/** Close the popover if `closeOnDateSelect` is `true`. Called by the Calendar. */ /** Close the popover if `closeOnDateSelect` is `true`. Called by the Calendar. */

@ -16,9 +16,9 @@ import type {
} from '../../external/dates'; } from '../../external/dates';
import { dateRangePickerMorfo } from '../../../morfo/components/date-range-picker'; import { dateRangePickerMorfo } from '../../../morfo/components/date-range-picker';
import type { SomaRuntime, SomaRuntimePart } from '../../runtime.svelte';
const attrs = createAttrs(dateRangePickerMorfo); const attrs = createAttrs(dateRangePickerMorfo);
import type { SomaRuntimePart } from '../../runtime.svelte';
interface DateRangePickerOpts interface DateRangePickerOpts
@ -79,6 +79,8 @@ interface DateRangePickerOpts
export class DateRangePickerProvider { export class DateRangePickerProvider {
readonly opts: DateRangePickerOpts; readonly opts: DateRangePickerOpts;
readonly runtimePart: SomaRuntimePart; readonly runtimePart: SomaRuntimePart;
readonly soma: Soma;
readonly runtime: SomaRuntime;
static readonly ctx = context<DateRangePickerProvider>('DateRangePicker'); static readonly ctx = context<DateRangePickerProvider>('DateRangePicker');
static get(): DateRangePickerProvider | undefined { static get(): DateRangePickerProvider | undefined {
return this.ctx.getOr(undefined) as DateRangePickerProvider | undefined; return this.ctx.getOr(undefined) as DateRangePickerProvider | undefined;
@ -90,18 +92,16 @@ export class DateRangePickerProvider {
return new DateRangePickerProvider(opts); return new DateRangePickerProvider(opts);
} }
readonly soma = Soma.get();
private constructor(opts: DateRangePickerOpts) { private constructor(opts: DateRangePickerOpts) {
this.opts = opts; this.opts = opts;
this.runtimePart = Soma.require() this.soma = Soma.require();
.runtime(dateRangePickerMorfo, {}) this.runtime = this.soma.runtime(dateRangePickerMorfo, {});
.part('provider', { this.runtimePart = this.runtime.part('provider', {
id: opts.id, id: opts.id,
ref: opts.ref, ref: opts.ref,
owner: this, owner: this,
context: DateRangePickerProvider.ctx context: DateRangePickerProvider.ctx
}); });
} }
/** Close the popover if `closeOnRangeSelect` is true. Called by the calendar wrapper. */ /** Close the popover if `closeOnRangeSelect` is true. Called by the calendar wrapper. */

@ -13,9 +13,9 @@ import type {
} from '../../external/dates'; } from '../../external/dates';
import { timePickerMorfo } from '../../../morfo/components/time-picker'; import { timePickerMorfo } from '../../../morfo/components/time-picker';
import type { SomaRuntime, SomaRuntimePart } from '../../runtime.svelte';
const attrs = createAttrs(timePickerMorfo); const attrs = createAttrs(timePickerMorfo);
import type { SomaRuntimePart } from '../../runtime.svelte';
export interface TimePickerOpts export interface TimePickerOpts
@ -56,6 +56,8 @@ export interface TimePickerOpts
export class TimePickerProvider { export class TimePickerProvider {
readonly opts: TimePickerOpts; readonly opts: TimePickerOpts;
readonly runtimePart: SomaRuntimePart; readonly runtimePart: SomaRuntimePart;
readonly soma: Soma;
readonly runtime: SomaRuntime;
static readonly ctx = context<TimePickerProvider>('TimePicker'); static readonly ctx = context<TimePickerProvider>('TimePicker');
static get(): TimePickerProvider | undefined { static get(): TimePickerProvider | undefined {
return this.ctx.getOr(undefined) as TimePickerProvider | undefined; return this.ctx.getOr(undefined) as TimePickerProvider | undefined;
@ -67,27 +69,25 @@ export class TimePickerProvider {
return new TimePickerProvider(opts); return new TimePickerProvider(opts);
} }
readonly soma = Soma.get();
private constructor(opts: TimePickerOpts) { private constructor(opts: TimePickerOpts) {
this.opts = opts; this.opts = opts;
this.runtimePart = Soma.require() this.soma = Soma.require();
.runtime(timePickerMorfo, {}) this.runtime = this.soma.runtime(timePickerMorfo, {});
.part('provider', { this.runtimePart = this.runtime.part('provider', {
id: opts.id, id: opts.id,
ref: opts.ref, ref: opts.ref,
owner: this, owner: this,
context: TimePickerProvider.ctx context: TimePickerProvider.ctx
}); });
} }
/** Resolved hour cycle — same rule as TimeField: explicit → service → locale. */ /** Resolved hour cycle — same rule as TimeField: explicit → service → locale. */
readonly resolvedHourCycle: HourCycle = $derived.by(() => { readonly resolvedHourCycle: HourCycle = $derived.by(() => {
const explicit = this.opts.hourCycle.current; const explicit = this.opts.hourCycle.current;
if (explicit === 12 || explicit === 24) return explicit; if (explicit === 12 || explicit === 24) return explicit;
const fromService = this.soma?.dates?.getHourCycle?.(); const fromService = this.soma.dates?.getHourCycle?.();
if (fromService === 12 || fromService === 24) return fromService; if (fromService === 12 || fromService === 24) return fromService;
const locale = this.opts.locale.current || this.soma?.langs.getLocale() || 'en'; const locale = this.opts.locale.current || this.soma.langs.getLocale() || 'en';
return new Intl.DateTimeFormat(locale, { hour: 'numeric' }).resolvedOptions().hour12 ? 12 : 24; return new Intl.DateTimeFormat(locale, { hour: 'numeric' }).resolvedOptions().hour12 ? 12 : 24;
}); });

@ -15,9 +15,9 @@ import type {
import type { TimeRangeEndpoint } from './types'; import type { TimeRangeEndpoint } from './types';
import { timeRangePickerMorfo } from '../../../morfo/components/time-range-picker'; import { timeRangePickerMorfo } from '../../../morfo/components/time-range-picker';
import type { SomaRuntime, SomaRuntimePart } from '../../runtime.svelte';
const attrs = createAttrs(timeRangePickerMorfo); const attrs = createAttrs(timeRangePickerMorfo);
import type { SomaRuntimePart } from '../../runtime.svelte';
export interface TimeRangePickerOpts export interface TimeRangePickerOpts
@ -62,6 +62,8 @@ export interface TimeRangePickerOpts
export class TimeRangePickerProvider { export class TimeRangePickerProvider {
readonly opts: TimeRangePickerOpts; readonly opts: TimeRangePickerOpts;
readonly runtimePart: SomaRuntimePart; readonly runtimePart: SomaRuntimePart;
readonly soma: Soma;
readonly runtime: SomaRuntime;
static readonly ctx = context<TimeRangePickerProvider>('TimeRangePicker'); static readonly ctx = context<TimeRangePickerProvider>('TimeRangePicker');
static get(): TimeRangePickerProvider | undefined { static get(): TimeRangePickerProvider | undefined {
return this.ctx.getOr(undefined) as TimeRangePickerProvider | undefined; return this.ctx.getOr(undefined) as TimeRangePickerProvider | undefined;
@ -73,27 +75,25 @@ export class TimeRangePickerProvider {
return new TimeRangePickerProvider(opts); return new TimeRangePickerProvider(opts);
} }
readonly soma = Soma.get();
private constructor(opts: TimeRangePickerOpts) { private constructor(opts: TimeRangePickerOpts) {
this.opts = opts; this.opts = opts;
this.runtimePart = Soma.require() this.soma = Soma.require();
.runtime(timeRangePickerMorfo, {}) this.runtime = this.soma.runtime(timeRangePickerMorfo, {});
.part('provider', { this.runtimePart = this.runtime.part('provider', {
id: opts.id, id: opts.id,
ref: opts.ref, ref: opts.ref,
owner: this, owner: this,
context: TimeRangePickerProvider.ctx context: TimeRangePickerProvider.ctx
}); });
} }
/** Resolved hour cycle — same rule as TimeField/TimePicker. */ /** Resolved hour cycle — same rule as TimeField/TimePicker. */
readonly resolvedHourCycle: HourCycle = $derived.by(() => { readonly resolvedHourCycle: HourCycle = $derived.by(() => {
const explicit = this.opts.hourCycle.current; const explicit = this.opts.hourCycle.current;
if (explicit === 12 || explicit === 24) return explicit; if (explicit === 12 || explicit === 24) return explicit;
const fromService = this.soma?.dates?.getHourCycle?.(); const fromService = this.soma.dates?.getHourCycle?.();
if (fromService === 12 || fromService === 24) return fromService; if (fromService === 12 || fromService === 24) return fromService;
const locale = this.opts.locale.current || this.soma?.langs.getLocale() || 'en'; const locale = this.opts.locale.current || this.soma.langs.getLocale() || 'en';
return new Intl.DateTimeFormat(locale, { hour: 'numeric' }).resolvedOptions().hour12 ? 12 : 24; return new Intl.DateTimeFormat(locale, { hour: 'numeric' }).resolvedOptions().hour12 ? 12 : 24;
}); });

Loading…
Cancel
Save

Powered by TurnKey Linux.