@almadar/shell-web 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/AvlGlyph-6MA7AZBV.js +5 -0
  2. package/dist/AvlStateMachine-JC7L7XE4.js +8 -0
  3. package/dist/AvlTransitionDetail-DYNDVWPG.js +10 -0
  4. package/dist/AvlTransitionExplainer-2UZQADBO.js +11 -0
  5. package/dist/BehaviorView-GEXFDDJ4.js +10 -0
  6. package/dist/{FileTree-B3GDAjaQ.d.ts → FileTree-CYtJ4yHB.d.ts} +12 -2
  7. package/dist/FlowCanvas-FINBI4XQ.js +23 -0
  8. package/dist/{GameAudioProvider-BgWOOYT3.d.ts → GameAudioProvider-B8FBcGVE.d.ts} +1 -1
  9. package/dist/{KernelEngineContext-BPx-q0iw.d.ts → KernelEngineContext-6l6vkc50.d.ts} +1 -1
  10. package/dist/LayersPanel-RPYIG5OC.js +6 -0
  11. package/dist/ModuleCard-7WXCBELY.js +6 -0
  12. package/dist/OrbInspector-F5X7ZBNB.js +23 -0
  13. package/dist/OrbPreview-LQCUPAHB.js +23 -0
  14. package/dist/OrbPreview-V4VLWNMT.css +1754 -0
  15. package/dist/{Select-BJ8Fgc8A.d.ts → Select-DuX0Gvwo.d.ts} +14 -8
  16. package/dist/UISlotRenderer-RUI64CSS.js +23 -0
  17. package/dist/auth/react/index.js +4 -0
  18. package/dist/avl/index.d.ts +2 -2
  19. package/dist/avl/index.js +31 -31
  20. package/dist/{chunk-7UCL26QB.js → chunk-2X2SUH6H.js} +4 -4
  21. package/dist/{chunk-TAEOMNDK.js → chunk-6RVHS7VA.js} +44916 -44208
  22. package/dist/{chunk-RDPELAFQ.js → chunk-7GGUX2ER.js} +4 -4
  23. package/dist/{chunk-3YUMGEEW.js → chunk-AYQKZFUH.js} +1 -1
  24. package/dist/{chunk-S3LS3B7N.js → chunk-CB4POLGP.js} +1 -1
  25. package/dist/{chunk-LINJRTNB.js → chunk-FC3MXAFJ.js} +2 -2
  26. package/dist/{chunk-2LNXLMK3.js → chunk-FZOX7XTU.js} +41 -41
  27. package/dist/{chunk-CCO2ZH7F.js → chunk-GC7BGA5F.js} +3 -3
  28. package/dist/{chunk-ZDRDJKYB.js → chunk-MXN32OVV.js} +212 -20
  29. package/dist/{chunk-D5FJU4XC.js → chunk-OOG33EGF.js} +46 -14
  30. package/dist/{chunk-AU7O65OX.js → chunk-OXHXISFA.js} +1 -1
  31. package/dist/{chunk-PWXZN5G5.js → chunk-PD5QUVRE.js} +2 -2
  32. package/dist/{chunk-GHAF7QUD.js → chunk-QZ6TDP6I.js} +1 -1
  33. package/dist/{chunk-HA2BYO5E.js → chunk-R5Z655B4.js} +2 -2
  34. package/dist/{chunk-JEN4EIUF.js → chunk-RCB4CKRK.js} +1 -1
  35. package/dist/{chunk-AL2XXMYR.js → chunk-RQH6O76X.js} +20 -6
  36. package/dist/{chunk-3UQNFRYV.js → chunk-SO2MERCZ.js} +20 -25
  37. package/dist/{chunk-DPDKBY6Z.js → chunk-SVIH6ICP.js} +2 -1
  38. package/dist/{chunk-UFQLHCFJ.js → chunk-SZJEUMQ2.js} +2 -2
  39. package/dist/{chunk-V5SVGUYN.js → chunk-TDSE2L4F.js} +2 -2
  40. package/dist/{chunk-PCR37T3U.js → chunk-UUHF7XOZ.js} +9 -5
  41. package/dist/{chunk-B23EZH2P.js → chunk-VC5BOBVE.js} +3 -3
  42. package/dist/{chunk-LKL5RULQ.js → chunk-VQQEFPNX.js} +3 -2
  43. package/dist/{chunk-6RXP5ZXE.js → chunk-YNF2LH2I.js} +8 -8
  44. package/dist/{chunk-KTYOYEVA.js → chunk-YU2ZNLGI.js} +1 -1
  45. package/dist/{chunk-3DA36FOA.js → chunk-ZR2UDQOR.js} +2 -2
  46. package/dist/components/index.d.ts +295 -22
  47. package/dist/components/index.js +30 -25
  48. package/dist/context/index.js +3 -3
  49. package/dist/core.d.ts +23 -6
  50. package/dist/core.js +1 -1
  51. package/dist/{fx-Bx5RqplG.d.ts → fx-Bc3yEVED.d.ts} +2 -2
  52. package/dist/hooks/index.js +4 -4
  53. package/dist/index.d.ts +18 -5
  54. package/dist/index.js +4 -4
  55. package/dist/{kernel-client-NMZ56JVU.js → kernel-client-NSTJKR2U.js} +84 -35
  56. package/dist/{kernel-wire-CRsHtLsf.d.ts → kernel-wire-Ds7xSZzx.d.ts} +6 -0
  57. package/dist/lib/index.d.ts +2 -2
  58. package/dist/lib/index.js +3 -3
  59. package/dist/providers/index.d.ts +5 -5
  60. package/dist/providers/index.js +18 -18
  61. package/dist/runtime/index.d.ts +6 -2
  62. package/dist/runtime/index.js +17 -17
  63. package/dist/ssr/index.cjs +27 -4
  64. package/dist/ssr/index.d.cts +6 -0
  65. package/dist/ssr/index.d.ts +6 -0
  66. package/dist/ssr/index.js +27 -4
  67. package/dist/test-support.js +2 -2
  68. package/dist/{verificationRegistry-BLuQU1JV.d.ts → verificationRegistry-Dz5N0oxx.d.ts} +199 -8
  69. package/package.json +9 -9
  70. package/src/core/locales/ar.json +8 -1
  71. package/src/core/locales/en.json +8 -1
  72. package/src/core/locales/sl.json +8 -1
  73. package/dist/AvlGlyph-KZMJDBEB.js +0 -5
  74. package/dist/AvlStateMachine-KVZMFHFU.js +0 -8
  75. package/dist/AvlTransitionDetail-7DVGV27I.js +0 -10
  76. package/dist/AvlTransitionExplainer-RMJ5LQLK.js +0 -11
  77. package/dist/BehaviorView-EYRPME67.js +0 -10
  78. package/dist/FlowCanvas-J54627TC.js +0 -23
  79. package/dist/LayersPanel-PSXI4EHG.js +0 -6
  80. package/dist/ModuleCard-TNRLL45H.js +0 -6
  81. package/dist/OrbInspector-UBEQWWZ2.js +0 -23
  82. package/dist/UISlotRenderer-5OURMAP2.js +0 -23
@@ -1,8 +1,8 @@
1
- import { useContainerWidth, computeTraitLayout, roundedEdgePath } from './chunk-HA2BYO5E.js';
2
- import { AvlExplain, AvlEffectChip } from './chunk-V5SVGUYN.js';
3
- import { AVL_INK, AVL_FONT, AVL_STROKE, avlTint } from './chunk-3UQNFRYV.js';
1
+ import { useContainerWidth, computeTraitLayout, roundedEdgePath } from './chunk-R5Z655B4.js';
2
+ import { AvlExplain, AvlEffectChip } from './chunk-TDSE2L4F.js';
3
+ import { AVL_INK, AVL_FONT, AVL_STROKE, avlTint } from './chunk-SO2MERCZ.js';
4
4
  import { gearTeethPath } from './chunk-TZZBINQY.js';
5
- import { domPassthrough, useTranslate, useEventBus, useMediaQuery, Box, Typography, Button } from './chunk-D5FJU4XC.js';
5
+ import { domPassthrough, useTranslate, useEventBus, useMediaQuery, Box, Typography, Button } from './chunk-OOG33EGF.js';
6
6
  import { useState, useRef, useMemo, useEffect } from 'react';
7
7
  import { formatSExpr } from '@almadar/core';
8
8
  import { createLogger } from '@almadar/logger';
@@ -1,4 +1,4 @@
1
- import { useEventBus, useTranslate, Box, VStack, Icon, cn, Typography, Button, domPassthrough } from './chunk-D5FJU4XC.js';
1
+ import { useEventBus, useTranslate, Box, VStack, Icon, cn, Typography, Button, domPassthrough } from './chunk-OOG33EGF.js';
2
2
  import { EMPTY_STATE_MARKER } from '@almadar/core';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
 
@@ -1,4 +1,4 @@
1
- import { useEventBus, useTranslate } from './chunk-D5FJU4XC.js';
1
+ import { useEventBus, useTranslate } from './chunk-OOG33EGF.js';
2
2
  import { createContext, useMemo, useContext, useRef, useEffect, useCallback, useState } from 'react';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
  import { resolvePageMeta } from '@almadar/core';
@@ -1,5 +1,5 @@
1
- import { AvlTransitionDetail } from './chunk-6RXP5ZXE.js';
2
- import { Box, domPassthrough } from './chunk-D5FJU4XC.js';
1
+ import { AvlTransitionDetail } from './chunk-YNF2LH2I.js';
2
+ import { Box, domPassthrough } from './chunk-OOG33EGF.js';
3
3
  import { jsx } from 'react/jsx-runtime';
4
4
 
5
5
  var AvlTransitionExplainer = ({ orbitalName, traitName, transition, annotations, className, ...rest }) => {
@@ -1,6 +1,6 @@
1
1
  import { resolveThemeForRuntime, themeTokensToCssVars } from './chunk-3BBUBJFF.js';
2
2
  import { useUISlotManager } from './chunk-ANTJUQRD.js';
3
- import { useThemeScope, useTheme, keyInViewerMode, ThemeScopeContext, Box, cn } from './chunk-D5FJU4XC.js';
3
+ import { useThemeScope, useTheme, keyInViewerMode, ThemeScopeContext, Box, cn } from './chunk-OOG33EGF.js';
4
4
  import { createContext, useMemo, useContext, useCallback, useEffect } from 'react';
5
5
  import { jsx, Fragment } from 'react/jsx-runtime';
6
6
  import { ANONYMOUS_USER, isThemeRegistryKey, toPayloadValue } from '@almadar/core';
@@ -127,6 +127,46 @@ function useUserForEvaluation() {
127
127
  const { user, isLoggedIn } = useUser();
128
128
  return isLoggedIn && user ? user : void 0;
129
129
  }
130
+ var SURFACE = "h-full min-h-full bg-background surface-page text-foreground";
131
+ function useFontImport(href) {
132
+ useEffect(() => {
133
+ if (!href || typeof document === "undefined") return;
134
+ const existing = Array.from(document.head.querySelectorAll("link[data-almadar-font]")).some((el) => el.getAttribute("href") === href);
135
+ if (existing) return;
136
+ const link = document.createElement("link");
137
+ link.rel = "stylesheet";
138
+ link.href = href;
139
+ link.setAttribute("data-almadar-font", "");
140
+ document.head.appendChild(link);
141
+ }, [href]);
142
+ }
143
+ function OrbitalThemeProvider({ theme: declared, override, children }) {
144
+ const parent = useThemeScope();
145
+ const hostOverride = override || parent.override || void 0;
146
+ const theme = hostOverride ?? declared;
147
+ const resolved = resolveThemeForRuntime(theme);
148
+ const { resolvedMode, availableThemes } = useTheme();
149
+ const darkTypeScale = resolvedMode === "dark" ? resolved?.variants?.dark?.typeScale : void 0;
150
+ useFontImport(darkTypeScale?.fontImport ?? resolved?.tokens.typeScale?.fontImport);
151
+ if (isThemeRegistryKey(theme)) {
152
+ const inherited = !override && parent.override ? { key: parent.override, mode: parent.mode } : void 0;
153
+ const { key, mode: keyMode } = inherited ?? keyInViewerMode(theme, availableThemes, resolvedMode);
154
+ const mode = keyMode ?? parent.mode;
155
+ return /* @__PURE__ */ jsx(
156
+ ThemeScopeContext.Provider,
157
+ {
158
+ value: hostOverride ? { ...parent, theme: key, mode, vars: void 0, override: key } : { ...parent, theme: key, mode },
159
+ children: /* @__PURE__ */ jsx(Box, { "data-theme": key, className: cn(SURFACE, keyMode), children })
160
+ }
161
+ );
162
+ }
163
+ if (!resolved) {
164
+ return /* @__PURE__ */ jsx(Fragment, { children });
165
+ }
166
+ const vars = themeTokensToCssVars(resolved.tokens, resolvedMode, resolved.variants?.dark);
167
+ return /* @__PURE__ */ jsx(ThemeScopeContext.Provider, { value: { ...parent, vars: { ...parent.vars, ...vars } }, children: /* @__PURE__ */ jsx(Box, { "data-orbital-theme": resolved.name, className: SURFACE, style: vars, children }) });
168
+ }
169
+ OrbitalThemeProvider.displayName = "OrbitalThemeProvider";
130
170
  var DESIGN_COLOR_TOKENS = [
131
171
  "primary",
132
172
  "primary-foreground",
@@ -517,45 +557,5 @@ function useArbitraryClassStyles(schema) {
517
557
  });
518
558
  }, [compile, classes]);
519
559
  }
520
- var SURFACE = "h-full min-h-full bg-background surface-page text-foreground";
521
- function useFontImport(href) {
522
- useEffect(() => {
523
- if (!href || typeof document === "undefined") return;
524
- const existing = Array.from(document.head.querySelectorAll("link[data-almadar-font]")).some((el) => el.getAttribute("href") === href);
525
- if (existing) return;
526
- const link = document.createElement("link");
527
- link.rel = "stylesheet";
528
- link.href = href;
529
- link.setAttribute("data-almadar-font", "");
530
- document.head.appendChild(link);
531
- }, [href]);
532
- }
533
- function OrbitalThemeProvider({ theme: declared, override, children }) {
534
- const parent = useThemeScope();
535
- const hostOverride = override || parent.override || void 0;
536
- const theme = hostOverride ?? declared;
537
- const resolved = resolveThemeForRuntime(theme);
538
- const { resolvedMode, availableThemes } = useTheme();
539
- const darkTypeScale = resolvedMode === "dark" ? resolved?.variants?.dark?.typeScale : void 0;
540
- useFontImport(darkTypeScale?.fontImport ?? resolved?.tokens.typeScale?.fontImport);
541
- if (isThemeRegistryKey(theme)) {
542
- const inherited = !override && parent.override ? { key: parent.override, mode: parent.mode } : void 0;
543
- const { key, mode: keyMode } = inherited ?? keyInViewerMode(theme, availableThemes, resolvedMode);
544
- const mode = keyMode ?? parent.mode;
545
- return /* @__PURE__ */ jsx(
546
- ThemeScopeContext.Provider,
547
- {
548
- value: hostOverride ? { ...parent, theme: key, mode, vars: void 0, override: key } : { ...parent, theme: key, mode },
549
- children: /* @__PURE__ */ jsx(Box, { "data-theme": key, className: cn(SURFACE, keyMode), children })
550
- }
551
- );
552
- }
553
- if (!resolved) {
554
- return /* @__PURE__ */ jsx(Fragment, { children });
555
- }
556
- const vars = themeTokensToCssVars(resolved.tokens, resolvedMode, resolved.variants?.dark);
557
- return /* @__PURE__ */ jsx(ThemeScopeContext.Provider, { value: { ...parent, vars: { ...parent.vars, ...vars } }, children: /* @__PURE__ */ jsx(Box, { "data-orbital-theme": resolved.name, className: SURFACE, style: vars, children }) });
558
- }
559
- OrbitalThemeProvider.displayName = "OrbitalThemeProvider";
560
560
 
561
561
  export { ARBITRARY_CLASS_STYLE_ID, ArbitraryClassCompilerProvider, CurrentPagePathContext, CurrentPagePathProvider, DESIGN_COLOR_TOKENS, DESIGN_RADIUS_TOKENS, DESIGN_SPACING_SCALE, OrbitalThemeProvider, UISlotContext, UISlotProvider, UserContext, UserProvider, defaultSpacingStepPx, isArbitraryClass, layoutOf, positionOf, resetArbitraryClassStyles, sizeLimitOf, sizingOf, snapToSpacingStep, spacingOf, spacingTokenOf, tokenOfDesignClass, useArbitraryClassStyles, useCurrentPagePath, useHasPermission, useHasRole, useSlotContent, useSlotHasContent, useUISlots, useUser, useUserForEvaluation, withLayout, withPosition, withSizeLimit, withSizing, withSpacing };
@@ -1,6 +1,6 @@
1
- import { AvlFieldType, AvlState, AvlPage, AvlEntity } from './chunk-DPDKBY6Z.js';
2
- import { OPERATOR_CATEGORY_COLORS, AvlEffect } from './chunk-3UQNFRYV.js';
3
- import { useTranslate, Box, Typography, domPassthrough } from './chunk-D5FJU4XC.js';
1
+ import { AvlFieldType, AvlState, AvlPage, AvlEntity } from './chunk-SVIH6ICP.js';
2
+ import { OPERATOR_CATEGORY_COLORS, AvlEffect } from './chunk-SO2MERCZ.js';
3
+ import { useTranslate, Box, Typography, domPassthrough } from './chunk-OOG33EGF.js';
4
4
  import React, { useRef, useState, useLayoutEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,30 +1,110 @@
1
1
  import { __export, __reExport } from './chunk-G7DCAZ22.js';
2
+ import { instancesForLocale, orbitalInlineEntities, storesRowsInBrowser, isRoutePage, tickEventKey, isJsonObject } from '@almadar/core';
3
+ import { createLogger, isLogLevelEnabled } from '@almadar/logger';
4
+ import { HostAskError, consentFromRedirect, performHostAnswer, hostAskReturn } from '@almadar/shell-runtime/kernel/host';
2
5
  import { NativeMemoryPersistenceAdapter } from '@almadar/shell-runtime/persistence/native-memory';
3
6
  import * as local_store_transport_star from '@almadar/shell-runtime/runtime/evaluation/local-store-transport';
4
7
  import { openLocalKernel as openLocalKernel$1 } from '@almadar/shell-runtime/runtime/evaluation/local-store-transport';
5
8
  import { readPageFacts } from '@almadar/shell-browser/page-facts';
6
- import { instancesForLocale, orbitalInlineEntities, storesRowsInBrowser, isRoutePage, tickEventKey, isJsonObject } from '@almadar/core';
7
- import { createLogger, isLogLevelEnabled } from '@almadar/logger';
8
- import { HostAskError, consentFromRedirect, performHostAnswer, hostAskReturn } from '@almadar/shell-runtime/kernel/host';
9
9
  import { dispatchDeclaredInput } from '@almadar/shell-runtime/client/declared-input-dispatch';
10
10
  import { IndexedDbPersistence } from '@almadar/shell-browser/storage';
11
11
  export { eventRouteKey } from '@almadar/shell-runtime/runtime/events/identity/routing';
12
12
  export { createResidenceTransport } from '@almadar/shell-runtime/runtime/evaluation/residence-transport';
13
13
 
14
- function hasMemoryStore(kernel) {
15
- return "MemoryStore" in kernel;
14
+ var context;
15
+ var buffers = /* @__PURE__ */ new Map();
16
+ var voices = /* @__PURE__ */ new Map();
17
+ function audioContext() {
18
+ if (context !== void 0) return context;
19
+ if (typeof AudioContext === "undefined") return void 0;
20
+ context = new AudioContext();
21
+ return context;
22
+ }
23
+ function load(ctx, source) {
24
+ const cached = buffers.get(source);
25
+ if (cached !== void 0) return cached;
26
+ const pending = (async () => {
27
+ const response = await fetch(source);
28
+ if (!response.ok) throw new Error(`audio/schedule: ${source} did not load (${response.status})`);
29
+ return ctx.decodeAudioData(await response.arrayBuffer());
30
+ })();
31
+ buffers.set(source, pending);
32
+ pending.catch(() => buffers.delete(source));
33
+ return pending;
34
+ }
35
+ function begin(ctx, buffer, spec) {
36
+ const previous = voices.get(spec.key);
37
+ if (previous !== void 0) previous.source.stop(spec.at);
38
+ const source = ctx.createBufferSource();
39
+ const gain = ctx.createGain();
40
+ source.buffer = buffer;
41
+ source.playbackRate.value = spec.rate;
42
+ gain.gain.value = spec.gain;
43
+ source.connect(gain);
44
+ gain.connect(ctx.destination);
45
+ const voice = { source, gain, gainValue: spec.gain, rateValue: spec.rate, ended: false };
46
+ voices.set(spec.key, voice);
47
+ source.onended = () => {
48
+ voice.ended = true;
49
+ };
50
+ if (spec.duration !== void 0) source.start(spec.at, spec.offset, spec.duration);
51
+ else source.start(spec.at, spec.offset);
52
+ }
53
+ async function scheduleAudio(commands) {
54
+ const ctx = audioContext();
55
+ if (ctx === void 0) throw new HostAskError("unavailable", "audio/schedule: this environment has no AudioContext");
56
+ const known = new Set(voices.keys());
57
+ for (const command of commands) {
58
+ if ("start" in command) known.add(command.start.key);
59
+ else if ("stop" in command) {
60
+ if (!known.has(command.stop.key)) throw new HostAskError("invalid", `audio/schedule: no voice named ${command.stop.key} was started`);
61
+ known.delete(command.stop.key);
62
+ } else if (!known.has(command.ramp.key)) throw new HostAskError("invalid", `audio/schedule: no voice named ${command.ramp.key} was started`);
63
+ }
64
+ try {
65
+ await ctx.resume();
66
+ const decoded = /* @__PURE__ */ new Map();
67
+ for (const command of commands) {
68
+ if ("start" in command && !decoded.has(command.start.source)) decoded.set(command.start.source, await load(ctx, command.start.source));
69
+ }
70
+ for (const command of commands) {
71
+ if ("start" in command) {
72
+ const buffer = decoded.get(command.start.source);
73
+ if (buffer === void 0) throw new HostAskError("unavailable", `audio/schedule: ${command.start.source} was not decoded`);
74
+ begin(ctx, buffer, command.start);
75
+ continue;
76
+ }
77
+ const key = "stop" in command ? command.stop.key : command.ramp.key;
78
+ const voice = voices.get(key);
79
+ if (voice === void 0) throw new HostAskError("invalid", `audio/schedule: no voice named ${key} was started`);
80
+ if ("stop" in command) {
81
+ if (!voice.ended) voice.source.stop(command.stop.at);
82
+ voices.delete(key);
83
+ continue;
84
+ }
85
+ if (voice.ended) continue;
86
+ const { param, value, at, endAt, curve } = command.ramp;
87
+ const target = param === "gain" ? voice.gain.gain : voice.source.playbackRate;
88
+ target.setValueAtTime(param === "gain" ? voice.gainValue : voice.rateValue, at);
89
+ if (curve === "linear") target.linearRampToValueAtTime(value, endAt);
90
+ else target.exponentialRampToValueAtTime(value, endAt);
91
+ if (param === "gain") voice.gainValue = value;
92
+ else voice.rateValue = value;
93
+ }
94
+ } catch (error) {
95
+ if (error instanceof HostAskError) throw error;
96
+ throw new HostAskError("unavailable", error instanceof Error ? error.message : String(error));
97
+ }
16
98
  }
17
- function nativeMemoryPersistence(kernel) {
18
- if (!hasMemoryStore(kernel)) throw new Error("nativeMemoryPersistence: this kernel module exports no MemoryStore; install a kernel build that carries it");
19
- return new NativeMemoryPersistenceAdapter(new kernel.MemoryStore());
99
+ async function readAudioClock() {
100
+ const ctx = audioContext();
101
+ if (ctx === void 0) throw new HostAskError("unavailable", "audio/clock: this environment has no AudioContext");
102
+ if (typeof ctx.getOutputTimestamp === "function") {
103
+ const { contextTime, performanceTime } = ctx.getOutputTimestamp();
104
+ if (contextTime !== void 0 && performanceTime !== void 0) return { audio: contextTime, wall: performance.timeOrigin + performanceTime };
105
+ }
106
+ return { audio: ctx.currentTime, wall: performance.timeOrigin + performance.now() };
20
107
  }
21
-
22
- // src/runtime/evaluation/local-store-transport.ts
23
- var local_store_transport_exports = {};
24
- __export(local_store_transport_exports, {
25
- openLocalKernel: () => openLocalKernel
26
- });
27
- __reExport(local_store_transport_exports, local_store_transport_star);
28
108
  var POLL_MS = 250;
29
109
  function consentByPopup(env) {
30
110
  return async (request) => {
@@ -94,6 +174,8 @@ var webHostActions = {
94
174
  get signIn() {
95
175
  return signInHost;
96
176
  },
177
+ audioSchedule: scheduleAudio,
178
+ audioClock: readAudioClock,
97
179
  get consent() {
98
180
  return consentHost ?? (typeof window === "undefined" ? void 0 : consentByPopup(browserConsentEnv(window)));
99
181
  }
@@ -110,11 +192,13 @@ function streamTrace(args, completion, dispatch, source) {
110
192
  const named = options !== void 0 && options !== null && isJsonObject(options) ? options["traits"] : void 0;
111
193
  const traits = Array.isArray(named) ? named.flatMap((t) => typeof t === "string" ? [t] : []) : [];
112
194
  if (traits.length === 0) return refuse("program/live trace: name the traits it observes in `traits`");
195
+ const cost = options !== void 0 && options !== null && isJsonObject(options) ? options["cost"] : void 0;
196
+ if (cost !== void 0 && cost !== null && typeof cost !== "boolean") return refuse("program/live trace: cost must be a boolean when supplied");
113
197
  if (source === void 0 || dispatch === void 0) return refuse("program/live trace: this host has no kernel trace to stream");
114
198
  if (traceStreams.has(key)) return refuse(`key ${key} already has a stream open`);
115
199
  traceStreams.set(key, source(traits, (item) => {
116
200
  void dispatch(trait, onMessage, { ...item, key, ...completion.entityId !== void 0 ? { entityId: completion.entityId } : {} }).catch((error) => log.error("trace item return failed", { trait, key, error: error.message }));
117
- }));
201
+ }, cost === true));
118
202
  }
119
203
  function cancelStreams(args) {
120
204
  const named = args[0];
@@ -138,8 +222,20 @@ async function answerHostAsk(op, args, completion, dispatch, trace) {
138
222
  }
139
223
  await dispatch(returned.trait, returned.event, returned.entityId !== void 0 ? { ...returned.payload, entityId: returned.entityId } : returned.payload);
140
224
  }
225
+ function hasMemoryStore(kernel) {
226
+ return "MemoryStore" in kernel;
227
+ }
228
+ function nativeMemoryPersistence(kernel) {
229
+ if (!hasMemoryStore(kernel)) throw new Error("nativeMemoryPersistence: this kernel module exports no MemoryStore; install a kernel build that carries it");
230
+ return new NativeMemoryPersistenceAdapter(new kernel.MemoryStore());
231
+ }
141
232
 
142
233
  // src/runtime/evaluation/local-store-transport.ts
234
+ var local_store_transport_exports = {};
235
+ __export(local_store_transport_exports, {
236
+ openLocalKernel: () => openLocalKernel
237
+ });
238
+ __reExport(local_store_transport_exports, local_store_transport_star);
143
239
  function openLocalKernel(options) {
144
240
  return openLocalKernel$1({ ...options, pageFacts: options.pageFacts ?? readPageFacts, hostActions: options.hostActions ?? webHostActions });
145
241
  }
@@ -205,14 +301,110 @@ async function persistedMemory(kernel, database, entities, locale) {
205
301
  function browserStoreName(appName, locale) {
206
302
  return locale !== void 0 ? `almadar:${appName}:${locale}` : `almadar:${appName}`;
207
303
  }
208
- async function openBrowserStore(databaseName, orbitals, factory) {
304
+ function tableOf(entity) {
305
+ return entity.collection ?? entity.name;
306
+ }
307
+ async function moveTypeStores(factory, databaseName, entities) {
308
+ const collections = new Set(entities.map(tableOf));
309
+ const current = await new Promise((resolve, reject) => {
310
+ const req = factory.open(databaseName);
311
+ req.onsuccess = () => resolve(req.result);
312
+ req.onerror = () => reject(req.error);
313
+ });
314
+ const stale = entities.filter((e) => tableOf(e) !== e.name && !collections.has(e.name) && current.objectStoreNames.contains(e.name));
315
+ const next = current.version + 1;
316
+ current.close();
317
+ if (stale.length === 0) return;
318
+ await new Promise((resolve, reject) => {
319
+ const req = factory.open(databaseName, next);
320
+ req.onupgradeneeded = () => {
321
+ const db = req.result;
322
+ const tx = req.transaction;
323
+ if (tx === null) return;
324
+ const moveOne = (index) => {
325
+ const entity = stale[index];
326
+ if (entity === void 0) return;
327
+ const target = tableOf(entity);
328
+ if (!db.objectStoreNames.contains(target)) db.createObjectStore(target, { keyPath: "id" });
329
+ const old = tx.objectStore(entity.name);
330
+ const destination = tx.objectStore(target);
331
+ const rows = old.getAll();
332
+ rows.onsuccess = () => {
333
+ const keys = destination.getAllKeys();
334
+ keys.onsuccess = () => {
335
+ const present = new Set(keys.result);
336
+ for (const row of rows.result) if (!present.has(row.id)) destination.put(row);
337
+ db.deleteObjectStore(entity.name);
338
+ moveOne(index + 1);
339
+ };
340
+ };
341
+ };
342
+ moveOne(0);
343
+ };
344
+ req.onsuccess = () => {
345
+ req.result.close();
346
+ resolve();
347
+ };
348
+ req.onerror = () => reject(req.error);
349
+ req.onblocked = () => reject(new Error(`browser store "${databaseName}" is open in another context and cannot be upgraded`));
350
+ });
351
+ }
352
+ async function adoptDatabase(factory, formerName, entities, target) {
353
+ await moveTypeStores(factory, formerName, entities);
354
+ const tables = [...new Set(entities.map(tableOf))];
355
+ const former = await new Promise((resolve, reject) => {
356
+ const req = factory.open(formerName);
357
+ req.onsuccess = () => resolve(req.result);
358
+ req.onerror = () => reject(req.error);
359
+ });
360
+ const held = /* @__PURE__ */ new Map();
361
+ try {
362
+ for (const table of tables) {
363
+ if (!former.objectStoreNames.contains(table)) continue;
364
+ const rows = await new Promise((resolve, reject) => {
365
+ const req = former.transaction(table, "readonly").objectStore(table).getAll();
366
+ req.onsuccess = () => resolve(req.result);
367
+ req.onerror = () => reject(req.error);
368
+ });
369
+ held.set(table, rows);
370
+ }
371
+ } finally {
372
+ former.close();
373
+ }
374
+ for (const [table, rows] of held) {
375
+ const present = new Set((await target.list(table)).map((row) => row.id));
376
+ for (const row of rows) if (!present.has(row.id)) await target.create(table, row);
377
+ }
378
+ await new Promise((resolve, reject) => {
379
+ const req = factory.deleteDatabase(formerName);
380
+ req.onsuccess = () => resolve();
381
+ req.onerror = () => reject(req.error);
382
+ req.onblocked = () => reject(new Error(`browser store "${formerName}" is open in another context and cannot be removed`));
383
+ });
384
+ }
385
+ async function openBrowserStore(databaseName, orbitals, factory, formerDatabaseName) {
209
386
  const entities = orbitals.flatMap(orbitalInlineEntities).filter(storesRowsInBrowser);
210
387
  if (entities.length === 0) return null;
211
- return IndexedDbPersistence.open({
388
+ const idb = factory ?? globalThis.indexedDB;
389
+ if (!idb) throw new Error("IndexedDbPersistence: this environment has no IndexedDB");
390
+ await moveTypeStores(idb, databaseName, entities);
391
+ const tables = new Map(entities.map((e) => [e.name, tableOf(e)]));
392
+ const table = (entityType) => tables.get(entityType) ?? entityType;
393
+ const database = await IndexedDbPersistence.open({
212
394
  databaseName,
213
- entityTypes: entities.map((e) => e.name),
214
- ...factory !== void 0 ? { factory } : {}
395
+ entityTypes: [...new Set(tables.values())],
396
+ factory: idb
215
397
  });
398
+ if (formerDatabaseName !== void 0 && formerDatabaseName !== databaseName) {
399
+ await adoptDatabase(idb, formerDatabaseName, entities, database);
400
+ }
401
+ return {
402
+ create: (entityType, data) => database.create(table(entityType), data),
403
+ delete: (entityType, id) => database.delete(table(entityType), id),
404
+ list: (entityType) => database.list(table(entityType)),
405
+ changes: () => database.changes(),
406
+ close: () => database.close()
407
+ };
216
408
  }
217
409
  function browserEntities(orbitals) {
218
410
  return orbitals.flatMap(orbitalInlineEntities).filter(storesRowsInBrowser);
@@ -3,7 +3,7 @@ import React44__default, { useRef, useEffect, createContext, useCallback, useSta
3
3
  import { clsx } from 'clsx';
4
4
  import { extendTailwindMerge } from 'tailwind-merge';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
- import { createLogger } from '@almadar/logger';
6
+ import { createLogger, isLogLevelEnabled } from '@almadar/logger';
7
7
  import { X, Loader2, HelpCircle, ArrowDownNarrowWide, ArrowUpNarrowWide, Share2, RefreshCw, VolumeX, Volume2, Square, Trash2 } from 'lucide-react';
8
8
  import dynamicIconImports from 'lucide-react/dynamicIconImports.mjs';
9
9
  import themeToggleEn from '@almadar/std/ui-theme-toggle-locales/en';
@@ -252,11 +252,9 @@ function hasMatchMedia() {
252
252
  function usePrefersReducedMotion() {
253
253
  return useMediaQuery("(prefers-reduced-motion: reduce)");
254
254
  }
255
- var busLog = createLogger("almadar:eventbus");
256
- var subLog = createLogger("almadar:eventbus:subscribe");
257
- var EventBusContext = globalThis.__almadarUiEventBusContext ?? (globalThis.__almadarUiEventBusContext = createContext(null));
258
- var listenerTags = /* @__PURE__ */ new WeakMap();
259
- function captureSubscriberTag(listener) {
255
+ var TAG_READERS = ["almadar:eventbus", "almadar:eventbus:subscribe"];
256
+ function subscriberTag(listener) {
257
+ if (!TAG_READERS.some((ns) => isLogLevelEnabled("DEBUG", ns))) return void 0;
260
258
  const fnName = listener.name;
261
259
  if (typeof fnName === "string" && fnName.length > 0 && fnName !== "listener") {
262
260
  return fnName;
@@ -266,14 +264,18 @@ function captureSubscriberTag(listener) {
266
264
  for (const raw of lines.slice(2)) {
267
265
  const line = raw.trim();
268
266
  if (!line) continue;
269
- if (line.includes("EventBusProvider") || line.includes("useEventBus")) continue;
270
- if (line.includes("captureSubscriberTag")) continue;
267
+ if (line.includes("EventBusProvider") || line.includes("useEventBus") || line.includes("subscriber-tag")) continue;
268
+ if (line.includes("subscriberTag")) continue;
271
269
  const match = line.match(/([^/\\)]+\.(?:tsx?|jsx?))(?::(\d+))?/);
272
270
  if (match) return match[2] ? `${match[1]}:${match[2]}` : match[1];
273
271
  return line.slice(0, 120);
274
272
  }
275
273
  return "unknown";
276
274
  }
275
+ var busLog = createLogger("almadar:eventbus");
276
+ var subLog = createLogger("almadar:eventbus:subscribe");
277
+ var EventBusContext = globalThis.__almadarUiEventBusContext ?? (globalThis.__almadarUiEventBusContext = createContext(null));
278
+ var listenerTags = /* @__PURE__ */ new WeakMap();
277
279
  function EventBusProvider({ children, isolated = false }) {
278
280
  const listenersRef = useRef(/* @__PURE__ */ new Map());
279
281
  const anyListenersRef = useRef(/* @__PURE__ */ new Set());
@@ -347,7 +349,10 @@ function EventBusProvider({ children, isolated = false }) {
347
349
  }
348
350
  const listeners2 = listenersRef.current.get(type);
349
351
  listeners2.add(listener);
350
- if (!listenerTags.has(listener)) listenerTags.set(listener, captureSubscriberTag(listener));
352
+ if (!listenerTags.has(listener)) {
353
+ const tag = subscriberTag(listener);
354
+ if (tag !== void 0) listenerTags.set(listener, tag);
355
+ }
351
356
  subLog.debug("subscribe", { type, totalListeners: listeners2.size, tag: listenerTags.get(listener) });
352
357
  return () => {
353
358
  listeners2.delete(listener);
@@ -370,7 +375,10 @@ function EventBusProvider({ children, isolated = false }) {
370
375
  }, []);
371
376
  const onAny = useCallback((listener) => {
372
377
  anyListenersRef.current.add(listener);
373
- if (!listenerTags.has(listener)) listenerTags.set(listener, captureSubscriberTag(listener));
378
+ if (!listenerTags.has(listener)) {
379
+ const tag = subscriberTag(listener);
380
+ if (tag !== void 0) listenerTags.set(listener, tag);
381
+ }
374
382
  subLog.debug("subscribe:any", { totalAnyListeners: anyListenersRef.current.size, tag: listenerTags.get(listener) });
375
383
  return () => {
376
384
  anyListenersRef.current.delete(listener);
@@ -2784,6 +2792,10 @@ var en_default = {
2784
2792
  "upload.error.maxFiles": "Maximum {{count}} files allowed",
2785
2793
  "upload.error.invalidType": "Invalid file type: {{name}}",
2786
2794
  "upload.error.tooLarge": "File too large: {{name}} (max {{size}})",
2795
+ "upload.error.partial": "Some files could not be added: {{details}}",
2796
+ "upload.reason.invalidType": "invalid type",
2797
+ "upload.reason.tooLarge": "too large, max {{size}}",
2798
+ "upload.reason.overLimit": "over the {{count}} file limit",
2787
2799
  "optionConstraint.requiredOne": "Required, pick 1",
2788
2800
  "optionConstraint.optionalOne": "Optional, pick up to 1",
2789
2801
  "optionConstraint.pickExactly": "Pick exactly {{count}}",
@@ -3279,6 +3291,7 @@ var en_default = {
3279
3291
  "selection.note": "Note",
3280
3292
  "selection.toolbar": "Selection actions",
3281
3293
  "qrScanner.apiUnavailable": "Camera API not available in this environment",
3294
+ "qrScanner.decoderUnavailable": "No barcode reader is available in this browser",
3282
3295
  "aria.videoEmbed": "Video player",
3283
3296
  "videoEmbed.apiUnavailable": "The video player could not be loaded",
3284
3297
  "videoEmbed.invalidVideo": "The video address is not valid",
@@ -3602,7 +3615,9 @@ var en_default = {
3602
3615
  "themeToggle.light": "Light",
3603
3616
  "themeToggle.dark": "Dark",
3604
3617
  "agentActivity.toolDone": "{{tool}} \u2014 done",
3605
- "agentActivity.toolFailed": "{{tool}} \u2014 failed"
3618
+ "agentActivity.toolFailed": "{{tool}} \u2014 failed",
3619
+ "aria.annotatedMedia": "Media to review",
3620
+ "aria.annotatedTimeline": "Comment timeline"
3606
3621
  };
3607
3622
 
3608
3623
  // src/core/lib/format.ts
@@ -4173,6 +4188,10 @@ var ar_default = {
4173
4188
  "upload.error.maxFiles": "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0627\u0644\u0645\u0633\u0645\u0648\u062D \u0628\u0647 {{count}} \u0645\u0644\u0641\u0627\u062A",
4174
4189
  "upload.error.invalidType": "\u0646\u0648\u0639 \u0645\u0644\u0641 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D: {{name}}",
4175
4190
  "upload.error.tooLarge": "\u0627\u0644\u0645\u0644\u0641 \u0643\u0628\u064A\u0631 \u062C\u062F\u064B\u0627: {{name}} (\u0627\u0644\u0623\u0642\u0635\u0649 {{size}})",
4191
+ "upload.error.partial": "\u062A\u0639\u0630\u0651\u0631\u062A \u0625\u0636\u0627\u0641\u0629 \u0628\u0639\u0636 \u0627\u0644\u0645\u0644\u0641\u0627\u062A: {{details}}",
4192
+ "upload.reason.invalidType": "\u0646\u0648\u0639 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",
4193
+ "upload.reason.tooLarge": "\u0643\u0628\u064A\u0631 \u062C\u062F\u064B\u0627\u060C \u0627\u0644\u0623\u0642\u0635\u0649 {{size}}",
4194
+ "upload.reason.overLimit": "\u064A\u062A\u062C\u0627\u0648\u0632 \u062D\u062F {{count}} \u0645\u0644\u0641\u0627\u062A",
4176
4195
  "optionConstraint.requiredOne": "\u0645\u0637\u0644\u0648\u0628\u060C \u0627\u062E\u062A\u0631 1",
4177
4196
  "optionConstraint.optionalOne": "\u0627\u062E\u062A\u064A\u0627\u0631\u064A\u060C \u0627\u062E\u062A\u0631 \u062D\u062A\u0649 1",
4178
4197
  "optionConstraint.pickExactly": "\u0627\u062E\u062A\u0631 \u0628\u0627\u0644\u0636\u0628\u0637 {{count}}",
@@ -4672,6 +4691,7 @@ var ar_default = {
4672
4691
  "selection.note": "\u0645\u0644\u0627\u062D\u0638\u0629",
4673
4692
  "selection.toolbar": "\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0627\u0644\u062A\u062D\u062F\u064A\u062F",
4674
4693
  "qrScanner.apiUnavailable": "\u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D\u0629 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0628\u064A\u0626\u0629",
4694
+ "qrScanner.decoderUnavailable": "\u0642\u0627\u0631\u0626 \u0627\u0644\u0631\u0645\u0648\u0632 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D",
4675
4695
  "aria.videoEmbed": "\u0645\u0634\u063A\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648",
4676
4696
  "videoEmbed.apiUnavailable": "\u062A\u0639\u0630\u0631 \u062A\u062D\u0645\u064A\u0644 \u0645\u0634\u063A\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648",
4677
4697
  "videoEmbed.invalidVideo": "\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D",
@@ -4995,7 +5015,9 @@ var ar_default = {
4995
5015
  "themeToggle.light": "\u0641\u0627\u062A\u062D",
4996
5016
  "themeToggle.dark": "\u062F\u0627\u0643\u0646",
4997
5017
  "agentActivity.toolDone": "{{tool}} \u2014 \u062A\u0645",
4998
- "agentActivity.toolFailed": "{{tool}} \u2014 \u062A\u0639\u0630\u0651\u0631"
5018
+ "agentActivity.toolFailed": "{{tool}} \u2014 \u062A\u0639\u0630\u0651\u0631",
5019
+ "aria.annotatedMedia": "\u0648\u0633\u0627\u0626\u0637 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
5020
+ "aria.annotatedTimeline": "\u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u0644\u0644\u062A\u0639\u0644\u064A\u0642\u0627\u062A"
4999
5021
  };
5000
5022
 
5001
5023
  // src/core/locales/sl.json
@@ -5460,6 +5482,10 @@ var sl_default = {
5460
5482
  "upload.error.maxFiles": "Dovoljenih je najve\u010D {{count}} datotek",
5461
5483
  "upload.error.invalidType": "Neveljavna vrsta datoteke: {{name}}",
5462
5484
  "upload.error.tooLarge": "Datoteka prevelika: {{name}} (najve\u010D {{size}})",
5485
+ "upload.error.partial": "Nekaterih datotek ni bilo mogo\u010De dodati: {{details}}",
5486
+ "upload.reason.invalidType": "neveljavna vrsta",
5487
+ "upload.reason.tooLarge": "prevelika, najve\u010D {{size}}",
5488
+ "upload.reason.overLimit": "presega omejitev {{count}} datotek",
5463
5489
  "optionConstraint.requiredOne": "Obvezno, izberite 1",
5464
5490
  "optionConstraint.optionalOne": "Neobvezno, izberite do 1",
5465
5491
  "optionConstraint.pickExactly": "Izberite natanko {{count}}",
@@ -5959,6 +5985,7 @@ var sl_default = {
5959
5985
  "selection.note": "Opomba",
5960
5986
  "selection.toolbar": "Dejanja izbora",
5961
5987
  "qrScanner.apiUnavailable": "API kamere v tem okolju ni na voljo",
5988
+ "qrScanner.decoderUnavailable": "Bralnik kod v tem brskalniku ni na voljo",
5962
5989
  "aria.videoEmbed": "Video predvajalnik",
5963
5990
  "videoEmbed.apiUnavailable": "Video predvajalnika ni bilo mogo\u010De nalo\u017Eiti",
5964
5991
  "videoEmbed.invalidVideo": "Naslov videa ni veljaven",
@@ -6282,7 +6309,9 @@ var sl_default = {
6282
6309
  "themeToggle.light": "Svetla",
6283
6310
  "themeToggle.dark": "Temna",
6284
6311
  "agentActivity.toolDone": "{{tool}} \u2014 kon\u010Dano",
6285
- "agentActivity.toolFailed": "{{tool}} \u2014 ni uspelo"
6312
+ "agentActivity.toolFailed": "{{tool}} \u2014 ni uspelo",
6313
+ "aria.annotatedMedia": "Gradivo za pregled",
6314
+ "aria.annotatedTimeline": "\u010Casovnica komentarjev"
6286
6315
  };
6287
6316
  var { $meta: _meta2, ...coreMessages2 } = en_default;
6288
6317
  var withThemeToggle = (messages, labels) => ({
@@ -8694,6 +8723,7 @@ var Stack = ({
8694
8723
  };
8695
8724
  const isHorizontal = direction === "horizontal";
8696
8725
  const directionClass = responsive && isHorizontal ? reverse ? "flex-col-reverse md:flex-row-reverse" : "flex-col md:flex-row" : isHorizontal ? reverse ? "flex-row-reverse" : "flex-row" : reverse ? "flex-col-reverse" : "flex-col";
8726
+ const fullWidthChildren = align === "center" ? isHorizontal ? responsive && "max-md:[&>.w-full]:self-stretch" : "[&>.w-full]:self-stretch" : void 0;
8697
8727
  return React44__default.createElement(
8698
8728
  Component,
8699
8729
  {
@@ -8703,6 +8733,7 @@ var Stack = ({
8703
8733
  directionClass,
8704
8734
  gapStyles[gap],
8705
8735
  alignStyles[align],
8736
+ fullWidthChildren,
8706
8737
  justifyStyles[justify],
8707
8738
  wrap && "flex-wrap",
8708
8739
  flex && "flex-1",
@@ -10122,7 +10153,8 @@ var Switch = React44.forwardRef(
10122
10153
  // proportional regardless of a theme's density scale.
10123
10154
  "relative inline-flex h-[1.5rem] w-[2.75rem] shrink-0 cursor-pointer items-center rounded-full border-heavy border-transparent transition-colors duration-fast",
10124
10155
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
10125
- isChecked ? "bg-primary" : "bg-muted",
10156
+ // The off track must clear 3:1 against the page (WCAG 1.4.11); the muted surface colour does not.
10157
+ isChecked ? "bg-primary" : "bg-muted-foreground",
10126
10158
  disabled && "cursor-not-allowed opacity-50"
10127
10159
  ),
10128
10160
  children: /* @__PURE__ */ jsx(
@@ -1,7 +1,7 @@
1
1
  import { applyFrame } from '@almadar/shell-runtime/kernel/frame-applier';
2
2
 
3
3
  function runTickFrame(ports, now) {
4
- return applyFrame(ports.kernel.frame(now()), ports.client, ports.post);
4
+ return applyFrame(ports.kernel.frame(now()), ports.client, ports.post, ports.held);
5
5
  }
6
6
  function createTickDriver(ports) {
7
7
  let handle;
@@ -1,5 +1,5 @@
1
- import { claimDelivery } from './chunk-S3LS3B7N.js';
2
- import { useEventBus, getTraitPresence, beginPending, endPending } from './chunk-D5FJU4XC.js';
1
+ import { claimDelivery } from './chunk-CB4POLGP.js';
2
+ import { useEventBus, getTraitPresence, beginPending, endPending } from './chunk-OOG33EGF.js';
3
3
  import { createContext, useState, useCallback, useEffect, useMemo, useRef, useContext, useSyncExternalStore } from 'react';
4
4
  import { createLogger } from '@almadar/logger';
5
5
  import { mergeEntityFrame } from '@almadar/core';
@@ -1,4 +1,4 @@
1
- import { useEventBus } from './chunk-D5FJU4XC.js';
1
+ import { useEventBus } from './chunk-OOG33EGF.js';
2
2
  import { useState, useCallback, useMemo } from 'react';
3
3
 
4
4
  var ALMADAR_DND_MIME = "application/x-almadar-dnd";
@@ -1,5 +1,5 @@
1
- import { traitLevelFromMounted } from './chunk-PCR37T3U.js';
2
- import { getStateRole } from './chunk-3UQNFRYV.js';
1
+ import { traitLevelFromMounted } from './chunk-UUHF7XOZ.js';
2
+ import { getStateRole } from './chunk-SO2MERCZ.js';
3
3
  import { useState, useLayoutEffect } from 'react';
4
4
 
5
5
  function useContainerWidth(ref) {