@almadar/ui 6.16.0 → 6.18.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.
@@ -22251,6 +22251,7 @@ var init_CodeBlock = __esm({
22251
22251
  ref: scrollRef,
22252
22252
  onCopy: handleSelectionCopy,
22253
22253
  dir: "ltr",
22254
+ className: "[&_code]:!bg-transparent [&_code]:!p-0 [&_code]:!border-0 [&_code]:!shadow-none [&_span]:!bg-transparent",
22254
22255
  style: {
22255
22256
  flex: 1,
22256
22257
  minHeight: 0,
@@ -22408,7 +22409,12 @@ var init_MermaidDiagram = __esm({
22408
22409
  mermaid.initialize({
22409
22410
  startOnLoad: false,
22410
22411
  securityLevel: "strict",
22411
- theme: resolvedMode === "dark" ? "dark" : "default"
22412
+ theme: resolvedMode === "dark" ? "dark" : "default",
22413
+ // Mermaid's default is to append its "Syntax error in text" bomb
22414
+ // graphic to <body> on a failed parse, outside any error boundary —
22415
+ // the catch below owns failure presentation (source + log), so the
22416
+ // library must not paint its own.
22417
+ suppressErrorRendering: true
22412
22418
  });
22413
22419
  const domId = `mermaid-${reactId.replace(/[^a-zA-Z0-9]/g, "")}`;
22414
22420
  let firstError = null;
@@ -54999,6 +55005,11 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
54999
55005
  if (_childChildren !== void 0 && nestedProps === void 0) {
55000
55006
  resolvedProps.children = _childChildren;
55001
55007
  }
55008
+ const childKids = resolvedProps.children;
55009
+ const childlessStack = (_childType === "stack" || _childType === "vstack" || _childType === "hstack") && resolvedProps.className === void 0 && resolvedProps.style === void 0 && (childKids === void 0 || childKids === null || Array.isArray(childKids) && !childKids.length);
55010
+ if (childlessStack) {
55011
+ return null;
55012
+ }
55002
55013
  const childContent = {
55003
55014
  id: childId,
55004
55015
  pattern: child.type,
@@ -60617,6 +60628,30 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60617
60628
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
60618
60629
  return /* @__PURE__ */ jsxRuntime.jsx(providers.EntityBindingContext.Provider, { value: entityBindingSource, children });
60619
60630
  }
60631
+ function FitToBox({ children }) {
60632
+ const outerRef = React96.useRef(null);
60633
+ const innerRef = React96.useRef(null);
60634
+ const [scale, setScale] = React96.useState(1);
60635
+ React96.useEffect(() => {
60636
+ const outer = outerRef.current;
60637
+ const inner = innerRef.current;
60638
+ if (!outer || !inner) return;
60639
+ const update = () => {
60640
+ const sw = inner.scrollWidth;
60641
+ const sh = inner.scrollHeight;
60642
+ const cw = outer.clientWidth;
60643
+ const ch = outer.clientHeight;
60644
+ if (!sw || !sh || !cw || !ch) return;
60645
+ setScale(Math.min(1, cw / sw, ch / sh));
60646
+ };
60647
+ update();
60648
+ const ro = new ResizeObserver(update);
60649
+ ro.observe(outer);
60650
+ ro.observe(inner);
60651
+ return () => ro.disconnect();
60652
+ }, []);
60653
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: outerRef, className: "relative h-full w-full overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: innerRef, style: { transform: `scale(${scale})`, transformOrigin: "top left", width: "fit-content" }, children }) });
60654
+ }
60620
60655
  function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
60621
60656
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
60622
60657
  const allPageTraits = React96.useMemo(() => {
@@ -60802,6 +60837,7 @@ function OrbPreview({
60802
60837
  getAccessToken,
60803
60838
  initialPagePath,
60804
60839
  isolated = false,
60840
+ fit = false,
60805
60841
  user = null
60806
60842
  }) {
60807
60843
  if (serverUrl && transport) {
@@ -60958,7 +60994,7 @@ function OrbPreview({
60958
60994
  Box,
60959
60995
  {
60960
60996
  ref: containerRef,
60961
- className: `overflow-auto border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
60997
+ className: `${fit ? "overflow-hidden" : "overflow-auto"} border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
60962
60998
  style: { height },
60963
60999
  children: [
60964
61000
  localFallback && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-3 py-2 bg-[var(--color-warning)] bg-opacity-10 border-b border-[var(--color-warning)] flex items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-[var(--color-warning-foreground)] flex-1", children: "Preview server unreachable \u2014 running locally. Server-side state and persistence are disabled." }) }),
@@ -60971,7 +61007,22 @@ function OrbPreview({
60971
61007
  storageKey: `almadar:navstack:${parseResult.schema.name ?? "preview"}`,
60972
61008
  children: [
60973
61009
  /* @__PURE__ */ jsxRuntime.jsx(NavStackRefBridge, { apiRef: navStackRef }),
60974
- /* @__PURE__ */ jsxRuntime.jsx(providers.OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsxRuntime.jsx(context.UISlotProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(
61010
+ /* @__PURE__ */ jsxRuntime.jsx(providers.OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsxRuntime.jsx(context.UISlotProvider, { children: fit ? /* @__PURE__ */ jsxRuntime.jsx(FitToBox, { children: /* @__PURE__ */ jsxRuntime.jsx(
61011
+ SchemaRunner,
61012
+ {
61013
+ schema: parseResult.schema,
61014
+ serverUrl,
61015
+ transport,
61016
+ getAccessToken,
61017
+ mockData: effectiveMockData,
61018
+ pageName: currentPage,
61019
+ routeParams,
61020
+ onNavigate: handleNavigateEffect,
61021
+ onNavigateBack: handleNavigateBack,
61022
+ onLocalFallback: handleLocalFallback,
61023
+ persistence
61024
+ }
61025
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx(
60975
61026
  SchemaRunner,
60976
61027
  {
60977
61028
  schema: parseResult.schema,
@@ -61002,7 +61053,8 @@ function BrowserPlayground({
61002
61053
  initialPagePath,
61003
61054
  height,
61004
61055
  className,
61005
- paused
61056
+ paused,
61057
+ fit
61006
61058
  }) {
61007
61059
  const [runtime] = React96.useState(
61008
61060
  () => new OrbitalServerRuntime.OrbitalServerRuntime({ mode, debug: false })
@@ -61064,6 +61116,7 @@ function BrowserPlayground({
61064
61116
  initialPagePath,
61065
61117
  height,
61066
61118
  className,
61119
+ fit,
61067
61120
  isolated: true
61068
61121
  }
61069
61122
  );
package/dist/avl/index.js CHANGED
@@ -22175,6 +22175,7 @@ var init_CodeBlock = __esm({
22175
22175
  ref: scrollRef,
22176
22176
  onCopy: handleSelectionCopy,
22177
22177
  dir: "ltr",
22178
+ className: "[&_code]:!bg-transparent [&_code]:!p-0 [&_code]:!border-0 [&_code]:!shadow-none [&_span]:!bg-transparent",
22178
22179
  style: {
22179
22180
  flex: 1,
22180
22181
  minHeight: 0,
@@ -22332,7 +22333,12 @@ var init_MermaidDiagram = __esm({
22332
22333
  mermaid.initialize({
22333
22334
  startOnLoad: false,
22334
22335
  securityLevel: "strict",
22335
- theme: resolvedMode === "dark" ? "dark" : "default"
22336
+ theme: resolvedMode === "dark" ? "dark" : "default",
22337
+ // Mermaid's default is to append its "Syntax error in text" bomb
22338
+ // graphic to <body> on a failed parse, outside any error boundary —
22339
+ // the catch below owns failure presentation (source + log), so the
22340
+ // library must not paint its own.
22341
+ suppressErrorRendering: true
22336
22342
  });
22337
22343
  const domId = `mermaid-${reactId.replace(/[^a-zA-Z0-9]/g, "")}`;
22338
22344
  let firstError = null;
@@ -54923,6 +54929,11 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
54923
54929
  if (_childChildren !== void 0 && nestedProps === void 0) {
54924
54930
  resolvedProps.children = _childChildren;
54925
54931
  }
54932
+ const childKids = resolvedProps.children;
54933
+ const childlessStack = (_childType === "stack" || _childType === "vstack" || _childType === "hstack") && resolvedProps.className === void 0 && resolvedProps.style === void 0 && (childKids === void 0 || childKids === null || Array.isArray(childKids) && !childKids.length);
54934
+ if (childlessStack) {
54935
+ return null;
54936
+ }
54926
54937
  const childContent = {
54927
54938
  id: childId,
54928
54939
  pattern: child.type,
@@ -60541,6 +60552,30 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60541
60552
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
60542
60553
  return /* @__PURE__ */ jsx(EntityBindingContext.Provider, { value: entityBindingSource, children });
60543
60554
  }
60555
+ function FitToBox({ children }) {
60556
+ const outerRef = useRef(null);
60557
+ const innerRef = useRef(null);
60558
+ const [scale, setScale] = useState(1);
60559
+ useEffect(() => {
60560
+ const outer = outerRef.current;
60561
+ const inner = innerRef.current;
60562
+ if (!outer || !inner) return;
60563
+ const update = () => {
60564
+ const sw = inner.scrollWidth;
60565
+ const sh = inner.scrollHeight;
60566
+ const cw = outer.clientWidth;
60567
+ const ch = outer.clientHeight;
60568
+ if (!sw || !sh || !cw || !ch) return;
60569
+ setScale(Math.min(1, cw / sw, ch / sh));
60570
+ };
60571
+ update();
60572
+ const ro = new ResizeObserver(update);
60573
+ ro.observe(outer);
60574
+ ro.observe(inner);
60575
+ return () => ro.disconnect();
60576
+ }, []);
60577
+ return /* @__PURE__ */ jsx("div", { ref: outerRef, className: "relative h-full w-full overflow-hidden", children: /* @__PURE__ */ jsx("div", { ref: innerRef, style: { transform: `scale(${scale})`, transformOrigin: "top left", width: "fit-content" }, children }) });
60578
+ }
60544
60579
  function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
60545
60580
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
60546
60581
  const allPageTraits = useMemo(() => {
@@ -60726,6 +60761,7 @@ function OrbPreview({
60726
60761
  getAccessToken,
60727
60762
  initialPagePath,
60728
60763
  isolated = false,
60764
+ fit = false,
60729
60765
  user = null
60730
60766
  }) {
60731
60767
  if (serverUrl && transport) {
@@ -60882,7 +60918,7 @@ function OrbPreview({
60882
60918
  Box,
60883
60919
  {
60884
60920
  ref: containerRef,
60885
- className: `overflow-auto border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
60921
+ className: `${fit ? "overflow-hidden" : "overflow-auto"} border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
60886
60922
  style: { height },
60887
60923
  children: [
60888
60924
  localFallback && /* @__PURE__ */ jsx(Box, { className: "px-3 py-2 bg-[var(--color-warning)] bg-opacity-10 border-b border-[var(--color-warning)] flex items-center gap-2", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-[var(--color-warning-foreground)] flex-1", children: "Preview server unreachable \u2014 running locally. Server-side state and persistence are disabled." }) }),
@@ -60895,7 +60931,22 @@ function OrbPreview({
60895
60931
  storageKey: `almadar:navstack:${parseResult.schema.name ?? "preview"}`,
60896
60932
  children: [
60897
60933
  /* @__PURE__ */ jsx(NavStackRefBridge, { apiRef: navStackRef }),
60898
- /* @__PURE__ */ jsx(OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsx(UISlotProvider, { children: /* @__PURE__ */ jsx(
60934
+ /* @__PURE__ */ jsx(OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsx(UISlotProvider, { children: fit ? /* @__PURE__ */ jsx(FitToBox, { children: /* @__PURE__ */ jsx(
60935
+ SchemaRunner,
60936
+ {
60937
+ schema: parseResult.schema,
60938
+ serverUrl,
60939
+ transport,
60940
+ getAccessToken,
60941
+ mockData: effectiveMockData,
60942
+ pageName: currentPage,
60943
+ routeParams,
60944
+ onNavigate: handleNavigateEffect,
60945
+ onNavigateBack: handleNavigateBack,
60946
+ onLocalFallback: handleLocalFallback,
60947
+ persistence
60948
+ }
60949
+ ) }) : /* @__PURE__ */ jsx(
60899
60950
  SchemaRunner,
60900
60951
  {
60901
60952
  schema: parseResult.schema,
@@ -60926,7 +60977,8 @@ function BrowserPlayground({
60926
60977
  initialPagePath,
60927
60978
  height,
60928
60979
  className,
60929
- paused
60980
+ paused,
60981
+ fit
60930
60982
  }) {
60931
60983
  const [runtime] = useState(
60932
60984
  () => new OrbitalServerRuntime({ mode, debug: false })
@@ -60988,6 +61040,7 @@ function BrowserPlayground({
60988
61040
  initialPagePath,
60989
61041
  height,
60990
61042
  className,
61043
+ fit,
60991
61044
  isolated: true
60992
61045
  }
60993
61046
  );
@@ -15495,6 +15495,7 @@ var init_CodeBlock = __esm({
15495
15495
  ref: scrollRef,
15496
15496
  onCopy: handleSelectionCopy,
15497
15497
  dir: "ltr",
15498
+ className: "[&_code]:!bg-transparent [&_code]:!p-0 [&_code]:!border-0 [&_code]:!shadow-none [&_span]:!bg-transparent",
15498
15499
  style: {
15499
15500
  flex: 1,
15500
15501
  minHeight: 0,
@@ -15652,7 +15653,12 @@ var init_MermaidDiagram = __esm({
15652
15653
  mermaid.initialize({
15653
15654
  startOnLoad: false,
15654
15655
  securityLevel: "strict",
15655
- theme: resolvedMode === "dark" ? "dark" : "default"
15656
+ theme: resolvedMode === "dark" ? "dark" : "default",
15657
+ // Mermaid's default is to append its "Syntax error in text" bomb
15658
+ // graphic to <body> on a failed parse, outside any error boundary —
15659
+ // the catch below owns failure presentation (source + log), so the
15660
+ // library must not paint its own.
15661
+ suppressErrorRendering: true
15656
15662
  });
15657
15663
  const domId = `mermaid-${reactId.replace(/[^a-zA-Z0-9]/g, "")}`;
15658
15664
  let firstError = null;
@@ -54118,6 +54124,11 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
54118
54124
  if (_childChildren !== void 0 && nestedProps === void 0) {
54119
54125
  resolvedProps.children = _childChildren;
54120
54126
  }
54127
+ const childKids = resolvedProps.children;
54128
+ const childlessStack = (_childType === "stack" || _childType === "vstack" || _childType === "hstack") && resolvedProps.className === void 0 && resolvedProps.style === void 0 && (childKids === void 0 || childKids === null || Array.isArray(childKids) && !childKids.length);
54129
+ if (childlessStack) {
54130
+ return null;
54131
+ }
54121
54132
  const childContent = {
54122
54133
  id: childId,
54123
54134
  pattern: child.type,
@@ -15420,6 +15420,7 @@ var init_CodeBlock = __esm({
15420
15420
  ref: scrollRef,
15421
15421
  onCopy: handleSelectionCopy,
15422
15422
  dir: "ltr",
15423
+ className: "[&_code]:!bg-transparent [&_code]:!p-0 [&_code]:!border-0 [&_code]:!shadow-none [&_span]:!bg-transparent",
15423
15424
  style: {
15424
15425
  flex: 1,
15425
15426
  minHeight: 0,
@@ -15577,7 +15578,12 @@ var init_MermaidDiagram = __esm({
15577
15578
  mermaid.initialize({
15578
15579
  startOnLoad: false,
15579
15580
  securityLevel: "strict",
15580
- theme: resolvedMode === "dark" ? "dark" : "default"
15581
+ theme: resolvedMode === "dark" ? "dark" : "default",
15582
+ // Mermaid's default is to append its "Syntax error in text" bomb
15583
+ // graphic to <body> on a failed parse, outside any error boundary —
15584
+ // the catch below owns failure presentation (source + log), so the
15585
+ // library must not paint its own.
15586
+ suppressErrorRendering: true
15581
15587
  });
15582
15588
  const domId = `mermaid-${reactId.replace(/[^a-zA-Z0-9]/g, "")}`;
15583
15589
  let firstError = null;
@@ -54043,6 +54049,11 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
54043
54049
  if (_childChildren !== void 0 && nestedProps === void 0) {
54044
54050
  resolvedProps.children = _childChildren;
54045
54051
  }
54052
+ const childKids = resolvedProps.children;
54053
+ const childlessStack = (_childType === "stack" || _childType === "vstack" || _childType === "hstack") && resolvedProps.className === void 0 && resolvedProps.style === void 0 && (childKids === void 0 || childKids === null || Array.isArray(childKids) && !childKids.length);
54054
+ if (childlessStack) {
54055
+ return null;
54056
+ }
54046
54057
  const childContent = {
54047
54058
  id: childId,
54048
54059
  pattern: child.type,
@@ -19700,6 +19700,7 @@ var init_CodeBlock = __esm({
19700
19700
  ref: scrollRef,
19701
19701
  onCopy: handleSelectionCopy,
19702
19702
  dir: "ltr",
19703
+ className: "[&_code]:!bg-transparent [&_code]:!p-0 [&_code]:!border-0 [&_code]:!shadow-none [&_span]:!bg-transparent",
19703
19704
  style: {
19704
19705
  flex: 1,
19705
19706
  minHeight: 0,
@@ -19857,7 +19858,12 @@ var init_MermaidDiagram = __esm({
19857
19858
  mermaid.initialize({
19858
19859
  startOnLoad: false,
19859
19860
  securityLevel: "strict",
19860
- theme: resolvedMode === "dark" ? "dark" : "default"
19861
+ theme: resolvedMode === "dark" ? "dark" : "default",
19862
+ // Mermaid's default is to append its "Syntax error in text" bomb
19863
+ // graphic to <body> on a failed parse, outside any error boundary —
19864
+ // the catch below owns failure presentation (source + log), so the
19865
+ // library must not paint its own.
19866
+ suppressErrorRendering: true
19861
19867
  });
19862
19868
  const domId = `mermaid-${reactId.replace(/[^a-zA-Z0-9]/g, "")}`;
19863
19869
  let firstError = null;
@@ -52838,6 +52844,11 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
52838
52844
  if (_childChildren !== void 0 && nestedProps === void 0) {
52839
52845
  resolvedProps.children = _childChildren;
52840
52846
  }
52847
+ const childKids = resolvedProps.children;
52848
+ const childlessStack = (_childType === "stack" || _childType === "vstack" || _childType === "hstack") && resolvedProps.className === void 0 && resolvedProps.style === void 0 && (childKids === void 0 || childKids === null || Array.isArray(childKids) && !childKids.length);
52849
+ if (childlessStack) {
52850
+ return null;
52851
+ }
52841
52852
  const childContent = {
52842
52853
  id: childId,
52843
52854
  pattern: child.type,
@@ -19626,6 +19626,7 @@ var init_CodeBlock = __esm({
19626
19626
  ref: scrollRef,
19627
19627
  onCopy: handleSelectionCopy,
19628
19628
  dir: "ltr",
19629
+ className: "[&_code]:!bg-transparent [&_code]:!p-0 [&_code]:!border-0 [&_code]:!shadow-none [&_span]:!bg-transparent",
19629
19630
  style: {
19630
19631
  flex: 1,
19631
19632
  minHeight: 0,
@@ -19783,7 +19784,12 @@ var init_MermaidDiagram = __esm({
19783
19784
  mermaid.initialize({
19784
19785
  startOnLoad: false,
19785
19786
  securityLevel: "strict",
19786
- theme: resolvedMode === "dark" ? "dark" : "default"
19787
+ theme: resolvedMode === "dark" ? "dark" : "default",
19788
+ // Mermaid's default is to append its "Syntax error in text" bomb
19789
+ // graphic to <body> on a failed parse, outside any error boundary —
19790
+ // the catch below owns failure presentation (source + log), so the
19791
+ // library must not paint its own.
19792
+ suppressErrorRendering: true
19787
19793
  });
19788
19794
  const domId = `mermaid-${reactId.replace(/[^a-zA-Z0-9]/g, "")}`;
19789
19795
  let firstError = null;
@@ -52764,6 +52770,11 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
52764
52770
  if (_childChildren !== void 0 && nestedProps === void 0) {
52765
52771
  resolvedProps.children = _childChildren;
52766
52772
  }
52773
+ const childKids = resolvedProps.children;
52774
+ const childlessStack = (_childType === "stack" || _childType === "vstack" || _childType === "hstack") && resolvedProps.className === void 0 && resolvedProps.style === void 0 && (childKids === void 0 || childKids === null || Array.isArray(childKids) && !childKids.length);
52775
+ if (childlessStack) {
52776
+ return null;
52777
+ }
52767
52778
  const childContent = {
52768
52779
  id: childId,
52769
52780
  pattern: child.type,
@@ -19779,6 +19779,7 @@ var init_CodeBlock = __esm({
19779
19779
  ref: scrollRef,
19780
19780
  onCopy: handleSelectionCopy,
19781
19781
  dir: "ltr",
19782
+ className: "[&_code]:!bg-transparent [&_code]:!p-0 [&_code]:!border-0 [&_code]:!shadow-none [&_span]:!bg-transparent",
19782
19783
  style: {
19783
19784
  flex: 1,
19784
19785
  minHeight: 0,
@@ -19936,7 +19937,12 @@ var init_MermaidDiagram = __esm({
19936
19937
  mermaid.initialize({
19937
19938
  startOnLoad: false,
19938
19939
  securityLevel: "strict",
19939
- theme: resolvedMode === "dark" ? "dark" : "default"
19940
+ theme: resolvedMode === "dark" ? "dark" : "default",
19941
+ // Mermaid's default is to append its "Syntax error in text" bomb
19942
+ // graphic to <body> on a failed parse, outside any error boundary —
19943
+ // the catch below owns failure presentation (source + log), so the
19944
+ // library must not paint its own.
19945
+ suppressErrorRendering: true
19940
19946
  });
19941
19947
  const domId = `mermaid-${reactId.replace(/[^a-zA-Z0-9]/g, "")}`;
19942
19948
  let firstError = null;
@@ -52497,6 +52503,11 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
52497
52503
  if (_childChildren !== void 0 && nestedProps === void 0) {
52498
52504
  resolvedProps.children = _childChildren;
52499
52505
  }
52506
+ const childKids = resolvedProps.children;
52507
+ const childlessStack = (_childType === "stack" || _childType === "vstack" || _childType === "hstack") && resolvedProps.className === void 0 && resolvedProps.style === void 0 && (childKids === void 0 || childKids === null || Array.isArray(childKids) && !childKids.length);
52508
+ if (childlessStack) {
52509
+ return null;
52510
+ }
52500
52511
  const childContent = {
52501
52512
  id: childId,
52502
52513
  pattern: child.type,
@@ -54844,6 +54855,30 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54844
54855
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
54845
54856
  return /* @__PURE__ */ jsxRuntime.jsx(providers.EntityBindingContext.Provider, { value: entityBindingSource, children });
54846
54857
  }
54858
+ function FitToBox({ children }) {
54859
+ const outerRef = React87.useRef(null);
54860
+ const innerRef = React87.useRef(null);
54861
+ const [scale, setScale] = React87.useState(1);
54862
+ React87.useEffect(() => {
54863
+ const outer = outerRef.current;
54864
+ const inner = innerRef.current;
54865
+ if (!outer || !inner) return;
54866
+ const update = () => {
54867
+ const sw = inner.scrollWidth;
54868
+ const sh = inner.scrollHeight;
54869
+ const cw = outer.clientWidth;
54870
+ const ch = outer.clientHeight;
54871
+ if (!sw || !sh || !cw || !ch) return;
54872
+ setScale(Math.min(1, cw / sw, ch / sh));
54873
+ };
54874
+ update();
54875
+ const ro = new ResizeObserver(update);
54876
+ ro.observe(outer);
54877
+ ro.observe(inner);
54878
+ return () => ro.disconnect();
54879
+ }, []);
54880
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: outerRef, className: "relative h-full w-full overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: innerRef, style: { transform: `scale(${scale})`, transformOrigin: "top left", width: "fit-content" }, children }) });
54881
+ }
54847
54882
  function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
54848
54883
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
54849
54884
  const allPageTraits = React87.useMemo(() => {
@@ -55029,6 +55064,7 @@ function OrbPreview({
55029
55064
  getAccessToken,
55030
55065
  initialPagePath,
55031
55066
  isolated = false,
55067
+ fit = false,
55032
55068
  user = null
55033
55069
  }) {
55034
55070
  if (serverUrl && transport) {
@@ -55185,7 +55221,7 @@ function OrbPreview({
55185
55221
  Box,
55186
55222
  {
55187
55223
  ref: containerRef,
55188
- className: `overflow-auto border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
55224
+ className: `${fit ? "overflow-hidden" : "overflow-auto"} border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
55189
55225
  style: { height },
55190
55226
  children: [
55191
55227
  localFallback && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-3 py-2 bg-[var(--color-warning)] bg-opacity-10 border-b border-[var(--color-warning)] flex items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-[var(--color-warning-foreground)] flex-1", children: "Preview server unreachable \u2014 running locally. Server-side state and persistence are disabled." }) }),
@@ -55198,7 +55234,22 @@ function OrbPreview({
55198
55234
  storageKey: `almadar:navstack:${parseResult.schema.name ?? "preview"}`,
55199
55235
  children: [
55200
55236
  /* @__PURE__ */ jsxRuntime.jsx(NavStackRefBridge, { apiRef: navStackRef }),
55201
- /* @__PURE__ */ jsxRuntime.jsx(providers.OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsxRuntime.jsx(context.UISlotProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(
55237
+ /* @__PURE__ */ jsxRuntime.jsx(providers.OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsxRuntime.jsx(context.UISlotProvider, { children: fit ? /* @__PURE__ */ jsxRuntime.jsx(FitToBox, { children: /* @__PURE__ */ jsxRuntime.jsx(
55238
+ SchemaRunner,
55239
+ {
55240
+ schema: parseResult.schema,
55241
+ serverUrl,
55242
+ transport,
55243
+ getAccessToken,
55244
+ mockData: effectiveMockData,
55245
+ pageName: currentPage,
55246
+ routeParams,
55247
+ onNavigate: handleNavigateEffect,
55248
+ onNavigateBack: handleNavigateBack,
55249
+ onLocalFallback: handleLocalFallback,
55250
+ persistence
55251
+ }
55252
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx(
55202
55253
  SchemaRunner,
55203
55254
  {
55204
55255
  schema: parseResult.schema,
@@ -55229,7 +55280,8 @@ function BrowserPlayground({
55229
55280
  initialPagePath,
55230
55281
  height,
55231
55282
  className,
55232
- paused
55283
+ paused,
55284
+ fit
55233
55285
  }) {
55234
55286
  const [runtime] = React87.useState(
55235
55287
  () => new OrbitalServerRuntime.OrbitalServerRuntime({ mode, debug: false })
@@ -55291,6 +55343,7 @@ function BrowserPlayground({
55291
55343
  initialPagePath,
55292
55344
  height,
55293
55345
  className,
55346
+ fit,
55294
55347
  isolated: true
55295
55348
  }
55296
55349
  );
@@ -293,6 +293,12 @@ interface OrbPreviewProps {
293
293
  * Default false (standalone previews own the global bridge).
294
294
  */
295
295
  isolated?: boolean;
296
+ /**
297
+ * Scale the rendered content down (never up) so it fits the container
298
+ * without scrollbars. For fixed-intrinsic-size content (game canvases);
299
+ * leave off for flow layouts, which should keep their internal scroll.
300
+ */
301
+ fit?: boolean;
296
302
  }
297
303
  /**
298
304
  * Renders a live preview of an Orbital schema.
@@ -307,7 +313,7 @@ interface OrbPreviewProps {
307
313
  * <OrbPreview schema={schema} serverUrl="/api/orbitals" />
308
314
  * ```
309
315
  */
310
- declare function OrbPreview({ schema, mockData, autoMock, height, className, serverUrl, transport, getAccessToken, initialPagePath, isolated, user, }: OrbPreviewProps): React__default.ReactElement;
316
+ declare function OrbPreview({ schema, mockData, autoMock, height, className, serverUrl, transport, getAccessToken, initialPagePath, isolated, fit, user, }: OrbPreviewProps): React__default.ReactElement;
311
317
  declare namespace OrbPreview {
312
318
  var displayName: string;
313
319
  }
@@ -344,8 +350,10 @@ interface BrowserPlaygroundProps {
344
350
  className?: string;
345
351
  /** Pause the in-process runtime's tick scheduler. Default: undefined (running, same as today). */
346
352
  paused?: boolean;
353
+ /** Scale content down (never up) to fit the container without scrollbars — for fixed-size content like game canvases. Forwarded to OrbPreview. */
354
+ fit?: boolean;
347
355
  }
348
- declare function BrowserPlayground({ schema, mode, initialPagePath, height, className, paused, }: BrowserPlaygroundProps): React__default.ReactElement;
356
+ declare function BrowserPlayground({ schema, mode, initialPagePath, height, className, paused, fit, }: BrowserPlaygroundProps): React__default.ReactElement;
349
357
 
350
358
  /**
351
359
  * OrbitalPluginHost — runs an ordinary behavior headless against the
@@ -293,6 +293,12 @@ interface OrbPreviewProps {
293
293
  * Default false (standalone previews own the global bridge).
294
294
  */
295
295
  isolated?: boolean;
296
+ /**
297
+ * Scale the rendered content down (never up) so it fits the container
298
+ * without scrollbars. For fixed-intrinsic-size content (game canvases);
299
+ * leave off for flow layouts, which should keep their internal scroll.
300
+ */
301
+ fit?: boolean;
296
302
  }
297
303
  /**
298
304
  * Renders a live preview of an Orbital schema.
@@ -307,7 +313,7 @@ interface OrbPreviewProps {
307
313
  * <OrbPreview schema={schema} serverUrl="/api/orbitals" />
308
314
  * ```
309
315
  */
310
- declare function OrbPreview({ schema, mockData, autoMock, height, className, serverUrl, transport, getAccessToken, initialPagePath, isolated, user, }: OrbPreviewProps): React__default.ReactElement;
316
+ declare function OrbPreview({ schema, mockData, autoMock, height, className, serverUrl, transport, getAccessToken, initialPagePath, isolated, fit, user, }: OrbPreviewProps): React__default.ReactElement;
311
317
  declare namespace OrbPreview {
312
318
  var displayName: string;
313
319
  }
@@ -344,8 +350,10 @@ interface BrowserPlaygroundProps {
344
350
  className?: string;
345
351
  /** Pause the in-process runtime's tick scheduler. Default: undefined (running, same as today). */
346
352
  paused?: boolean;
353
+ /** Scale content down (never up) to fit the container without scrollbars — for fixed-size content like game canvases. Forwarded to OrbPreview. */
354
+ fit?: boolean;
347
355
  }
348
- declare function BrowserPlayground({ schema, mode, initialPagePath, height, className, paused, }: BrowserPlaygroundProps): React__default.ReactElement;
356
+ declare function BrowserPlayground({ schema, mode, initialPagePath, height, className, paused, fit, }: BrowserPlaygroundProps): React__default.ReactElement;
349
357
 
350
358
  /**
351
359
  * OrbitalPluginHost — runs an ordinary behavior headless against the
@@ -19705,6 +19705,7 @@ var init_CodeBlock = __esm({
19705
19705
  ref: scrollRef,
19706
19706
  onCopy: handleSelectionCopy,
19707
19707
  dir: "ltr",
19708
+ className: "[&_code]:!bg-transparent [&_code]:!p-0 [&_code]:!border-0 [&_code]:!shadow-none [&_span]:!bg-transparent",
19708
19709
  style: {
19709
19710
  flex: 1,
19710
19711
  minHeight: 0,
@@ -19862,7 +19863,12 @@ var init_MermaidDiagram = __esm({
19862
19863
  mermaid.initialize({
19863
19864
  startOnLoad: false,
19864
19865
  securityLevel: "strict",
19865
- theme: resolvedMode === "dark" ? "dark" : "default"
19866
+ theme: resolvedMode === "dark" ? "dark" : "default",
19867
+ // Mermaid's default is to append its "Syntax error in text" bomb
19868
+ // graphic to <body> on a failed parse, outside any error boundary —
19869
+ // the catch below owns failure presentation (source + log), so the
19870
+ // library must not paint its own.
19871
+ suppressErrorRendering: true
19866
19872
  });
19867
19873
  const domId = `mermaid-${reactId.replace(/[^a-zA-Z0-9]/g, "")}`;
19868
19874
  let firstError = null;
@@ -52423,6 +52429,11 @@ function renderPatternChildren(children, onDismiss, parentId = "root", parentPat
52423
52429
  if (_childChildren !== void 0 && nestedProps === void 0) {
52424
52430
  resolvedProps.children = _childChildren;
52425
52431
  }
52432
+ const childKids = resolvedProps.children;
52433
+ const childlessStack = (_childType === "stack" || _childType === "vstack" || _childType === "hstack") && resolvedProps.className === void 0 && resolvedProps.style === void 0 && (childKids === void 0 || childKids === null || Array.isArray(childKids) && !childKids.length);
52434
+ if (childlessStack) {
52435
+ return null;
52436
+ }
52426
52437
  const childContent = {
52427
52438
  id: childId,
52428
52439
  pattern: child.type,
@@ -54770,6 +54781,30 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54770
54781
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
54771
54782
  return /* @__PURE__ */ jsx(EntityBindingContext.Provider, { value: entityBindingSource, children });
54772
54783
  }
54784
+ function FitToBox({ children }) {
54785
+ const outerRef = useRef(null);
54786
+ const innerRef = useRef(null);
54787
+ const [scale, setScale] = useState(1);
54788
+ useEffect(() => {
54789
+ const outer = outerRef.current;
54790
+ const inner = innerRef.current;
54791
+ if (!outer || !inner) return;
54792
+ const update = () => {
54793
+ const sw = inner.scrollWidth;
54794
+ const sh = inner.scrollHeight;
54795
+ const cw = outer.clientWidth;
54796
+ const ch = outer.clientHeight;
54797
+ if (!sw || !sh || !cw || !ch) return;
54798
+ setScale(Math.min(1, cw / sw, ch / sh));
54799
+ };
54800
+ update();
54801
+ const ro = new ResizeObserver(update);
54802
+ ro.observe(outer);
54803
+ ro.observe(inner);
54804
+ return () => ro.disconnect();
54805
+ }, []);
54806
+ return /* @__PURE__ */ jsx("div", { ref: outerRef, className: "relative h-full w-full overflow-hidden", children: /* @__PURE__ */ jsx("div", { ref: innerRef, style: { transform: `scale(${scale})`, transformOrigin: "top left", width: "fit-content" }, children }) });
54807
+ }
54773
54808
  function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
54774
54809
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
54775
54810
  const allPageTraits = useMemo(() => {
@@ -54955,6 +54990,7 @@ function OrbPreview({
54955
54990
  getAccessToken,
54956
54991
  initialPagePath,
54957
54992
  isolated = false,
54993
+ fit = false,
54958
54994
  user = null
54959
54995
  }) {
54960
54996
  if (serverUrl && transport) {
@@ -55111,7 +55147,7 @@ function OrbPreview({
55111
55147
  Box,
55112
55148
  {
55113
55149
  ref: containerRef,
55114
- className: `overflow-auto border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
55150
+ className: `${fit ? "overflow-hidden" : "overflow-auto"} border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
55115
55151
  style: { height },
55116
55152
  children: [
55117
55153
  localFallback && /* @__PURE__ */ jsx(Box, { className: "px-3 py-2 bg-[var(--color-warning)] bg-opacity-10 border-b border-[var(--color-warning)] flex items-center gap-2", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "text-[var(--color-warning-foreground)] flex-1", children: "Preview server unreachable \u2014 running locally. Server-side state and persistence are disabled." }) }),
@@ -55124,7 +55160,22 @@ function OrbPreview({
55124
55160
  storageKey: `almadar:navstack:${parseResult.schema.name ?? "preview"}`,
55125
55161
  children: [
55126
55162
  /* @__PURE__ */ jsx(NavStackRefBridge, { apiRef: navStackRef }),
55127
- /* @__PURE__ */ jsx(OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsx(UISlotProvider, { children: /* @__PURE__ */ jsx(
55163
+ /* @__PURE__ */ jsx(OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsx(UISlotProvider, { children: fit ? /* @__PURE__ */ jsx(FitToBox, { children: /* @__PURE__ */ jsx(
55164
+ SchemaRunner,
55165
+ {
55166
+ schema: parseResult.schema,
55167
+ serverUrl,
55168
+ transport,
55169
+ getAccessToken,
55170
+ mockData: effectiveMockData,
55171
+ pageName: currentPage,
55172
+ routeParams,
55173
+ onNavigate: handleNavigateEffect,
55174
+ onNavigateBack: handleNavigateBack,
55175
+ onLocalFallback: handleLocalFallback,
55176
+ persistence
55177
+ }
55178
+ ) }) : /* @__PURE__ */ jsx(
55128
55179
  SchemaRunner,
55129
55180
  {
55130
55181
  schema: parseResult.schema,
@@ -55155,7 +55206,8 @@ function BrowserPlayground({
55155
55206
  initialPagePath,
55156
55207
  height,
55157
55208
  className,
55158
- paused
55209
+ paused,
55210
+ fit
55159
55211
  }) {
55160
55212
  const [runtime] = useState(
55161
55213
  () => new OrbitalServerRuntime({ mode, debug: false })
@@ -55217,6 +55269,7 @@ function BrowserPlayground({
55217
55269
  initialPagePath,
55218
55270
  height,
55219
55271
  className,
55272
+ fit,
55220
55273
  isolated: true
55221
55274
  }
55222
55275
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "6.16.0",
3
+ "version": "6.18.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -121,8 +121,8 @@
121
121
  "@almadar/core": "^10.92.0",
122
122
  "@almadar/evaluator": "^2.45.0",
123
123
  "@almadar/logger": "^1.12.0",
124
- "@almadar/runtime": "^6.77.0",
125
- "@almadar/std": "^16.213.0",
124
+ "@almadar/runtime": "^6.78.0",
125
+ "@almadar/std": "^16.214.0",
126
126
  "@almadar/syntax": "^1.17.0",
127
127
  "@dnd-kit/core": "^6.3.1",
128
128
  "@dnd-kit/sortable": "^10.0.0",