gridsmith-ui 0.6.7 → 0.7.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.
package/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
1
  import { Skeleton } from './chunk-M3AARGLI.js';
2
2
  export { Skeleton } from './chunk-M3AARGLI.js';
3
3
  import { useOverlayLayer, useCloseOnFocusOut, useReturnFocus, focusInitial, useFocusTrap, OVERLAY_CLOSE_ATTR, useNonModalDialog, rovingTabStop } from './chunk-RLUK575N.js';
4
- import { Link } from './chunk-R2HNSJJG.js';
5
- export { CodeBlock, Divider, Link } from './chunk-R2HNSJJG.js';
6
- import { Badge } from './chunk-ADTPGMOD.js';
7
- export { Badge } from './chunk-ADTPGMOD.js';
4
+ import { Link } from './chunk-G6KC5YNY.js';
5
+ export { CodeBlock, Divider, Link } from './chunk-G6KC5YNY.js';
6
+ import { Badge } from './chunk-QVNGQ64Q.js';
7
+ export { Badge } from './chunk-QVNGQ64Q.js';
8
8
  import { useBreakpoint } from './chunk-EKQHHP72.js';
9
9
  export { BreakpointWidthProvider, useBreakpoint } from './chunk-EKQHHP72.js';
10
- import { Tooltip, useTextOverflow, usePosition, Slot } from './chunk-LTV5X3S7.js';
11
- export { Tooltip, useTextOverflow } from './chunk-LTV5X3S7.js';
10
+ import { Tooltip, useTextOverflow, usePosition, Slot } from './chunk-RLNIRPOH.js';
11
+ export { Tooltip, useTextOverflow } from './chunk-RLNIRPOH.js';
12
12
  import { useLatest } from './chunk-WH2FUFAC.js';
13
- import { Icon } from './chunk-NM3BFWHH.js';
13
+ import { Icon } from './chunk-X4CNZFWC.js';
14
14
  import { cn, GLASS_SURFACE, ACTIVE_RING, GLASS_BACKDROP, GLASS_DROPDOWN, lockBodyScroll, unlockBodyScroll, GLASS_OVERLAY, ERROR_ACTIVE_RING, ERROR_FOCUS_RING, FOCUS_RING, ERROR_HAS_FOCUS_RING, HAS_FOCUS_RING, ERROR_FOCUS_WITHIN_RING, FOCUS_WITHIN_RING } from './chunk-4KVFH5KC.js';
15
- import { createContext, forwardRef, useContext, useState, memo, useRef, useEffect, useCallback, useLayoutEffect, useId, isValidElement, cloneElement, Fragment as Fragment$1, useMemo, Children, useSyncExternalStore } from 'react';
15
+ import { createContext, forwardRef, useContext, useState, memo, useCallback, useRef, useEffect, useLayoutEffect, Children, useId, isValidElement, cloneElement, Fragment as Fragment$1, useMemo, useSyncExternalStore } from 'react';
16
16
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
17
17
  import { createPortal } from 'react-dom';
18
18
 
@@ -540,7 +540,8 @@ function Dropdown({
540
540
  ref,
541
541
  container,
542
542
  error = false,
543
- showChips = true
543
+ showChips = true,
544
+ "aria-label": ariaLabel
544
545
  }) {
545
546
  const [open, setOpen] = useState(false);
546
547
  const [search, setSearch] = useState("");
@@ -706,6 +707,7 @@ function Dropdown({
706
707
  "aria-invalid": error || void 0,
707
708
  "aria-haspopup": "listbox",
708
709
  "aria-expanded": open,
710
+ "aria-label": ariaLabel,
709
711
  className: cn(
710
712
  "w-full flex items-center justify-between gap-ds-2",
711
713
  size === "sm" ? "px-ds-2 py-ds-1 text-xs h-[var(--ds-control-height-sm)]" : "px-ds-3 py-ds-2 text-sm h-[var(--ds-control-height-md)]",
@@ -4308,19 +4310,22 @@ function TrendBadge({ trend }) {
4308
4310
  flat: "text-[var(--ds-text-muted)] bg-[var(--ds-bg-muted)]"
4309
4311
  };
4310
4312
  const arrows = { up: "\u2191", down: "\u2193", flat: "\u2192" };
4311
- return /* @__PURE__ */ jsxs(
4313
+ const { ref, isTruncated } = useTextOverflow({ lines: 1, content: trend.value });
4314
+ const badge = /* @__PURE__ */ jsxs(
4312
4315
  "span",
4313
4316
  {
4314
4317
  className: cn(
4315
- "inline-flex items-center gap-ds-0.5 text-xs font-medium rounded-[var(--ds-radius-sm)] px-ds-1.5 py-ds-0.5",
4318
+ "inline-flex items-center gap-ds-0.5 text-xs font-medium rounded-[var(--ds-radius-sm)] px-ds-1.5 py-ds-0.5 min-w-0 max-w-full",
4316
4319
  colors[trend.direction]
4317
4320
  ),
4318
4321
  children: [
4319
4322
  /* @__PURE__ */ jsx("span", { children: arrows[trend.direction] }),
4320
- trend.value
4323
+ /* @__PURE__ */ jsx("span", { ref, className: "truncate", children: trend.value })
4321
4324
  ]
4322
4325
  }
4323
4326
  );
4327
+ if (!isTruncated) return badge;
4328
+ return /* @__PURE__ */ jsx(Tooltip, { content: trend.value, children: badge });
4324
4329
  }
4325
4330
  function DataList({ items, columns = 1, className }) {
4326
4331
  return /* @__PURE__ */ jsx(
@@ -4851,7 +4856,8 @@ function SegmentedControl({
4851
4856
  variant = "default",
4852
4857
  fullWidth = false,
4853
4858
  onHoverChange,
4854
- className
4859
+ className,
4860
+ "aria-label": ariaLabel
4855
4861
  }) {
4856
4862
  const containerRef = useRef(null);
4857
4863
  const [indicator, setIndicator] = useState({ left: 0, width: 0 });
@@ -4905,6 +4911,7 @@ function SegmentedControl({
4905
4911
  {
4906
4912
  ref: containerRef,
4907
4913
  role: "radiogroup",
4914
+ "aria-label": ariaLabel,
4908
4915
  onKeyDown: handleKeyDown,
4909
4916
  className: cn(
4910
4917
  "relative items-center",
@@ -6509,18 +6516,25 @@ var defaultIcons = {
6509
6516
  error: "\u26A0",
6510
6517
  "no-permission": "\u{1F512}"
6511
6518
  };
6519
+ var FRAME_ICON_SIZE = 28;
6520
+ function renderIcon(icon) {
6521
+ if (typeof icon === "string") return /* @__PURE__ */ jsx(Icon, { name: icon, size: FRAME_ICON_SIZE, className: "text-[var(--ds-text-muted)]" });
6522
+ if (isValidElement(icon) && icon.type === Icon) return cloneElement(icon, { size: FRAME_ICON_SIZE });
6523
+ return icon;
6524
+ }
6512
6525
  function EmptyState({ icon, iconFrame = "circle", title, description, action, variant = "empty", bordered = false, className }) {
6526
+ const iconNode = icon === void 0 || icon === null ? void 0 : renderIcon(icon);
6513
6527
  return /* @__PURE__ */ jsxs(
6514
6528
  "div",
6515
6529
  {
6516
6530
  className: cn(
6517
- "flex flex-col items-center justify-center py-[var(--ds-space-10)]",
6531
+ "flex flex-col items-center justify-center py-[var(--ds-space-10)] px-[var(--ds-space-6)]",
6518
6532
  "rounded-[var(--ds-radius-md)] bg-[var(--ds-bg-surface)]",
6519
6533
  bordered && "border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]",
6520
6534
  className
6521
6535
  ),
6522
6536
  children: [
6523
- iconFrame === "none" && icon ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center mb-ds-4", children: icon }) : /* @__PURE__ */ jsx("div", { className: "w-16 h-16 rounded-[var(--ds-radius-full)] bg-[var(--ds-bg-emphasis)] flex items-center justify-center mb-ds-4", children: icon ?? /* @__PURE__ */ jsx("span", { className: "text-2xl text-[var(--ds-text-muted)]", children: defaultIcons[variant] }) }),
6537
+ iconFrame === "none" && iconNode ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center mb-ds-4", children: iconNode }) : /* @__PURE__ */ jsx("div", { className: "w-16 h-16 rounded-[var(--ds-radius-full)] bg-[var(--ds-bg-emphasis)] flex items-center justify-center mb-ds-4", children: iconNode ?? /* @__PURE__ */ jsx("span", { className: "text-2xl text-[var(--ds-text-muted)]", children: defaultIcons[variant] }) }),
6524
6538
  /* @__PURE__ */ jsx("h3", { className: "font-[family-name:var(--ds-font-display)] text-lg font-[var(--ds-weight-heading)] text-[var(--ds-text-primary)]", children: title }),
6525
6539
  description && /* @__PURE__ */ jsx("p", { className: "mt-ds-1 text-sm text-[var(--ds-text-muted)] max-w-sm text-center", children: description }),
6526
6540
  action && /* @__PURE__ */ jsx("div", { className: "mt-ds-4", children: action })
@@ -6528,6 +6542,130 @@ function EmptyState({ icon, iconFrame = "circle", title, description, action, va
6528
6542
  }
6529
6543
  );
6530
6544
  }
6545
+ function SkipLink({ href = "#main", children = "Skip to content", className }) {
6546
+ return /* @__PURE__ */ jsx(
6547
+ "a",
6548
+ {
6549
+ href,
6550
+ className: cn(
6551
+ "sr-only focus:not-sr-only focus:fixed focus:top-[var(--ds-space-2)] focus:left-[var(--ds-space-2)] focus:z-[var(--ds-z-tooltip)]",
6552
+ "focus:px-[var(--ds-space-3)] focus:py-[var(--ds-space-2)] focus:rounded-[var(--ds-radius-md)] focus:text-sm focus:font-medium",
6553
+ "focus:bg-[var(--ds-bg-surface-elevated)] focus:text-[var(--ds-text-primary)] focus:shadow-[var(--ds-shadow-md)]",
6554
+ "focus:outline-none focus:ring-2 focus:ring-[var(--ds-accent-primary)]",
6555
+ className
6556
+ ),
6557
+ children
6558
+ }
6559
+ );
6560
+ }
6561
+ function useCompact(ref, breakpoint) {
6562
+ const [compact, setCompact] = useState(false);
6563
+ const check = useCallback(() => {
6564
+ const width = ref.current?.offsetWidth ?? 0;
6565
+ if (width > 0) setCompact(width < breakpoint);
6566
+ }, [ref, breakpoint]);
6567
+ useLayoutEffect(() => {
6568
+ check();
6569
+ if (!ref.current || typeof ResizeObserver === "undefined") return;
6570
+ const observer = new ResizeObserver(check);
6571
+ observer.observe(ref.current);
6572
+ return () => observer.disconnect();
6573
+ }, [check, ref]);
6574
+ return compact;
6575
+ }
6576
+ function TableToolbar({
6577
+ search,
6578
+ primaryFilter,
6579
+ filters,
6580
+ filtersOpen,
6581
+ onFiltersOpenChange,
6582
+ activeFilterCount,
6583
+ activeFilters,
6584
+ onClearAll,
6585
+ resultCount,
6586
+ resultNoun = ["result", "results"],
6587
+ actions,
6588
+ size = "sm",
6589
+ compactBreakpoint = 680,
6590
+ className
6591
+ }) {
6592
+ const rowRef = useRef(null);
6593
+ const compact = useCompact(rowRef, compactBreakpoint);
6594
+ const filterRowId = useId();
6595
+ const [openState, setOpenState] = useState(false);
6596
+ const open = filtersOpen ?? openState;
6597
+ const setOpen = (next) => {
6598
+ setOpenState(next);
6599
+ onFiltersOpenChange?.(next);
6600
+ };
6601
+ const iconSize = size === "sm" ? 14 : 16;
6602
+ const count = activeFilterCount ?? activeFilters?.length ?? 0;
6603
+ const hasChips = !!activeFilters?.length;
6604
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-ds-3 min-w-0", className), "data-table-toolbar": "", children: [
6605
+ /* @__PURE__ */ jsxs("div", { ref: rowRef, className: "flex items-center gap-ds-2 flex-wrap", children: [
6606
+ search && /* @__PURE__ */ jsx(
6607
+ Input,
6608
+ {
6609
+ "aria-label": search.label,
6610
+ placeholder: search.placeholder ?? search.label,
6611
+ value: search.value,
6612
+ size,
6613
+ onChange: (e) => search.onChange(e.target.value),
6614
+ className: "flex-1 min-w-[160px] max-w-[280px]"
6615
+ }
6616
+ ),
6617
+ primaryFilter && (compact ? /* @__PURE__ */ jsx(
6618
+ Dropdown,
6619
+ {
6620
+ "aria-label": primaryFilter.label,
6621
+ options: primaryFilter.options.map((o) => ({ id: o.value, label: o.label })),
6622
+ value: primaryFilter.value,
6623
+ onChange: (v) => primaryFilter.onChange(v),
6624
+ size,
6625
+ className: "w-[150px]"
6626
+ }
6627
+ ) : /* @__PURE__ */ jsx(
6628
+ SegmentedControl,
6629
+ {
6630
+ "aria-label": primaryFilter.label,
6631
+ options: primaryFilter.options,
6632
+ value: primaryFilter.value,
6633
+ size,
6634
+ onChange: primaryFilter.onChange
6635
+ }
6636
+ )),
6637
+ (filters || actions) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-ds-2 flex-1 justify-end", children: [
6638
+ filters && /* @__PURE__ */ jsxs(
6639
+ Button,
6640
+ {
6641
+ variant: open ? "secondary" : "outline",
6642
+ size,
6643
+ iconLeft: /* @__PURE__ */ jsx(Icon, { name: "filter", size: iconSize }),
6644
+ onClick: () => setOpen(!open),
6645
+ "aria-expanded": open,
6646
+ "aria-controls": filterRowId,
6647
+ className: "mr-auto",
6648
+ children: [
6649
+ "Filters",
6650
+ count > 0 && !open && /* @__PURE__ */ jsx(Badge, { variant: "default", size: "xs", className: "ml-ds-1", children: count })
6651
+ ]
6652
+ }
6653
+ ),
6654
+ actions
6655
+ ] })
6656
+ ] }),
6657
+ filters && open && /* @__PURE__ */ jsx("div", { id: filterRowId, className: "flex items-center gap-ds-3 flex-wrap", children: filters }),
6658
+ (resultCount !== void 0 || hasChips) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-ds-2 flex-wrap", children: [
6659
+ resultCount !== void 0 && /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--ds-text-muted)]", "aria-live": "polite", children: [
6660
+ resultCount,
6661
+ " ",
6662
+ resultCount === 1 ? resultNoun[0] : resultNoun[1]
6663
+ ] }),
6664
+ activeFilters?.map((f) => /* @__PURE__ */ jsx(Tag, { size: "sm", variant: "subtle", onRemove: f.onRemove, children: f.label }, f.id)),
6665
+ hasChips && onClearAll && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onClearAll, children: "Clear all" })
6666
+ ] })
6667
+ ] });
6668
+ }
6531
6669
  var dotVariant = {
6532
6670
  default: "bg-[var(--ds-accent-primary)] shadow-[0_0_0_3px_var(--ds-accent-primary)]/20",
6533
6671
  success: "bg-[var(--ds-status-success)] shadow-[0_0_0_3px_var(--ds-status-success)]/20",
@@ -8410,12 +8548,18 @@ var AppShell = forwardRef(function AppShell2({
8410
8548
  mobileMenuFlush = true,
8411
8549
  navbar,
8412
8550
  mobileNav,
8551
+ footer,
8552
+ skipLink = true,
8553
+ mainId = "main",
8413
8554
  aside,
8414
8555
  asideSide = "right",
8415
8556
  launcher,
8416
8557
  children,
8417
8558
  className,
8418
- scrollable = true
8559
+ scrollable = true,
8560
+ theme,
8561
+ currentPath,
8562
+ homePath = "/"
8419
8563
  }, ref) {
8420
8564
  const [sidebarOpen, setSidebarOpen] = useState(false);
8421
8565
  const [asideOpen, setAsideOpen] = useState(false);
@@ -8431,15 +8575,29 @@ var AppShell = forwardRef(function AppShell2({
8431
8575
  const hasMobileNav = mobileNav != null;
8432
8576
  const showMobileDrawer = hasMobileMenu && !(isSmallMobile && hasMobileNav);
8433
8577
  const [shellEl, setShellEl] = useState(null);
8578
+ const [chrome, setChrome] = useState({});
8579
+ const registerChrome = useCallback((kind, position) => {
8580
+ setChrome((c) => c[kind] === position ? c : { ...c, [kind]: position });
8581
+ return () => setChrome((c) => {
8582
+ if (!(kind in c)) return c;
8583
+ const next = { ...c };
8584
+ delete next[kind];
8585
+ return next;
8586
+ });
8587
+ }, []);
8588
+ const navbarFloating = (chrome.navbar ?? theme?.navbarPosition) === "floating";
8589
+ const sidebarFloating = hasSidebar && !isMobile && (chrome.sidebar ?? theme?.sidebarPosition) === "floating";
8590
+ const isHome = currentPath != null && currentPath === homePath;
8434
8591
  return /* @__PURE__ */ jsx(
8435
8592
  AppShellContext,
8436
8593
  {
8437
- value: { hasSidebar, hasMobileMenu, hasMobileNav, sidebarOpen, setSidebarOpen, isMobile, isTablet, sidebarCollapsed, setSidebarCollapsed: setUserCollapsed, asideOpen, setAsideOpen, asideSide, asideFloating, setAsideFloating, container: shellEl },
8594
+ value: { hasSidebar, hasMobileMenu, hasMobileNav, sidebarOpen, setSidebarOpen, isMobile, isTablet, sidebarCollapsed, setSidebarCollapsed: setUserCollapsed, asideOpen, setAsideOpen, asideSide, asideFloating, setAsideFloating, container: shellEl, theme: theme ?? null, isHome, navbarFloating, sidebarFloating, registerChrome },
8438
8595
  children: /* @__PURE__ */ jsxs("div", { ref: (el) => {
8439
8596
  setShellEl(el);
8440
8597
  if (typeof ref === "function") ref(el);
8441
8598
  else if (ref) ref.current = el;
8442
8599
  }, className: cn("relative h-screen flex flex-col bg-[var(--ds-bg-canvas)] overflow-hidden", className), children: [
8600
+ skipLink && /* @__PURE__ */ jsx(SkipLink, { href: `#${mainId}` }),
8443
8601
  layout === "sidebar-header" && navbar,
8444
8602
  layout === "multi-column" && navbar,
8445
8603
  /* @__PURE__ */ jsxs("div", { className: "flex flex-1 min-h-0", children: [
@@ -8451,13 +8609,18 @@ var AppShell = forwardRef(function AppShell2({
8451
8609
  /* @__PURE__ */ jsx(
8452
8610
  "main",
8453
8611
  {
8612
+ id: mainId,
8613
+ tabIndex: -1,
8454
8614
  className: cn(
8455
- "flex-1 min-h-0",
8615
+ "flex-1 min-h-0 focus:outline-none",
8456
8616
  scrollable ? "overflow-y-auto" : "relative",
8457
8617
  layout === "multi-column" && "flex"
8458
8618
  ),
8459
8619
  style: { containerType: "inline-size" },
8460
- children: scrollable ? children : /* @__PURE__ */ jsx("div", { className: "absolute inset-0", children })
8620
+ children: scrollable ? footer ? /* @__PURE__ */ jsxs("div", { className: "min-h-full flex flex-col", children: [
8621
+ /* @__PURE__ */ jsx("div", { className: "flex-1", children }),
8622
+ footer
8623
+ ] }) : children : /* @__PURE__ */ jsx("div", { className: "absolute inset-0", children })
8461
8624
  }
8462
8625
  )
8463
8626
  ] }),
@@ -8491,8 +8654,8 @@ function AsidePanel({
8491
8654
  side = "right",
8492
8655
  width = "420px",
8493
8656
  position = "flush",
8494
- navbarFloating = false,
8495
- sidebarFloating = false,
8657
+ navbarFloating: navbarFloatingProp,
8658
+ sidebarFloating: sidebarFloatingProp,
8496
8659
  collapseBelow = "lg",
8497
8660
  keepMounted = true,
8498
8661
  resizable = true,
@@ -8504,6 +8667,8 @@ function AsidePanel({
8504
8667
  }) {
8505
8668
  const collapsed = useBreakpoint(collapseBelow);
8506
8669
  const shell = useAppShell();
8670
+ const navbarFloating = navbarFloatingProp ?? shell?.navbarFloating ?? false;
8671
+ const sidebarFloating = sidebarFloatingProp ?? shell?.sidebarFloating ?? false;
8507
8672
  const setAsideOpen = shell?.setAsideOpen;
8508
8673
  const setAsideFloating = shell?.setAsideFloating;
8509
8674
  const floating = position === "floating";
@@ -8832,7 +8997,7 @@ var subscribeNever = () => () => {
8832
8997
  var getClientSnapshot = () => true;
8833
8998
  var getServerSnapshot = () => false;
8834
8999
  var bodyLaunchers = 0;
8835
- function renderIcon(icon, size) {
9000
+ function renderIcon2(icon, size) {
8836
9001
  return typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, size }) : icon;
8837
9002
  }
8838
9003
  function Launcher({
@@ -8976,7 +9141,7 @@ function Launcher({
8976
9141
  accentGlyph && ACCENT_GLYPH,
8977
9142
  showClose && "rotate-90"
8978
9143
  ),
8979
- children: renderIcon(glyph, glyphSize)
9144
+ children: renderIcon2(glyph, glyphSize)
8980
9145
  }
8981
9146
  ),
8982
9147
  variant === "pill" && /* @__PURE__ */ jsx("span", { children: label }),
@@ -8996,7 +9161,7 @@ function Launcher({
8996
9161
  children: label
8997
9162
  }
8998
9163
  ),
8999
- ribbonOverlayClose && /* @__PURE__ */ jsx("span", { "data-launcher-close": "", className: cn("absolute inset-0 inline-flex items-center justify-center", accentGlyph && ACCENT_GLYPH), children: renderIcon("close", glyphSize) }),
9164
+ ribbonOverlayClose && /* @__PURE__ */ jsx("span", { "data-launcher-close": "", className: cn("absolute inset-0 inline-flex items-center justify-center", accentGlyph && ACCENT_GLYPH), children: renderIcon2("close", glyphSize) }),
9000
9165
  badge && !showClose && // A ribbon is flush to the viewport edge, so its badge hangs off the inner corner instead.
9001
9166
  /* @__PURE__ */ jsx("span", { className: "absolute", style: badgeStyle, "data-testid": "launcher-badge", children: typeof badge === "number" ? /* @__PURE__ */ jsx(Badge, { variant: "error", size: "xs", children: badge > 99 ? "99+" : badge }) : /* @__PURE__ */ jsx("span", { className: "block h-ds-2.5 w-ds-2.5 rounded-[var(--ds-radius-full)] bg-[var(--ds-status-error)] ring-2 ring-[var(--ds-bg-surface)]" }) })
9002
9167
  ]
@@ -10009,7 +10174,7 @@ var Sidebar = forwardRef(function Sidebar2({
10009
10174
  mini = false,
10010
10175
  type = "traditional",
10011
10176
  position = "flush",
10012
- navbarFloating,
10177
+ navbarFloating: navbarFloatingProp,
10013
10178
  navSize = "md",
10014
10179
  fill = false,
10015
10180
  className
@@ -10019,6 +10184,11 @@ var Sidebar = forwardRef(function Sidebar2({
10019
10184
  const portalRef = useCallback((node) => setPortalEl(node), []);
10020
10185
  const isControlled = controlledCollapsed !== void 0;
10021
10186
  const appShell = useAppShell();
10187
+ const navbarFloating = navbarFloatingProp ?? appShell?.navbarFloating;
10188
+ useLayoutEffect(() => {
10189
+ if (fill || !appShell) return;
10190
+ return appShell.registerChrome("sidebar", position);
10191
+ }, [appShell?.registerChrome, fill, position]);
10022
10192
  const usesShellState = appShell !== null && !isControlled && defaultCollapsed === void 0 && !fill && type === "traditional";
10023
10193
  const uncontrolledCollapsed = usesShellState ? appShell.sidebarCollapsed : internalCollapsed;
10024
10194
  const collapsed = mini || (isControlled ? controlledCollapsed : uncontrolledCollapsed);
@@ -10772,9 +10942,164 @@ function NavButton({ item, onClick }) {
10772
10942
  }
10773
10943
  );
10774
10944
  }
10775
- function TruncHeading({ as: Tag3 = "h1", className, children }) {
10776
- const { ref, isTruncated } = useTextOverflow({ lines: 1 });
10777
- const heading = /* @__PURE__ */ jsx(Tag3, { ref, className: cn("truncate", className), children });
10945
+
10946
+ // ../../showcase/src/lib/shell-theme.ts
10947
+ var PAGE_HEADER_MARK = /* @__PURE__ */ Symbol.for("gridsmith.PageHeader");
10948
+ function resolvePageHeader(theme, props, facts) {
10949
+ const t = theme?.pageHeader ?? {};
10950
+ const themeVariant = t.variant ?? "default";
10951
+ const homeOnlyElsewhere = themeVariant === "colourful" && !!t.colourfulHomeOnly && !facts.isHome;
10952
+ const variant = props.variant ?? (homeOnlyElsewhere ? t.otherPagesVariant ?? "default" : themeVariant);
10953
+ const behavior = props.behavior ?? t.behavior ?? "static";
10954
+ const position = props.position ?? t.position ?? "flush";
10955
+ const intensity = props.intensity ?? t.intensity ?? "bold";
10956
+ const b = theme?.breadcrumbs ?? {};
10957
+ const navbarFloating = props.navbarFloating ?? facts.navbarFloating;
10958
+ const sidebarFloating = (props.sidebarFloating ?? facts.sidebarFloating) && !facts.isMobile;
10959
+ return {
10960
+ variant,
10961
+ behavior,
10962
+ position,
10963
+ intensity,
10964
+ breadcrumbPosition: b.position ?? "inline",
10965
+ breadcrumbStyle: props.breadcrumbStyle ?? b.style ?? "default",
10966
+ breadcrumbSeparator: props.breadcrumbSeparator ?? b.separator ?? "chevron",
10967
+ navbarFloating,
10968
+ sidebarFloating,
10969
+ outside: variant === "colourful" || behavior === "snapping" || position === "floating"
10970
+ };
10971
+ }
10972
+ var maxWidthValues = {
10973
+ sm: "var(--ds-bp-sm)",
10974
+ md: "var(--ds-bp-md)",
10975
+ lg: "var(--ds-bp-lg)",
10976
+ xl: "var(--ds-bp-xl)",
10977
+ full: "100%"
10978
+ };
10979
+ var widthToMaxWidth = {
10980
+ constrained: "xl",
10981
+ full: "full",
10982
+ narrow: "md"
10983
+ };
10984
+ var paddingClasses = {
10985
+ none: "",
10986
+ default: "px-ds-6",
10987
+ wide: "px-ds-10"
10988
+ };
10989
+ var verticalPaddingClasses = {
10990
+ none: "",
10991
+ default: "pt-ds-8 pb-ds-12",
10992
+ spacious: "pt-ds-8 pb-ds-16"
10993
+ };
10994
+ var bottomPaddingClasses = {
10995
+ none: "",
10996
+ default: "pb-ds-12",
10997
+ spacious: "pb-ds-16"
10998
+ };
10999
+ var FLOATING_BLOCK = cn(
11000
+ "rounded-[var(--ds-radius-md)]",
11001
+ "border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]",
11002
+ GLASS_SURFACE,
11003
+ "overflow-hidden"
11004
+ );
11005
+ var PageContainerContext = createContext(null);
11006
+ function usePageContainer() {
11007
+ return useContext(PageContainerContext);
11008
+ }
11009
+ function isPageHeaderElement(node) {
11010
+ if (!isValidElement(node)) return false;
11011
+ const type = node.type;
11012
+ return !!type && typeof type !== "string" && type[PAGE_HEADER_MARK] === true;
11013
+ }
11014
+ function floatingBlockPadding(navbarFloating, sidebarFloating, overlap) {
11015
+ return {
11016
+ paddingTop: navbarFloating ? 0 : "var(--ds-space-3)",
11017
+ paddingRight: "var(--ds-space-3)",
11018
+ paddingBottom: overlap ? 0 : "var(--ds-space-3)",
11019
+ paddingLeft: sidebarFloating ? 0 : "var(--ds-space-3)",
11020
+ marginBottom: overlap ? 0 : "var(--ds-space-3)"
11021
+ };
11022
+ }
11023
+ var PageContainer = forwardRef(function PageContainer2({
11024
+ width,
11025
+ maxWidth = "xl",
11026
+ padding = "default",
11027
+ verticalPadding,
11028
+ centered = true,
11029
+ children,
11030
+ className,
11031
+ renderHeader
11032
+ }, ref) {
11033
+ const shell = useAppShell();
11034
+ const resolvedMaxWidth = width ? widthToMaxWidth[width] : maxWidth;
11035
+ const maxWidthValue = maxWidthValues[resolvedMaxWidth];
11036
+ const kids = Children.toArray(children);
11037
+ const headerIdx = kids.findIndex(isPageHeaderElement);
11038
+ if (headerIdx === -1) {
11039
+ return /* @__PURE__ */ jsx(
11040
+ "div",
11041
+ {
11042
+ ref,
11043
+ className: cn(
11044
+ "w-full",
11045
+ paddingClasses[padding],
11046
+ verticalPaddingClasses[verticalPadding ?? "default"],
11047
+ centered && "mx-auto",
11048
+ className
11049
+ ),
11050
+ style: { maxWidth: maxWidthValue, containerType: "inline-size" },
11051
+ children
11052
+ }
11053
+ );
11054
+ }
11055
+ const headerEl = kids[headerIdx];
11056
+ const rest = kids.filter((_, i) => i !== headerIdx);
11057
+ const r = resolvePageHeader(shell?.theme, headerEl.props, {
11058
+ isHome: shell?.isHome ?? false,
11059
+ isMobile: shell?.isMobile ?? false,
11060
+ navbarFloating: shell?.navbarFloating ?? false,
11061
+ sidebarFloating: shell?.sidebarFloating ?? false
11062
+ });
11063
+ const snapping = r.behavior === "snapping";
11064
+ const floatingHeader = r.position === "floating";
11065
+ const colourful = r.variant === "colourful";
11066
+ const crumbs = Array.isArray(headerEl.props.breadcrumbs) && headerEl.props.breadcrumbs.length > 0 ? headerEl.props.breadcrumbs : null;
11067
+ const contained = r.breadcrumbPosition === "contained" && !!crumbs;
11068
+ const block = floatingHeader && contained && !snapping;
11069
+ const placement = block ? "block" : r.outside ? "outside" : "inside";
11070
+ const breadcrumbsInsideHeader = snapping && floatingHeader && contained;
11071
+ const overlap = colourful && typeof headerEl.props.overlapHeight === "number" && headerEl.props.overlapHeight > 0 ? headerEl.props.overlapHeight : 0;
11072
+ const strip = contained && !breadcrumbsInsideHeader && crumbs ? (
11073
+ // The strip is the whole trail: the path, then this page as the current item (Breadcrumbs renders the last item as text).
11074
+ /* @__PURE__ */ jsx(Breadcrumbs, { variant: "contained", itemVariant: r.breadcrumbStyle, bleed: true, contentMaxWidth: maxWidthValue, separator: r.breadcrumbSeparator, items: headerEl.props.title ? [...crumbs, { label: headerEl.props.title }] : crumbs })
11075
+ ) : null;
11076
+ const columnClass = (pad2) => cn("w-full", paddingClasses[pad2], centered && "mx-auto");
11077
+ const columnStyle = { maxWidth: maxWidthValue, containerType: "inline-size" };
11078
+ const header = /* @__PURE__ */ jsx(PageContainerContext, { value: { contentMaxWidth: maxWidthValue, placement, containedBreadcrumbs: contained, breadcrumbsInsideHeader, noBottomMargin: block }, children: renderHeader ? renderHeader(headerEl) : headerEl });
11079
+ const contentPadding = floatingHeader && shell?.isMobile ? "none" : padding;
11080
+ const wrapperStyle = floatingHeader || overlap ? {
11081
+ ...floatingHeader ? { paddingRight: "var(--ds-space-3)", paddingLeft: r.sidebarFloating ? 0 : "var(--ds-space-3)" } : {},
11082
+ ...overlap ? { marginTop: -overlap, position: "relative", zIndex: 1 } : {}
11083
+ } : void 0;
11084
+ const column = /* @__PURE__ */ jsx("div", { className: cn(columnClass(contentPadding), bottomPaddingClasses[verticalPadding ?? "default"], className), style: columnStyle, children: rest });
11085
+ return /* @__PURE__ */ jsxs("div", { ref, "data-page-container": "", className: "w-full", children: [
11086
+ placement === "block" ? /* @__PURE__ */ jsx("div", { style: floatingBlockPadding(r.navbarFloating, r.sidebarFloating, overlap > 0), children: /* @__PURE__ */ jsxs("div", { className: FLOATING_BLOCK, children: [
11087
+ strip,
11088
+ colourful ? header : /* @__PURE__ */ jsx("div", { className: columnClass(padding), style: columnStyle, children: header })
11089
+ ] }) }) : placement === "outside" ? /* @__PURE__ */ jsxs(Fragment, { children: [
11090
+ strip,
11091
+ header
11092
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
11093
+ strip,
11094
+ /* @__PURE__ */ jsx("div", { className: columnClass(padding), style: columnStyle, children: header })
11095
+ ] }),
11096
+ wrapperStyle ? /* @__PURE__ */ jsx("div", { style: wrapperStyle, children: column }) : column
11097
+ ] });
11098
+ });
11099
+ function TruncHeading({ as: Tag3 = "h1", className, children, lines: linesProp }) {
11100
+ const lines = linesProp ?? (Tag3 === "h1" ? 2 : 1);
11101
+ const { ref, isTruncated } = useTextOverflow({ lines });
11102
+ const heading = /* @__PURE__ */ jsx(Tag3, { ref, className: cn(lines === 2 ? "line-clamp-2" : "truncate", className), children });
10778
11103
  if (!isTruncated) return heading;
10779
11104
  return /* @__PURE__ */ jsx(Tooltip, { content: children, children: heading });
10780
11105
  }
@@ -10895,30 +11220,49 @@ var PageHeader = forwardRef(function PageHeader2({
10895
11220
  bannerImage,
10896
11221
  as: Heading = "h1",
10897
11222
  className,
10898
- variant = "default",
10899
- behavior = "static",
10900
- intensity = "bold",
11223
+ variant: variantProp,
11224
+ behavior: behaviorProp,
11225
+ intensity: intensityProp,
10901
11226
  backgroundImage,
10902
11227
  overlapHeight,
10903
11228
  expandedContent,
10904
11229
  collapseOffset = 100,
10905
11230
  pinned = true,
10906
- contentMaxWidth,
11231
+ contentMaxWidth: contentMaxWidthProp,
10907
11232
  tabs,
10908
11233
  breadcrumbStyle,
10909
11234
  breadcrumbSeparator,
10910
- hideExpandedBreadcrumbs,
10911
- position = "flush",
10912
- navbarFloating,
10913
- sidebarFloating,
10914
- noBottomMargin,
10915
- containedBreadcrumbs
11235
+ hideExpandedBreadcrumbs: hideExpandedBreadcrumbsProp,
11236
+ position: positionProp,
11237
+ navbarFloating: navbarFloatingProp,
11238
+ sidebarFloating: sidebarFloatingProp,
11239
+ noBottomMargin: noBottomMarginProp,
11240
+ containedBreadcrumbs: containedBreadcrumbsProp
10916
11241
  }, ref) {
10917
- const isFloating = position === "floating";
10918
11242
  const shell = useAppShell();
11243
+ const container = usePageContainer();
11244
+ const r = resolvePageHeader(shell?.theme, {
11245
+ variant: variantProp,
11246
+ behavior: behaviorProp,
11247
+ position: positionProp,
11248
+ intensity: intensityProp,
11249
+ breadcrumbStyle,
11250
+ breadcrumbSeparator,
11251
+ navbarFloating: navbarFloatingProp,
11252
+ sidebarFloating: sidebarFloatingProp
11253
+ }, { isHome: shell?.isHome ?? false, isMobile: shell?.isMobile ?? false, navbarFloating: shell?.navbarFloating ?? false, sidebarFloating: shell?.sidebarFloating ?? false });
11254
+ const { variant, behavior, position, intensity, navbarFloating, sidebarFloating } = r;
11255
+ const isFloating = position === "floating";
10919
11256
  const asideFloatingSide = shell?.asideOpen && shell.asideFloating ? shell.asideSide : null;
10920
- const bcPill = breadcrumbStyle === "pill";
10921
- const bcSep = breadcrumbSeparator ?? "chevron";
11257
+ const bcPill = r.breadcrumbStyle === "pill";
11258
+ const bcSep = r.breadcrumbSeparator;
11259
+ const contentMaxWidth = contentMaxWidthProp ?? container?.contentMaxWidth;
11260
+ const stickyTop = shell ? "top-0" : "top-[var(--ds-navbar-height)]";
11261
+ const snapping = behavior === "snapping";
11262
+ const inlineBreadcrumbs = container?.containedBreadcrumbs && !snapping ? void 0 : breadcrumbs;
11263
+ const hideExpandedBreadcrumbs = hideExpandedBreadcrumbsProp ?? (!!container?.containedBreadcrumbs && snapping);
11264
+ const containedBreadcrumbs = containedBreadcrumbsProp ?? (container?.breadcrumbsInsideHeader && breadcrumbs?.length ? /* @__PURE__ */ jsx(Breadcrumbs, { variant: "contained", itemVariant: r.breadcrumbStyle, bleed: true, contentMaxWidth, separator: bcSep, items: [...breadcrumbs, { label: title }] }) : void 0);
11265
+ const noBottomMargin = noBottomMarginProp ?? container?.noBottomMargin;
10922
11266
  if (behavior === "snapping") {
10923
11267
  return /* @__PURE__ */ jsx(
10924
11268
  SnappingHeader,
@@ -10926,7 +11270,7 @@ var PageHeader = forwardRef(function PageHeader2({
10926
11270
  title,
10927
11271
  description,
10928
11272
  badge,
10929
- breadcrumbs,
11273
+ breadcrumbs: inlineBreadcrumbs,
10930
11274
  onBack,
10931
11275
  actions,
10932
11276
  avatar,
@@ -10945,6 +11289,7 @@ var PageHeader = forwardRef(function PageHeader2({
10945
11289
  hideExpandedBreadcrumbs,
10946
11290
  as: Heading,
10947
11291
  className,
11292
+ stickyTop,
10948
11293
  isFloating,
10949
11294
  navbarFloating,
10950
11295
  sidebarFloating,
@@ -10955,7 +11300,7 @@ var PageHeader = forwardRef(function PageHeader2({
10955
11300
  }
10956
11301
  let header;
10957
11302
  if (variant === "minimal") {
10958
- header = /* @__PURE__ */ jsx(MinimalHeader, { title, badge, breadcrumbs, actions, breadcrumbPill: bcPill, breadcrumbSeparator: bcSep, as: Heading, className, headerRef: isFloating ? void 0 : ref, isFloating, contentMaxWidth });
11303
+ header = /* @__PURE__ */ jsx(MinimalHeader, { title, badge, breadcrumbs: inlineBreadcrumbs, actions, breadcrumbPill: bcPill, breadcrumbSeparator: bcSep, as: Heading, className, headerRef: isFloating ? void 0 : ref, isFloating, contentMaxWidth });
10959
11304
  } else if (variant === "tabs-integrated") {
10960
11305
  header = /* @__PURE__ */ jsx(
10961
11306
  TabsIntegratedHeader,
@@ -10963,7 +11308,7 @@ var PageHeader = forwardRef(function PageHeader2({
10963
11308
  title,
10964
11309
  description,
10965
11310
  badge,
10966
- breadcrumbs,
11311
+ breadcrumbs: inlineBreadcrumbs,
10967
11312
  onBack,
10968
11313
  actions,
10969
11314
  avatar,
@@ -10984,7 +11329,7 @@ var PageHeader = forwardRef(function PageHeader2({
10984
11329
  title,
10985
11330
  description,
10986
11331
  badge,
10987
- breadcrumbs,
11332
+ breadcrumbs: inlineBreadcrumbs,
10988
11333
  onBack,
10989
11334
  actions,
10990
11335
  avatar,
@@ -11009,7 +11354,7 @@ var PageHeader = forwardRef(function PageHeader2({
11009
11354
  title,
11010
11355
  description,
11011
11356
  badge,
11012
- breadcrumbs,
11357
+ breadcrumbs: inlineBreadcrumbs,
11013
11358
  onBack,
11014
11359
  actions,
11015
11360
  avatar,
@@ -11038,6 +11383,7 @@ var PageHeader = forwardRef(function PageHeader2({
11038
11383
  }
11039
11384
  return header;
11040
11385
  });
11386
+ Object.assign(PageHeader, { [PAGE_HEADER_MARK]: true });
11041
11387
  function floatingContentProps(isFloating, contentMaxWidth, extraClassName) {
11042
11388
  if (!isFloating) return { className: extraClassName, style: void 0 };
11043
11389
  return {
@@ -11131,7 +11477,7 @@ function MinimalHeader({
11131
11477
  hasBreadcrumbs && /* @__PURE__ */ jsx(Breadcrumbs3, { items: breadcrumbs, pill: breadcrumbPill, separator: breadcrumbSeparator }),
11132
11478
  /* @__PURE__ */ jsxs("div", { className: cn("flex items-center justify-between gap-ds-4", hasBreadcrumbs && "mt-ds-0.5"), children: [
11133
11479
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-ds-2 min-w-0", children: [
11134
- /* @__PURE__ */ jsx(TruncHeading, { as: Heading, className: "font-[family-name:var(--ds-font-display)] text-xl font-[var(--ds-weight-heading)] text-[var(--ds-text-primary)]", children: title }),
11480
+ /* @__PURE__ */ jsx(TruncHeading, { as: Heading, lines: 1, className: "font-[family-name:var(--ds-font-display)] text-xl font-[var(--ds-weight-heading)] text-[var(--ds-text-primary)]", children: title }),
11135
11481
  badge
11136
11482
  ] }),
11137
11483
  actions && /* @__PURE__ */ jsx(ButtonSizeContext.Provider, { value: "sm", children: /* @__PURE__ */ jsx("div", { className: "flex items-center gap-ds-2 shrink-0", children: actions }) })
@@ -11264,7 +11610,8 @@ function SnappingHeader({
11264
11610
  navbarFloating,
11265
11611
  sidebarFloating,
11266
11612
  containedBreadcrumbs,
11267
- headerRef
11613
+ headerRef,
11614
+ stickyTop = "top-[var(--ds-navbar-height)]"
11268
11615
  }) {
11269
11616
  const [collapsed, setCollapsed] = useState(false);
11270
11617
  const sentinelRef = useRef(null);
@@ -11338,7 +11685,7 @@ function SnappingHeader({
11338
11685
  ref: !isFloating ? headerRef : void 0,
11339
11686
  className: cn(
11340
11687
  "transition-all duration-[var(--ds-transition-speed)] ease-[var(--ds-transition-ease)]",
11341
- !isFloating && pinned && collapsed && "sticky top-[var(--ds-navbar-height)] z-[calc(var(--ds-z-sticky,40)-1)]",
11688
+ !isFloating && pinned && collapsed && cn("sticky", stickyTop, "z-[calc(var(--ds-z-sticky,40)-1)]"),
11342
11689
  collapsed && (isFloating ? cn(FLOATING_HEADER, "bg-[var(--ds-bg-surface)]") : ["bg-[var(--ds-bg-surface)]", GLASS_BACKDROP, "border-b-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]", "shadow-[var(--ds-shadow-sm)]"]),
11343
11690
  !collapsed && isColourful && (isFloating && !wrapperHasCard ? [
11344
11691
  "relative overflow-hidden",
@@ -11432,7 +11779,7 @@ function SnappingHeader({
11432
11779
  }
11433
11780
  );
11434
11781
  })(),
11435
- /* @__PURE__ */ jsx(TruncHeading, { as: Heading, className: cn(
11782
+ /* @__PURE__ */ jsx(TruncHeading, { as: Heading, lines: collapsed ? 1 : void 0, className: cn(
11436
11783
  "font-[family-name:var(--ds-font-display)] font-[var(--ds-weight-heading)]",
11437
11784
  collapsed ? "text-lg text-[var(--ds-text-primary)]" : cn("text-3xl", onLight ? "text-[var(--ds-text-on-primary)]" : "text-[var(--ds-text-primary)]")
11438
11785
  ), children: title }),
@@ -11777,6 +12124,7 @@ var Navbar = forwardRef(function Navbar2({
11777
12124
  onMenuClick
11778
12125
  }, ref) {
11779
12126
  const appShell = useAppShell();
12127
+ useLayoutEffect(() => appShell?.registerChrome("navbar", position), [appShell?.registerChrome, position]);
11780
12128
  const isSmallPhone = appShell?.isMobile && !appShell.isTablet;
11781
12129
  const showHamburger = appShell?.isMobile && appShell.hasMobileMenu && !(isSmallPhone && appShell.hasMobileNav) || !!onMenuClick;
11782
12130
  const handleHamburger = () => onMenuClick ? onMenuClick() : appShell?.setSidebarOpen(!appShell.sidebarOpen);
@@ -13192,7 +13540,7 @@ var TOAST_POSITION_CLASSES = {
13192
13540
  "top-center": "top-ds-4 left-1/2 -translate-x-1/2",
13193
13541
  "bottom-center": "bottom-ds-4 left-1/2 -translate-x-1/2"
13194
13542
  };
13195
- function Toast({ variant = "default", message, visible, onDismiss, duration = 3e3, pauseOnHover = false, action, position = "bottom-right", mode, container, inline = false }) {
13543
+ function Toast({ variant = "default", message, visible, onDismiss, duration = 5e3, pauseOnHover = false, action, position = "bottom-right", mode, container, inline = false }) {
13196
13544
  const isMobile = useBreakpoint("sm");
13197
13545
  const isCentered = position === "top-center" || position === "bottom-center";
13198
13546
  const timerRef = useRef(void 0);
@@ -13295,7 +13643,7 @@ function useToast() {
13295
13643
  return ctx;
13296
13644
  }
13297
13645
  var toastSeq = 0;
13298
- function ToastProvider({ children, maxVisible = 3, position = "bottom-right", duration = 3e3, mode, pauseOnHover = true }) {
13646
+ function ToastProvider({ children, maxVisible = 1, position = "bottom-right", duration = 5e3, mode, pauseOnHover = true }) {
13299
13647
  const [queue, setQueue] = useState([]);
13300
13648
  const isMobile = useBreakpoint("sm");
13301
13649
  const dismiss = useCallback((id) => {
@@ -13371,54 +13719,6 @@ function ToastProvider({ children, maxVisible = 3, position = "bottom-right", du
13371
13719
  )
13372
13720
  ] });
13373
13721
  }
13374
- var maxWidthValues = {
13375
- sm: "var(--ds-bp-sm)",
13376
- md: "var(--ds-bp-md)",
13377
- lg: "var(--ds-bp-lg)",
13378
- xl: "var(--ds-bp-xl)",
13379
- full: "100%"
13380
- };
13381
- var widthToMaxWidth = {
13382
- constrained: "xl",
13383
- full: "full",
13384
- narrow: "md"
13385
- };
13386
- var paddingClasses = {
13387
- none: "",
13388
- default: "px-ds-6",
13389
- wide: "px-ds-10"
13390
- };
13391
- var verticalPaddingClasses = {
13392
- none: "",
13393
- default: "pt-ds-8 pb-ds-12",
13394
- spacious: "pt-ds-8 pb-ds-16"
13395
- };
13396
- var PageContainer = forwardRef(function PageContainer2({
13397
- width,
13398
- maxWidth = "xl",
13399
- padding = "default",
13400
- verticalPadding = "default",
13401
- centered = true,
13402
- children,
13403
- className
13404
- }, ref) {
13405
- const resolvedMaxWidth = width ? widthToMaxWidth[width] : maxWidth;
13406
- return /* @__PURE__ */ jsx(
13407
- "div",
13408
- {
13409
- ref,
13410
- className: cn(
13411
- "w-full",
13412
- paddingClasses[padding],
13413
- verticalPaddingClasses[verticalPadding],
13414
- centered && "mx-auto",
13415
- className
13416
- ),
13417
- style: { maxWidth: maxWidthValues[resolvedMaxWidth], containerType: "inline-size" },
13418
- children
13419
- }
13420
- );
13421
- });
13422
13722
  var SectionHeading = forwardRef(function SectionHeading2({
13423
13723
  title,
13424
13724
  description,
@@ -13546,6 +13846,6 @@ var TextOverflow = forwardRef(function TextOverflow2({
13546
13846
  return /* @__PURE__ */ jsx(Tooltip, { content: resolvedTooltipContent, children: content });
13547
13847
  });
13548
13848
 
13549
- export { Accordion, ActionPanel, ActionPanelGroup, Alert, AppShell, AsidePanel, Avatar, AvatarGroup, BottomNav, Breadcrumbs, BulkActionBar, Button, ButtonSizeContext, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, ChatMessageList, ChatPanel, Checkbox, CheckboxGroup, CheckboxGroupItem, Collapsible, ColorPicker, Combobox, CommandPalette, ContextMenu, CornerPanel, DEFAULT_DATE_RANGE_PRESETS, DataList, DatePicker, DateRangePicker, DescriptionList, Dialog, Dock, Drawer, Dropdown, DropdownMenu, EmptyState, Field, FileUpload, FormWrapper, HoverCard, InlineFieldError, Input, Kbd, Label, Launcher, MentionInput, MobileHeaderMenu, NavItem, NavMenu, Navbar, NotificationCenter, NumberInput, PageContainer, PageHeader, Pagination, PinInput, Popover, Progress, RadioGroup, Rating, ScrollArea, SectionHeading, SegmentedControl, Sheet, Sidebar, SidebarNav, SliderRange, Spinner, StackedList, StatsCard, StatusDot, Stepper, Table, Tabs, Tag, TagInput, TextOverflow, Textarea, TimePicker, Timeline, Toast, ToastProvider, Toggle, Tour, TransferList, TreeView, useAppShell, useFormContext, useSidebar, useToast };
13849
+ export { Accordion, ActionPanel, ActionPanelGroup, Alert, AppShell, AsidePanel, Avatar, AvatarGroup, BottomNav, Breadcrumbs, BulkActionBar, Button, ButtonSizeContext, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, ChatMessageList, ChatPanel, Checkbox, CheckboxGroup, CheckboxGroupItem, Collapsible, ColorPicker, Combobox, CommandPalette, ContextMenu, CornerPanel, DEFAULT_DATE_RANGE_PRESETS, DataList, DatePicker, DateRangePicker, DescriptionList, Dialog, Dock, Drawer, Dropdown, DropdownMenu, EmptyState, Field, FileUpload, FormWrapper, HoverCard, InlineFieldError, Input, Kbd, Label, Launcher, MentionInput, MobileHeaderMenu, NavItem, NavMenu, Navbar, NotificationCenter, NumberInput, PageContainer, PageHeader, Pagination, PinInput, Popover, Progress, RadioGroup, Rating, ScrollArea, SectionHeading, SegmentedControl, Sheet, Sidebar, SidebarNav, SkipLink, SliderRange, Spinner, StackedList, StatsCard, StatusDot, Stepper, Table, TableToolbar, Tabs, Tag, TagInput, TextOverflow, Textarea, TimePicker, Timeline, Toast, ToastProvider, Toggle, Tour, TransferList, TreeView, useAppShell, useFormContext, useSidebar, useToast };
13550
13850
  //# sourceMappingURL=index.js.map
13551
13851
  //# sourceMappingURL=index.js.map