@almadar/shell-web 1.2.1 → 1.3.0

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 (77) hide show
  1. package/dist/AvlGlyph-N2MSWT7H.js +5 -0
  2. package/dist/{AvlStateMachine-KVZMFHFU.js → AvlStateMachine-HDWKFV7C.js} +3 -3
  3. package/dist/AvlTransitionDetail-CRMZLMFV.js +10 -0
  4. package/dist/AvlTransitionExplainer-NJLDP7X5.js +11 -0
  5. package/dist/BehaviorView-EFKTS3KZ.js +10 -0
  6. package/dist/{FileTree-B3GDAjaQ.d.ts → FileTree-CSdbAdcJ.d.ts} +8 -0
  7. package/dist/FlowCanvas-S3ODHQXS.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-PSXI4EHG.js → LayersPanel-YHXNS36U.js} +4 -4
  11. package/dist/ModuleCard-6UW7YBAH.js +6 -0
  12. package/dist/OrbInspector-RQU5P2T6.js +23 -0
  13. package/dist/OrbPreview-V4VLWNMT.css +1754 -0
  14. package/dist/OrbPreview-WKC3ORIK.js +23 -0
  15. package/dist/{Select-BJ8Fgc8A.d.ts → Select-DuX0Gvwo.d.ts} +14 -8
  16. package/dist/UISlotRenderer-7IGRYWII.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 +25 -25
  20. package/dist/{chunk-LKL5RULQ.js → chunk-3OF2X6GG.js} +2 -2
  21. package/dist/{chunk-V5SVGUYN.js → chunk-3WSTUUJ7.js} +1 -1
  22. package/dist/{chunk-B23EZH2P.js → chunk-4IFO6QJL.js} +3 -3
  23. package/dist/{chunk-RDPELAFQ.js → chunk-4UAAP6ZN.js} +2 -2
  24. package/dist/{chunk-LINJRTNB.js → chunk-6MZ224GN.js} +2 -2
  25. package/dist/{chunk-3YUMGEEW.js → chunk-AYQKZFUH.js} +1 -1
  26. package/dist/{chunk-3DA36FOA.js → chunk-BY2UJWVR.js} +1 -1
  27. package/dist/{chunk-S3LS3B7N.js → chunk-CB4POLGP.js} +1 -1
  28. package/dist/{chunk-2LNXLMK3.js → chunk-FZOX7XTU.js} +41 -41
  29. package/dist/{chunk-ZDRDJKYB.js → chunk-MXN32OVV.js} +212 -20
  30. package/dist/{chunk-TAEOMNDK.js → chunk-NIOQT2IE.js} +44914 -44206
  31. package/dist/{chunk-CCO2ZH7F.js → chunk-NVSUTIJ2.js} +2 -2
  32. package/dist/{chunk-DPDKBY6Z.js → chunk-OEWVBYW5.js} +1 -0
  33. package/dist/{chunk-UFQLHCFJ.js → chunk-OHWEWQL3.js} +1 -1
  34. package/dist/{chunk-D5FJU4XC.js → chunk-OOG33EGF.js} +46 -14
  35. package/dist/{chunk-AU7O65OX.js → chunk-OXHXISFA.js} +1 -1
  36. package/dist/{chunk-PWXZN5G5.js → chunk-PD5QUVRE.js} +2 -2
  37. package/dist/{chunk-6RXP5ZXE.js → chunk-PHIQOASV.js} +5 -5
  38. package/dist/{chunk-GHAF7QUD.js → chunk-QZ6TDP6I.js} +1 -1
  39. package/dist/{chunk-JEN4EIUF.js → chunk-RCB4CKRK.js} +1 -1
  40. package/dist/{chunk-AL2XXMYR.js → chunk-RQH6O76X.js} +20 -6
  41. package/dist/{chunk-7UCL26QB.js → chunk-TJEB4PII.js} +3 -3
  42. package/dist/{chunk-KTYOYEVA.js → chunk-YU2ZNLGI.js} +1 -1
  43. package/dist/components/index.d.ts +295 -22
  44. package/dist/components/index.js +27 -22
  45. package/dist/context/index.js +3 -3
  46. package/dist/core.d.ts +23 -6
  47. package/dist/core.js +1 -1
  48. package/dist/{fx-Bx5RqplG.d.ts → fx-Bc3yEVED.d.ts} +2 -2
  49. package/dist/hooks/index.js +4 -4
  50. package/dist/index.d.ts +18 -5
  51. package/dist/index.js +4 -4
  52. package/dist/{kernel-client-NMZ56JVU.js → kernel-client-NM6S72DO.js} +74 -33
  53. package/dist/{kernel-wire-CRsHtLsf.d.ts → kernel-wire-Ds7xSZzx.d.ts} +6 -0
  54. package/dist/lib/index.d.ts +2 -2
  55. package/dist/lib/index.js +3 -3
  56. package/dist/providers/index.d.ts +5 -5
  57. package/dist/providers/index.js +15 -15
  58. package/dist/runtime/index.d.ts +6 -2
  59. package/dist/runtime/index.js +14 -14
  60. package/dist/ssr/index.cjs +27 -4
  61. package/dist/ssr/index.d.cts +6 -0
  62. package/dist/ssr/index.d.ts +6 -0
  63. package/dist/ssr/index.js +27 -4
  64. package/dist/test-support.js +2 -2
  65. package/dist/{verificationRegistry-BLuQU1JV.d.ts → verificationRegistry-Dz5N0oxx.d.ts} +199 -8
  66. package/package.json +9 -9
  67. package/src/core/locales/ar.json +8 -1
  68. package/src/core/locales/en.json +8 -1
  69. package/src/core/locales/sl.json +8 -1
  70. package/dist/AvlGlyph-KZMJDBEB.js +0 -5
  71. package/dist/AvlTransitionDetail-7DVGV27I.js +0 -10
  72. package/dist/AvlTransitionExplainer-RMJ5LQLK.js +0 -11
  73. package/dist/BehaviorView-EYRPME67.js +0 -10
  74. package/dist/FlowCanvas-J54627TC.js +0 -23
  75. package/dist/ModuleCard-TNRLL45H.js +0 -6
  76. package/dist/OrbInspector-UBEQWWZ2.js +0 -23
  77. package/dist/UISlotRenderer-5OURMAP2.js +0 -23
@@ -1,6 +1,6 @@
1
- import { AvlFieldType, AvlState, AvlPage, AvlEntity } from './chunk-DPDKBY6Z.js';
1
+ import { AvlFieldType, AvlState, AvlPage, AvlEntity } from './chunk-OEWVBYW5.js';
2
2
  import { OPERATOR_CATEGORY_COLORS, AvlEffect } from './chunk-3UQNFRYV.js';
3
- import { useTranslate, Box, Typography, domPassthrough } from './chunk-D5FJU4XC.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
 
@@ -232,6 +232,7 @@ var FIELD_TYPE_SHAPES = {
232
232
  event: "hexagon",
233
233
  EventAddress: "hexagon",
234
234
  CallKey: "hexagon",
235
+ MessageKey: "hexagon",
235
236
  SExpr: "hexagon",
236
237
  array: "bars",
237
238
  tuple: "bars",
@@ -1,4 +1,4 @@
1
- import { FileTree } from './chunk-AL2XXMYR.js';
1
+ import { FileTree } from './chunk-RQH6O76X.js';
2
2
  import { parseApplicationLevel, parseOrbitalLevel, parseTraitLevel, traitTransitionRenderUi } from './chunk-PCR37T3U.js';
3
3
  import { useMemo } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
@@ -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,11 +1,11 @@
1
- import { JsonTreeEditor } from './chunk-JEN4EIUF.js';
2
- import { transitionPlayback, Accordion } from './chunk-3DA36FOA.js';
3
- import { EmptyState } from './chunk-3YUMGEEW.js';
1
+ import { JsonTreeEditor } from './chunk-RCB4CKRK.js';
2
+ import { transitionPlayback, Accordion } from './chunk-BY2UJWVR.js';
3
+ import { EmptyState } from './chunk-AYQKZFUH.js';
4
4
  import { useContainerWidth, roundedEdgePath } from './chunk-HA2BYO5E.js';
5
5
  import { parseTraitLevel } from './chunk-PCR37T3U.js';
6
- import { AvlExplain, AvlEffectChip } from './chunk-V5SVGUYN.js';
6
+ import { AvlExplain, AvlEffectChip } from './chunk-3WSTUUJ7.js';
7
7
  import { AVL_INK, AVL_FONT, effectZoneOf, avlTint, AvlEffect, OPERATOR_CATEGORY_COLORS, avlBlend } from './chunk-3UQNFRYV.js';
8
- import { useTranslate, useMediaQuery, Box, Typography, Card, VStack, HStack, Badge, Button } from './chunk-D5FJU4XC.js';
8
+ import { useTranslate, useMediaQuery, Box, Typography, Card, VStack, HStack, Badge, Button } from './chunk-OOG33EGF.js';
9
9
  import { useRef, useMemo, useState } from 'react';
10
10
  import { formatSExpr, JsonValueSchema, isJsonObject, isBinding } from '@almadar/core';
11
11
  import { operatorVisualForm, getStdOperatorMeta } from '@almadar/std/registry';
@@ -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,4 +1,4 @@
1
- import { cn, Typography, useTranslate, VStack, HStack, Icon, Button, Switch, Input } from './chunk-D5FJU4XC.js';
1
+ import { cn, Typography, useTranslate, VStack, HStack, Icon, Button, Switch, Input } from './chunk-OOG33EGF.js';
2
2
  import React from 'react';
3
3
  import { jsx, jsxs } from 'react/jsx-runtime';
4
4
 
@@ -1,5 +1,5 @@
1
- import { useDraggable, useDropZone } from './chunk-GHAF7QUD.js';
2
- import { Box, domPassthrough, useTranslate, Icon, pressableProps, Typography } from './chunk-D5FJU4XC.js';
1
+ import { useDraggable, useDropZone } from './chunk-QZ6TDP6I.js';
2
+ import { Box, domPassthrough, useTranslate, Icon, pressableProps, Typography } from './chunk-OOG33EGF.js';
3
3
  import React, { createContext, useState, useCallback, useRef, useEffect, useContext } from 'react';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
 
@@ -242,6 +242,7 @@ var FlatTreeNodeItem = ({
242
242
  onNodeReorder,
243
243
  selectedId,
244
244
  look,
245
+ foldsOnClick,
245
246
  isExpanded,
246
247
  onToggle
247
248
  }) => {
@@ -257,9 +258,13 @@ var FlatTreeNodeItem = ({
257
258
  if (isSelected) rowRef.current?.scrollIntoView({ block: "center" });
258
259
  }, [isSelected]);
259
260
  const handleClick = useCallback(() => {
261
+ if (hasChildren && foldsOnClick) {
262
+ onToggle(item.id, expanded);
263
+ return;
264
+ }
260
265
  if (hasChildren && !onNodeSelect) onToggle(item.id, expanded);
261
266
  onNodeSelect?.(item.id);
262
- }, [hasChildren, expanded, item.id, onNodeSelect, onToggle]);
267
+ }, [hasChildren, foldsOnClick, expanded, item.id, onNodeSelect, onToggle]);
263
268
  const handleChevron = useCallback((e) => {
264
269
  e.stopPropagation();
265
270
  onToggle(item.id, expanded);
@@ -373,6 +378,7 @@ var FlatTreeNodeItem = ({
373
378
  onNodeReorder,
374
379
  selectedId,
375
380
  look,
381
+ foldsOnClick,
376
382
  isExpanded,
377
383
  onToggle
378
384
  },
@@ -396,6 +402,7 @@ var FlatFileTree = ({
396
402
  expandedPaths,
397
403
  look = "files",
398
404
  onNodeSelect,
405
+ onNodeToggle,
399
406
  onNodeAction,
400
407
  nodeActionIcon,
401
408
  nodeActionLabel,
@@ -423,16 +430,20 @@ var FlatFileTree = ({
423
430
  });
424
431
  }, [selectedId, selectedAncestors, listedKey, listed]);
425
432
  const isExpanded = useCallback(
426
- (id, depth) => overrides.get(id) ?? (depth < 1 || selectedAncestors.has(id) || listed.has(id)),
427
- [overrides, selectedAncestors, listed]
433
+ (id, depth) => onNodeToggle ? listed.has(id) : overrides.get(id) ?? (depth < 1 || selectedAncestors.has(id) || listed.has(id)),
434
+ [onNodeToggle, overrides, selectedAncestors, listed]
428
435
  );
429
436
  const onToggle = useCallback((id, effective) => {
437
+ if (onNodeToggle) {
438
+ onNodeToggle(id, !effective);
439
+ return;
440
+ }
430
441
  setOverrides((prev) => {
431
442
  const next = new Map(prev);
432
443
  next.set(id, !effective);
433
444
  return next;
434
445
  });
435
- }, []);
446
+ }, [onNodeToggle]);
436
447
  if (items.length === 0) return null;
437
448
  const ids = new Set(items.map((node) => node.id));
438
449
  const childrenByParent = /* @__PURE__ */ new Map();
@@ -461,6 +472,7 @@ var FlatFileTree = ({
461
472
  onNodeReorder,
462
473
  selectedId,
463
474
  look,
475
+ foldsOnClick: onNodeToggle !== void 0,
464
476
  isExpanded,
465
477
  onToggle
466
478
  },
@@ -477,6 +489,7 @@ var FileTree = ({
477
489
  onNodeExpand,
478
490
  expandedPaths,
479
491
  onNodeSelect,
492
+ onNodeToggle,
480
493
  onNodeAction,
481
494
  nodeActionIcon,
482
495
  nodeActionLabel,
@@ -495,6 +508,7 @@ var FileTree = ({
495
508
  expandedPaths,
496
509
  look,
497
510
  onNodeSelect,
511
+ onNodeToggle,
498
512
  onNodeAction,
499
513
  nodeActionIcon,
500
514
  nodeActionLabel,
@@ -1,7 +1,7 @@
1
- import { AvlState, AvlEntity, AvlFieldType, AvlPage } from './chunk-DPDKBY6Z.js';
2
- import { AvlExplain, useEffectLines } from './chunk-V5SVGUYN.js';
1
+ import { AvlState, AvlEntity, AvlFieldType, AvlPage } from './chunk-OEWVBYW5.js';
2
+ import { AvlExplain, useEffectLines } from './chunk-3WSTUUJ7.js';
3
3
  import { getStateRole, AvlEffect, CONNECTION_COLORS } from './chunk-3UQNFRYV.js';
4
- import { useTranslate, Box, cn, domPassthrough } from './chunk-D5FJU4XC.js';
4
+ import { useTranslate, Box, cn, domPassthrough } from './chunk-OOG33EGF.js';
5
5
  import { useNodeId, ReactFlowProvider, Handle, Position } from '@xyflow/react';
6
6
  import React from 'react';
7
7
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,4 +1,4 @@
1
- import { ThemeProvider, useTheme } from './chunk-D5FJU4XC.js';
1
+ import { ThemeProvider, useTheme } from './chunk-OOG33EGF.js';
2
2
 
3
3
  // src/providers/DesignThemeContext.tsx
4
4
  var DesignThemeProvider = ThemeProvider;