@almadar/ui 4.56.4 → 4.57.2

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.
@@ -1770,7 +1770,7 @@ var init_Badge = __esm({
1770
1770
  lg: "px-3 py-1.5 text-base"
1771
1771
  };
1772
1772
  exports.Badge = React78__namespace.default.forwardRef(
1773
- ({ className, variant = "default", size = "sm", amount, label, icon, children, ...props }, ref) => {
1773
+ ({ className, variant = "default", size = "sm", amount, label, icon, children, onRemove, removeLabel, ...props }, ref) => {
1774
1774
  const iconSizes3 = { sm: "w-3 h-3", md: "w-3.5 h-3.5", lg: "w-4 h-4" };
1775
1775
  const resolvedIcon = typeof icon === "string" ? (() => {
1776
1776
  const I = resolveIcon(icon);
@@ -1784,12 +1784,31 @@ var init_Badge = __esm({
1784
1784
  "inline-flex items-center gap-1 font-bold rounded-sm",
1785
1785
  variantStyles3[variant],
1786
1786
  sizeStyles2[size],
1787
+ onRemove && "pr-1",
1787
1788
  className
1788
1789
  ),
1789
1790
  ...props,
1790
1791
  children: [
1791
1792
  resolvedIcon,
1792
- children || (amount != null ? `${label ? `${label} ` : ""}${amount}` : label)
1793
+ children || (amount != null ? `${label ? `${label} ` : ""}${amount}` : label),
1794
+ onRemove ? /* @__PURE__ */ jsxRuntime.jsx(
1795
+ "button",
1796
+ {
1797
+ type: "button",
1798
+ "aria-label": removeLabel ?? "Remove",
1799
+ onClick: (e) => {
1800
+ e.stopPropagation();
1801
+ onRemove();
1802
+ },
1803
+ className: cn(
1804
+ "inline-flex items-center justify-center rounded-sm",
1805
+ "hover:bg-foreground/10 focus:outline-none focus:ring-1 focus:ring-ring",
1806
+ "transition-colors",
1807
+ size === "sm" ? "w-4 h-4 ml-0.5" : size === "md" ? "w-5 h-5 ml-1" : "w-6 h-6 ml-1"
1808
+ ),
1809
+ children: /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.X, { className: iconSizes3[size] })
1810
+ }
1811
+ ) : null
1793
1812
  ]
1794
1813
  }
1795
1814
  );
@@ -7870,7 +7889,7 @@ var init_MapView = __esm({
7870
7889
  shadowSize: [41, 41]
7871
7890
  });
7872
7891
  L.Marker.prototype.options.icon = defaultIcon;
7873
- const { useEffect: useEffect71, useRef: useRef66, useCallback: useCallback126, useState: useState108 } = React78__namespace.default;
7892
+ const { useEffect: useEffect71, useRef: useRef66, useCallback: useCallback127, useState: useState109 } = React78__namespace.default;
7874
7893
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
7875
7894
  const { useEventBus: useEventBus2 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
7876
7895
  function MapUpdater({ centerLat, centerLng, zoom }) {
@@ -7915,8 +7934,8 @@ var init_MapView = __esm({
7915
7934
  showAttribution = true
7916
7935
  }) {
7917
7936
  const eventBus = useEventBus2();
7918
- const [clickedPosition, setClickedPosition] = useState108(null);
7919
- const handleMapClick = useCallback126((lat, lng) => {
7937
+ const [clickedPosition, setClickedPosition] = useState109(null);
7938
+ const handleMapClick = useCallback127((lat, lng) => {
7920
7939
  if (showClickedPin) {
7921
7940
  setClickedPosition({ lat, lng });
7922
7941
  }
@@ -7925,7 +7944,7 @@ var init_MapView = __esm({
7925
7944
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
7926
7945
  }
7927
7946
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
7928
- const handleMarkerClick = useCallback126((marker) => {
7947
+ const handleMarkerClick = useCallback127((marker) => {
7929
7948
  onMarkerClick?.(marker);
7930
7949
  if (markerClickEvent) {
7931
7950
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -28744,6 +28763,98 @@ var init_TagCloud = __esm({
28744
28763
  exports.TagCloud.displayName = "TagCloud";
28745
28764
  }
28746
28765
  });
28766
+ exports.TagInput = void 0;
28767
+ var init_TagInput = __esm({
28768
+ "components/molecules/TagInput.tsx"() {
28769
+ "use client";
28770
+ init_cn();
28771
+ init_useEventBus();
28772
+ init_Input();
28773
+ init_Badge();
28774
+ init_Stack();
28775
+ init_Typography();
28776
+ exports.TagInput = ({
28777
+ value,
28778
+ onChange,
28779
+ placeholder,
28780
+ disabled = false,
28781
+ variant = "default",
28782
+ unique = true,
28783
+ helperText,
28784
+ className,
28785
+ addEvent,
28786
+ removeEvent
28787
+ }) => {
28788
+ const eventBus = useEventBus();
28789
+ const [draft, setDraft] = React78.useState("");
28790
+ const commit = React78.useCallback(() => {
28791
+ const tag = draft.trim();
28792
+ if (!tag) return;
28793
+ if (unique && value.includes(tag)) {
28794
+ setDraft("");
28795
+ return;
28796
+ }
28797
+ const next = [...value, tag];
28798
+ onChange?.(next);
28799
+ if (addEvent) {
28800
+ eventBus.emit(`UI:${addEvent}`, { tag, value: next });
28801
+ }
28802
+ setDraft("");
28803
+ }, [draft, value, onChange, unique, addEvent, eventBus]);
28804
+ const removeAt = React78.useCallback(
28805
+ (index) => {
28806
+ if (disabled) return;
28807
+ const tag = value[index];
28808
+ const next = value.slice();
28809
+ next.splice(index, 1);
28810
+ onChange?.(next);
28811
+ if (removeEvent) {
28812
+ eventBus.emit(`UI:${removeEvent}`, { tag, index, value: next });
28813
+ }
28814
+ },
28815
+ [value, onChange, disabled, removeEvent, eventBus]
28816
+ );
28817
+ const handleKeyDown = React78.useCallback(
28818
+ (e) => {
28819
+ if (disabled) return;
28820
+ if (e.key === "Enter") {
28821
+ e.preventDefault();
28822
+ commit();
28823
+ } else if (e.key === "Backspace" && draft.length === 0 && value.length > 0) {
28824
+ e.preventDefault();
28825
+ removeAt(value.length - 1);
28826
+ }
28827
+ },
28828
+ [commit, draft.length, value, removeAt, disabled]
28829
+ );
28830
+ return /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "xs", className: cn("w-full", className), children: [
28831
+ value.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(exports.HStack, { gap: "xs", className: "flex-wrap", children: value.map((tag, index) => /* @__PURE__ */ jsxRuntime.jsx(
28832
+ exports.Badge,
28833
+ {
28834
+ variant,
28835
+ size: "sm",
28836
+ onRemove: disabled ? void 0 : () => removeAt(index),
28837
+ removeLabel: `Remove ${tag}`,
28838
+ children: tag
28839
+ },
28840
+ `${tag}-${index}`
28841
+ )) }) : null,
28842
+ /* @__PURE__ */ jsxRuntime.jsx(
28843
+ exports.Input,
28844
+ {
28845
+ value: draft,
28846
+ placeholder: placeholder ?? "Type and press Enter\u2026",
28847
+ disabled,
28848
+ onChange: (e) => setDraft(e.target.value),
28849
+ onKeyDown: handleKeyDown
28850
+ }
28851
+ ),
28852
+ helperText ? /* @__PURE__ */ jsxRuntime.jsx(exports.Typography, { variant: "caption", color: "muted", children: helperText }) : null
28853
+ ] });
28854
+ };
28855
+ exports.TagInput.displayName = "TagInput";
28856
+ }
28857
+ });
28747
28858
  exports.ShowcaseCard = void 0;
28748
28859
  var init_ShowcaseCard = __esm({
28749
28860
  "components/molecules/ShowcaseCard.tsx"() {
@@ -32362,6 +32473,75 @@ var init_GradientDivider = __esm({
32362
32473
  exports.GradientDivider.displayName = "GradientDivider";
32363
32474
  }
32364
32475
  });
32476
+ exports.MarketingFooter = void 0;
32477
+ var init_MarketingFooter = __esm({
32478
+ "components/molecules/MarketingFooter.tsx"() {
32479
+ "use client";
32480
+ init_cn();
32481
+ init_Box();
32482
+ init_Stack();
32483
+ init_Typography();
32484
+ exports.MarketingFooter = ({
32485
+ columns,
32486
+ copyright,
32487
+ logo,
32488
+ className
32489
+ }) => {
32490
+ return /* @__PURE__ */ jsxRuntime.jsx(
32491
+ exports.Box,
32492
+ {
32493
+ as: "footer",
32494
+ className: cn(
32495
+ "bg-surface",
32496
+ "border-t border-border",
32497
+ "pt-12 pb-8 px-4",
32498
+ className
32499
+ ),
32500
+ children: /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "lg", className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
32501
+ /* @__PURE__ */ jsxRuntime.jsxs(exports.HStack, { gap: "lg", align: "start", className: "flex-wrap w-full justify-between", children: [
32502
+ logo && /* @__PURE__ */ jsxRuntime.jsx(exports.VStack, { gap: "sm", className: "min-w-[140px] mb-4", children: logo.href ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: logo.href, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: logo.src, alt: logo.alt, className: "h-8 w-auto" }) }) : /* @__PURE__ */ jsxRuntime.jsx("img", { src: logo.src, alt: logo.alt, className: "h-8 w-auto" }) }),
32503
+ columns.map((col) => /* @__PURE__ */ jsxRuntime.jsxs(exports.VStack, { gap: "sm", className: "min-w-[140px] mb-4", children: [
32504
+ /* @__PURE__ */ jsxRuntime.jsx(
32505
+ exports.Typography,
32506
+ {
32507
+ variant: "body2",
32508
+ className: "font-semibold text-foreground mb-1",
32509
+ children: col.title
32510
+ }
32511
+ ),
32512
+ col.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
32513
+ "a",
32514
+ {
32515
+ href: item.href,
32516
+ className: cn(
32517
+ "text-sm no-underline",
32518
+ "text-foreground/60",
32519
+ "hover:text-accent",
32520
+ "transition-colors duration-150"
32521
+ ),
32522
+ target: item.href.startsWith("http") ? "_blank" : void 0,
32523
+ rel: item.href.startsWith("http") ? "noopener noreferrer" : void 0,
32524
+ children: item.label
32525
+ },
32526
+ item.label
32527
+ ))
32528
+ ] }, col.title))
32529
+ ] }),
32530
+ copyright && /* @__PURE__ */ jsxRuntime.jsx(
32531
+ exports.Typography,
32532
+ {
32533
+ variant: "caption",
32534
+ className: "text-foreground/30 text-center w-full pt-6",
32535
+ children: copyright
32536
+ }
32537
+ )
32538
+ ] })
32539
+ }
32540
+ );
32541
+ };
32542
+ exports.MarketingFooter.displayName = "MarketingFooter";
32543
+ }
32544
+ });
32365
32545
  exports.PullQuote = void 0;
32366
32546
  var init_PullQuote = __esm({
32367
32547
  "components/molecules/PullQuote.tsx"() {
@@ -32879,6 +33059,7 @@ var init_molecules = __esm({
32879
33059
  init_StepFlow();
32880
33060
  init_SplitSection();
32881
33061
  init_TagCloud();
33062
+ init_TagInput();
32882
33063
  init_CommunityLinks();
32883
33064
  init_TeamCard();
32884
33065
  init_ShowcaseCard();
@@ -32901,6 +33082,7 @@ var init_molecules = __esm({
32901
33082
  init_DocSidebar();
32902
33083
  init_DocTOC();
32903
33084
  init_GradientDivider();
33085
+ init_MarketingFooter();
32904
33086
  init_PullQuote();
32905
33087
  init_BehaviorView();
32906
33088
  init_ModuleCard();
@@ -44730,6 +44912,7 @@ var init_component_registry_generated = __esm({
44730
44912
  init_List();
44731
44913
  init_LoadingState();
44732
44914
  init_MarkdownContent();
44915
+ init_MarketingFooter();
44733
44916
  init_MasterDetail();
44734
44917
  init_MasterDetailLayout();
44735
44918
  init_MatrixQuestion();
@@ -44829,6 +45012,7 @@ var init_component_registry_generated = __esm({
44829
45012
  init_Table();
44830
45013
  init_Tabs();
44831
45014
  init_TagCloud();
45015
+ init_TagInput();
44832
45016
  init_TeamCard();
44833
45017
  init_TeamOrganism();
44834
45018
  init_TextHighlight();
@@ -45029,6 +45213,7 @@ var init_component_registry_generated = __esm({
45029
45213
  "MapView": MapViewPattern,
45030
45214
  "MapViewPattern": MapViewPattern,
45031
45215
  "MarkdownContent": exports.MarkdownContent,
45216
+ "MarketingFooter": exports.MarketingFooter,
45032
45217
  "MasterDetail": MasterDetail,
45033
45218
  "MasterDetailLayout": exports.MasterDetailLayout,
45034
45219
  "MatrixQuestion": exports.MatrixQuestion,
@@ -45144,6 +45329,7 @@ var init_component_registry_generated = __esm({
45144
45329
  "Table": exports.Table,
45145
45330
  "Tabs": exports.Tabs,
45146
45331
  "TagCloud": exports.TagCloud,
45332
+ "TagInput": exports.TagInput,
45147
45333
  "TeamCard": exports.TeamCard,
45148
45334
  "TeamOrganism": exports.TeamOrganism,
45149
45335
  "TextHighlight": exports.TextHighlight,
@@ -1724,7 +1724,7 @@ var init_Badge = __esm({
1724
1724
  lg: "px-3 py-1.5 text-base"
1725
1725
  };
1726
1726
  Badge = React78__default.forwardRef(
1727
- ({ className, variant = "default", size = "sm", amount, label, icon, children, ...props }, ref) => {
1727
+ ({ className, variant = "default", size = "sm", amount, label, icon, children, onRemove, removeLabel, ...props }, ref) => {
1728
1728
  const iconSizes3 = { sm: "w-3 h-3", md: "w-3.5 h-3.5", lg: "w-4 h-4" };
1729
1729
  const resolvedIcon = typeof icon === "string" ? (() => {
1730
1730
  const I = resolveIcon(icon);
@@ -1738,12 +1738,31 @@ var init_Badge = __esm({
1738
1738
  "inline-flex items-center gap-1 font-bold rounded-sm",
1739
1739
  variantStyles3[variant],
1740
1740
  sizeStyles2[size],
1741
+ onRemove && "pr-1",
1741
1742
  className
1742
1743
  ),
1743
1744
  ...props,
1744
1745
  children: [
1745
1746
  resolvedIcon,
1746
- children || (amount != null ? `${label ? `${label} ` : ""}${amount}` : label)
1747
+ children || (amount != null ? `${label ? `${label} ` : ""}${amount}` : label),
1748
+ onRemove ? /* @__PURE__ */ jsx(
1749
+ "button",
1750
+ {
1751
+ type: "button",
1752
+ "aria-label": removeLabel ?? "Remove",
1753
+ onClick: (e) => {
1754
+ e.stopPropagation();
1755
+ onRemove();
1756
+ },
1757
+ className: cn(
1758
+ "inline-flex items-center justify-center rounded-sm",
1759
+ "hover:bg-foreground/10 focus:outline-none focus:ring-1 focus:ring-ring",
1760
+ "transition-colors",
1761
+ size === "sm" ? "w-4 h-4 ml-0.5" : size === "md" ? "w-5 h-5 ml-1" : "w-6 h-6 ml-1"
1762
+ ),
1763
+ children: /* @__PURE__ */ jsx(X, { className: iconSizes3[size] })
1764
+ }
1765
+ ) : null
1747
1766
  ]
1748
1767
  }
1749
1768
  );
@@ -7824,7 +7843,7 @@ var init_MapView = __esm({
7824
7843
  shadowSize: [41, 41]
7825
7844
  });
7826
7845
  L.Marker.prototype.options.icon = defaultIcon;
7827
- const { useEffect: useEffect71, useRef: useRef66, useCallback: useCallback126, useState: useState108 } = React78__default;
7846
+ const { useEffect: useEffect71, useRef: useRef66, useCallback: useCallback127, useState: useState109 } = React78__default;
7828
7847
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
7829
7848
  const { useEventBus: useEventBus2 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
7830
7849
  function MapUpdater({ centerLat, centerLng, zoom }) {
@@ -7869,8 +7888,8 @@ var init_MapView = __esm({
7869
7888
  showAttribution = true
7870
7889
  }) {
7871
7890
  const eventBus = useEventBus2();
7872
- const [clickedPosition, setClickedPosition] = useState108(null);
7873
- const handleMapClick = useCallback126((lat, lng) => {
7891
+ const [clickedPosition, setClickedPosition] = useState109(null);
7892
+ const handleMapClick = useCallback127((lat, lng) => {
7874
7893
  if (showClickedPin) {
7875
7894
  setClickedPosition({ lat, lng });
7876
7895
  }
@@ -7879,7 +7898,7 @@ var init_MapView = __esm({
7879
7898
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
7880
7899
  }
7881
7900
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
7882
- const handleMarkerClick = useCallback126((marker) => {
7901
+ const handleMarkerClick = useCallback127((marker) => {
7883
7902
  onMarkerClick?.(marker);
7884
7903
  if (markerClickEvent) {
7885
7904
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -28698,6 +28717,98 @@ var init_TagCloud = __esm({
28698
28717
  TagCloud.displayName = "TagCloud";
28699
28718
  }
28700
28719
  });
28720
+ var TagInput;
28721
+ var init_TagInput = __esm({
28722
+ "components/molecules/TagInput.tsx"() {
28723
+ "use client";
28724
+ init_cn();
28725
+ init_useEventBus();
28726
+ init_Input();
28727
+ init_Badge();
28728
+ init_Stack();
28729
+ init_Typography();
28730
+ TagInput = ({
28731
+ value,
28732
+ onChange,
28733
+ placeholder,
28734
+ disabled = false,
28735
+ variant = "default",
28736
+ unique = true,
28737
+ helperText,
28738
+ className,
28739
+ addEvent,
28740
+ removeEvent
28741
+ }) => {
28742
+ const eventBus = useEventBus();
28743
+ const [draft, setDraft] = useState("");
28744
+ const commit = useCallback(() => {
28745
+ const tag = draft.trim();
28746
+ if (!tag) return;
28747
+ if (unique && value.includes(tag)) {
28748
+ setDraft("");
28749
+ return;
28750
+ }
28751
+ const next = [...value, tag];
28752
+ onChange?.(next);
28753
+ if (addEvent) {
28754
+ eventBus.emit(`UI:${addEvent}`, { tag, value: next });
28755
+ }
28756
+ setDraft("");
28757
+ }, [draft, value, onChange, unique, addEvent, eventBus]);
28758
+ const removeAt = useCallback(
28759
+ (index) => {
28760
+ if (disabled) return;
28761
+ const tag = value[index];
28762
+ const next = value.slice();
28763
+ next.splice(index, 1);
28764
+ onChange?.(next);
28765
+ if (removeEvent) {
28766
+ eventBus.emit(`UI:${removeEvent}`, { tag, index, value: next });
28767
+ }
28768
+ },
28769
+ [value, onChange, disabled, removeEvent, eventBus]
28770
+ );
28771
+ const handleKeyDown = useCallback(
28772
+ (e) => {
28773
+ if (disabled) return;
28774
+ if (e.key === "Enter") {
28775
+ e.preventDefault();
28776
+ commit();
28777
+ } else if (e.key === "Backspace" && draft.length === 0 && value.length > 0) {
28778
+ e.preventDefault();
28779
+ removeAt(value.length - 1);
28780
+ }
28781
+ },
28782
+ [commit, draft.length, value, removeAt, disabled]
28783
+ );
28784
+ return /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: cn("w-full", className), children: [
28785
+ value.length > 0 ? /* @__PURE__ */ jsx(HStack, { gap: "xs", className: "flex-wrap", children: value.map((tag, index) => /* @__PURE__ */ jsx(
28786
+ Badge,
28787
+ {
28788
+ variant,
28789
+ size: "sm",
28790
+ onRemove: disabled ? void 0 : () => removeAt(index),
28791
+ removeLabel: `Remove ${tag}`,
28792
+ children: tag
28793
+ },
28794
+ `${tag}-${index}`
28795
+ )) }) : null,
28796
+ /* @__PURE__ */ jsx(
28797
+ Input,
28798
+ {
28799
+ value: draft,
28800
+ placeholder: placeholder ?? "Type and press Enter\u2026",
28801
+ disabled,
28802
+ onChange: (e) => setDraft(e.target.value),
28803
+ onKeyDown: handleKeyDown
28804
+ }
28805
+ ),
28806
+ helperText ? /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: helperText }) : null
28807
+ ] });
28808
+ };
28809
+ TagInput.displayName = "TagInput";
28810
+ }
28811
+ });
28701
28812
  var ShowcaseCard;
28702
28813
  var init_ShowcaseCard = __esm({
28703
28814
  "components/molecules/ShowcaseCard.tsx"() {
@@ -32316,6 +32427,75 @@ var init_GradientDivider = __esm({
32316
32427
  GradientDivider.displayName = "GradientDivider";
32317
32428
  }
32318
32429
  });
32430
+ var MarketingFooter;
32431
+ var init_MarketingFooter = __esm({
32432
+ "components/molecules/MarketingFooter.tsx"() {
32433
+ "use client";
32434
+ init_cn();
32435
+ init_Box();
32436
+ init_Stack();
32437
+ init_Typography();
32438
+ MarketingFooter = ({
32439
+ columns,
32440
+ copyright,
32441
+ logo,
32442
+ className
32443
+ }) => {
32444
+ return /* @__PURE__ */ jsx(
32445
+ Box,
32446
+ {
32447
+ as: "footer",
32448
+ className: cn(
32449
+ "bg-surface",
32450
+ "border-t border-border",
32451
+ "pt-12 pb-8 px-4",
32452
+ className
32453
+ ),
32454
+ children: /* @__PURE__ */ jsxs(VStack, { gap: "lg", className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
32455
+ /* @__PURE__ */ jsxs(HStack, { gap: "lg", align: "start", className: "flex-wrap w-full justify-between", children: [
32456
+ logo && /* @__PURE__ */ jsx(VStack, { gap: "sm", className: "min-w-[140px] mb-4", children: logo.href ? /* @__PURE__ */ jsx("a", { href: logo.href, children: /* @__PURE__ */ jsx("img", { src: logo.src, alt: logo.alt, className: "h-8 w-auto" }) }) : /* @__PURE__ */ jsx("img", { src: logo.src, alt: logo.alt, className: "h-8 w-auto" }) }),
32457
+ columns.map((col) => /* @__PURE__ */ jsxs(VStack, { gap: "sm", className: "min-w-[140px] mb-4", children: [
32458
+ /* @__PURE__ */ jsx(
32459
+ Typography,
32460
+ {
32461
+ variant: "body2",
32462
+ className: "font-semibold text-foreground mb-1",
32463
+ children: col.title
32464
+ }
32465
+ ),
32466
+ col.items.map((item) => /* @__PURE__ */ jsx(
32467
+ "a",
32468
+ {
32469
+ href: item.href,
32470
+ className: cn(
32471
+ "text-sm no-underline",
32472
+ "text-foreground/60",
32473
+ "hover:text-accent",
32474
+ "transition-colors duration-150"
32475
+ ),
32476
+ target: item.href.startsWith("http") ? "_blank" : void 0,
32477
+ rel: item.href.startsWith("http") ? "noopener noreferrer" : void 0,
32478
+ children: item.label
32479
+ },
32480
+ item.label
32481
+ ))
32482
+ ] }, col.title))
32483
+ ] }),
32484
+ copyright && /* @__PURE__ */ jsx(
32485
+ Typography,
32486
+ {
32487
+ variant: "caption",
32488
+ className: "text-foreground/30 text-center w-full pt-6",
32489
+ children: copyright
32490
+ }
32491
+ )
32492
+ ] })
32493
+ }
32494
+ );
32495
+ };
32496
+ MarketingFooter.displayName = "MarketingFooter";
32497
+ }
32498
+ });
32319
32499
  var PullQuote;
32320
32500
  var init_PullQuote = __esm({
32321
32501
  "components/molecules/PullQuote.tsx"() {
@@ -32833,6 +33013,7 @@ var init_molecules = __esm({
32833
33013
  init_StepFlow();
32834
33014
  init_SplitSection();
32835
33015
  init_TagCloud();
33016
+ init_TagInput();
32836
33017
  init_CommunityLinks();
32837
33018
  init_TeamCard();
32838
33019
  init_ShowcaseCard();
@@ -32855,6 +33036,7 @@ var init_molecules = __esm({
32855
33036
  init_DocSidebar();
32856
33037
  init_DocTOC();
32857
33038
  init_GradientDivider();
33039
+ init_MarketingFooter();
32858
33040
  init_PullQuote();
32859
33041
  init_BehaviorView();
32860
33042
  init_ModuleCard();
@@ -44684,6 +44866,7 @@ var init_component_registry_generated = __esm({
44684
44866
  init_List();
44685
44867
  init_LoadingState();
44686
44868
  init_MarkdownContent();
44869
+ init_MarketingFooter();
44687
44870
  init_MasterDetail();
44688
44871
  init_MasterDetailLayout();
44689
44872
  init_MatrixQuestion();
@@ -44783,6 +44966,7 @@ var init_component_registry_generated = __esm({
44783
44966
  init_Table();
44784
44967
  init_Tabs();
44785
44968
  init_TagCloud();
44969
+ init_TagInput();
44786
44970
  init_TeamCard();
44787
44971
  init_TeamOrganism();
44788
44972
  init_TextHighlight();
@@ -44983,6 +45167,7 @@ var init_component_registry_generated = __esm({
44983
45167
  "MapView": MapViewPattern,
44984
45168
  "MapViewPattern": MapViewPattern,
44985
45169
  "MarkdownContent": MarkdownContent,
45170
+ "MarketingFooter": MarketingFooter,
44986
45171
  "MasterDetail": MasterDetail,
44987
45172
  "MasterDetailLayout": MasterDetailLayout,
44988
45173
  "MatrixQuestion": MatrixQuestion,
@@ -45098,6 +45283,7 @@ var init_component_registry_generated = __esm({
45098
45283
  "Table": Table,
45099
45284
  "Tabs": Tabs,
45100
45285
  "TagCloud": TagCloud,
45286
+ "TagInput": TagInput,
45101
45287
  "TeamCard": TeamCard,
45102
45288
  "TeamOrganism": TeamOrganism,
45103
45289
  "TextHighlight": TextHighlight,
@@ -49006,4 +49192,4 @@ function useGitHubBranches(owner, repo, enabled = true) {
49006
49192
  });
49007
49193
  }
49008
49194
 
49009
- export { ALL_PRESETS, ALMADAR_DND_MIME, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, ActionButton, ActionButtons, Card2 as ActionCard, ActionPalette, ActionTile, Alert, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AuthLayout, Avatar, Badge, BattleBoard, BattleTemplate, BehaviorView, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, BuilderBoard, Button, ButtonGroup, CTABanner, CalendarGrid, CanvasEffect, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, CastleBoard, CastleTemplate, Center, Chart, ChartLegend, Checkbox, ChoiceButton, ClassifierBoard, CodeBlock, CodeExample, CodeView, CodeViewer, CollapsibleSection, CombatLog, ComboCounter, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, Container, ContentRenderer, ContentSection, ControlButton, CounterTemplate, CraftingRecipe, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DEFAULT_SLOTS, DIAMOND_TOP_Y, DPad, DamageNumber, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DebuggerBoard, DetailPanel, Dialog, DialogueBox, DialogueBubble, Divider, DocBreadcrumb, DocCodeBlock, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EnemyPlate, EntityDisplayEvents, ErrorBoundary, ErrorState, EventHandlerBoard, EventLog, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FeatureRenderer2 as FeatureRenderer, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioContext, GameAudioProvider, GameAudioToggle, GameCanvas2D, GameHud, GameMenu, GameOverScreen, GameShell, GameTemplate, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, HStack, Header, Heading, HealthBar, HealthPanel, HeroOrganism, HeroSection, I18nProvider, IDENTITY_BOOK_FIELDS, Icon, InfiniteScrollSentinel, Input, InputGroup, InstallBox, InventoryGrid, InventoryPanel, IsometricCanvas, ItemSlot, JazariStateMachine, Label, LandingPageTemplate, LawReferenceTooltip, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingStatCard, MasterDetail, MasterDetailLayout, MatrixQuestion, MediaGallery, Menu, Meter, MiniMap, Modal, ModalSlot, ModuleCard, Navigation, NegotiatorBoard, NotifyListener, NumberStepper, ObjectRulePanel, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, Pagination, PatternTile, PhysicsManager, PlatformerCanvas, Popover, PositionedCanvas, PowerupSlots, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PullQuote, PullToRefresh, QrScanner, QuestTracker, QuizBlock, Radio, RangeSlider, RelationSelect, RepeatableFormSection, ReplyTree, ResourceBar, ResourceCounter, RichBlockEditor, RuleEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreBoard, ScoreDisplay, SearchInput, Section, SectionHeader, Select, SequenceBar, SequencerBoard, ServiceCatalog, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, SimulationCanvas, SimulationControls, SimulationGraph, SimulatorBoard, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Sprite, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateArchitectBoard, StateIndicator, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StatusEffect, StepFlow, StepFlowOrganism, SvgBranch, SvgConnection, SvgFlow, SvgGrid, SvgLobe, SvgMesh, SvgMorph, SvgNode, SvgPulse, SvgRing, SvgShield, SvgStack, SwipeableRow, Switch, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, Table, Tabs, TagCloud, TeamCard, TeamOrganism, TerrainPalette, Text, TextHighlight, Textarea, ThemeSelector, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TurnIndicator, TurnPanel, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UncontrolledBattleBoard, UnitCommandBar, UploadDropZone, VStack, VariablePanel, VersionDiff, ViolationAlert, VoteStack, WaypointMarker, WizardContainer, WizardNavigation, WizardProgress, WorldMapBoard, WorldMapTemplate, XPBar, applyTemporaryEffect, calculateAttackTargets, calculateDamage, calculateValidMoves, clearEntities, cn, combatAnimations, combatClasses, combatEffects, createInitialGameState, createTranslate, createUnitAnimationState, drawSprite, generateCombatMessage, getAllEntities, getByType, getCurrentFrame, getEntity, getSingleton, getTileDimensions, inferDirection, isoToScreen, mapBookData, parseQueryBinding, pendulum, projectileMotion, removeEntity, resolveFieldMap, resolveFrame, resolveSheetDirection, screenToIso, spawnEntity, springOscillator, tickAnimationState, transitionAnimation, updateEntity, updateSingleton, useAgentChat, useAuthContext, useBattleState, useCamera, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useEmitEvent, useEntities, useEntitiesByType, useEntity as useEntityById, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useGameAudio, useGameAudioContext, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useImageCache, useInfiniteScroll, useInput, useLongPress, useOrbitalHistory, usePhysics, usePhysics2D, usePinchZoom, usePlayer, usePreview, usePullToRefresh, useQuerySingleton, useSingletonEntity, useSpriteAnimations, useSwipeGesture, useTraitListens, useTranslate, useUIEvents, useUISlotManager, useValidation };
49195
+ export { ALL_PRESETS, ALMADAR_DND_MIME, AR_BOOK_FIELDS, AboutPageTemplate, Accordion, ActionButton, ActionButtons, Card2 as ActionCard, ActionPalette, ActionTile, Alert, AnimatedCounter, AnimatedGraphic, AnimatedReveal, ArticleSection, Aside, AuthLayout, Avatar, Badge, BattleBoard, BattleTemplate, BehaviorView, BookChapterView, BookCoverPage, BookNavBar, BookTableOfContents, BookViewer, Box, BranchingLogicBuilder, Breadcrumb, BuilderBoard, Button, ButtonGroup, CTABanner, CalendarGrid, CanvasEffect, Card, CardBody, CardContent, CardFooter, CardGrid, CardHeader, CardTitle, Carousel, CaseStudyCard, CaseStudyOrganism, CastleBoard, CastleTemplate, Center, Chart, ChartLegend, Checkbox, ChoiceButton, ClassifierBoard, CodeBlock, CodeExample, CodeView, CodeViewer, CollapsibleSection, CombatLog, ComboCounter, CommunityLinks, ConditionalWrapper, ConfettiEffect, ConfirmDialog, Container, ContentRenderer, ContentSection, ControlButton, CounterTemplate, CraftingRecipe, DEFAULT_LIKERT_OPTIONS, DEFAULT_MATRIX_COLUMNS, DEFAULT_SLOTS, DIAMOND_TOP_Y, DPad, DamageNumber, DashboardGrid, DashboardLayout, DataGrid, DataList, DataTable, DateRangePicker, DateRangeSelector, DayCell, DebuggerBoard, DetailPanel, Dialog, DialogueBox, DialogueBubble, Divider, DocBreadcrumb, DocCodeBlock, DocPagination, DocSearch, DocSidebar, DocTOC, DocumentViewer, StateMachineView as DomStateMachineVisualizer, Drawer, DrawerSlot, EdgeDecoration, EditorCheckbox, EditorSelect, EditorSlider, EditorTextInput, EditorToolbar, EmptyState, EnemyPlate, EntityDisplayEvents, ErrorBoundary, ErrorState, EventHandlerBoard, EventLog, FEATURE_COLORS, FEATURE_TYPES, FLOOR_HEIGHT, FeatureCard, FeatureDetailPageTemplate, FeatureGrid, FeatureGridOrganism, FeatureRenderer2 as FeatureRenderer, FileTree, FilterGroup, FilterPill, Flex, FlipCard, FlipContainer, FloatingActionButton, Form, FormActions, FormField, FormLayout, FormSection, FormSectionHeader, GameAudioContext, GameAudioProvider, GameAudioToggle, GameCanvas2D, GameHud, GameMenu, GameOverScreen, GameShell, GameTemplate, GenericAppTemplate, GeometricPattern, GradientDivider, GraphCanvas, GraphView, Grid, HStack, Header, Heading, HealthBar, HealthPanel, HeroOrganism, HeroSection, I18nProvider, IDENTITY_BOOK_FIELDS, Icon, InfiniteScrollSentinel, Input, InputGroup, InstallBox, InventoryGrid, InventoryPanel, IsometricCanvas, ItemSlot, JazariStateMachine, Label, LandingPageTemplate, LawReferenceTooltip, Lightbox, LikertScale, LineChart2 as LineChart, List3 as List, LoadingState, MapView, MarkdownContent, MarketingFooter, MarketingStatCard, MasterDetail, MasterDetailLayout, MatrixQuestion, MediaGallery, Menu, Meter, MiniMap, Modal, ModalSlot, ModuleCard, Navigation, NegotiatorBoard, NotifyListener, NumberStepper, ObjectRulePanel, OptionConstraintGroup, StateMachineView as OrbitalStateMachineView, OrbitalVisualization, Overlay, PageHeader, Pagination, PatternTile, PhysicsManager, PlatformerCanvas, Popover, PositionedCanvas, PowerupSlots, PricingCard, PricingGrid, PricingOrganism, PricingPageTemplate, ProgressBar, ProgressDots, PullQuote, PullToRefresh, QrScanner, QuestTracker, QuizBlock, Radio, RangeSlider, RelationSelect, RepeatableFormSection, ReplyTree, ResourceBar, ResourceCounter, RichBlockEditor, RuleEditor, RuntimeDebugger, SHEET_COLUMNS, SPRITE_SHEET_LAYOUT, ScaledDiagram, ScoreBoard, ScoreDisplay, SearchInput, Section, SectionHeader, Select, SequenceBar, SequencerBoard, ServiceCatalog, ShowcaseCard, ShowcaseOrganism, SidePanel, Sidebar, SignaturePad, SimpleGrid, SimulationCanvas, SimulationControls, SimulationGraph, SimulatorBoard, Skeleton, SlotContentRenderer, SocialProof, SortableList, Spacer, Sparkline, Spinner, Split, SplitPane, SplitSection, Sprite, Stack, StarRating, StatBadge, StatCard, StatDisplay, StateArchitectBoard, StateIndicator, StateMachineView, StateNode2 as StateNode, StatsGrid, StatsOrganism, StatusBar, StatusDot, StatusEffect, StepFlow, StepFlowOrganism, SvgBranch, SvgConnection, SvgFlow, SvgGrid, SvgLobe, SvgMesh, SvgMorph, SvgNode, SvgPulse, SvgRing, SvgShield, SvgStack, SwipeableRow, Switch, TERRAIN_COLORS, TILE_HEIGHT, TILE_WIDTH, TabbedContainer, Table, Tabs, TagCloud, TagInput, TeamCard, TeamOrganism, TerrainPalette, Text, TextHighlight, Textarea, ThemeSelector, ThemeToggle, TimeSlotCell, Timeline, TimerDisplay, Toast, ToastSlot, Tooltip, TraitFrame, TraitSlot, TraitStateViewer, TransitionArrow, TrendIndicator, TurnIndicator, TurnPanel, TypewriterText, Typography, UISlotComponent, UISlotRenderer, UncontrolledBattleBoard, UnitCommandBar, UploadDropZone, VStack, VariablePanel, VersionDiff, ViolationAlert, VoteStack, WaypointMarker, WizardContainer, WizardNavigation, WizardProgress, WorldMapBoard, WorldMapTemplate, XPBar, applyTemporaryEffect, calculateAttackTargets, calculateDamage, calculateValidMoves, clearEntities, cn, combatAnimations, combatClasses, combatEffects, createInitialGameState, createTranslate, createUnitAnimationState, drawSprite, generateCombatMessage, getAllEntities, getByType, getCurrentFrame, getEntity, getSingleton, getTileDimensions, inferDirection, isoToScreen, mapBookData, parseQueryBinding, pendulum, projectileMotion, removeEntity, resolveFieldMap, resolveFrame, resolveSheetDirection, screenToIso, spawnEntity, springOscillator, tickAnimationState, transitionAnimation, updateEntity, updateSingleton, useAgentChat, useAuthContext, useBattleState, useCamera, useCompile, useConnectGitHub, useDeepAgentGeneration, useDisconnectGitHub, useDragReorder, useDraggable, useDropZone, useEmitEvent, useEntities, useEntitiesByType, useEntity as useEntityById, useEventBus, useEventListener, useExtensions, useFileEditor, useFileSystem, useGameAudio, useGameAudioContext, useGitHubBranches, useGitHubRepo, useGitHubRepos, useGitHubStatus, useImageCache, useInfiniteScroll, useInput, useLongPress, useOrbitalHistory, usePhysics, usePhysics2D, usePinchZoom, usePlayer, usePreview, usePullToRefresh, useQuerySingleton, useSingletonEntity, useSpriteAnimations, useSwipeGesture, useTraitListens, useTranslate, useUIEvents, useUISlotManager, useValidation };
@@ -0,0 +1,52 @@
1
+ /**
2
+ * TagInput Molecule Component
3
+ *
4
+ * Free-form chip editor for `string[]` values. The user types into an
5
+ * `Input` and presses Enter to commit; each committed value renders as
6
+ * a removable `Badge` (`onRemove` X-chip). Backspace on an empty input
7
+ * deletes the most recently added chip. Optional `unique` flag
8
+ * (default true) suppresses duplicate entries.
9
+ *
10
+ * **Atomic Design**: Composed using `Input`, `Badge`, `Typography`,
11
+ * `HStack`, `VStack` atoms — no raw HTML. Generic primitive; no entity
12
+ * binding.
13
+ *
14
+ * Event contract (mirrors DataList / FilterGroup):
15
+ * - Emits `UI:{addEvent}` with `{ tag, value }` when a chip is added.
16
+ * - Emits `UI:{removeEvent}` with `{ tag, index, value }` when a chip
17
+ * is removed.
18
+ * - `onChange` callback stays as the direct / Storybook contract.
19
+ *
20
+ * Used by the studio Questionnaire for the `tagList` input type
21
+ * (`[string]` config knobs without `enumValues`).
22
+ */
23
+ import React from 'react';
24
+ import type { EventKey } from '@almadar/core';
25
+ import { type BadgeVariant } from '../atoms/Badge';
26
+ export interface TagInputProps {
27
+ /** Current list of tags. */
28
+ value: ReadonlyArray<string>;
29
+ /** Direct callback emitted on every change. Stays as the
30
+ * Storybook / non-trait contract; trait-driven schemas should prefer
31
+ * the bus events below. */
32
+ onChange?: (next: ReadonlyArray<string>) => void;
33
+ /** Placeholder for the entry input. Default: `"Type and press Enter…"`. */
34
+ placeholder?: string;
35
+ /** Disable add + remove interactions. */
36
+ disabled?: boolean;
37
+ /** Variant applied to each chip Badge. Default: `'default'`. */
38
+ variant?: BadgeVariant;
39
+ /** Suppress duplicate entries. Default: `true`. */
40
+ unique?: boolean;
41
+ /** Helper text rendered under the input. */
42
+ helperText?: string;
43
+ /** Additional CSS classes applied to the outer container. */
44
+ className?: string;
45
+ /** Event emitted when a tag is added: `UI:{addEvent}` with payload
46
+ * `{ tag: string, value: string[] }`. */
47
+ addEvent?: EventKey;
48
+ /** Event emitted when a tag is removed: `UI:{removeEvent}` with
49
+ * payload `{ tag: string, index: number, value: string[] }`. */
50
+ removeEvent?: EventKey;
51
+ }
52
+ export declare const TagInput: React.FC<TagInputProps>;
@@ -75,6 +75,7 @@ export { SocialProof, type SocialProofProps, type SocialProofItem } from './Soci
75
75
  export { StepFlow, type StepFlowProps, type StepItemProps } from './StepFlow';
76
76
  export { SplitSection, type SplitSectionProps } from './SplitSection';
77
77
  export { TagCloud, type TagCloudProps, type TagCloudItem } from './TagCloud';
78
+ export { TagInput, type TagInputProps } from './TagInput';
78
79
  export { CommunityLinks, type CommunityLinksProps } from './CommunityLinks';
79
80
  export { TeamCard, type TeamCardProps } from './TeamCard';
80
81
  export { ShowcaseCard, type ShowcaseCardProps } from './ShowcaseCard';
@@ -97,6 +98,7 @@ export { DocSearch, type DocSearchProps, type DocSearchResult } from './DocSearc
97
98
  export { DocSidebar, type DocSidebarProps, type DocSidebarItem } from './DocSidebar';
98
99
  export { DocTOC, type DocTOCProps, type DocTOCItem } from './DocTOC';
99
100
  export { GradientDivider, type GradientDividerProps } from './GradientDivider';
101
+ export { MarketingFooter, type MarketingFooterProps, type FooterLinkColumn, type FooterLinkItem } from './MarketingFooter';
100
102
  export { PullQuote, type PullQuoteProps } from './PullQuote';
101
103
  export { BehaviorView, type BehaviorViewProps } from './avl/BehaviorView';
102
104
  export { ModuleCard, type ModuleCardProps } from './avl/ModuleCard';