@almadar/ui 4.54.14 → 4.55.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.
@@ -25147,7 +25147,7 @@ var init_CurrentPagePathContext = __esm({
25147
25147
  useCurrentPagePath = () => React96.useContext(CurrentPagePathContext);
25148
25148
  }
25149
25149
  });
25150
- var DashboardLayout, NavLink;
25150
+ var DashboardLayout, NavLink, NavLinkTopnav, NavLinkBottom;
25151
25151
  var init_DashboardLayout = __esm({
25152
25152
  "components/templates/DashboardLayout.tsx"() {
25153
25153
  "use client";
@@ -25178,6 +25178,7 @@ var init_DashboardLayout = __esm({
25178
25178
  sidebarFooter,
25179
25179
  onSignOut: onSignOutProp,
25180
25180
  currentPath,
25181
+ layoutMode = "sidebar",
25181
25182
  children
25182
25183
  }) => {
25183
25184
  const eventBus = useEventBus();
@@ -25204,20 +25205,24 @@ var init_DashboardLayout = __esm({
25204
25205
  const user = userProp || (null);
25205
25206
  const { t } = useTranslate();
25206
25207
  const handleSignOut = onSignOutProp || authSignOut;
25208
+ const showSidebar = layoutMode === "sidebar";
25209
+ const showHeader = layoutMode !== "minimal";
25210
+ const showBottomNav = layoutMode === "bottomnav";
25211
+ const isTopNav = layoutMode === "topnav";
25207
25212
  return /* @__PURE__ */ jsxRuntime.jsxs(
25208
25213
  HStack,
25209
25214
  {
25210
25215
  gap: "none",
25211
25216
  className: "@container/dashboard min-h-screen w-full bg-background dark:bg-background items-stretch",
25212
25217
  children: [
25213
- sidebarOpen && /* @__PURE__ */ jsxRuntime.jsx(
25218
+ showSidebar && sidebarOpen && /* @__PURE__ */ jsxRuntime.jsx(
25214
25219
  Box,
25215
25220
  {
25216
25221
  className: "fixed inset-0 bg-foreground/50 dark:bg-foreground/70 z-20 @lg/dashboard:hidden",
25217
25222
  onClick: () => setSidebarOpen(false)
25218
25223
  }
25219
25224
  ),
25220
- /* @__PURE__ */ jsxRuntime.jsxs(
25225
+ showSidebar && /* @__PURE__ */ jsxRuntime.jsxs(
25221
25226
  Box,
25222
25227
  {
25223
25228
  as: "aside",
@@ -25289,7 +25294,7 @@ var init_DashboardLayout = __esm({
25289
25294
  }
25290
25295
  ),
25291
25296
  /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "none", className: "flex-1 min-w-0 min-h-screen", children: [
25292
- /* @__PURE__ */ jsxRuntime.jsx(
25297
+ showHeader && /* @__PURE__ */ jsxRuntime.jsx(
25293
25298
  Box,
25294
25299
  {
25295
25300
  as: "header",
@@ -25301,7 +25306,7 @@ var init_DashboardLayout = __esm({
25301
25306
  justify: "between",
25302
25307
  className: "h-full px-3 @sm/dashboard:px-4 gap-2 @sm/dashboard:gap-4",
25303
25308
  children: [
25304
- /* @__PURE__ */ jsxRuntime.jsx(
25309
+ showSidebar && /* @__PURE__ */ jsxRuntime.jsx(
25305
25310
  Button,
25306
25311
  {
25307
25312
  variant: "ghost",
@@ -25311,6 +25316,45 @@ var init_DashboardLayout = __esm({
25311
25316
  children: /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Menu, { className: "h-5 w-5" })
25312
25317
  }
25313
25318
  ),
25319
+ isTopNav && /* @__PURE__ */ jsxRuntime.jsxs(
25320
+ HStack,
25321
+ {
25322
+ as: "nav",
25323
+ align: "center",
25324
+ gap: "none",
25325
+ className: "hidden @md/dashboard:flex items-center gap-1 overflow-x-auto",
25326
+ children: [
25327
+ /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Link, { to: "/", className: "flex items-center gap-2 mr-3 shrink-0", children: [
25328
+ logo || /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "w-7 h-7 bg-primary-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
25329
+ Typography,
25330
+ {
25331
+ variant: "small",
25332
+ className: "text-white font-bold text-xs",
25333
+ as: "span",
25334
+ children: appName.charAt(0).toUpperCase()
25335
+ }
25336
+ ) }),
25337
+ /* @__PURE__ */ jsxRuntime.jsx(
25338
+ Typography,
25339
+ {
25340
+ variant: "label",
25341
+ className: "font-semibold text-foreground dark:text-foreground",
25342
+ as: "span",
25343
+ children: appName
25344
+ }
25345
+ )
25346
+ ] }),
25347
+ navItems.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
25348
+ NavLinkTopnav,
25349
+ {
25350
+ item,
25351
+ currentPath: activePath
25352
+ },
25353
+ item.href
25354
+ ))
25355
+ ]
25356
+ }
25357
+ ),
25314
25358
  searchEnabled && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "hidden @sm/dashboard:block flex-1 min-w-0 @xl/dashboard:max-w-md", children: /* @__PURE__ */ jsxRuntime.jsxs(Box, { className: "relative", children: [
25315
25359
  /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground dark:text-muted-foreground" }),
25316
25360
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -25458,7 +25502,22 @@ var init_DashboardLayout = __esm({
25458
25502
  )
25459
25503
  }
25460
25504
  ),
25461
- /* @__PURE__ */ jsxRuntime.jsx(Box, { as: "main", className: "flex-1 p-3 @sm/dashboard:p-4 @md/dashboard:p-6", children })
25505
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { as: "main", className: "flex-1 p-3 @sm/dashboard:p-4 @md/dashboard:p-6", children }),
25506
+ showBottomNav && /* @__PURE__ */ jsxRuntime.jsx(
25507
+ Box,
25508
+ {
25509
+ as: "nav",
25510
+ className: "sticky bottom-0 z-20 h-16 bg-card dark:bg-card border-t border-border dark:border-border @md/dashboard:hidden",
25511
+ children: /* @__PURE__ */ jsxRuntime.jsx(HStack, { align: "center", justify: "around", className: "h-full px-2", children: navItems.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
25512
+ NavLinkBottom,
25513
+ {
25514
+ item,
25515
+ currentPath: activePath
25516
+ },
25517
+ item.href
25518
+ )) })
25519
+ }
25520
+ )
25462
25521
  ] })
25463
25522
  ]
25464
25523
  }
@@ -25500,6 +25559,62 @@ var init_DashboardLayout = __esm({
25500
25559
  );
25501
25560
  };
25502
25561
  NavLink.displayName = "NavLink";
25562
+ NavLinkTopnav = ({
25563
+ item,
25564
+ currentPath
25565
+ }) => {
25566
+ const isActive = currentPath === item.href || currentPath.startsWith(item.href + "/");
25567
+ return /* @__PURE__ */ jsxRuntime.jsxs(
25568
+ reactRouterDom.Link,
25569
+ {
25570
+ to: item.href,
25571
+ className: cn(
25572
+ "flex items-center gap-1.5 px-3 py-1.5 rounded-md text-sm font-medium transition-colors whitespace-nowrap",
25573
+ isActive ? "bg-primary text-primary-foreground shadow-sm" : "text-muted-foreground hover:bg-muted hover:text-foreground"
25574
+ ),
25575
+ children: [
25576
+ item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: item.icon, className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(item.icon, { className: "h-4 w-4" })),
25577
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "flex-1", as: "span", children: item.label }),
25578
+ item.badge && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: isActive ? "primary" : "default", size: "sm", children: item.badge })
25579
+ ]
25580
+ }
25581
+ );
25582
+ };
25583
+ NavLinkTopnav.displayName = "NavLinkTopnav";
25584
+ NavLinkBottom = ({
25585
+ item,
25586
+ currentPath
25587
+ }) => {
25588
+ const isActive = currentPath === item.href || currentPath.startsWith(item.href + "/");
25589
+ const iconClassName = cn(
25590
+ "h-5 w-5",
25591
+ isActive ? "text-primary" : "text-muted-foreground"
25592
+ );
25593
+ return /* @__PURE__ */ jsxRuntime.jsxs(
25594
+ reactRouterDom.Link,
25595
+ {
25596
+ to: item.href,
25597
+ className: "flex flex-col items-center justify-center gap-0.5 px-2 py-1 rounded-lg transition-colors flex-1 min-w-0",
25598
+ children: [
25599
+ item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: item.icon, className: iconClassName }) : /* @__PURE__ */ jsxRuntime.jsx(item.icon, { className: iconClassName })),
25600
+ /* @__PURE__ */ jsxRuntime.jsx(
25601
+ Typography,
25602
+ {
25603
+ variant: "caption",
25604
+ className: cn(
25605
+ "text-[10px] leading-tight truncate max-w-full",
25606
+ isActive ? "text-primary font-medium" : "text-muted-foreground"
25607
+ ),
25608
+ as: "span",
25609
+ children: item.label
25610
+ }
25611
+ ),
25612
+ item.badge && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: isActive ? "primary" : "default", size: "sm", className: "text-[8px] px-1 py-0 min-w-0", children: item.badge })
25613
+ ]
25614
+ }
25615
+ );
25616
+ };
25617
+ NavLinkBottom.displayName = "NavLinkBottom";
25503
25618
  }
25504
25619
  });
25505
25620
  function useAlmadarDndSensors(withSortableKeyboard = true) {
@@ -60481,7 +60596,10 @@ function buildTransitionSchema(fullSchema, orbitalName, traitName, transitionEve
60481
60596
  if (!Array.isArray(eff)) continue;
60482
60597
  const op = eff[0];
60483
60598
  if (op === "render-ui") {
60484
- previewEffects.push(eff);
60599
+ const slotTarget = eff[1];
60600
+ const PORTAL_SLOTS = /* @__PURE__ */ new Set(["modal", "drawer", "overlay", "center"]);
60601
+ const rewritten = typeof slotTarget === "string" && PORTAL_SLOTS.has(slotTarget) ? ["render-ui", "main", ...eff.slice(2)] : eff;
60602
+ previewEffects.push(rewritten);
60485
60603
  hasRenderUI = true;
60486
60604
  continue;
60487
60605
  }
@@ -60757,7 +60875,7 @@ var OrbPreviewNodeInner = (props) => {
60757
60875
  },
60758
60876
  children: [
60759
60877
  /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12 }, children: "\u279E" }),
60760
- "Click to open"
60878
+ "Double-click to open"
60761
60879
  ]
60762
60880
  }
60763
60881
  )
@@ -60858,33 +60976,20 @@ var OrbPreviewNodeInner = (props) => {
60858
60976
  ref: setContentRef,
60859
60977
  className: `orb-preview-live nodrag${dragActive || l2IsOver ? " drag-active" : ""}`,
60860
60978
  onClick: handleContentClick,
60861
- children: orbitalSchema ? isExpanded ? (
60862
- // L2 transition card: OrbPreview's `<Box style={{height}}>` is the
60863
- // only positioned ancestor with a resolved height inside the
60864
- // runtime tree. When the synthesized transition's render-ui
60865
- // targets `modal`/`drawer`/`overlay`, UISlotRenderer paints them
60866
- // via `renderContainedPortal` as `absolute inset-0` which
60867
- // collapses to 0 when the parent chain is `height: auto` →
60868
- // `min-h-full` (no resolved height to inherit). Forcing a real
60869
- // pixel height here gives the contained modal a real card to
60870
- // fill, so the L2 preview shows the modal panel sized to the
60871
- // card instead of a tiny floating rectangle.
60872
- /* @__PURE__ */ jsxRuntime.jsx(
60979
+ children: orbitalSchema ? (
60980
+ // L1 and L2 both auto-grow with content. L2's `buildTransitionSchema`
60981
+ // rewrites portal slots (modal/drawer/overlay/center) to `main`, so
60982
+ // the rendered pattern lands inline in the main slot and contributes
60983
+ // to the card's height — same height model as L1 orbital cards.
60984
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsxRuntime.jsx(
60873
60985
  BrowserPlayground,
60874
60986
  {
60875
60987
  schema: orbitalSchema,
60876
60988
  mode: "mock",
60877
- height: `${preset.minHeight}px`
60989
+ height: "auto"
60878
60990
  }
60879
- )
60880
- ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsxRuntime.jsx(
60881
- BrowserPlayground,
60882
- {
60883
- schema: orbitalSchema,
60884
- mode: "mock",
60885
- height: "auto"
60886
- }
60887
- ) }) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex items-center justify-center", style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: "No preview available" }) })
60991
+ ) })
60992
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "flex items-center justify-center", style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", className: "text-muted-foreground", children: "No preview available" }) })
60888
60993
  }
60889
60994
  ),
60890
60995
  /* @__PURE__ */ jsxRuntime.jsx(react.Handle, { type: "target", position: react.Position.Left, style: TARGET_HANDLE_STYLE }),
@@ -62377,10 +62482,7 @@ function FlowCanvasInner({
62377
62482
  const orbitalName = nodeData.orbitalName ?? node.id;
62378
62483
  onNodeClick?.({ level: "overview", orbital: orbitalName });
62379
62484
  onNodeSelect?.(orbitalName);
62380
- setExpandedOrbital(orbitalName);
62381
- setLevel("expanded");
62382
- onLevelChange?.("expanded", orbitalName);
62383
- }, [level, expandedOrbital, onNodeClick, onNodeSelect, onLevelChange]);
62485
+ }, [level, expandedOrbital, onNodeClick, onNodeSelect]);
62384
62486
  const handleClosePanel = React96.useCallback(() => {
62385
62487
  setSelectedNode(null);
62386
62488
  }, []);
package/dist/avl/index.js CHANGED
@@ -25101,7 +25101,7 @@ var init_CurrentPagePathContext = __esm({
25101
25101
  useCurrentPagePath = () => useContext(CurrentPagePathContext);
25102
25102
  }
25103
25103
  });
25104
- var DashboardLayout, NavLink;
25104
+ var DashboardLayout, NavLink, NavLinkTopnav, NavLinkBottom;
25105
25105
  var init_DashboardLayout = __esm({
25106
25106
  "components/templates/DashboardLayout.tsx"() {
25107
25107
  "use client";
@@ -25132,6 +25132,7 @@ var init_DashboardLayout = __esm({
25132
25132
  sidebarFooter,
25133
25133
  onSignOut: onSignOutProp,
25134
25134
  currentPath,
25135
+ layoutMode = "sidebar",
25135
25136
  children
25136
25137
  }) => {
25137
25138
  const eventBus = useEventBus();
@@ -25158,20 +25159,24 @@ var init_DashboardLayout = __esm({
25158
25159
  const user = userProp || (null);
25159
25160
  const { t } = useTranslate();
25160
25161
  const handleSignOut = onSignOutProp || authSignOut;
25162
+ const showSidebar = layoutMode === "sidebar";
25163
+ const showHeader = layoutMode !== "minimal";
25164
+ const showBottomNav = layoutMode === "bottomnav";
25165
+ const isTopNav = layoutMode === "topnav";
25161
25166
  return /* @__PURE__ */ jsxs(
25162
25167
  HStack,
25163
25168
  {
25164
25169
  gap: "none",
25165
25170
  className: "@container/dashboard min-h-screen w-full bg-background dark:bg-background items-stretch",
25166
25171
  children: [
25167
- sidebarOpen && /* @__PURE__ */ jsx(
25172
+ showSidebar && sidebarOpen && /* @__PURE__ */ jsx(
25168
25173
  Box,
25169
25174
  {
25170
25175
  className: "fixed inset-0 bg-foreground/50 dark:bg-foreground/70 z-20 @lg/dashboard:hidden",
25171
25176
  onClick: () => setSidebarOpen(false)
25172
25177
  }
25173
25178
  ),
25174
- /* @__PURE__ */ jsxs(
25179
+ showSidebar && /* @__PURE__ */ jsxs(
25175
25180
  Box,
25176
25181
  {
25177
25182
  as: "aside",
@@ -25243,7 +25248,7 @@ var init_DashboardLayout = __esm({
25243
25248
  }
25244
25249
  ),
25245
25250
  /* @__PURE__ */ jsxs(VStack, { gap: "none", className: "flex-1 min-w-0 min-h-screen", children: [
25246
- /* @__PURE__ */ jsx(
25251
+ showHeader && /* @__PURE__ */ jsx(
25247
25252
  Box,
25248
25253
  {
25249
25254
  as: "header",
@@ -25255,7 +25260,7 @@ var init_DashboardLayout = __esm({
25255
25260
  justify: "between",
25256
25261
  className: "h-full px-3 @sm/dashboard:px-4 gap-2 @sm/dashboard:gap-4",
25257
25262
  children: [
25258
- /* @__PURE__ */ jsx(
25263
+ showSidebar && /* @__PURE__ */ jsx(
25259
25264
  Button,
25260
25265
  {
25261
25266
  variant: "ghost",
@@ -25265,6 +25270,45 @@ var init_DashboardLayout = __esm({
25265
25270
  children: /* @__PURE__ */ jsx(Menu$1, { className: "h-5 w-5" })
25266
25271
  }
25267
25272
  ),
25273
+ isTopNav && /* @__PURE__ */ jsxs(
25274
+ HStack,
25275
+ {
25276
+ as: "nav",
25277
+ align: "center",
25278
+ gap: "none",
25279
+ className: "hidden @md/dashboard:flex items-center gap-1 overflow-x-auto",
25280
+ children: [
25281
+ /* @__PURE__ */ jsxs(Link, { to: "/", className: "flex items-center gap-2 mr-3 shrink-0", children: [
25282
+ logo || /* @__PURE__ */ jsx(Box, { className: "w-7 h-7 bg-primary-600 rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsx(
25283
+ Typography,
25284
+ {
25285
+ variant: "small",
25286
+ className: "text-white font-bold text-xs",
25287
+ as: "span",
25288
+ children: appName.charAt(0).toUpperCase()
25289
+ }
25290
+ ) }),
25291
+ /* @__PURE__ */ jsx(
25292
+ Typography,
25293
+ {
25294
+ variant: "label",
25295
+ className: "font-semibold text-foreground dark:text-foreground",
25296
+ as: "span",
25297
+ children: appName
25298
+ }
25299
+ )
25300
+ ] }),
25301
+ navItems.map((item) => /* @__PURE__ */ jsx(
25302
+ NavLinkTopnav,
25303
+ {
25304
+ item,
25305
+ currentPath: activePath
25306
+ },
25307
+ item.href
25308
+ ))
25309
+ ]
25310
+ }
25311
+ ),
25268
25312
  searchEnabled && /* @__PURE__ */ jsx(Box, { className: "hidden @sm/dashboard:block flex-1 min-w-0 @xl/dashboard:max-w-md", children: /* @__PURE__ */ jsxs(Box, { className: "relative", children: [
25269
25313
  /* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground dark:text-muted-foreground" }),
25270
25314
  /* @__PURE__ */ jsx(
@@ -25412,7 +25456,22 @@ var init_DashboardLayout = __esm({
25412
25456
  )
25413
25457
  }
25414
25458
  ),
25415
- /* @__PURE__ */ jsx(Box, { as: "main", className: "flex-1 p-3 @sm/dashboard:p-4 @md/dashboard:p-6", children })
25459
+ /* @__PURE__ */ jsx(Box, { as: "main", className: "flex-1 p-3 @sm/dashboard:p-4 @md/dashboard:p-6", children }),
25460
+ showBottomNav && /* @__PURE__ */ jsx(
25461
+ Box,
25462
+ {
25463
+ as: "nav",
25464
+ className: "sticky bottom-0 z-20 h-16 bg-card dark:bg-card border-t border-border dark:border-border @md/dashboard:hidden",
25465
+ children: /* @__PURE__ */ jsx(HStack, { align: "center", justify: "around", className: "h-full px-2", children: navItems.map((item) => /* @__PURE__ */ jsx(
25466
+ NavLinkBottom,
25467
+ {
25468
+ item,
25469
+ currentPath: activePath
25470
+ },
25471
+ item.href
25472
+ )) })
25473
+ }
25474
+ )
25416
25475
  ] })
25417
25476
  ]
25418
25477
  }
@@ -25454,6 +25513,62 @@ var init_DashboardLayout = __esm({
25454
25513
  );
25455
25514
  };
25456
25515
  NavLink.displayName = "NavLink";
25516
+ NavLinkTopnav = ({
25517
+ item,
25518
+ currentPath
25519
+ }) => {
25520
+ const isActive = currentPath === item.href || currentPath.startsWith(item.href + "/");
25521
+ return /* @__PURE__ */ jsxs(
25522
+ Link,
25523
+ {
25524
+ to: item.href,
25525
+ className: cn(
25526
+ "flex items-center gap-1.5 px-3 py-1.5 rounded-md text-sm font-medium transition-colors whitespace-nowrap",
25527
+ isActive ? "bg-primary text-primary-foreground shadow-sm" : "text-muted-foreground hover:bg-muted hover:text-foreground"
25528
+ ),
25529
+ children: [
25530
+ item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: item.icon, className: "h-4 w-4" }) : /* @__PURE__ */ jsx(item.icon, { className: "h-4 w-4" })),
25531
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "flex-1", as: "span", children: item.label }),
25532
+ item.badge && /* @__PURE__ */ jsx(Badge, { variant: isActive ? "primary" : "default", size: "sm", children: item.badge })
25533
+ ]
25534
+ }
25535
+ );
25536
+ };
25537
+ NavLinkTopnav.displayName = "NavLinkTopnav";
25538
+ NavLinkBottom = ({
25539
+ item,
25540
+ currentPath
25541
+ }) => {
25542
+ const isActive = currentPath === item.href || currentPath.startsWith(item.href + "/");
25543
+ const iconClassName = cn(
25544
+ "h-5 w-5",
25545
+ isActive ? "text-primary" : "text-muted-foreground"
25546
+ );
25547
+ return /* @__PURE__ */ jsxs(
25548
+ Link,
25549
+ {
25550
+ to: item.href,
25551
+ className: "flex flex-col items-center justify-center gap-0.5 px-2 py-1 rounded-lg transition-colors flex-1 min-w-0",
25552
+ children: [
25553
+ item.icon && (typeof item.icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: item.icon, className: iconClassName }) : /* @__PURE__ */ jsx(item.icon, { className: iconClassName })),
25554
+ /* @__PURE__ */ jsx(
25555
+ Typography,
25556
+ {
25557
+ variant: "caption",
25558
+ className: cn(
25559
+ "text-[10px] leading-tight truncate max-w-full",
25560
+ isActive ? "text-primary font-medium" : "text-muted-foreground"
25561
+ ),
25562
+ as: "span",
25563
+ children: item.label
25564
+ }
25565
+ ),
25566
+ item.badge && /* @__PURE__ */ jsx(Badge, { variant: isActive ? "primary" : "default", size: "sm", className: "text-[8px] px-1 py-0 min-w-0", children: item.badge })
25567
+ ]
25568
+ }
25569
+ );
25570
+ };
25571
+ NavLinkBottom.displayName = "NavLinkBottom";
25457
25572
  }
25458
25573
  });
25459
25574
  function useAlmadarDndSensors(withSortableKeyboard = true) {
@@ -60435,7 +60550,10 @@ function buildTransitionSchema(fullSchema, orbitalName, traitName, transitionEve
60435
60550
  if (!Array.isArray(eff)) continue;
60436
60551
  const op = eff[0];
60437
60552
  if (op === "render-ui") {
60438
- previewEffects.push(eff);
60553
+ const slotTarget = eff[1];
60554
+ const PORTAL_SLOTS = /* @__PURE__ */ new Set(["modal", "drawer", "overlay", "center"]);
60555
+ const rewritten = typeof slotTarget === "string" && PORTAL_SLOTS.has(slotTarget) ? ["render-ui", "main", ...eff.slice(2)] : eff;
60556
+ previewEffects.push(rewritten);
60439
60557
  hasRenderUI = true;
60440
60558
  continue;
60441
60559
  }
@@ -60711,7 +60829,7 @@ var OrbPreviewNodeInner = (props) => {
60711
60829
  },
60712
60830
  children: [
60713
60831
  /* @__PURE__ */ jsx("span", { style: { fontSize: 12 }, children: "\u279E" }),
60714
- "Click to open"
60832
+ "Double-click to open"
60715
60833
  ]
60716
60834
  }
60717
60835
  )
@@ -60812,33 +60930,20 @@ var OrbPreviewNodeInner = (props) => {
60812
60930
  ref: setContentRef,
60813
60931
  className: `orb-preview-live nodrag${dragActive || l2IsOver ? " drag-active" : ""}`,
60814
60932
  onClick: handleContentClick,
60815
- children: orbitalSchema ? isExpanded ? (
60816
- // L2 transition card: OrbPreview's `<Box style={{height}}>` is the
60817
- // only positioned ancestor with a resolved height inside the
60818
- // runtime tree. When the synthesized transition's render-ui
60819
- // targets `modal`/`drawer`/`overlay`, UISlotRenderer paints them
60820
- // via `renderContainedPortal` as `absolute inset-0` which
60821
- // collapses to 0 when the parent chain is `height: auto` →
60822
- // `min-h-full` (no resolved height to inherit). Forcing a real
60823
- // pixel height here gives the contained modal a real card to
60824
- // fill, so the L2 preview shows the modal panel sized to the
60825
- // card instead of a tiny floating rectangle.
60826
- /* @__PURE__ */ jsx(
60933
+ children: orbitalSchema ? (
60934
+ // L1 and L2 both auto-grow with content. L2's `buildTransitionSchema`
60935
+ // rewrites portal slots (modal/drawer/overlay/center) to `main`, so
60936
+ // the rendered pattern lands inline in the main slot and contributes
60937
+ // to the card's height — same height model as L1 orbital cards.
60938
+ /* @__PURE__ */ jsx(Box, { style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsx(
60827
60939
  BrowserPlayground,
60828
60940
  {
60829
60941
  schema: orbitalSchema,
60830
60942
  mode: "mock",
60831
- height: `${preset.minHeight}px`
60943
+ height: "auto"
60832
60944
  }
60833
- )
60834
- ) : /* @__PURE__ */ jsx(Box, { style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsx(
60835
- BrowserPlayground,
60836
- {
60837
- schema: orbitalSchema,
60838
- mode: "mock",
60839
- height: "auto"
60840
- }
60841
- ) }) : /* @__PURE__ */ jsx(Box, { className: "flex items-center justify-center", style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: "No preview available" }) })
60945
+ ) })
60946
+ ) : /* @__PURE__ */ jsx(Box, { className: "flex items-center justify-center", style: { minHeight: preset.minHeight }, children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-muted-foreground", children: "No preview available" }) })
60842
60947
  }
60843
60948
  ),
60844
60949
  /* @__PURE__ */ jsx(Handle, { type: "target", position: Position.Left, style: TARGET_HANDLE_STYLE }),
@@ -62331,10 +62436,7 @@ function FlowCanvasInner({
62331
62436
  const orbitalName = nodeData.orbitalName ?? node.id;
62332
62437
  onNodeClick?.({ level: "overview", orbital: orbitalName });
62333
62438
  onNodeSelect?.(orbitalName);
62334
- setExpandedOrbital(orbitalName);
62335
- setLevel("expanded");
62336
- onLevelChange?.("expanded", orbitalName);
62337
- }, [level, expandedOrbital, onNodeClick, onNodeSelect, onLevelChange]);
62439
+ }, [level, expandedOrbital, onNodeClick, onNodeSelect]);
62338
62440
  const handleClosePanel = useCallback(() => {
62339
62441
  setSelectedNode(null);
62340
62442
  }, []);