Normalize Soma picker runtimes

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

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

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

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

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

Loading…
Cancel
Save

Powered by TurnKey Linux.