@almadar/ui 5.131.0 → 5.133.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.
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import * as React74 from 'react';
3
- import React74__default, { createContext, useContext, useMemo, useRef, useEffect, useCallback, useState, useLayoutEffect, Suspense, lazy, useSyncExternalStore, useId } from 'react';
3
+ import React74__default, { createContext, useContext, useMemo, useRef, useEffect, useCallback, useState, useLayoutEffect, Suspense, useSyncExternalStore, lazy, useId } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { EventBusContext, useTraitScopeChain, useCurrentPagePath, useGameAudioContextOptional, useEntitySchemaOptional, TraitScopeProvider } from '@almadar/ui/providers';
@@ -2535,6 +2535,8 @@ var init_Badge = __esm({
2535
2535
  };
2536
2536
  const iconPx = size === "lg" ? 20 : 16;
2537
2537
  const resolvedIcon = iconAsset?.url ? /* @__PURE__ */ jsx(AtlasImage, { asset: iconAsset, size: iconPx, alt: iconAsset.name ?? iconAsset.category ?? "", className: "flex-shrink-0" }) : typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, className: iconSizes3[size] }) : icon ? /* @__PURE__ */ jsx(Icon, { icon, className: iconSizes3[size] }) : null;
2538
+ const hasText = Boolean(children) || amount != null || label !== void 0 && label !== null && label !== "";
2539
+ if (!hasText && !resolvedIcon && !onRemove) return null;
2538
2540
  return /* @__PURE__ */ jsxs(
2539
2541
  "span",
2540
2542
  {
@@ -4631,11 +4633,13 @@ var init_TrendIndicator = __esm({
4631
4633
  size = "md",
4632
4634
  ...props
4633
4635
  }, ref) => {
4634
- const dir = resolveDirection(value, direction);
4636
+ const hasValue = typeof value === "number" && Number.isFinite(value);
4637
+ if (!hasValue && !direction) return null;
4638
+ const dir = resolveDirection(hasValue ? value : void 0, direction);
4635
4639
  const colorClass = resolveColor(dir, invert);
4636
4640
  const iconName = iconNameMap[dir];
4637
4641
  const styles = sizeStyles6[size];
4638
- const formattedValue = value !== void 0 ? `${value > 0 ? "+" : ""}${value}%` : void 0;
4642
+ const formattedValue = hasValue ? `${value > 0 ? "+" : ""}${value}%` : void 0;
4639
4643
  const ariaLabel = label ?? (formattedValue ? `${dir} ${formattedValue}` : dir);
4640
4644
  return /* @__PURE__ */ jsxs(
4641
4645
  "span",
@@ -13657,26 +13661,19 @@ var init_BookViewer = __esm({
13657
13661
  function BoxPattern({
13658
13662
  p,
13659
13663
  m,
13660
- bg = "transparent",
13661
- border = false,
13662
- radius = "none",
13663
- shadow = "none",
13664
- className,
13665
- style,
13666
- children
13664
+ radius,
13665
+ isLoading: _isLoading,
13666
+ error: _error,
13667
+ entity: _entity,
13668
+ ...boxProps
13667
13669
  }) {
13668
13670
  return /* @__PURE__ */ jsx(
13669
13671
  Box,
13670
13672
  {
13671
- padding: p,
13672
- margin: m,
13673
- bg,
13674
- border,
13675
- rounded: radius,
13676
- shadow,
13677
- className,
13678
- style,
13679
- children
13673
+ padding: boxProps.padding ?? p,
13674
+ margin: boxProps.margin ?? m,
13675
+ rounded: boxProps.rounded ?? radius,
13676
+ ...boxProps
13680
13677
  }
13681
13678
  );
13682
13679
  }
@@ -19331,17 +19328,19 @@ var init_DashboardLayout = __esm({
19331
19328
  const [sidebarOpen, setSidebarOpen] = useState(false);
19332
19329
  const [userMenuOpen, setUserMenuOpen] = useState(false);
19333
19330
  const layoutRef = useRef(null);
19334
- const [isMobile, setIsMobile] = useState(false);
19331
+ const [layoutWidth, setLayoutWidth] = useState(null);
19335
19332
  useEffect(() => {
19336
19333
  const el = layoutRef.current;
19337
19334
  if (!el || typeof ResizeObserver === "undefined") return;
19338
19335
  const ro = new ResizeObserver((entries) => {
19339
19336
  const w = entries[0]?.contentRect.width ?? el.clientWidth;
19340
- setIsMobile(w < 1024);
19337
+ setLayoutWidth(w);
19341
19338
  });
19342
19339
  ro.observe(el);
19343
19340
  return () => ro.disconnect();
19344
19341
  }, []);
19342
+ const isMobile = layoutWidth !== null && layoutWidth < 768;
19343
+ const isRail = layoutWidth !== null && layoutWidth >= 768 && layoutWidth < 1024;
19345
19344
  useEffect(() => {
19346
19345
  if (!isMobile && sidebarOpen) setSidebarOpen(false);
19347
19346
  }, [isMobile, sidebarOpen]);
@@ -19378,7 +19377,8 @@ var init_DashboardLayout = __esm({
19378
19377
  {
19379
19378
  as: "aside",
19380
19379
  className: cn(
19381
- "z-30 w-64 flex-shrink-0 bg-card dark:bg-card border-r border-border dark:border-border",
19380
+ "z-30 flex-shrink-0 bg-card dark:bg-card border-r border-border dark:border-border",
19381
+ isRail ? "w-16" : "w-64",
19382
19382
  "flex flex-col"
19383
19383
  ),
19384
19384
  style: isMobile ? {
@@ -19394,10 +19394,10 @@ var init_DashboardLayout = __esm({
19394
19394
  HStack,
19395
19395
  {
19396
19396
  align: "center",
19397
- justify: "between",
19398
- className: "h-16 px-4 border-b border-border dark:border-border",
19397
+ justify: isRail ? "center" : "between",
19398
+ className: cn("h-16 border-b border-border dark:border-border", isRail ? "px-2" : "px-4"),
19399
19399
  children: [
19400
- /* @__PURE__ */ jsxs(Link, { to: "/", className: "flex items-center gap-2", children: [
19400
+ /* @__PURE__ */ jsxs(Link, { to: "/", className: "flex items-center gap-2", title: isRail ? appName : void 0, children: [
19401
19401
  logo || /* @__PURE__ */ jsx(Box, { className: "w-8 h-8 bg-primary rounded-lg flex items-center justify-center", children: /* @__PURE__ */ jsx(
19402
19402
  Typography,
19403
19403
  {
@@ -19407,7 +19407,7 @@ var init_DashboardLayout = __esm({
19407
19407
  children: appName.charAt(0).toUpperCase()
19408
19408
  }
19409
19409
  ) }),
19410
- /* @__PURE__ */ jsx(
19410
+ !isRail && /* @__PURE__ */ jsx(
19411
19411
  Typography,
19412
19412
  {
19413
19413
  variant: "label",
@@ -19434,12 +19434,13 @@ var init_DashboardLayout = __esm({
19434
19434
  {
19435
19435
  as: "nav",
19436
19436
  gap: "none",
19437
- className: "flex-1 px-3 py-4 space-y-1 overflow-y-auto",
19437
+ className: cn("flex-1 py-4 space-y-1 overflow-y-auto", isRail ? "px-2" : "px-3"),
19438
19438
  children: navItems.map((item) => /* @__PURE__ */ jsx(
19439
19439
  NavLink,
19440
19440
  {
19441
19441
  item,
19442
- currentPath: activePath
19442
+ currentPath: activePath,
19443
+ compact: isRail
19443
19444
  },
19444
19445
  item.href
19445
19446
  ))
@@ -19694,13 +19695,40 @@ var init_DashboardLayout = __esm({
19694
19695
  DashboardLayout.displayName = "DashboardLayout";
19695
19696
  NavLink = ({
19696
19697
  item,
19697
- currentPath
19698
+ currentPath,
19699
+ compact = false
19698
19700
  }) => {
19699
19701
  const isActive = currentPath === item.href || currentPath.startsWith(item.href + "/");
19700
19702
  const iconClassName = cn(
19701
19703
  "h-5 w-5",
19702
19704
  isActive ? "text-primary-foreground" : "text-muted-foreground"
19703
19705
  );
19706
+ if (compact) {
19707
+ return /* @__PURE__ */ jsx(
19708
+ Link,
19709
+ {
19710
+ to: item.href,
19711
+ title: item.label,
19712
+ "aria-label": item.label,
19713
+ className: cn(
19714
+ "flex items-center justify-center px-2 py-2 rounded-lg transition-colors",
19715
+ isActive ? "bg-primary text-primary-foreground shadow-sm" : "text-muted-foreground hover:bg-muted hover:text-foreground"
19716
+ ),
19717
+ children: /* @__PURE__ */ jsxs(Box, { as: "span", className: "relative inline-flex", children: [
19718
+ item.icon ? typeof item.icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: item.icon, className: iconClassName }) : /* @__PURE__ */ jsx(item.icon, { className: iconClassName }) : /* @__PURE__ */ jsx(Typography, { variant: "small", className: "font-semibold", as: "span", children: item.label.charAt(0).toUpperCase() }),
19719
+ item.badge && /* @__PURE__ */ jsx(
19720
+ Badge,
19721
+ {
19722
+ variant: isActive ? "primary" : "default",
19723
+ size: "sm",
19724
+ className: "absolute -top-2 -right-2 px-1 py-0 text-[10px] leading-4",
19725
+ children: item.badge
19726
+ }
19727
+ )
19728
+ ] })
19729
+ }
19730
+ );
19731
+ }
19704
19732
  return /* @__PURE__ */ jsxs(
19705
19733
  Link,
19706
19734
  {
@@ -20766,40 +20794,55 @@ function DataGrid({
20766
20794
  {
20767
20795
  "data-entity-row": true,
20768
20796
  "data-entity-id": id,
20769
- className: cn(isSelected && "ring-2 ring-primary rounded-lg"),
20797
+ className: cn("relative group/rowactions", isSelected && "ring-2 ring-primary rounded-lg"),
20770
20798
  children: [
20771
20799
  children(itemData, index),
20772
- actionDefs.length > 0 && /* @__PURE__ */ jsx(Box, { className: "px-4 py-3 border-t border-border", children: /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "justify-end", children: [
20773
- (maxInlineActions != null ? actionDefs.slice(0, maxInlineActions) : actionDefs).map((action, idx) => /* @__PURE__ */ jsxs(
20774
- Button,
20775
- {
20776
- variant: action.variant === "primary" ? "primary" : "ghost",
20777
- size: "sm",
20778
- onClick: handleActionClick(action, itemData),
20779
- "data-testid": `action-${action.event}`,
20780
- "data-row-id": String(itemData.id),
20781
- className: action.variant === "danger" ? "text-error hover:text-error hover:bg-error/10" : void 0,
20782
- children: [
20783
- action.icon && renderIconInput(action.icon, { size: "xs", className: "mr-1" }),
20784
- action.label
20785
- ]
20786
- },
20787
- idx
20788
- )),
20789
- maxInlineActions != null && actionDefs.length > maxInlineActions && /* @__PURE__ */ jsx(
20800
+ actionDefs.length > 0 && /* @__PURE__ */ jsxs(Box, { className: "absolute top-2 right-2 z-10 opacity-0 group-hover/rowactions:opacity-100 focus-within:opacity-100 [@media(pointer:coarse)]:opacity-100 transition-opacity duration-fast", children: [
20801
+ /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "rounded-md border border-border bg-card/95 backdrop-blur-sm shadow-sm p-0.5 [@media(pointer:coarse)]:hidden", children: [
20802
+ (maxInlineActions != null ? actionDefs.slice(0, maxInlineActions) : actionDefs).map((action, idx) => /* @__PURE__ */ jsxs(
20803
+ Button,
20804
+ {
20805
+ variant: action.variant === "primary" ? "primary" : "ghost",
20806
+ size: "sm",
20807
+ onClick: handleActionClick(action, itemData),
20808
+ "data-testid": `action-${action.event}`,
20809
+ "data-row-id": String(itemData.id),
20810
+ className: action.variant === "danger" ? "text-error hover:text-error hover:bg-error/10" : void 0,
20811
+ children: [
20812
+ action.icon && renderIconInput(action.icon, { size: "xs", className: "mr-1" }),
20813
+ action.label
20814
+ ]
20815
+ },
20816
+ idx
20817
+ )),
20818
+ maxInlineActions != null && actionDefs.length > maxInlineActions && /* @__PURE__ */ jsx(
20819
+ Menu,
20820
+ {
20821
+ position: "bottom-end",
20822
+ trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
20823
+ items: actionDefs.slice(maxInlineActions).map((action) => ({
20824
+ label: action.label,
20825
+ icon: action.icon,
20826
+ event: action.event,
20827
+ onClick: () => fireAction(action, itemData)
20828
+ }))
20829
+ }
20830
+ )
20831
+ ] }),
20832
+ /* @__PURE__ */ jsx(Box, { className: "hidden [@media(pointer:coarse)]:block rounded-md border border-border bg-card/95 backdrop-blur-sm shadow-sm p-0.5", children: /* @__PURE__ */ jsx(
20790
20833
  Menu,
20791
20834
  {
20792
20835
  position: "bottom-end",
20793
20836
  trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
20794
- items: actionDefs.slice(maxInlineActions).map((action) => ({
20837
+ items: actionDefs.map((action) => ({
20795
20838
  label: action.label,
20796
20839
  icon: action.icon,
20797
20840
  event: action.event,
20798
20841
  onClick: () => fireAction(action, itemData)
20799
20842
  }))
20800
20843
  }
20801
- )
20802
- ] }) })
20844
+ ) })
20845
+ ] })
20803
20846
  ]
20804
20847
  },
20805
20848
  id
@@ -20835,7 +20878,7 @@ function DataGrid({
20835
20878
  }
20836
20879
  ) });
20837
20880
  })(),
20838
- /* @__PURE__ */ jsx(Box, { className: "p-4 pb-0", children: /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "justify-between items-start", children: [
20881
+ /* @__PURE__ */ jsx(Box, { className: cn("p-4", bodyFields.length > 0 && "pb-0"), children: /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "justify-between items-start", children: [
20839
20882
  selectable && /* @__PURE__ */ jsx(
20840
20883
  "input",
20841
20884
  {
@@ -20868,78 +20911,77 @@ function DataGrid({
20868
20911
  ] }, field.name);
20869
20912
  }) })
20870
20913
  ] }),
20871
- dangerActions.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "xs", className: "flex-shrink-0", children: dangerActions.map((action, idx) => /* @__PURE__ */ jsx(
20872
- Button,
20873
- {
20874
- variant: "ghost",
20875
- size: "sm",
20876
- onClick: handleActionClick(action, itemData),
20877
- "data-testid": `action-${action.event}`,
20878
- "data-row-id": String(itemData.id),
20879
- "aria-label": action.label,
20880
- title: action.label,
20881
- className: "text-error hover:text-error hover:bg-error/10 px-2",
20882
- children: action.icon ? renderIconInput(action.icon, { size: "xs" }) : action.label
20883
- },
20884
- idx
20885
- )) })
20886
- ] }) }),
20887
- bodyFields.length > 0 && /* @__PURE__ */ jsx(Box, { className: "px-4 py-3 flex-1", children: /* @__PURE__ */ jsx(VStack, { gap: "xs", children: bodyFields.map((field) => {
20888
- const value = getNestedValue(itemData, field.name);
20889
- if (value === void 0 || value === null || value === "") return null;
20890
- if (field.format === "boolean") {
20891
- return /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "justify-between items-center", children: [
20892
- /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
20893
- field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
20894
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: field.label ?? fieldLabel2(field.name) })
20895
- ] }),
20896
- /* @__PURE__ */ jsx(Badge, { variant: value ? "success" : "neutral", children: value ? t("common.yes") || "Yes" : t("common.no") || "No" })
20897
- ] }, field.name);
20898
- }
20899
- return /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "justify-between items-center", children: [
20900
- /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
20901
- field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
20902
- /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: field.label ?? fieldLabel2(field.name) })
20903
- ] }),
20904
- /* @__PURE__ */ jsx(
20905
- Typography,
20914
+ (primaryActions.length > 0 || dangerActions.length > 0) && /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "flex-shrink-0", children: [
20915
+ (maxInlineActions != null ? primaryActions.slice(0, maxInlineActions) : primaryActions).map((action, idx) => /* @__PURE__ */ jsx(
20916
+ Button,
20917
+ {
20918
+ variant: action.variant === "primary" ? "primary" : "ghost",
20919
+ size: "sm",
20920
+ onClick: handleActionClick(action, itemData),
20921
+ "data-testid": `action-${action.event}`,
20922
+ "data-row-id": String(itemData.id),
20923
+ "aria-label": action.label,
20924
+ title: action.label,
20925
+ className: cn(
20926
+ action.variant === "primary" ? void 0 : "text-muted-foreground hover:text-foreground",
20927
+ action.icon && "px-2"
20928
+ ),
20929
+ children: action.icon ? renderIconInput(action.icon, { size: "xs" }) : action.label
20930
+ },
20931
+ idx
20932
+ )),
20933
+ maxInlineActions != null && primaryActions.length > maxInlineActions && /* @__PURE__ */ jsx(
20934
+ Menu,
20906
20935
  {
20907
- variant: field.variant === "caption" ? "caption" : "small",
20908
- className: "text-right truncate max-w-[60%]",
20909
- children: formatValue(value, field.format)
20936
+ position: "bottom-end",
20937
+ trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
20938
+ items: primaryActions.slice(maxInlineActions).map((action) => ({
20939
+ label: action.label,
20940
+ icon: action.icon,
20941
+ event: action.event,
20942
+ onClick: () => fireAction(action, itemData)
20943
+ }))
20910
20944
  }
20911
- )
20912
- ] }, field.name);
20913
- }) }) }),
20914
- primaryActions.length > 0 && /* @__PURE__ */ jsx(Box, { className: "px-4 py-3 mt-auto border-t border-border", children: /* @__PURE__ */ jsxs(HStack, { gap: "sm", className: "justify-end flex-wrap", children: [
20915
- (maxInlineActions != null ? primaryActions.slice(0, maxInlineActions) : primaryActions).map((action, idx) => /* @__PURE__ */ jsxs(
20916
- Button,
20917
- {
20918
- variant: action.variant === "primary" ? "primary" : "ghost",
20919
- size: "sm",
20920
- onClick: handleActionClick(action, itemData),
20921
- "data-testid": `action-${action.event}`,
20922
- "data-row-id": String(itemData.id),
20923
- children: [
20924
- action.icon && renderIconInput(action.icon, { size: "xs", className: "mr-1" }),
20925
- action.label
20926
- ]
20927
- },
20928
- idx
20929
- )),
20930
- maxInlineActions != null && primaryActions.length > maxInlineActions && /* @__PURE__ */ jsx(
20931
- Menu,
20932
- {
20933
- position: "bottom-end",
20934
- trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
20935
- items: primaryActions.slice(maxInlineActions).map((action) => ({
20936
- label: action.label,
20937
- icon: action.icon,
20938
- event: action.event,
20939
- onClick: () => fireAction(action, itemData)
20940
- }))
20945
+ ),
20946
+ dangerActions.map((action, idx) => /* @__PURE__ */ jsx(
20947
+ Button,
20948
+ {
20949
+ variant: "ghost",
20950
+ size: "sm",
20951
+ onClick: handleActionClick(action, itemData),
20952
+ "data-testid": `action-${action.event}`,
20953
+ "data-row-id": String(itemData.id),
20954
+ "aria-label": action.label,
20955
+ title: action.label,
20956
+ className: "text-error hover:text-error hover:bg-error/10 px-2",
20957
+ children: action.icon ? renderIconInput(action.icon, { size: "xs" }) : action.label
20958
+ },
20959
+ `danger-${idx}`
20960
+ ))
20961
+ ] })
20962
+ ] }) }),
20963
+ bodyFields.length > 0 && /* @__PURE__ */ jsx(Box, { className: "px-4 pt-2 pb-4 flex-1", children: /* @__PURE__ */ jsxs(VStack, { gap: "xs", children: [
20964
+ bodyFields.filter((f3) => f3.variant === "caption" && f3.format !== "boolean").map((field) => {
20965
+ const value = getNestedValue(itemData, field.name);
20966
+ if (value === void 0 || value === null || value === "") return null;
20967
+ return /* @__PURE__ */ jsx(Typography, { variant: "small", color: "secondary", className: "line-clamp-2", children: formatValue(value, field.format) }, field.name);
20968
+ }),
20969
+ /* @__PURE__ */ jsx(HStack, { gap: "md", className: "flex-wrap gap-y-1", children: bodyFields.filter((f3) => f3.variant !== "caption" || f3.format === "boolean").map((field) => {
20970
+ const value = getNestedValue(itemData, field.name);
20971
+ if (value === void 0 || value === null || value === "") return null;
20972
+ if (field.format === "boolean") {
20973
+ return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
20974
+ field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
20975
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: field.label ?? fieldLabel2(field.name) }),
20976
+ /* @__PURE__ */ jsx(Badge, { variant: value ? "success" : "neutral", children: value ? t("common.yes") || "Yes" : t("common.no") || "No" })
20977
+ ] }, field.name);
20941
20978
  }
20942
- )
20979
+ return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
20980
+ field.icon && renderIconInput(field.icon, { size: "xs", className: "text-muted-foreground" }),
20981
+ /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", children: (field.label ?? fieldLabel2(field.name)) + ":" }),
20982
+ /* @__PURE__ */ jsx(Typography, { variant: "small", children: formatValue(value, field.format) })
20983
+ ] }, field.name);
20984
+ }) })
20943
20985
  ] }) })
20944
20986
  ]
20945
20987
  },
@@ -21287,11 +21329,29 @@ function DataList({
21287
21329
  const wrapDnd = (node) => dnd.isZone ? /* @__PURE__ */ jsx(dnd.SortableItem, { id: dndId, children: node }, dndId) : node;
21288
21330
  if (hasRenderProp) {
21289
21331
  const id2 = itemData.id || String(index);
21332
+ const actions = renderItemActions(itemData);
21290
21333
  return wrapDnd(
21291
- /* @__PURE__ */ jsxs(Box, { "data-entity-row": true, "data-entity-id": id2, onClick: itemClickEvent ? handleRowClick(itemData) : void 0, className: cn(itemClickEvent && "cursor-pointer"), children: [
21292
- /* @__PURE__ */ jsxs(Box, { className: "group flex items-stretch gap-2", children: [
21293
- /* @__PURE__ */ jsx(Box, { className: "flex-1 min-w-0", children: children(itemData, index) }),
21294
- renderItemActions(itemData)
21334
+ /* @__PURE__ */ jsxs(Box, { "data-entity-row": true, "data-entity-id": id2, onClick: itemClickEvent ? handleRowClick(itemData) : void 0, className: cn("relative group/rowactions", itemClickEvent && "cursor-pointer"), children: [
21335
+ children(itemData, index),
21336
+ actions && /* @__PURE__ */ jsxs(Box, { className: "absolute top-2 right-2 z-10 opacity-0 group-hover/rowactions:opacity-100 focus-within:opacity-100 [@media(pointer:coarse)]:opacity-100 transition-opacity duration-fast", children: [
21337
+ /* @__PURE__ */ jsx(Box, { className: "rounded-md border border-border bg-card/95 backdrop-blur-sm shadow-sm p-0.5 [@media(pointer:coarse)]:hidden", children: actions }),
21338
+ /* @__PURE__ */ jsx(Box, { className: "hidden [@media(pointer:coarse)]:block rounded-md border border-border bg-card/95 backdrop-blur-sm shadow-sm p-0.5", children: /* @__PURE__ */ jsx(
21339
+ Menu,
21340
+ {
21341
+ position: "bottom-end",
21342
+ trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
21343
+ items: (itemActions ?? []).map((action) => ({
21344
+ label: action.label,
21345
+ icon: action.icon,
21346
+ event: action.event,
21347
+ variant: action.variant === "danger" ? "danger" : "default",
21348
+ onClick: () => eventBus.emit(`UI:${action.event}`, {
21349
+ id: itemData.id,
21350
+ row: itemData
21351
+ })
21352
+ }))
21353
+ }
21354
+ ) })
21295
21355
  ] }),
21296
21356
  isCard && !isLast && /* @__PURE__ */ jsx(Box, { className: "mx-6 border-b border-border/40" })
21297
21357
  ] }, id2)
@@ -21331,7 +21391,7 @@ function DataList({
21331
21391
  ] }, field.name);
21332
21392
  })
21333
21393
  ] }),
21334
- bodyFields.length > 0 && !isCompact && /* @__PURE__ */ jsx(HStack, { gap: "md", className: "mt-1.5 flex-wrap", children: bodyFields.map((field) => {
21394
+ bodyFields.length > 0 && /* @__PURE__ */ jsx(HStack, { gap: "md", className: cn("flex-wrap", isCompact ? "mt-0.5" : "mt-1.5"), children: bodyFields.map((field) => {
21335
21395
  const value = getNestedValue(itemData, field.name);
21336
21396
  if (value === void 0 || value === null || value === "") return null;
21337
21397
  return /* @__PURE__ */ jsxs(HStack, { gap: "xs", className: "items-center", children: [
@@ -28581,7 +28641,7 @@ var init_MapView = __esm({
28581
28641
  shadowSize: [41, 41]
28582
28642
  });
28583
28643
  L.Marker.prototype.options.icon = defaultIcon;
28584
- const { useEffect: useEffect65, useRef: useRef63, useCallback: useCallback105, useState: useState102 } = React74__default;
28644
+ const { useEffect: useEffect65, useRef: useRef63, useCallback: useCallback106, useState: useState102 } = React74__default;
28585
28645
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
28586
28646
  const { useEventBus: useEventBus2 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
28587
28647
  function MapUpdater({ centerLat, centerLng, zoom }) {
@@ -28627,7 +28687,7 @@ var init_MapView = __esm({
28627
28687
  }) {
28628
28688
  const eventBus = useEventBus2();
28629
28689
  const [clickedPosition, setClickedPosition] = useState102(null);
28630
- const handleMapClick = useCallback105((lat, lng) => {
28690
+ const handleMapClick = useCallback106((lat, lng) => {
28631
28691
  if (showClickedPin) {
28632
28692
  setClickedPosition({ lat, lng });
28633
28693
  }
@@ -28636,7 +28696,7 @@ var init_MapView = __esm({
28636
28696
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
28637
28697
  }
28638
28698
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
28639
- const handleMarkerClick = useCallback105((marker) => {
28699
+ const handleMarkerClick = useCallback106((marker) => {
28640
28700
  onMarkerClick?.(marker);
28641
28701
  if (markerClickEvent) {
28642
28702
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -29412,6 +29472,26 @@ var init_Lightbox = __esm({
29412
29472
  Lightbox.displayName = "Lightbox";
29413
29473
  }
29414
29474
  });
29475
+ function useMediaQuery(query) {
29476
+ const subscribe = useCallback(
29477
+ (onChange) => {
29478
+ const mql = window.matchMedia(query);
29479
+ mql.addEventListener("change", onChange);
29480
+ return () => mql.removeEventListener("change", onChange);
29481
+ },
29482
+ [query]
29483
+ );
29484
+ return useSyncExternalStore(
29485
+ subscribe,
29486
+ () => window.matchMedia(query).matches,
29487
+ () => false
29488
+ );
29489
+ }
29490
+ var init_useMediaQuery = __esm({
29491
+ "hooks/useMediaQuery.ts"() {
29492
+ "use client";
29493
+ }
29494
+ });
29415
29495
  function renderIconInput3(icon, props) {
29416
29496
  return typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { name: icon, ...props }) : /* @__PURE__ */ jsx(Icon, { icon, ...props });
29417
29497
  }
@@ -29518,6 +29598,7 @@ function TableView({
29518
29598
  const hasMore = pageSize > 0 && visibleCount < ordered.length;
29519
29599
  const hasRenderProp = typeof children === "function";
29520
29600
  const idField = dndItemIdField ?? "id";
29601
+ const isCoarsePointer = useMediaQuery("(pointer: coarse)");
29521
29602
  const selected = selectedIds ? new Set(selectedIds) : localSelected;
29522
29603
  const emitSelection = (next) => {
29523
29604
  if (!selectedIds) setLocalSelected(next);
@@ -29550,6 +29631,17 @@ function TableView({
29550
29631
  };
29551
29632
  eventBus.emit(`UI:${action.event}`, payload);
29552
29633
  };
29634
+ const colFloors = React74__default.useMemo(
29635
+ () => colDefs.map((col) => {
29636
+ const longest = data.reduce((widest, row) => {
29637
+ const cell = formatCell(asFieldValue(getNestedValue(row, col.field ?? col.key)), col.format);
29638
+ return Math.max(widest, cell.length);
29639
+ }, columnLabel(col).length);
29640
+ const chrome = col.format === "badge" ? BADGE_CHROME_CH : 0;
29641
+ return Math.min(longest + chrome, MAX_MEASURED_COL_CH);
29642
+ }),
29643
+ [colDefs, data]
29644
+ );
29553
29645
  if (isLoading) {
29554
29646
  return /* @__PURE__ */ jsx(Box, { className: "text-center py-8", children: /* @__PURE__ */ jsx(Typography, { variant: "body", color: "secondary", children: t("loading.items") }) });
29555
29647
  }
@@ -29562,20 +29654,10 @@ function TableView({
29562
29654
  }
29563
29655
  const lk = LOOKS[look];
29564
29656
  const hasActions = Boolean(itemActions && itemActions.length > 0);
29565
- const inlineActionCount = hasActions ? maxInlineActions != null ? Math.min(itemActions.length, maxInlineActions) : itemActions.length : 0;
29566
- const hasOverflowActions = hasActions && maxInlineActions != null && itemActions.length > maxInlineActions;
29657
+ const effectiveMaxInline = isCoarsePointer ? 0 : maxInlineActions;
29658
+ const inlineActionCount = hasActions ? effectiveMaxInline != null ? Math.min(itemActions.length, effectiveMaxInline) : itemActions.length : 0;
29659
+ const hasOverflowActions = hasActions && effectiveMaxInline != null && itemActions.length > effectiveMaxInline;
29567
29660
  const actionsTrack = hasActions ? `${inlineActionCount * 6 + (hasOverflowActions ? 3 : 0)}rem` : null;
29568
- const colFloors = React74__default.useMemo(
29569
- () => colDefs.map((col) => {
29570
- const longest = data.reduce((widest, row) => {
29571
- const cell = formatCell(asFieldValue(getNestedValue(row, col.field ?? col.key)), col.format);
29572
- return Math.max(widest, cell.length);
29573
- }, columnLabel(col).length);
29574
- const chrome = col.format === "badge" ? BADGE_CHROME_CH : 0;
29575
- return Math.min(longest + chrome, MAX_MEASURED_COL_CH);
29576
- }),
29577
- [colDefs, data]
29578
- );
29579
29661
  const gridTemplateColumns = [
29580
29662
  selectable ? "auto" : null,
29581
29663
  ...colDefs.map((c, i) => c.width ?? `minmax(${colFloors[i]}ch, 1fr)`),
@@ -29664,7 +29746,7 @@ function TableView({
29664
29746
  if (col.format === "badge" && raw != null && raw !== "") {
29665
29747
  return /* @__PURE__ */ jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsx(Badge, { variant: statusVariant4(String(raw)), size: "sm", className: "whitespace-nowrap", children: String(raw) }) }, col.key);
29666
29748
  }
29667
- return /* @__PURE__ */ jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsx("span", { className: "truncate", children: formatCell(raw, col.format) }) }, col.key);
29749
+ return /* @__PURE__ */ jsx(Box, { role: "cell", className: cellBase, children: /* @__PURE__ */ jsx("span", { className: "truncate text-foreground", children: formatCell(raw, col.format) }) }, col.key);
29668
29750
  }),
29669
29751
  itemActions && itemActions.length > 0 && /* @__PURE__ */ jsxs(
29670
29752
  HStack,
@@ -29678,15 +29760,15 @@ function TableView({
29678
29760
  lk.striped && index % 2 === 1 ? "bg-[var(--color-surface-subtle)]" : "bg-[var(--color-card)] group-hover:bg-[var(--color-surface-subtle)]"
29679
29761
  ),
29680
29762
  children: [
29681
- (maxInlineActions != null ? itemActions.slice(0, maxInlineActions) : itemActions).map((action, i) => /* @__PURE__ */ jsxs(
29763
+ (effectiveMaxInline != null ? itemActions.slice(0, effectiveMaxInline) : itemActions).map((action, i) => /* @__PURE__ */ jsxs(
29682
29764
  Button,
29683
29765
  {
29684
- variant: action.variant ?? "ghost",
29766
+ variant: action.variant === "primary" ? "primary" : "ghost",
29685
29767
  size: "sm",
29686
29768
  onClick: handleActionClick(action, row),
29687
29769
  "data-testid": `action-${action.event}`,
29688
29770
  "data-row-id": String(row.id),
29689
- className: cn(action.variant === "danger" && "text-error hover:bg-error/10"),
29771
+ className: cn(action.variant === "danger" && "text-error hover:text-error hover:bg-error/10"),
29690
29772
  children: [
29691
29773
  action.icon && renderIconInput3(action.icon, { size: "xs", className: "mr-1" }),
29692
29774
  action.label
@@ -29694,12 +29776,12 @@ function TableView({
29694
29776
  },
29695
29777
  i
29696
29778
  )),
29697
- maxInlineActions != null && itemActions.length > maxInlineActions && /* @__PURE__ */ jsx(
29779
+ effectiveMaxInline != null && itemActions.length > effectiveMaxInline && /* @__PURE__ */ jsx(
29698
29780
  Menu,
29699
29781
  {
29700
29782
  position: "bottom-end",
29701
29783
  trigger: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": t("common.actions"), "data-testid": "action-overflow", children: /* @__PURE__ */ jsx(Icon, { name: "more-horizontal", size: "xs" }) }),
29702
- items: itemActions.slice(maxInlineActions).map((action) => ({
29784
+ items: itemActions.slice(effectiveMaxInline).map((action) => ({
29703
29785
  label: action.label,
29704
29786
  icon: action.icon,
29705
29787
  event: action.event,
@@ -29752,6 +29834,7 @@ var init_TableView = __esm({
29752
29834
  init_cn();
29753
29835
  init_getNestedValue();
29754
29836
  init_useEventBus();
29837
+ init_useMediaQuery();
29755
29838
  init_Box();
29756
29839
  init_Stack();
29757
29840
  init_Typography();
@@ -29776,7 +29859,7 @@ var init_TableView = __esm({
29776
29859
  semibold: "font-semibold"
29777
29860
  };
29778
29861
  LOOKS = {
29779
- dense: { rowPad: "px-card-md py-card-sm", headPad: "px-card-md py-card-sm", striped: false, divider: true },
29862
+ dense: { rowPad: "px-card-md py-2", headPad: "px-card-md py-2", striped: false, divider: true },
29780
29863
  spacious: { rowPad: "px-card-lg py-card-md", headPad: "px-card-lg py-card-sm", striped: false, divider: true },
29781
29864
  striped: { rowPad: "px-card-md py-card-sm", headPad: "px-card-md py-card-sm", striped: true, divider: false },
29782
29865
  borderless: { rowPad: "px-card-md py-card-sm", headPad: "px-card-md py-card-sm", striped: false, divider: false },
@@ -38451,7 +38534,17 @@ function DataTable({
38451
38534
  const currentPageSize = pageSize ?? 20;
38452
38535
  const total = totalCount ?? items.length;
38453
38536
  const totalPages = Math.ceil(total / currentPageSize);
38454
- const rowActions = externalRowActions ?? itemActions?.filter((a) => a.placement !== "bulk").map((action) => ({
38537
+ const withEventClick = (action) => {
38538
+ if (action.onClick || !action.event) return action;
38539
+ const event = action.event;
38540
+ return {
38541
+ ...action,
38542
+ onClick: (row) => {
38543
+ eventBus.emit(`UI:${event}`, { row });
38544
+ }
38545
+ };
38546
+ };
38547
+ const rowActions = (externalRowActions ?? itemActions?.filter((a) => a.placement !== "bulk").map((action) => ({
38455
38548
  label: action.label,
38456
38549
  icon: action.icon,
38457
38550
  variant: action.variant,
@@ -38471,7 +38564,17 @@ function DataTable({
38471
38564
  });
38472
38565
  }
38473
38566
  }
38474
- }));
38567
+ })))?.map(withEventClick);
38568
+ const normalizedBulkActions = bulkActions?.map((action) => {
38569
+ if (action.onClick || !action.event) return action;
38570
+ const event = action.event;
38571
+ return {
38572
+ ...action,
38573
+ onClick: (selectedRows2) => {
38574
+ eventBus.emit(`UI:${event}`, { rows: selectedRows2 });
38575
+ }
38576
+ };
38577
+ });
38475
38578
  const viewAction = itemActions?.find(
38476
38579
  (a) => a.event === "VIEW" || a.navigatesTo
38477
38580
  );
@@ -38579,7 +38682,7 @@ function DataTable({
38579
38682
  }
38580
38683
  )
38581
38684
  ] }),
38582
- bulkActions && selectedIds.length > 0 && /* @__PURE__ */ jsxs(HStack, { className: "items-center gap-2 pl-0 sm:pl-3 border-l-0 sm:border-l border-border", children: [
38685
+ normalizedBulkActions && selectedIds.length > 0 && /* @__PURE__ */ jsxs(HStack, { className: "items-center gap-2 pl-0 sm:pl-3 border-l-0 sm:border-l border-border", children: [
38583
38686
  /* @__PURE__ */ jsx(
38584
38687
  Typography,
38585
38688
  {
@@ -38590,13 +38693,13 @@ function DataTable({
38590
38693
  })
38591
38694
  }
38592
38695
  ),
38593
- /* @__PURE__ */ jsx(HStack, { className: "flex-wrap gap-2", children: bulkActions.map((action, idx) => /* @__PURE__ */ jsx(
38696
+ /* @__PURE__ */ jsx(HStack, { className: "flex-wrap gap-2", children: normalizedBulkActions.map((action, idx) => /* @__PURE__ */ jsx(
38594
38697
  Button,
38595
38698
  {
38596
38699
  variant: action.variant === "danger" ? "danger" : "secondary",
38597
38700
  size: "sm",
38598
38701
  leftIcon: action.icon,
38599
- onClick: () => action.onClick(selectedRows),
38702
+ onClick: () => action.onClick?.(selectedRows),
38600
38703
  children: action.label
38601
38704
  },
38602
38705
  idx
@@ -38758,7 +38861,7 @@ function DataTable({
38758
38861
  ),
38759
38862
  onClick: (e) => {
38760
38863
  e.stopPropagation();
38761
- action.onClick(row);
38864
+ action.onClick?.(row);
38762
38865
  setOpenActionMenu(null);
38763
38866
  },
38764
38867
  children: [
@@ -41054,27 +41157,24 @@ var init_MasterDetailLayout = __esm({
41054
41157
  masterClassName,
41055
41158
  detailClassName
41056
41159
  }) => {
41057
- masterWidth.endsWith("%") ? parseInt(masterWidth, 10) : 30;
41058
41160
  return /* @__PURE__ */ jsxs(
41059
41161
  "div",
41060
41162
  {
41061
- className: cn("flex h-full w-full", className),
41062
- style: {
41063
- display: "grid",
41064
- gridTemplateColumns: masterWidth.endsWith("%") ? `${masterWidth} 1fr` : `${masterWidth} 1fr`
41065
- },
41163
+ className: cn("w-full h-full md:grid md:grid-cols-[var(--master-detail-cols)]", className),
41164
+ style: { "--master-detail-cols": `${masterWidth} 1fr` },
41066
41165
  children: [
41067
41166
  /* @__PURE__ */ jsx(
41068
41167
  "div",
41069
41168
  {
41070
41169
  className: cn(
41071
- "border-r-2 border-border overflow-auto",
41170
+ "border-r border-border overflow-auto",
41171
+ hasSelection && "hidden md:block",
41072
41172
  masterClassName
41073
41173
  ),
41074
41174
  children: master
41075
41175
  }
41076
41176
  ),
41077
- /* @__PURE__ */ jsx("div", { className: cn("overflow-auto", detailClassName), children: hasSelection ? detail : emptyDetail || /* @__PURE__ */ jsx(DefaultEmptyDetail, {}) })
41177
+ /* @__PURE__ */ jsx("div", { className: cn("overflow-auto", !hasSelection && "hidden md:block", detailClassName), children: hasSelection ? detail : emptyDetail || /* @__PURE__ */ jsx(DefaultEmptyDetail, {}) })
41078
41178
  ]
41079
41179
  }
41080
41180
  );
@@ -48654,6 +48754,7 @@ init_useAuthContext();
48654
48754
  init_useSwipeGesture();
48655
48755
  init_useLongPress();
48656
48756
  init_useDragReorder();
48757
+ init_useMediaQuery();
48657
48758
  init_useInfiniteScroll();
48658
48759
  init_usePullToRefresh();
48659
48760
  init_useCanvasGestures();
@@ -48899,4 +49000,4 @@ function useGitHubBranches(owner, repo, enabled = true) {
48899
49000
  });
48900
49001
  }
48901
49002
 
48902
- export { ALL_PRESETS, ALMADAR_DND_MIME, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, Card2 as ActionCard, ActionPalette, ActionTile, ActivationBlock, Alert, AlgorithmCanvas, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AssetPicker, AtlasImage, AtlasPanel, AuthLayout, Avatar, Badge, BehaviorView, BiologyCanvas, BloomQuizBlock, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, Button, ButtonGroup, CTABanner, CalendarGrid, Canvas, Canvas2D, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, Center, Chart, ChartLegend, ChatBar, Checkbox, ChemistryCanvas, ChoiceButton, Coachmark, CodeBlock, CodeRunnerPanel, CollapsibleSection, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ContentSection, ControlButton, ControlGrid, CounterTemplate, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DEFAULT_SLOTS, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DetailPanel, Dialog, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, ELEMENT_SELECTED_EVENT, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EntityDisplayEvents, ErrorBoundary, ErrorState, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioToggle, GameHud, GameIcon, GameMenu, GameShell, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HeroOrganism, HeroSection, I18nProvider, IDENTITY_BOOK_FIELDS, Icon, IconPicker, ImportPreviewTree, ImportProgress, ImportSourcePicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, LearningCanvas, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MathCanvas, MatrixQuestion, MediaGallery, Menu, Meter, Modal, ModalSlot, ModuleCard, Navigation, NodeSlotEditor, NotifyListener, NumberStepper, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, PageTransition, Pagination, PatternTile, PhysicsCanvas, Popover, PositionedCanvas, Presence, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuizBlock, Radio, RangeSlider, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, RichBlockEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreDisplay, SearchInput, Section, SectionHeader, SegmentRenderer, Select, SequenceBar, ServiceCatalog, SharedEntityStoreContext, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateGraph, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StepFlow, StepFlowOrganism, SubagentTracePanel, SvgBranch, SvgConnection, SvgFlow, SvgGrid, SvgLobe, SvgMesh, SvgMorph, SvgNode, SvgPulse, SvgRing, SvgShield, SvgStack, SwipeableRow, Switch, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, TableView, Tabs, TagCloud, TagInput, TeamCard, TeamOrganism, TerrainPalette, TextHighlight, Textarea, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UploadDropZone, VStack, VersionDiff, ViolationAlert, VoteStack, WizardContainer, WizardNavigation, WizardProgress, boardEntity, bool, calculateAttackTargets, calculateValidMoves, cn, createInitialGameState, createSharedEntityStore, createTranslate, createUnitAnimationState, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, makeAsset, makeAssetMap, mapBookData, num, objAvailableActions, objAvailableEvents, objCurrentState, objIcon, objId, objMaxRules, objName, objRules, objStates, parseEditFocus, parseLessonSegments, parseMarkdownWithCodeBlocks, parseQueryBinding, pendulum, projectileMotion, registerCodeLanguageLoader, resolveFieldMap, resolveFrame, resolveSheetDirection, rows, runTickFrame, screenToIso, springOscillator, str, tickAnimationState, toCodeLanguage, transitionAnimation, unitHealth, unitPosition, unitTeam, useAgentChat, useAnchorRect, useAtlasSliceDataUrl, useAuthContext, useCamera, useCanvasGestures, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useEmitEvent, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useGameAudio, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useImageCache, useInfiniteScroll, useLongPress, useOrbitalHistory, usePresence, usePreview, usePullToRefresh, useQuerySingleton, useRenderInterpolation, useSharedEntitySnapshot, useSharedEntityStore, useSharedEntityStoreContext, useSwipeGesture, useTapReveal, useTraitListens, useTranslate114 as useTranslate, useUIEvents, useUISlotManager, useUnitSpriteAtlas, useValidation, vec2 };
49003
+ export { ALL_PRESETS, ALMADAR_DND_MIME, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, Card2 as ActionCard, ActionPalette, ActionTile, ActivationBlock, Alert, AlgorithmCanvas, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AssetPicker, AtlasImage, AtlasPanel, AuthLayout, Avatar, Badge, BehaviorView, BiologyCanvas, BloomQuizBlock, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, Button, ButtonGroup, CTABanner, CalendarGrid, Canvas, Canvas2D, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, Center, Chart, ChartLegend, ChatBar, Checkbox, ChemistryCanvas, ChoiceButton, Coachmark, CodeBlock, CodeRunnerPanel, CollapsibleSection, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, ConnectionBlock, Container, ContentRenderer, ContentSection, ControlButton, ControlGrid, CounterTemplate, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DEFAULT_SLOTS, DIAMOND_TOP_Y, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DetailPanel, Dialog, DialogueBubble, Divider, DocBreadcrumb, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, ELEMENT_SELECTED_EVENT, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EntityDisplayEvents, ErrorBoundary, ErrorState, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioToggle, GameHud, GameIcon, GameMenu, GameShell, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, GridPicker, HStack, Header, HealthBar, HeroOrganism, HeroSection, I18nProvider, IDENTITY_BOOK_FIELDS, Icon, IconPicker, ImportPreviewTree, ImportProgress, ImportSourcePicker, InfiniteScrollSentinel, Input, InputGroup, InstallBox, JazariStateMachine, JsonTreeEditor, Label, LandingPageTemplate, LawReferenceTooltip, LearningCanvas, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MathCanvas, MatrixQuestion, MediaGallery, Menu, Meter, Modal, ModalSlot, ModuleCard, Navigation, NodeSlotEditor, NotifyListener, NumberStepper, OnboardingSpotlight, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, PageTransition, Pagination, PatternTile, PhysicsCanvas, Popover, PositionedCanvas, Presence, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PropertyInspector, PullQuote, PullToRefresh, QrScanner, QuizBlock, Radio, RangeSlider, ReflectionBlock, RelationSelect, RepeatableFormSection, ReplyTree, RichBlockEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreDisplay, SearchInput, Section, SectionHeader, SegmentRenderer, Select, SequenceBar, ServiceCatalog, SharedEntityStoreContext, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateGraph, StateJsonView, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StepFlow, StepFlowOrganism, SubagentTracePanel, SvgBranch, SvgConnection, SvgFlow, SvgGrid, SvgLobe, SvgMesh, SvgMorph, SvgNode, SvgPulse, SvgRing, SvgShield, SvgStack, SwipeableRow, Switch, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, TableView, Tabs, TagCloud, TagInput, TeamCard, TeamOrganism, TerrainPalette, TextHighlight, Textarea, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UploadDropZone, VStack, VersionDiff, ViolationAlert, VoteStack, WizardContainer, WizardNavigation, WizardProgress, boardEntity, bool, calculateAttackTargets, calculateValidMoves, cn, createInitialGameState, createSharedEntityStore, createTranslate, createUnitAnimationState, getCurrentFrame, getTileDimensions, inferDirection, isoToScreen, makeAsset, makeAssetMap, mapBookData, num, objAvailableActions, objAvailableEvents, objCurrentState, objIcon, objId, objMaxRules, objName, objRules, objStates, parseEditFocus, parseLessonSegments, parseMarkdownWithCodeBlocks, parseQueryBinding, pendulum, projectileMotion, registerCodeLanguageLoader, resolveFieldMap, resolveFrame, resolveSheetDirection, rows, runTickFrame, screenToIso, springOscillator, str, tickAnimationState, toCodeLanguage, transitionAnimation, unitHealth, unitPosition, unitTeam, useAgentChat, useAnchorRect, useAtlasSliceDataUrl, useAuthContext, useCamera, useCanvasGestures, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useEmitEvent, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useGameAudio, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useImageCache, useInfiniteScroll, useLongPress, useMediaQuery, useOrbitalHistory, usePresence, usePreview, usePullToRefresh, useQuerySingleton, useRenderInterpolation, useSharedEntitySnapshot, useSharedEntityStore, useSharedEntityStoreContext, useSwipeGesture, useTapReveal, useTraitListens, useTranslate114 as useTranslate, useUIEvents, useUISlotManager, useUnitSpriteAtlas, useValidation, vec2 };