@almadar/ui 6.16.0 → 6.17.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.
@@ -60617,6 +60617,30 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60617
60617
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
60618
60618
  return /* @__PURE__ */ jsxRuntime.jsx(providers.EntityBindingContext.Provider, { value: entityBindingSource, children });
60619
60619
  }
60620
+ function FitToBox({ children }) {
60621
+ const outerRef = React96.useRef(null);
60622
+ const innerRef = React96.useRef(null);
60623
+ const [scale, setScale] = React96.useState(1);
60624
+ React96.useEffect(() => {
60625
+ const outer = outerRef.current;
60626
+ const inner = innerRef.current;
60627
+ if (!outer || !inner) return;
60628
+ const update = () => {
60629
+ const sw = inner.scrollWidth;
60630
+ const sh = inner.scrollHeight;
60631
+ const cw = outer.clientWidth;
60632
+ const ch = outer.clientHeight;
60633
+ if (!sw || !sh || !cw || !ch) return;
60634
+ setScale(Math.min(1, cw / sw, ch / sh));
60635
+ };
60636
+ update();
60637
+ const ro = new ResizeObserver(update);
60638
+ ro.observe(outer);
60639
+ ro.observe(inner);
60640
+ return () => ro.disconnect();
60641
+ }, []);
60642
+ 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 }) });
60643
+ }
60620
60644
  function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
60621
60645
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
60622
60646
  const allPageTraits = React96.useMemo(() => {
@@ -60802,6 +60826,7 @@ function OrbPreview({
60802
60826
  getAccessToken,
60803
60827
  initialPagePath,
60804
60828
  isolated = false,
60829
+ fit = false,
60805
60830
  user = null
60806
60831
  }) {
60807
60832
  if (serverUrl && transport) {
@@ -60958,7 +60983,7 @@ function OrbPreview({
60958
60983
  Box,
60959
60984
  {
60960
60985
  ref: containerRef,
60961
- className: `overflow-auto border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
60986
+ className: `${fit ? "overflow-hidden" : "overflow-auto"} border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
60962
60987
  style: { height },
60963
60988
  children: [
60964
60989
  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 +60996,22 @@ function OrbPreview({
60971
60996
  storageKey: `almadar:navstack:${parseResult.schema.name ?? "preview"}`,
60972
60997
  children: [
60973
60998
  /* @__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(
60999
+ /* @__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(
61000
+ SchemaRunner,
61001
+ {
61002
+ schema: parseResult.schema,
61003
+ serverUrl,
61004
+ transport,
61005
+ getAccessToken,
61006
+ mockData: effectiveMockData,
61007
+ pageName: currentPage,
61008
+ routeParams,
61009
+ onNavigate: handleNavigateEffect,
61010
+ onNavigateBack: handleNavigateBack,
61011
+ onLocalFallback: handleLocalFallback,
61012
+ persistence
61013
+ }
61014
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx(
60975
61015
  SchemaRunner,
60976
61016
  {
60977
61017
  schema: parseResult.schema,
@@ -61002,7 +61042,8 @@ function BrowserPlayground({
61002
61042
  initialPagePath,
61003
61043
  height,
61004
61044
  className,
61005
- paused
61045
+ paused,
61046
+ fit
61006
61047
  }) {
61007
61048
  const [runtime] = React96.useState(
61008
61049
  () => new OrbitalServerRuntime.OrbitalServerRuntime({ mode, debug: false })
@@ -61064,6 +61105,7 @@ function BrowserPlayground({
61064
61105
  initialPagePath,
61065
61106
  height,
61066
61107
  className,
61108
+ fit,
61067
61109
  isolated: true
61068
61110
  }
61069
61111
  );
package/dist/avl/index.js CHANGED
@@ -60541,6 +60541,30 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60541
60541
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
60542
60542
  return /* @__PURE__ */ jsx(EntityBindingContext.Provider, { value: entityBindingSource, children });
60543
60543
  }
60544
+ function FitToBox({ children }) {
60545
+ const outerRef = useRef(null);
60546
+ const innerRef = useRef(null);
60547
+ const [scale, setScale] = useState(1);
60548
+ useEffect(() => {
60549
+ const outer = outerRef.current;
60550
+ const inner = innerRef.current;
60551
+ if (!outer || !inner) return;
60552
+ const update = () => {
60553
+ const sw = inner.scrollWidth;
60554
+ const sh = inner.scrollHeight;
60555
+ const cw = outer.clientWidth;
60556
+ const ch = outer.clientHeight;
60557
+ if (!sw || !sh || !cw || !ch) return;
60558
+ setScale(Math.min(1, cw / sw, ch / sh));
60559
+ };
60560
+ update();
60561
+ const ro = new ResizeObserver(update);
60562
+ ro.observe(outer);
60563
+ ro.observe(inner);
60564
+ return () => ro.disconnect();
60565
+ }, []);
60566
+ 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 }) });
60567
+ }
60544
60568
  function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
60545
60569
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
60546
60570
  const allPageTraits = useMemo(() => {
@@ -60726,6 +60750,7 @@ function OrbPreview({
60726
60750
  getAccessToken,
60727
60751
  initialPagePath,
60728
60752
  isolated = false,
60753
+ fit = false,
60729
60754
  user = null
60730
60755
  }) {
60731
60756
  if (serverUrl && transport) {
@@ -60882,7 +60907,7 @@ function OrbPreview({
60882
60907
  Box,
60883
60908
  {
60884
60909
  ref: containerRef,
60885
- className: `overflow-auto border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
60910
+ className: `${fit ? "overflow-hidden" : "overflow-auto"} border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
60886
60911
  style: { height },
60887
60912
  children: [
60888
60913
  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 +60920,22 @@ function OrbPreview({
60895
60920
  storageKey: `almadar:navstack:${parseResult.schema.name ?? "preview"}`,
60896
60921
  children: [
60897
60922
  /* @__PURE__ */ jsx(NavStackRefBridge, { apiRef: navStackRef }),
60898
- /* @__PURE__ */ jsx(OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsx(UISlotProvider, { children: /* @__PURE__ */ jsx(
60923
+ /* @__PURE__ */ jsx(OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsx(UISlotProvider, { children: fit ? /* @__PURE__ */ jsx(FitToBox, { children: /* @__PURE__ */ jsx(
60924
+ SchemaRunner,
60925
+ {
60926
+ schema: parseResult.schema,
60927
+ serverUrl,
60928
+ transport,
60929
+ getAccessToken,
60930
+ mockData: effectiveMockData,
60931
+ pageName: currentPage,
60932
+ routeParams,
60933
+ onNavigate: handleNavigateEffect,
60934
+ onNavigateBack: handleNavigateBack,
60935
+ onLocalFallback: handleLocalFallback,
60936
+ persistence
60937
+ }
60938
+ ) }) : /* @__PURE__ */ jsx(
60899
60939
  SchemaRunner,
60900
60940
  {
60901
60941
  schema: parseResult.schema,
@@ -60926,7 +60966,8 @@ function BrowserPlayground({
60926
60966
  initialPagePath,
60927
60967
  height,
60928
60968
  className,
60929
- paused
60969
+ paused,
60970
+ fit
60930
60971
  }) {
60931
60972
  const [runtime] = useState(
60932
60973
  () => new OrbitalServerRuntime({ mode, debug: false })
@@ -60988,6 +61029,7 @@ function BrowserPlayground({
60988
61029
  initialPagePath,
60989
61030
  height,
60990
61031
  className,
61032
+ fit,
60991
61033
  isolated: true
60992
61034
  }
60993
61035
  );
@@ -7942,7 +7942,7 @@ interface DataGridProps extends DataDndProps {
7942
7942
  * field whose type is relation. Same contract DetailPanel takes. */
7943
7943
  relationsData?: Record<string, readonly RelationOption[]>;
7944
7944
  }
7945
- declare function DataGrid({ entity, fields, columns, itemActions, maxInlineActions, scrollX, cols, gap, minCardWidth, className, isLoading, error, imageField, selectable, selectionEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, renderItem: schemaRenderItem, dragGroup, accepts, sortable, dropEvent, reorderEvent, positionEvent, dndItemIdField, dndRoot, look, relationsData, }: DataGridProps): string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
7945
+ declare function DataGrid({ entity, fields, columns, itemActions, maxInlineActions, scrollX, cols, gap, minCardWidth, className, isLoading, error, imageField, selectable, selectionEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, renderItem: schemaRenderItem, dragGroup, accepts, sortable, dropEvent, reorderEvent, positionEvent, dndItemIdField, dndRoot, look, relationsData, }: DataGridProps): string | number | bigint | boolean | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | React__default.JSX.Element | null | undefined;
7946
7946
  declare namespace DataGrid {
7947
7947
  var displayName: string;
7948
7948
  }
@@ -8104,7 +8104,7 @@ interface DataListProps extends DataDndProps {
8104
8104
  * field whose type is relation. Same contract DetailPanel takes. */
8105
8105
  relationsData?: Record<string, readonly RelationOption[]>;
8106
8106
  }
8107
- declare function DataList({ entity, fields, columns, itemActions, maxInlineActions, itemClickEvent, gap, variant, groupBy, senderField, senderLabelField, currentUser, emptyMessage, className, isLoading, error, reorderable: _reorderable, reorderEvent: _reorderEvent, swipeLeftEvent: _swipeLeftEvent, swipeLeftActions: _swipeLeftActions, swipeRightEvent: _swipeRightEvent, swipeRightActions: _swipeRightActions, longPressEvent: _longPressEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, sortBy, sortDirection, renderItem: schemaRenderItem, dragGroup, accepts, sortable: sortableProp, dropEvent, reorderEvent: dndReorderEvent, positionEvent, dndItemIdField, dndRoot, look, relationsData, }: DataListProps): string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
8107
+ declare function DataList({ entity, fields, columns, itemActions, maxInlineActions, itemClickEvent, gap, variant, groupBy, senderField, senderLabelField, currentUser, emptyMessage, className, isLoading, error, reorderable: _reorderable, reorderEvent: _reorderEvent, swipeLeftEvent: _swipeLeftEvent, swipeLeftActions: _swipeLeftActions, swipeRightEvent: _swipeRightEvent, swipeRightActions: _swipeRightActions, longPressEvent: _longPressEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, sortBy, sortDirection, renderItem: schemaRenderItem, dragGroup, accepts, sortable: sortableProp, dropEvent, reorderEvent: dndReorderEvent, positionEvent, dndItemIdField, dndRoot, look, relationsData, }: DataListProps): string | number | bigint | boolean | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | React__default.JSX.Element | null | undefined;
8108
8108
  declare namespace DataList {
8109
8109
  var displayName: string;
8110
8110
  }
@@ -7942,7 +7942,7 @@ interface DataGridProps extends DataDndProps {
7942
7942
  * field whose type is relation. Same contract DetailPanel takes. */
7943
7943
  relationsData?: Record<string, readonly RelationOption[]>;
7944
7944
  }
7945
- declare function DataGrid({ entity, fields, columns, itemActions, maxInlineActions, scrollX, cols, gap, minCardWidth, className, isLoading, error, imageField, selectable, selectionEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, renderItem: schemaRenderItem, dragGroup, accepts, sortable, dropEvent, reorderEvent, positionEvent, dndItemIdField, dndRoot, look, relationsData, }: DataGridProps): string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
7945
+ declare function DataGrid({ entity, fields, columns, itemActions, maxInlineActions, scrollX, cols, gap, minCardWidth, className, isLoading, error, imageField, selectable, selectionEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, renderItem: schemaRenderItem, dragGroup, accepts, sortable, dropEvent, reorderEvent, positionEvent, dndItemIdField, dndRoot, look, relationsData, }: DataGridProps): string | number | bigint | boolean | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | React__default.JSX.Element | null | undefined;
7946
7946
  declare namespace DataGrid {
7947
7947
  var displayName: string;
7948
7948
  }
@@ -8104,7 +8104,7 @@ interface DataListProps extends DataDndProps {
8104
8104
  * field whose type is relation. Same contract DetailPanel takes. */
8105
8105
  relationsData?: Record<string, readonly RelationOption[]>;
8106
8106
  }
8107
- declare function DataList({ entity, fields, columns, itemActions, maxInlineActions, itemClickEvent, gap, variant, groupBy, senderField, senderLabelField, currentUser, emptyMessage, className, isLoading, error, reorderable: _reorderable, reorderEvent: _reorderEvent, swipeLeftEvent: _swipeLeftEvent, swipeLeftActions: _swipeLeftActions, swipeRightEvent: _swipeRightEvent, swipeRightActions: _swipeRightActions, longPressEvent: _longPressEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, sortBy, sortDirection, renderItem: schemaRenderItem, dragGroup, accepts, sortable: sortableProp, dropEvent, reorderEvent: dndReorderEvent, positionEvent, dndItemIdField, dndRoot, look, relationsData, }: DataListProps): string | number | bigint | boolean | React__default.JSX.Element | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | null | undefined;
8107
+ declare function DataList({ entity, fields, columns, itemActions, maxInlineActions, itemClickEvent, gap, variant, groupBy, senderField, senderLabelField, currentUser, emptyMessage, className, isLoading, error, reorderable: _reorderable, reorderEvent: _reorderEvent, swipeLeftEvent: _swipeLeftEvent, swipeLeftActions: _swipeLeftActions, swipeRightEvent: _swipeRightEvent, swipeRightActions: _swipeRightActions, longPressEvent: _longPressEvent, infiniteScroll, loadMoreEvent, hasMore, children, pageSize, sortBy, sortDirection, renderItem: schemaRenderItem, dragGroup, accepts, sortable: sortableProp, dropEvent, reorderEvent: dndReorderEvent, positionEvent, dndItemIdField, dndRoot, look, relationsData, }: DataListProps): string | number | bigint | boolean | Iterable<React__default.ReactNode> | Promise<string | number | bigint | boolean | React__default.ReactPortal | React__default.ReactElement<unknown, string | React__default.JSXElementConstructor<any>> | Iterable<React__default.ReactNode> | null | undefined> | React__default.JSX.Element | null | undefined;
8108
8108
  declare namespace DataList {
8109
8109
  var displayName: string;
8110
8110
  }
@@ -54844,6 +54844,30 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54844
54844
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
54845
54845
  return /* @__PURE__ */ jsxRuntime.jsx(providers.EntityBindingContext.Provider, { value: entityBindingSource, children });
54846
54846
  }
54847
+ function FitToBox({ children }) {
54848
+ const outerRef = React87.useRef(null);
54849
+ const innerRef = React87.useRef(null);
54850
+ const [scale, setScale] = React87.useState(1);
54851
+ React87.useEffect(() => {
54852
+ const outer = outerRef.current;
54853
+ const inner = innerRef.current;
54854
+ if (!outer || !inner) return;
54855
+ const update = () => {
54856
+ const sw = inner.scrollWidth;
54857
+ const sh = inner.scrollHeight;
54858
+ const cw = outer.clientWidth;
54859
+ const ch = outer.clientHeight;
54860
+ if (!sw || !sh || !cw || !ch) return;
54861
+ setScale(Math.min(1, cw / sw, ch / sh));
54862
+ };
54863
+ update();
54864
+ const ro = new ResizeObserver(update);
54865
+ ro.observe(outer);
54866
+ ro.observe(inner);
54867
+ return () => ro.disconnect();
54868
+ }, []);
54869
+ 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 }) });
54870
+ }
54847
54871
  function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
54848
54872
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
54849
54873
  const allPageTraits = React87.useMemo(() => {
@@ -55029,6 +55053,7 @@ function OrbPreview({
55029
55053
  getAccessToken,
55030
55054
  initialPagePath,
55031
55055
  isolated = false,
55056
+ fit = false,
55032
55057
  user = null
55033
55058
  }) {
55034
55059
  if (serverUrl && transport) {
@@ -55185,7 +55210,7 @@ function OrbPreview({
55185
55210
  Box,
55186
55211
  {
55187
55212
  ref: containerRef,
55188
- className: `overflow-auto border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
55213
+ className: `${fit ? "overflow-hidden" : "overflow-auto"} border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
55189
55214
  style: { height },
55190
55215
  children: [
55191
55216
  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 +55223,22 @@ function OrbPreview({
55198
55223
  storageKey: `almadar:navstack:${parseResult.schema.name ?? "preview"}`,
55199
55224
  children: [
55200
55225
  /* @__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(
55226
+ /* @__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(
55227
+ SchemaRunner,
55228
+ {
55229
+ schema: parseResult.schema,
55230
+ serverUrl,
55231
+ transport,
55232
+ getAccessToken,
55233
+ mockData: effectiveMockData,
55234
+ pageName: currentPage,
55235
+ routeParams,
55236
+ onNavigate: handleNavigateEffect,
55237
+ onNavigateBack: handleNavigateBack,
55238
+ onLocalFallback: handleLocalFallback,
55239
+ persistence
55240
+ }
55241
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx(
55202
55242
  SchemaRunner,
55203
55243
  {
55204
55244
  schema: parseResult.schema,
@@ -55229,7 +55269,8 @@ function BrowserPlayground({
55229
55269
  initialPagePath,
55230
55270
  height,
55231
55271
  className,
55232
- paused
55272
+ paused,
55273
+ fit
55233
55274
  }) {
55234
55275
  const [runtime] = React87.useState(
55235
55276
  () => new OrbitalServerRuntime.OrbitalServerRuntime({ mode, debug: false })
@@ -55291,6 +55332,7 @@ function BrowserPlayground({
55291
55332
  initialPagePath,
55292
55333
  height,
55293
55334
  className,
55335
+ fit,
55294
55336
  isolated: true
55295
55337
  }
55296
55338
  );
@@ -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
@@ -54770,6 +54770,30 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54770
54770
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
54771
54771
  return /* @__PURE__ */ jsx(EntityBindingContext.Provider, { value: entityBindingSource, children });
54772
54772
  }
54773
+ function FitToBox({ children }) {
54774
+ const outerRef = useRef(null);
54775
+ const innerRef = useRef(null);
54776
+ const [scale, setScale] = useState(1);
54777
+ useEffect(() => {
54778
+ const outer = outerRef.current;
54779
+ const inner = innerRef.current;
54780
+ if (!outer || !inner) return;
54781
+ const update = () => {
54782
+ const sw = inner.scrollWidth;
54783
+ const sh = inner.scrollHeight;
54784
+ const cw = outer.clientWidth;
54785
+ const ch = outer.clientHeight;
54786
+ if (!sw || !sh || !cw || !ch) return;
54787
+ setScale(Math.min(1, cw / sw, ch / sh));
54788
+ };
54789
+ update();
54790
+ const ro = new ResizeObserver(update);
54791
+ ro.observe(outer);
54792
+ ro.observe(inner);
54793
+ return () => ro.disconnect();
54794
+ }, []);
54795
+ 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 }) });
54796
+ }
54773
54797
  function SchemaRunner({ schema, serverUrl, transport, getAccessToken, mockData, pageName, routeParams, onNavigate, onNavigateBack, onLocalFallback, persistence }) {
54774
54798
  const { traits: traits2, allEntities, allTraits, ir } = useResolvedSchema(schema, pageName);
54775
54799
  const allPageTraits = useMemo(() => {
@@ -54955,6 +54979,7 @@ function OrbPreview({
54955
54979
  getAccessToken,
54956
54980
  initialPagePath,
54957
54981
  isolated = false,
54982
+ fit = false,
54958
54983
  user = null
54959
54984
  }) {
54960
54985
  if (serverUrl && transport) {
@@ -55111,7 +55136,7 @@ function OrbPreview({
55111
55136
  Box,
55112
55137
  {
55113
55138
  ref: containerRef,
55114
- className: `overflow-auto border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
55139
+ className: `${fit ? "overflow-hidden" : "overflow-auto"} border border-[var(--color-border)] rounded-[var(--radius-md)] ${className ?? ""}`,
55115
55140
  style: { height },
55116
55141
  children: [
55117
55142
  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 +55149,22 @@ function OrbPreview({
55124
55149
  storageKey: `almadar:navstack:${parseResult.schema.name ?? "preview"}`,
55125
55150
  children: [
55126
55151
  /* @__PURE__ */ jsx(NavStackRefBridge, { apiRef: navStackRef }),
55127
- /* @__PURE__ */ jsx(OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsx(UISlotProvider, { children: /* @__PURE__ */ jsx(
55152
+ /* @__PURE__ */ jsx(OrbitalProvider, { initialData: effectiveMockData, skipTheme: true, verification: true, isolated, user, children: /* @__PURE__ */ jsx(UISlotProvider, { children: fit ? /* @__PURE__ */ jsx(FitToBox, { children: /* @__PURE__ */ jsx(
55153
+ SchemaRunner,
55154
+ {
55155
+ schema: parseResult.schema,
55156
+ serverUrl,
55157
+ transport,
55158
+ getAccessToken,
55159
+ mockData: effectiveMockData,
55160
+ pageName: currentPage,
55161
+ routeParams,
55162
+ onNavigate: handleNavigateEffect,
55163
+ onNavigateBack: handleNavigateBack,
55164
+ onLocalFallback: handleLocalFallback,
55165
+ persistence
55166
+ }
55167
+ ) }) : /* @__PURE__ */ jsx(
55128
55168
  SchemaRunner,
55129
55169
  {
55130
55170
  schema: parseResult.schema,
@@ -55155,7 +55195,8 @@ function BrowserPlayground({
55155
55195
  initialPagePath,
55156
55196
  height,
55157
55197
  className,
55158
- paused
55198
+ paused,
55199
+ fit
55159
55200
  }) {
55160
55201
  const [runtime] = useState(
55161
55202
  () => new OrbitalServerRuntime({ mode, debug: false })
@@ -55217,6 +55258,7 @@ function BrowserPlayground({
55217
55258
  initialPagePath,
55218
55259
  height,
55219
55260
  className,
55261
+ fit,
55220
55262
  isolated: true
55221
55263
  }
55222
55264
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "6.16.0",
3
+ "version": "6.17.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -121,7 +121,7 @@
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",
124
+ "@almadar/runtime": "^6.78.0",
125
125
  "@almadar/std": "^16.213.0",
126
126
  "@almadar/syntax": "^1.17.0",
127
127
  "@dnd-kit/core": "^6.3.1",