From d5f96aedf918e47b70f54c06e1fbbd31b5ebe0ea Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 15 May 2026 03:36:38 +0200 Subject: [PATCH] Normalize Soma root service references --- .../alert-dialog-provider.svelte.ts | 50 ++++++++++++------- .../collapsible-provider.svelte.ts | 5 +- .../switch/switch-provider.svelte.ts | 5 +- .../toggle/toggle-provider.svelte.ts | 5 +- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/uix/soma/components/alert-dialog/alert-dialog-provider.svelte.ts b/src/uix/soma/components/alert-dialog/alert-dialog-provider.svelte.ts index cac24d1b9..92c49d200 100644 --- a/src/uix/soma/components/alert-dialog/alert-dialog-provider.svelte.ts +++ b/src/uix/soma/components/alert-dialog/alert-dialog-provider.svelte.ts @@ -17,7 +17,7 @@ import { ALERT_DIALOG_LANGS } from './langs'; * differently, and they wire `onclick` to close the dialog. */ import { alertDialogMorfo } from '../../../morfo/components/alert-dialog'; -import type { SomaRuntimePart } from '../../runtime.svelte'; +import type { SomaRuntime, SomaRuntimePart } from '../../runtime.svelte'; // ── Action button (primary / destructive) ───────────────────────────────── @@ -33,22 +33,28 @@ export class AlertDialogActionProvider { } readonly dialog: DialogProvider; - readonly soma = Soma.get(); + readonly soma: Soma; + readonly runtime: SomaRuntime; private constructor(opts: AlertDialogActionOpts) { this.opts = opts; this.dialog = DialogProvider.require(); - this.runtimePart = Soma.require() - .runtime(alertDialogMorfo, { - props: { - ariaLabel: () => this.resolvedAriaLabel - } - }) - .part('action', { id: opts.id, ref: opts.ref, owner: this, syncAttrs: true }); + this.soma = Soma.require(); + this.runtime = this.soma.runtime(alertDialogMorfo, { + props: { + ariaLabel: () => this.resolvedAriaLabel + } + }); + this.runtimePart = this.runtime.part('action', { + id: opts.id, + ref: opts.ref, + owner: this, + syncAttrs: true + }); } readonly resolvedAriaLabel = $derived.by( - () => this.opts.ariaLabel.current || this.soma?.langs.ts(ALERT_DIALOG_LANGS.ACTION) + () => this.opts.ariaLabel.current || this.soma.langs.ts(ALERT_DIALOG_LANGS.ACTION) ); readonly onclick = (_e: SomaMouseEvent) => { @@ -76,22 +82,28 @@ export class AlertDialogCancelProvider { } readonly dialog: DialogProvider; - readonly soma = Soma.get(); + readonly soma: Soma; + readonly runtime: SomaRuntime; private constructor(opts: AlertDialogCancelOpts) { this.opts = opts; this.dialog = DialogProvider.require(); - this.runtimePart = Soma.require() - .runtime(alertDialogMorfo, { - props: { - ariaLabel: () => this.resolvedAriaLabel - } - }) - .part('cancel', { id: opts.id, ref: opts.ref, owner: this, syncAttrs: true }); + this.soma = Soma.require(); + this.runtime = this.soma.runtime(alertDialogMorfo, { + props: { + ariaLabel: () => this.resolvedAriaLabel + } + }); + this.runtimePart = this.runtime.part('cancel', { + id: opts.id, + ref: opts.ref, + owner: this, + syncAttrs: true + }); } readonly resolvedAriaLabel = $derived.by( - () => this.opts.ariaLabel.current || this.soma?.langs.ts(ALERT_DIALOG_LANGS.CANCEL) + () => this.opts.ariaLabel.current || this.soma.langs.ts(ALERT_DIALOG_LANGS.CANCEL) ); readonly onclick = (_e: SomaMouseEvent) => { diff --git a/src/uix/soma/components/collapsible/collapsible-provider.svelte.ts b/src/uix/soma/components/collapsible/collapsible-provider.svelte.ts index bba291c4a..b900978d7 100644 --- a/src/uix/soma/components/collapsible/collapsible-provider.svelte.ts +++ b/src/uix/soma/components/collapsible/collapsible-provider.svelte.ts @@ -35,6 +35,7 @@ export class CollapsibleProvider { } readonly opts: CollapsibleOpts; + readonly soma: Soma; readonly runtime: SomaRuntime; readonly runtimePart: SomaRuntimePart; @@ -47,8 +48,8 @@ export class CollapsibleProvider { this.opts = opts; CollapsibleProvider.ctx.set(this); - const soma = Soma.require(); - this.runtime = soma.runtime(collapsibleMorfo, { + this.soma = Soma.require(); + this.runtime = this.soma.runtime(collapsibleMorfo, { states: { open: () => opts.open.current }, diff --git a/src/uix/soma/components/switch/switch-provider.svelte.ts b/src/uix/soma/components/switch/switch-provider.svelte.ts index da71e94fc..8b12c574d 100644 --- a/src/uix/soma/components/switch/switch-provider.svelte.ts +++ b/src/uix/soma/components/switch/switch-provider.svelte.ts @@ -55,6 +55,7 @@ export class SwitchProvider { readonly field = FieldProvider.get(); readonly runtime: SomaRuntime; readonly runtimePart: SomaRuntimePart; + readonly soma: Soma; private constructor(opts: SwitchOpts) { this.opts = opts; @@ -64,8 +65,8 @@ export class SwitchProvider { // attribute lands on this button. Direct assign — NOT $effect (A30). if (this.field) this.field.inputId.current = opts.id.current; - const soma = Soma.require(); - this.runtime = soma.runtime(switchMorfo, { + this.soma = Soma.require(); + this.runtime = this.soma.runtime(switchMorfo, { states: { checked: () => opts.checked.current }, diff --git a/src/uix/soma/components/toggle/toggle-provider.svelte.ts b/src/uix/soma/components/toggle/toggle-provider.svelte.ts index ea6307f7c..e4175b087 100644 --- a/src/uix/soma/components/toggle/toggle-provider.svelte.ts +++ b/src/uix/soma/components/toggle/toggle-provider.svelte.ts @@ -58,6 +58,7 @@ export class ToggleProvider { readonly field = FieldProvider.get(); readonly runtime: SomaRuntime; readonly runtimePart: SomaRuntimePart; + readonly soma: Soma; private constructor(opts: ToggleOpts) { this.opts = opts; @@ -74,8 +75,8 @@ export class ToggleProvider { // toggle. El handler flipea el estado bound. El gesto de contact // está implícito en el botón nativo; no se descompone en dos // eventos porque la operación es instantánea. - const soma = Soma.require(); - this.runtime = soma.runtime(toggleMorfo, { + this.soma = Soma.require(); + this.runtime = this.soma.runtime(toggleMorfo, { states: { on: () => opts.pressed.current },