@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.
@@ -6432,7 +6432,7 @@ var init_Badge = __esm({
6432
6432
  lg: "px-3 py-1.5 text-base"
6433
6433
  };
6434
6434
  Badge = React96__namespace.default.forwardRef(
6435
- ({ className, variant = "default", size = "sm", amount, label, icon, children, ...props }, ref) => {
6435
+ ({ className, variant = "default", size = "sm", amount, label, icon, children, onRemove, removeLabel, ...props }, ref) => {
6436
6436
  const iconSizes3 = { sm: "w-3 h-3", md: "w-3.5 h-3.5", lg: "w-4 h-4" };
6437
6437
  const resolvedIcon = typeof icon === "string" ? (() => {
6438
6438
  const I = resolveIcon(icon);
@@ -6446,12 +6446,31 @@ var init_Badge = __esm({
6446
6446
  "inline-flex items-center gap-1 font-bold rounded-sm",
6447
6447
  variantStyles3[variant],
6448
6448
  sizeStyles3[size],
6449
+ onRemove && "pr-1",
6449
6450
  className
6450
6451
  ),
6451
6452
  ...props,
6452
6453
  children: [
6453
6454
  resolvedIcon,
6454
- children || (amount != null ? `${label ? `${label} ` : ""}${amount}` : label)
6455
+ children || (amount != null ? `${label ? `${label} ` : ""}${amount}` : label),
6456
+ onRemove ? /* @__PURE__ */ jsxRuntime.jsx(
6457
+ "button",
6458
+ {
6459
+ type: "button",
6460
+ "aria-label": removeLabel ?? "Remove",
6461
+ onClick: (e) => {
6462
+ e.stopPropagation();
6463
+ onRemove();
6464
+ },
6465
+ className: cn(
6466
+ "inline-flex items-center justify-center rounded-sm",
6467
+ "hover:bg-foreground/10 focus:outline-none focus:ring-1 focus:ring-ring",
6468
+ "transition-colors",
6469
+ size === "sm" ? "w-4 h-4 ml-0.5" : size === "md" ? "w-5 h-5 ml-1" : "w-6 h-6 ml-1"
6470
+ ),
6471
+ children: /* @__PURE__ */ jsxRuntime.jsx(LucideIcons.X, { className: iconSizes3[size] })
6472
+ }
6473
+ ) : null
6455
6474
  ]
6456
6475
  }
6457
6476
  );
@@ -13813,7 +13832,7 @@ var init_MapView = __esm({
13813
13832
  shadowSize: [41, 41]
13814
13833
  });
13815
13834
  L.Marker.prototype.options.icon = defaultIcon;
13816
- const { useEffect: useEffect88, useRef: useRef88, useCallback: useCallback128, useState: useState122 } = React96__namespace.default;
13835
+ const { useEffect: useEffect88, useRef: useRef88, useCallback: useCallback129, useState: useState123 } = React96__namespace.default;
13817
13836
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
13818
13837
  const { useEventBus: useEventBus3 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
13819
13838
  function MapUpdater({ centerLat, centerLng, zoom }) {
@@ -13858,8 +13877,8 @@ var init_MapView = __esm({
13858
13877
  showAttribution = true
13859
13878
  }) {
13860
13879
  const eventBus = useEventBus3();
13861
- const [clickedPosition, setClickedPosition] = useState122(null);
13862
- const handleMapClick = useCallback128((lat, lng) => {
13880
+ const [clickedPosition, setClickedPosition] = useState123(null);
13881
+ const handleMapClick = useCallback129((lat, lng) => {
13863
13882
  if (showClickedPin) {
13864
13883
  setClickedPosition({ lat, lng });
13865
13884
  }
@@ -13868,7 +13887,7 @@ var init_MapView = __esm({
13868
13887
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
13869
13888
  }
13870
13889
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
13871
- const handleMarkerClick = useCallback128((marker) => {
13890
+ const handleMarkerClick = useCallback129((marker) => {
13872
13891
  onMarkerClick?.(marker);
13873
13892
  if (markerClickEvent) {
13874
13893
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -33285,6 +33304,98 @@ var init_TagCloud = __esm({
33285
33304
  TagCloud.displayName = "TagCloud";
33286
33305
  }
33287
33306
  });
33307
+ var TagInput;
33308
+ var init_TagInput = __esm({
33309
+ "components/molecules/TagInput.tsx"() {
33310
+ "use client";
33311
+ init_cn();
33312
+ init_useEventBus();
33313
+ init_Input();
33314
+ init_Badge();
33315
+ init_Stack();
33316
+ init_Typography();
33317
+ TagInput = ({
33318
+ value,
33319
+ onChange,
33320
+ placeholder,
33321
+ disabled = false,
33322
+ variant = "default",
33323
+ unique = true,
33324
+ helperText,
33325
+ className,
33326
+ addEvent,
33327
+ removeEvent
33328
+ }) => {
33329
+ const eventBus = useEventBus();
33330
+ const [draft, setDraft] = React96.useState("");
33331
+ const commit = React96.useCallback(() => {
33332
+ const tag = draft.trim();
33333
+ if (!tag) return;
33334
+ if (unique && value.includes(tag)) {
33335
+ setDraft("");
33336
+ return;
33337
+ }
33338
+ const next = [...value, tag];
33339
+ onChange?.(next);
33340
+ if (addEvent) {
33341
+ eventBus.emit(`UI:${addEvent}`, { tag, value: next });
33342
+ }
33343
+ setDraft("");
33344
+ }, [draft, value, onChange, unique, addEvent, eventBus]);
33345
+ const removeAt = React96.useCallback(
33346
+ (index) => {
33347
+ if (disabled) return;
33348
+ const tag = value[index];
33349
+ const next = value.slice();
33350
+ next.splice(index, 1);
33351
+ onChange?.(next);
33352
+ if (removeEvent) {
33353
+ eventBus.emit(`UI:${removeEvent}`, { tag, index, value: next });
33354
+ }
33355
+ },
33356
+ [value, onChange, disabled, removeEvent, eventBus]
33357
+ );
33358
+ const handleKeyDown = React96.useCallback(
33359
+ (e) => {
33360
+ if (disabled) return;
33361
+ if (e.key === "Enter") {
33362
+ e.preventDefault();
33363
+ commit();
33364
+ } else if (e.key === "Backspace" && draft.length === 0 && value.length > 0) {
33365
+ e.preventDefault();
33366
+ removeAt(value.length - 1);
33367
+ }
33368
+ },
33369
+ [commit, draft.length, value, removeAt, disabled]
33370
+ );
33371
+ return /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: cn("w-full", className), children: [
33372
+ value.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "xs", className: "flex-wrap", children: value.map((tag, index) => /* @__PURE__ */ jsxRuntime.jsx(
33373
+ Badge,
33374
+ {
33375
+ variant,
33376
+ size: "sm",
33377
+ onRemove: disabled ? void 0 : () => removeAt(index),
33378
+ removeLabel: `Remove ${tag}`,
33379
+ children: tag
33380
+ },
33381
+ `${tag}-${index}`
33382
+ )) }) : null,
33383
+ /* @__PURE__ */ jsxRuntime.jsx(
33384
+ Input,
33385
+ {
33386
+ value: draft,
33387
+ placeholder: placeholder ?? "Type and press Enter\u2026",
33388
+ disabled,
33389
+ onChange: (e) => setDraft(e.target.value),
33390
+ onKeyDown: handleKeyDown
33391
+ }
33392
+ ),
33393
+ helperText ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: helperText }) : null
33394
+ ] });
33395
+ };
33396
+ TagInput.displayName = "TagInput";
33397
+ }
33398
+ });
33288
33399
  var ShowcaseCard;
33289
33400
  var init_ShowcaseCard = __esm({
33290
33401
  "components/molecules/ShowcaseCard.tsx"() {
@@ -36903,6 +37014,75 @@ var init_GradientDivider = __esm({
36903
37014
  GradientDivider.displayName = "GradientDivider";
36904
37015
  }
36905
37016
  });
37017
+ var MarketingFooter;
37018
+ var init_MarketingFooter = __esm({
37019
+ "components/molecules/MarketingFooter.tsx"() {
37020
+ "use client";
37021
+ init_cn();
37022
+ init_Box();
37023
+ init_Stack();
37024
+ init_Typography();
37025
+ MarketingFooter = ({
37026
+ columns,
37027
+ copyright,
37028
+ logo,
37029
+ className
37030
+ }) => {
37031
+ return /* @__PURE__ */ jsxRuntime.jsx(
37032
+ Box,
37033
+ {
37034
+ as: "footer",
37035
+ className: cn(
37036
+ "bg-surface",
37037
+ "border-t border-border",
37038
+ "pt-12 pb-8 px-4",
37039
+ className
37040
+ ),
37041
+ children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "lg", className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
37042
+ /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "lg", align: "start", className: "flex-wrap w-full justify-between", children: [
37043
+ logo && /* @__PURE__ */ jsxRuntime.jsx(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" }) }),
37044
+ columns.map((col) => /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "sm", className: "min-w-[140px] mb-4", children: [
37045
+ /* @__PURE__ */ jsxRuntime.jsx(
37046
+ Typography,
37047
+ {
37048
+ variant: "body2",
37049
+ className: "font-semibold text-foreground mb-1",
37050
+ children: col.title
37051
+ }
37052
+ ),
37053
+ col.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
37054
+ "a",
37055
+ {
37056
+ href: item.href,
37057
+ className: cn(
37058
+ "text-sm no-underline",
37059
+ "text-foreground/60",
37060
+ "hover:text-accent",
37061
+ "transition-colors duration-150"
37062
+ ),
37063
+ target: item.href.startsWith("http") ? "_blank" : void 0,
37064
+ rel: item.href.startsWith("http") ? "noopener noreferrer" : void 0,
37065
+ children: item.label
37066
+ },
37067
+ item.label
37068
+ ))
37069
+ ] }, col.title))
37070
+ ] }),
37071
+ copyright && /* @__PURE__ */ jsxRuntime.jsx(
37072
+ Typography,
37073
+ {
37074
+ variant: "caption",
37075
+ className: "text-foreground/30 text-center w-full pt-6",
37076
+ children: copyright
37077
+ }
37078
+ )
37079
+ ] })
37080
+ }
37081
+ );
37082
+ };
37083
+ MarketingFooter.displayName = "MarketingFooter";
37084
+ }
37085
+ });
36906
37086
  var PullQuote;
36907
37087
  var init_PullQuote = __esm({
36908
37088
  "components/molecules/PullQuote.tsx"() {
@@ -53744,6 +53924,7 @@ var init_component_registry_generated = __esm({
53744
53924
  init_List();
53745
53925
  init_LoadingState();
53746
53926
  init_MarkdownContent();
53927
+ init_MarketingFooter();
53747
53928
  init_MasterDetail();
53748
53929
  init_MasterDetailLayout();
53749
53930
  init_MatrixQuestion();
@@ -53843,6 +54024,7 @@ var init_component_registry_generated = __esm({
53843
54024
  init_Table();
53844
54025
  init_Tabs();
53845
54026
  init_TagCloud();
54027
+ init_TagInput();
53846
54028
  init_TeamCard();
53847
54029
  init_TeamOrganism();
53848
54030
  init_TextHighlight();
@@ -54043,6 +54225,7 @@ var init_component_registry_generated = __esm({
54043
54225
  "MapView": MapViewPattern,
54044
54226
  "MapViewPattern": MapViewPattern,
54045
54227
  "MarkdownContent": MarkdownContent,
54228
+ "MarketingFooter": MarketingFooter,
54046
54229
  "MasterDetail": MasterDetail,
54047
54230
  "MasterDetailLayout": MasterDetailLayout,
54048
54231
  "MatrixQuestion": MatrixQuestion,
@@ -54158,6 +54341,7 @@ var init_component_registry_generated = __esm({
54158
54341
  "Table": Table,
54159
54342
  "Tabs": Tabs,
54160
54343
  "TagCloud": TagCloud,
54344
+ "TagInput": TagInput,
54161
54345
  "TeamCard": TeamCard,
54162
54346
  "TeamOrganism": TeamOrganism,
54163
54347
  "TextHighlight": TextHighlight,
package/dist/avl/index.js CHANGED
@@ -6,7 +6,7 @@ import { createLogger, isLogLevelEnabled } from '@almadar/logger';
6
6
  import ELK from 'elkjs/lib/elk.bundled.js';
7
7
  import { MarkerType, Handle, Position, getBezierPath, EdgeLabelRenderer, BaseEdge, ReactFlowProvider, useNodesState, useEdgesState, useReactFlow, ReactFlow, Controls, Background, BackgroundVariant } from '@xyflow/react';
8
8
  import * as LucideIcons from 'lucide-react';
9
- import { Loader2, ChevronDown, X, Check, Copy, AlertTriangle, Info, AlertCircle, CheckCircle, List, Printer, ChevronRight, ChevronLeft, GitBranch, Pencil, Eye, Plus, ArrowRight, Trash, Code, FileText, WrapText, Trash2, Menu as Menu$1, Search, Bell, LogOut, ZoomOut, ZoomIn, Download, FileQuestion, Inbox, XCircle, Filter, Pause, Play, RotateCcw, Package, Calendar, MoreHorizontal, Image as Image$1, Upload, Minus, ArrowLeft, Camera, RefreshCw, HelpCircle, ChevronUp, MessageSquare, Flag, Type, Heading1, Heading2, Heading3, ListOrdered, Quote, Eraser, Star, TrendingUp, TrendingDown, ArrowUp, ArrowDown, MoreVertical, Sun, Moon, Circle, Clock, CheckCircle2, FileWarning, GitCommit, AlignLeft, Columns, SkipForward, Bug, Send, Wrench, User, Tag, DollarSign, Coffee, Users, Zap, Sword, Move, Heart, Shield } from 'lucide-react';
9
+ import { Loader2, X, ChevronDown, Check, Copy, AlertTriangle, Info, AlertCircle, CheckCircle, List, Printer, ChevronRight, ChevronLeft, GitBranch, Pencil, Eye, Plus, ArrowRight, Trash, Code, FileText, WrapText, Trash2, Menu as Menu$1, Search, Bell, LogOut, ZoomOut, ZoomIn, Download, FileQuestion, Inbox, XCircle, Filter, Pause, Play, RotateCcw, Package, Calendar, MoreHorizontal, Image as Image$1, Upload, Minus, ArrowLeft, Camera, RefreshCw, HelpCircle, ChevronUp, MessageSquare, Flag, Type, Heading1, Heading2, Heading3, ListOrdered, Quote, Eraser, Star, TrendingUp, TrendingDown, ArrowUp, ArrowDown, MoreVertical, Sun, Moon, Circle, Clock, CheckCircle2, FileWarning, GitCommit, AlignLeft, Columns, SkipForward, Bug, Send, Wrench, User, Tag, DollarSign, Coffee, Users, Zap, Sword, Move, Heart, Shield } from 'lucide-react';
10
10
  import { evaluate, createMinimalContext } from '@almadar/evaluator';
11
11
  import { createPortal } from 'react-dom';
12
12
  import { Link, Outlet, useLocation } from 'react-router-dom';
@@ -6386,7 +6386,7 @@ var init_Badge = __esm({
6386
6386
  lg: "px-3 py-1.5 text-base"
6387
6387
  };
6388
6388
  Badge = React96__default.forwardRef(
6389
- ({ className, variant = "default", size = "sm", amount, label, icon, children, ...props }, ref) => {
6389
+ ({ className, variant = "default", size = "sm", amount, label, icon, children, onRemove, removeLabel, ...props }, ref) => {
6390
6390
  const iconSizes3 = { sm: "w-3 h-3", md: "w-3.5 h-3.5", lg: "w-4 h-4" };
6391
6391
  const resolvedIcon = typeof icon === "string" ? (() => {
6392
6392
  const I = resolveIcon(icon);
@@ -6400,12 +6400,31 @@ var init_Badge = __esm({
6400
6400
  "inline-flex items-center gap-1 font-bold rounded-sm",
6401
6401
  variantStyles3[variant],
6402
6402
  sizeStyles3[size],
6403
+ onRemove && "pr-1",
6403
6404
  className
6404
6405
  ),
6405
6406
  ...props,
6406
6407
  children: [
6407
6408
  resolvedIcon,
6408
- children || (amount != null ? `${label ? `${label} ` : ""}${amount}` : label)
6409
+ children || (amount != null ? `${label ? `${label} ` : ""}${amount}` : label),
6410
+ onRemove ? /* @__PURE__ */ jsx(
6411
+ "button",
6412
+ {
6413
+ type: "button",
6414
+ "aria-label": removeLabel ?? "Remove",
6415
+ onClick: (e) => {
6416
+ e.stopPropagation();
6417
+ onRemove();
6418
+ },
6419
+ className: cn(
6420
+ "inline-flex items-center justify-center rounded-sm",
6421
+ "hover:bg-foreground/10 focus:outline-none focus:ring-1 focus:ring-ring",
6422
+ "transition-colors",
6423
+ size === "sm" ? "w-4 h-4 ml-0.5" : size === "md" ? "w-5 h-5 ml-1" : "w-6 h-6 ml-1"
6424
+ ),
6425
+ children: /* @__PURE__ */ jsx(X, { className: iconSizes3[size] })
6426
+ }
6427
+ ) : null
6409
6428
  ]
6410
6429
  }
6411
6430
  );
@@ -13767,7 +13786,7 @@ var init_MapView = __esm({
13767
13786
  shadowSize: [41, 41]
13768
13787
  });
13769
13788
  L.Marker.prototype.options.icon = defaultIcon;
13770
- const { useEffect: useEffect88, useRef: useRef88, useCallback: useCallback128, useState: useState122 } = React96__default;
13789
+ const { useEffect: useEffect88, useRef: useRef88, useCallback: useCallback129, useState: useState123 } = React96__default;
13771
13790
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
13772
13791
  const { useEventBus: useEventBus3 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
13773
13792
  function MapUpdater({ centerLat, centerLng, zoom }) {
@@ -13812,8 +13831,8 @@ var init_MapView = __esm({
13812
13831
  showAttribution = true
13813
13832
  }) {
13814
13833
  const eventBus = useEventBus3();
13815
- const [clickedPosition, setClickedPosition] = useState122(null);
13816
- const handleMapClick = useCallback128((lat, lng) => {
13834
+ const [clickedPosition, setClickedPosition] = useState123(null);
13835
+ const handleMapClick = useCallback129((lat, lng) => {
13817
13836
  if (showClickedPin) {
13818
13837
  setClickedPosition({ lat, lng });
13819
13838
  }
@@ -13822,7 +13841,7 @@ var init_MapView = __esm({
13822
13841
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
13823
13842
  }
13824
13843
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
13825
- const handleMarkerClick = useCallback128((marker) => {
13844
+ const handleMarkerClick = useCallback129((marker) => {
13826
13845
  onMarkerClick?.(marker);
13827
13846
  if (markerClickEvent) {
13828
13847
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -33239,6 +33258,98 @@ var init_TagCloud = __esm({
33239
33258
  TagCloud.displayName = "TagCloud";
33240
33259
  }
33241
33260
  });
33261
+ var TagInput;
33262
+ var init_TagInput = __esm({
33263
+ "components/molecules/TagInput.tsx"() {
33264
+ "use client";
33265
+ init_cn();
33266
+ init_useEventBus();
33267
+ init_Input();
33268
+ init_Badge();
33269
+ init_Stack();
33270
+ init_Typography();
33271
+ TagInput = ({
33272
+ value,
33273
+ onChange,
33274
+ placeholder,
33275
+ disabled = false,
33276
+ variant = "default",
33277
+ unique = true,
33278
+ helperText,
33279
+ className,
33280
+ addEvent,
33281
+ removeEvent
33282
+ }) => {
33283
+ const eventBus = useEventBus();
33284
+ const [draft, setDraft] = useState("");
33285
+ const commit = useCallback(() => {
33286
+ const tag = draft.trim();
33287
+ if (!tag) return;
33288
+ if (unique && value.includes(tag)) {
33289
+ setDraft("");
33290
+ return;
33291
+ }
33292
+ const next = [...value, tag];
33293
+ onChange?.(next);
33294
+ if (addEvent) {
33295
+ eventBus.emit(`UI:${addEvent}`, { tag, value: next });
33296
+ }
33297
+ setDraft("");
33298
+ }, [draft, value, onChange, unique, addEvent, eventBus]);
33299
+ const removeAt = useCallback(
33300
+ (index) => {
33301
+ if (disabled) return;
33302
+ const tag = value[index];
33303
+ const next = value.slice();
33304
+ next.splice(index, 1);
33305
+ onChange?.(next);
33306
+ if (removeEvent) {
33307
+ eventBus.emit(`UI:${removeEvent}`, { tag, index, value: next });
33308
+ }
33309
+ },
33310
+ [value, onChange, disabled, removeEvent, eventBus]
33311
+ );
33312
+ const handleKeyDown = useCallback(
33313
+ (e) => {
33314
+ if (disabled) return;
33315
+ if (e.key === "Enter") {
33316
+ e.preventDefault();
33317
+ commit();
33318
+ } else if (e.key === "Backspace" && draft.length === 0 && value.length > 0) {
33319
+ e.preventDefault();
33320
+ removeAt(value.length - 1);
33321
+ }
33322
+ },
33323
+ [commit, draft.length, value, removeAt, disabled]
33324
+ );
33325
+ return /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: cn("w-full", className), children: [
33326
+ value.length > 0 ? /* @__PURE__ */ jsx(HStack, { gap: "xs", className: "flex-wrap", children: value.map((tag, index) => /* @__PURE__ */ jsx(
33327
+ Badge,
33328
+ {
33329
+ variant,
33330
+ size: "sm",
33331
+ onRemove: disabled ? void 0 : () => removeAt(index),
33332
+ removeLabel: `Remove ${tag}`,
33333
+ children: tag
33334
+ },
33335
+ `${tag}-${index}`
33336
+ )) }) : null,
33337
+ /* @__PURE__ */ jsx(
33338
+ Input,
33339
+ {
33340
+ value: draft,
33341
+ placeholder: placeholder ?? "Type and press Enter\u2026",
33342
+ disabled,
33343
+ onChange: (e) => setDraft(e.target.value),
33344
+ onKeyDown: handleKeyDown
33345
+ }
33346
+ ),
33347
+ helperText ? /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: helperText }) : null
33348
+ ] });
33349
+ };
33350
+ TagInput.displayName = "TagInput";
33351
+ }
33352
+ });
33242
33353
  var ShowcaseCard;
33243
33354
  var init_ShowcaseCard = __esm({
33244
33355
  "components/molecules/ShowcaseCard.tsx"() {
@@ -36857,6 +36968,75 @@ var init_GradientDivider = __esm({
36857
36968
  GradientDivider.displayName = "GradientDivider";
36858
36969
  }
36859
36970
  });
36971
+ var MarketingFooter;
36972
+ var init_MarketingFooter = __esm({
36973
+ "components/molecules/MarketingFooter.tsx"() {
36974
+ "use client";
36975
+ init_cn();
36976
+ init_Box();
36977
+ init_Stack();
36978
+ init_Typography();
36979
+ MarketingFooter = ({
36980
+ columns,
36981
+ copyright,
36982
+ logo,
36983
+ className
36984
+ }) => {
36985
+ return /* @__PURE__ */ jsx(
36986
+ Box,
36987
+ {
36988
+ as: "footer",
36989
+ className: cn(
36990
+ "bg-surface",
36991
+ "border-t border-border",
36992
+ "pt-12 pb-8 px-4",
36993
+ className
36994
+ ),
36995
+ children: /* @__PURE__ */ jsxs(VStack, { gap: "lg", className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
36996
+ /* @__PURE__ */ jsxs(HStack, { gap: "lg", align: "start", className: "flex-wrap w-full justify-between", children: [
36997
+ 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" }) }),
36998
+ columns.map((col) => /* @__PURE__ */ jsxs(VStack, { gap: "sm", className: "min-w-[140px] mb-4", children: [
36999
+ /* @__PURE__ */ jsx(
37000
+ Typography,
37001
+ {
37002
+ variant: "body2",
37003
+ className: "font-semibold text-foreground mb-1",
37004
+ children: col.title
37005
+ }
37006
+ ),
37007
+ col.items.map((item) => /* @__PURE__ */ jsx(
37008
+ "a",
37009
+ {
37010
+ href: item.href,
37011
+ className: cn(
37012
+ "text-sm no-underline",
37013
+ "text-foreground/60",
37014
+ "hover:text-accent",
37015
+ "transition-colors duration-150"
37016
+ ),
37017
+ target: item.href.startsWith("http") ? "_blank" : void 0,
37018
+ rel: item.href.startsWith("http") ? "noopener noreferrer" : void 0,
37019
+ children: item.label
37020
+ },
37021
+ item.label
37022
+ ))
37023
+ ] }, col.title))
37024
+ ] }),
37025
+ copyright && /* @__PURE__ */ jsx(
37026
+ Typography,
37027
+ {
37028
+ variant: "caption",
37029
+ className: "text-foreground/30 text-center w-full pt-6",
37030
+ children: copyright
37031
+ }
37032
+ )
37033
+ ] })
37034
+ }
37035
+ );
37036
+ };
37037
+ MarketingFooter.displayName = "MarketingFooter";
37038
+ }
37039
+ });
36860
37040
  var PullQuote;
36861
37041
  var init_PullQuote = __esm({
36862
37042
  "components/molecules/PullQuote.tsx"() {
@@ -53698,6 +53878,7 @@ var init_component_registry_generated = __esm({
53698
53878
  init_List();
53699
53879
  init_LoadingState();
53700
53880
  init_MarkdownContent();
53881
+ init_MarketingFooter();
53701
53882
  init_MasterDetail();
53702
53883
  init_MasterDetailLayout();
53703
53884
  init_MatrixQuestion();
@@ -53797,6 +53978,7 @@ var init_component_registry_generated = __esm({
53797
53978
  init_Table();
53798
53979
  init_Tabs();
53799
53980
  init_TagCloud();
53981
+ init_TagInput();
53800
53982
  init_TeamCard();
53801
53983
  init_TeamOrganism();
53802
53984
  init_TextHighlight();
@@ -53997,6 +54179,7 @@ var init_component_registry_generated = __esm({
53997
54179
  "MapView": MapViewPattern,
53998
54180
  "MapViewPattern": MapViewPattern,
53999
54181
  "MarkdownContent": MarkdownContent,
54182
+ "MarketingFooter": MarketingFooter,
54000
54183
  "MasterDetail": MasterDetail,
54001
54184
  "MasterDetailLayout": MasterDetailLayout,
54002
54185
  "MatrixQuestion": MatrixQuestion,
@@ -54112,6 +54295,7 @@ var init_component_registry_generated = __esm({
54112
54295
  "Table": Table,
54113
54296
  "Tabs": Tabs,
54114
54297
  "TagCloud": TagCloud,
54298
+ "TagInput": TagInput,
54115
54299
  "TeamCard": TeamCard,
54116
54300
  "TeamOrganism": TeamOrganism,
54117
54301
  "TextHighlight": TextHighlight,
@@ -12,5 +12,12 @@ export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
12
12
  label?: string | number;
13
13
  /** Icon name (Lucide icon string) or React node */
14
14
  icon?: React.ReactNode;
15
+ /** When set, renders a small X button on the right of the badge that
16
+ * invokes this handler — turns the badge into a removable chip.
17
+ * Used by the TagInput molecule and other "list of removable values"
18
+ * surfaces. */
19
+ onRemove?: () => void;
20
+ /** Accessible label for the remove button. Defaults to "Remove". */
21
+ removeLabel?: string;
15
22
  }
16
23
  export declare const Badge: React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLSpanElement>>;