@almadar/ui 4.57.0 → 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.
@@ -32427,6 +32427,75 @@ var init_GradientDivider = __esm({
32427
32427
  GradientDivider.displayName = "GradientDivider";
32428
32428
  }
32429
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
+ });
32430
32499
  var PullQuote;
32431
32500
  var init_PullQuote = __esm({
32432
32501
  "components/molecules/PullQuote.tsx"() {
@@ -32967,6 +33036,7 @@ var init_molecules = __esm({
32967
33036
  init_DocSidebar();
32968
33037
  init_DocTOC();
32969
33038
  init_GradientDivider();
33039
+ init_MarketingFooter();
32970
33040
  init_PullQuote();
32971
33041
  init_BehaviorView();
32972
33042
  init_ModuleCard();
@@ -44796,6 +44866,7 @@ var init_component_registry_generated = __esm({
44796
44866
  init_List();
44797
44867
  init_LoadingState();
44798
44868
  init_MarkdownContent();
44869
+ init_MarketingFooter();
44799
44870
  init_MasterDetail();
44800
44871
  init_MasterDetailLayout();
44801
44872
  init_MatrixQuestion();
@@ -44895,6 +44966,7 @@ var init_component_registry_generated = __esm({
44895
44966
  init_Table();
44896
44967
  init_Tabs();
44897
44968
  init_TagCloud();
44969
+ init_TagInput();
44898
44970
  init_TeamCard();
44899
44971
  init_TeamOrganism();
44900
44972
  init_TextHighlight();
@@ -45095,6 +45167,7 @@ var init_component_registry_generated = __esm({
45095
45167
  "MapView": MapViewPattern,
45096
45168
  "MapViewPattern": MapViewPattern,
45097
45169
  "MarkdownContent": MarkdownContent,
45170
+ "MarketingFooter": MarketingFooter,
45098
45171
  "MasterDetail": MasterDetail,
45099
45172
  "MasterDetailLayout": MasterDetailLayout,
45100
45173
  "MatrixQuestion": MatrixQuestion,
@@ -45210,6 +45283,7 @@ var init_component_registry_generated = __esm({
45210
45283
  "Table": Table,
45211
45284
  "Tabs": Tabs,
45212
45285
  "TagCloud": TagCloud,
45286
+ "TagInput": TagInput,
45213
45287
  "TeamCard": TeamCard,
45214
45288
  "TeamOrganism": TeamOrganism,
45215
45289
  "TextHighlight": TextHighlight,
@@ -49118,4 +49192,4 @@ function useGitHubBranches(owner, repo, enabled = true) {
49118
49192
  });
49119
49193
  }
49120
49194
 
49121
- 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, 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 };
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 };
@@ -98,6 +98,7 @@ export { DocSearch, type DocSearchProps, type DocSearchResult } from './DocSearc
98
98
  export { DocSidebar, type DocSidebarProps, type DocSidebarItem } from './DocSidebar';
99
99
  export { DocTOC, type DocTOCProps, type DocTOCItem } from './DocTOC';
100
100
  export { GradientDivider, type GradientDividerProps } from './GradientDivider';
101
+ export { MarketingFooter, type MarketingFooterProps, type FooterLinkColumn, type FooterLinkItem } from './MarketingFooter';
101
102
  export { PullQuote, type PullQuoteProps } from './PullQuote';
102
103
  export { BehaviorView, type BehaviorViewProps } from './avl/BehaviorView';
103
104
  export { ModuleCard, type ModuleCardProps } from './avl/ModuleCard';
@@ -9457,7 +9457,7 @@ var init_MapView = __esm({
9457
9457
  shadowSize: [41, 41]
9458
9458
  });
9459
9459
  L.Marker.prototype.options.icon = defaultIcon;
9460
- const { useEffect: useEffect68, useRef: useRef65, useCallback: useCallback112, useState: useState97 } = React84__namespace.default;
9460
+ const { useEffect: useEffect68, useRef: useRef65, useCallback: useCallback113, useState: useState98 } = React84__namespace.default;
9461
9461
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
9462
9462
  const { useEventBus: useEventBus2 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
9463
9463
  function MapUpdater({ centerLat, centerLng, zoom }) {
@@ -9502,8 +9502,8 @@ var init_MapView = __esm({
9502
9502
  showAttribution = true
9503
9503
  }) {
9504
9504
  const eventBus = useEventBus2();
9505
- const [clickedPosition, setClickedPosition] = useState97(null);
9506
- const handleMapClick = useCallback112((lat, lng) => {
9505
+ const [clickedPosition, setClickedPosition] = useState98(null);
9506
+ const handleMapClick = useCallback113((lat, lng) => {
9507
9507
  if (showClickedPin) {
9508
9508
  setClickedPosition({ lat, lng });
9509
9509
  }
@@ -9512,7 +9512,7 @@ var init_MapView = __esm({
9512
9512
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
9513
9513
  }
9514
9514
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
9515
- const handleMarkerClick = useCallback112((marker) => {
9515
+ const handleMarkerClick = useCallback113((marker) => {
9516
9516
  onMarkerClick?.(marker);
9517
9517
  if (markerClickEvent) {
9518
9518
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -29716,6 +29716,98 @@ var init_TagCloud = __esm({
29716
29716
  TagCloud.displayName = "TagCloud";
29717
29717
  }
29718
29718
  });
29719
+ var TagInput;
29720
+ var init_TagInput = __esm({
29721
+ "components/molecules/TagInput.tsx"() {
29722
+ "use client";
29723
+ init_cn();
29724
+ init_useEventBus();
29725
+ init_Input();
29726
+ init_Badge();
29727
+ init_Stack();
29728
+ init_Typography();
29729
+ TagInput = ({
29730
+ value,
29731
+ onChange,
29732
+ placeholder,
29733
+ disabled = false,
29734
+ variant = "default",
29735
+ unique = true,
29736
+ helperText,
29737
+ className,
29738
+ addEvent,
29739
+ removeEvent
29740
+ }) => {
29741
+ const eventBus = useEventBus();
29742
+ const [draft, setDraft] = React84.useState("");
29743
+ const commit = React84.useCallback(() => {
29744
+ const tag = draft.trim();
29745
+ if (!tag) return;
29746
+ if (unique && value.includes(tag)) {
29747
+ setDraft("");
29748
+ return;
29749
+ }
29750
+ const next = [...value, tag];
29751
+ onChange?.(next);
29752
+ if (addEvent) {
29753
+ eventBus.emit(`UI:${addEvent}`, { tag, value: next });
29754
+ }
29755
+ setDraft("");
29756
+ }, [draft, value, onChange, unique, addEvent, eventBus]);
29757
+ const removeAt = React84.useCallback(
29758
+ (index) => {
29759
+ if (disabled) return;
29760
+ const tag = value[index];
29761
+ const next = value.slice();
29762
+ next.splice(index, 1);
29763
+ onChange?.(next);
29764
+ if (removeEvent) {
29765
+ eventBus.emit(`UI:${removeEvent}`, { tag, index, value: next });
29766
+ }
29767
+ },
29768
+ [value, onChange, disabled, removeEvent, eventBus]
29769
+ );
29770
+ const handleKeyDown = React84.useCallback(
29771
+ (e) => {
29772
+ if (disabled) return;
29773
+ if (e.key === "Enter") {
29774
+ e.preventDefault();
29775
+ commit();
29776
+ } else if (e.key === "Backspace" && draft.length === 0 && value.length > 0) {
29777
+ e.preventDefault();
29778
+ removeAt(value.length - 1);
29779
+ }
29780
+ },
29781
+ [commit, draft.length, value, removeAt, disabled]
29782
+ );
29783
+ return /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", className: cn("w-full", className), children: [
29784
+ value.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(HStack, { gap: "xs", className: "flex-wrap", children: value.map((tag, index) => /* @__PURE__ */ jsxRuntime.jsx(
29785
+ Badge,
29786
+ {
29787
+ variant,
29788
+ size: "sm",
29789
+ onRemove: disabled ? void 0 : () => removeAt(index),
29790
+ removeLabel: `Remove ${tag}`,
29791
+ children: tag
29792
+ },
29793
+ `${tag}-${index}`
29794
+ )) }) : null,
29795
+ /* @__PURE__ */ jsxRuntime.jsx(
29796
+ Input,
29797
+ {
29798
+ value: draft,
29799
+ placeholder: placeholder ?? "Type and press Enter\u2026",
29800
+ disabled,
29801
+ onChange: (e) => setDraft(e.target.value),
29802
+ onKeyDown: handleKeyDown
29803
+ }
29804
+ ),
29805
+ helperText ? /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", color: "muted", children: helperText }) : null
29806
+ ] });
29807
+ };
29808
+ TagInput.displayName = "TagInput";
29809
+ }
29810
+ });
29719
29811
  var ShowcaseCard;
29720
29812
  var init_ShowcaseCard = __esm({
29721
29813
  "components/molecules/ShowcaseCard.tsx"() {
@@ -33334,6 +33426,75 @@ var init_GradientDivider = __esm({
33334
33426
  GradientDivider.displayName = "GradientDivider";
33335
33427
  }
33336
33428
  });
33429
+ var MarketingFooter;
33430
+ var init_MarketingFooter = __esm({
33431
+ "components/molecules/MarketingFooter.tsx"() {
33432
+ "use client";
33433
+ init_cn();
33434
+ init_Box();
33435
+ init_Stack();
33436
+ init_Typography();
33437
+ MarketingFooter = ({
33438
+ columns,
33439
+ copyright,
33440
+ logo,
33441
+ className
33442
+ }) => {
33443
+ return /* @__PURE__ */ jsxRuntime.jsx(
33444
+ Box,
33445
+ {
33446
+ as: "footer",
33447
+ className: cn(
33448
+ "bg-surface",
33449
+ "border-t border-border",
33450
+ "pt-12 pb-8 px-4",
33451
+ className
33452
+ ),
33453
+ children: /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "lg", className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
33454
+ /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "lg", align: "start", className: "flex-wrap w-full justify-between", children: [
33455
+ 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" }) }),
33456
+ columns.map((col) => /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "sm", className: "min-w-[140px] mb-4", children: [
33457
+ /* @__PURE__ */ jsxRuntime.jsx(
33458
+ Typography,
33459
+ {
33460
+ variant: "body2",
33461
+ className: "font-semibold text-foreground mb-1",
33462
+ children: col.title
33463
+ }
33464
+ ),
33465
+ col.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
33466
+ "a",
33467
+ {
33468
+ href: item.href,
33469
+ className: cn(
33470
+ "text-sm no-underline",
33471
+ "text-foreground/60",
33472
+ "hover:text-accent",
33473
+ "transition-colors duration-150"
33474
+ ),
33475
+ target: item.href.startsWith("http") ? "_blank" : void 0,
33476
+ rel: item.href.startsWith("http") ? "noopener noreferrer" : void 0,
33477
+ children: item.label
33478
+ },
33479
+ item.label
33480
+ ))
33481
+ ] }, col.title))
33482
+ ] }),
33483
+ copyright && /* @__PURE__ */ jsxRuntime.jsx(
33484
+ Typography,
33485
+ {
33486
+ variant: "caption",
33487
+ className: "text-foreground/30 text-center w-full pt-6",
33488
+ children: copyright
33489
+ }
33490
+ )
33491
+ ] })
33492
+ }
33493
+ );
33494
+ };
33495
+ MarketingFooter.displayName = "MarketingFooter";
33496
+ }
33497
+ });
33337
33498
  var PullQuote;
33338
33499
  var init_PullQuote = __esm({
33339
33500
  "components/molecules/PullQuote.tsx"() {
@@ -45070,6 +45231,7 @@ var init_component_registry_generated = __esm({
45070
45231
  init_List();
45071
45232
  init_LoadingState();
45072
45233
  init_MarkdownContent();
45234
+ init_MarketingFooter();
45073
45235
  init_MasterDetail();
45074
45236
  init_MasterDetailLayout();
45075
45237
  init_MatrixQuestion();
@@ -45169,6 +45331,7 @@ var init_component_registry_generated = __esm({
45169
45331
  init_Table();
45170
45332
  init_Tabs();
45171
45333
  init_TagCloud();
45334
+ init_TagInput();
45172
45335
  init_TeamCard();
45173
45336
  init_TeamOrganism();
45174
45337
  init_TextHighlight();
@@ -45369,6 +45532,7 @@ var init_component_registry_generated = __esm({
45369
45532
  "MapView": MapViewPattern,
45370
45533
  "MapViewPattern": MapViewPattern,
45371
45534
  "MarkdownContent": MarkdownContent,
45535
+ "MarketingFooter": MarketingFooter,
45372
45536
  "MasterDetail": MasterDetail,
45373
45537
  "MasterDetailLayout": MasterDetailLayout,
45374
45538
  "MatrixQuestion": MatrixQuestion,
@@ -45484,6 +45648,7 @@ var init_component_registry_generated = __esm({
45484
45648
  "Table": Table,
45485
45649
  "Tabs": Tabs,
45486
45650
  "TagCloud": TagCloud,
45651
+ "TagInput": TagInput,
45487
45652
  "TeamCard": TeamCard,
45488
45653
  "TeamOrganism": TeamOrganism,
45489
45654
  "TextHighlight": TextHighlight,
@@ -9411,7 +9411,7 @@ var init_MapView = __esm({
9411
9411
  shadowSize: [41, 41]
9412
9412
  });
9413
9413
  L.Marker.prototype.options.icon = defaultIcon;
9414
- const { useEffect: useEffect68, useRef: useRef65, useCallback: useCallback112, useState: useState97 } = React84__default;
9414
+ const { useEffect: useEffect68, useRef: useRef65, useCallback: useCallback113, useState: useState98 } = React84__default;
9415
9415
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
9416
9416
  const { useEventBus: useEventBus2 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
9417
9417
  function MapUpdater({ centerLat, centerLng, zoom }) {
@@ -9456,8 +9456,8 @@ var init_MapView = __esm({
9456
9456
  showAttribution = true
9457
9457
  }) {
9458
9458
  const eventBus = useEventBus2();
9459
- const [clickedPosition, setClickedPosition] = useState97(null);
9460
- const handleMapClick = useCallback112((lat, lng) => {
9459
+ const [clickedPosition, setClickedPosition] = useState98(null);
9460
+ const handleMapClick = useCallback113((lat, lng) => {
9461
9461
  if (showClickedPin) {
9462
9462
  setClickedPosition({ lat, lng });
9463
9463
  }
@@ -9466,7 +9466,7 @@ var init_MapView = __esm({
9466
9466
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
9467
9467
  }
9468
9468
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
9469
- const handleMarkerClick = useCallback112((marker) => {
9469
+ const handleMarkerClick = useCallback113((marker) => {
9470
9470
  onMarkerClick?.(marker);
9471
9471
  if (markerClickEvent) {
9472
9472
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -29670,6 +29670,98 @@ var init_TagCloud = __esm({
29670
29670
  TagCloud.displayName = "TagCloud";
29671
29671
  }
29672
29672
  });
29673
+ var TagInput;
29674
+ var init_TagInput = __esm({
29675
+ "components/molecules/TagInput.tsx"() {
29676
+ "use client";
29677
+ init_cn();
29678
+ init_useEventBus();
29679
+ init_Input();
29680
+ init_Badge();
29681
+ init_Stack();
29682
+ init_Typography();
29683
+ TagInput = ({
29684
+ value,
29685
+ onChange,
29686
+ placeholder,
29687
+ disabled = false,
29688
+ variant = "default",
29689
+ unique = true,
29690
+ helperText,
29691
+ className,
29692
+ addEvent,
29693
+ removeEvent
29694
+ }) => {
29695
+ const eventBus = useEventBus();
29696
+ const [draft, setDraft] = useState("");
29697
+ const commit = useCallback(() => {
29698
+ const tag = draft.trim();
29699
+ if (!tag) return;
29700
+ if (unique && value.includes(tag)) {
29701
+ setDraft("");
29702
+ return;
29703
+ }
29704
+ const next = [...value, tag];
29705
+ onChange?.(next);
29706
+ if (addEvent) {
29707
+ eventBus.emit(`UI:${addEvent}`, { tag, value: next });
29708
+ }
29709
+ setDraft("");
29710
+ }, [draft, value, onChange, unique, addEvent, eventBus]);
29711
+ const removeAt = useCallback(
29712
+ (index) => {
29713
+ if (disabled) return;
29714
+ const tag = value[index];
29715
+ const next = value.slice();
29716
+ next.splice(index, 1);
29717
+ onChange?.(next);
29718
+ if (removeEvent) {
29719
+ eventBus.emit(`UI:${removeEvent}`, { tag, index, value: next });
29720
+ }
29721
+ },
29722
+ [value, onChange, disabled, removeEvent, eventBus]
29723
+ );
29724
+ const handleKeyDown = useCallback(
29725
+ (e) => {
29726
+ if (disabled) return;
29727
+ if (e.key === "Enter") {
29728
+ e.preventDefault();
29729
+ commit();
29730
+ } else if (e.key === "Backspace" && draft.length === 0 && value.length > 0) {
29731
+ e.preventDefault();
29732
+ removeAt(value.length - 1);
29733
+ }
29734
+ },
29735
+ [commit, draft.length, value, removeAt, disabled]
29736
+ );
29737
+ return /* @__PURE__ */ jsxs(VStack, { gap: "xs", className: cn("w-full", className), children: [
29738
+ value.length > 0 ? /* @__PURE__ */ jsx(HStack, { gap: "xs", className: "flex-wrap", children: value.map((tag, index) => /* @__PURE__ */ jsx(
29739
+ Badge,
29740
+ {
29741
+ variant,
29742
+ size: "sm",
29743
+ onRemove: disabled ? void 0 : () => removeAt(index),
29744
+ removeLabel: `Remove ${tag}`,
29745
+ children: tag
29746
+ },
29747
+ `${tag}-${index}`
29748
+ )) }) : null,
29749
+ /* @__PURE__ */ jsx(
29750
+ Input,
29751
+ {
29752
+ value: draft,
29753
+ placeholder: placeholder ?? "Type and press Enter\u2026",
29754
+ disabled,
29755
+ onChange: (e) => setDraft(e.target.value),
29756
+ onKeyDown: handleKeyDown
29757
+ }
29758
+ ),
29759
+ helperText ? /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "muted", children: helperText }) : null
29760
+ ] });
29761
+ };
29762
+ TagInput.displayName = "TagInput";
29763
+ }
29764
+ });
29673
29765
  var ShowcaseCard;
29674
29766
  var init_ShowcaseCard = __esm({
29675
29767
  "components/molecules/ShowcaseCard.tsx"() {
@@ -33288,6 +33380,75 @@ var init_GradientDivider = __esm({
33288
33380
  GradientDivider.displayName = "GradientDivider";
33289
33381
  }
33290
33382
  });
33383
+ var MarketingFooter;
33384
+ var init_MarketingFooter = __esm({
33385
+ "components/molecules/MarketingFooter.tsx"() {
33386
+ "use client";
33387
+ init_cn();
33388
+ init_Box();
33389
+ init_Stack();
33390
+ init_Typography();
33391
+ MarketingFooter = ({
33392
+ columns,
33393
+ copyright,
33394
+ logo,
33395
+ className
33396
+ }) => {
33397
+ return /* @__PURE__ */ jsx(
33398
+ Box,
33399
+ {
33400
+ as: "footer",
33401
+ className: cn(
33402
+ "bg-surface",
33403
+ "border-t border-border",
33404
+ "pt-12 pb-8 px-4",
33405
+ className
33406
+ ),
33407
+ children: /* @__PURE__ */ jsxs(VStack, { gap: "lg", className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
33408
+ /* @__PURE__ */ jsxs(HStack, { gap: "lg", align: "start", className: "flex-wrap w-full justify-between", children: [
33409
+ 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" }) }),
33410
+ columns.map((col) => /* @__PURE__ */ jsxs(VStack, { gap: "sm", className: "min-w-[140px] mb-4", children: [
33411
+ /* @__PURE__ */ jsx(
33412
+ Typography,
33413
+ {
33414
+ variant: "body2",
33415
+ className: "font-semibold text-foreground mb-1",
33416
+ children: col.title
33417
+ }
33418
+ ),
33419
+ col.items.map((item) => /* @__PURE__ */ jsx(
33420
+ "a",
33421
+ {
33422
+ href: item.href,
33423
+ className: cn(
33424
+ "text-sm no-underline",
33425
+ "text-foreground/60",
33426
+ "hover:text-accent",
33427
+ "transition-colors duration-150"
33428
+ ),
33429
+ target: item.href.startsWith("http") ? "_blank" : void 0,
33430
+ rel: item.href.startsWith("http") ? "noopener noreferrer" : void 0,
33431
+ children: item.label
33432
+ },
33433
+ item.label
33434
+ ))
33435
+ ] }, col.title))
33436
+ ] }),
33437
+ copyright && /* @__PURE__ */ jsx(
33438
+ Typography,
33439
+ {
33440
+ variant: "caption",
33441
+ className: "text-foreground/30 text-center w-full pt-6",
33442
+ children: copyright
33443
+ }
33444
+ )
33445
+ ] })
33446
+ }
33447
+ );
33448
+ };
33449
+ MarketingFooter.displayName = "MarketingFooter";
33450
+ }
33451
+ });
33291
33452
  var PullQuote;
33292
33453
  var init_PullQuote = __esm({
33293
33454
  "components/molecules/PullQuote.tsx"() {
@@ -45024,6 +45185,7 @@ var init_component_registry_generated = __esm({
45024
45185
  init_List();
45025
45186
  init_LoadingState();
45026
45187
  init_MarkdownContent();
45188
+ init_MarketingFooter();
45027
45189
  init_MasterDetail();
45028
45190
  init_MasterDetailLayout();
45029
45191
  init_MatrixQuestion();
@@ -45123,6 +45285,7 @@ var init_component_registry_generated = __esm({
45123
45285
  init_Table();
45124
45286
  init_Tabs();
45125
45287
  init_TagCloud();
45288
+ init_TagInput();
45126
45289
  init_TeamCard();
45127
45290
  init_TeamOrganism();
45128
45291
  init_TextHighlight();
@@ -45323,6 +45486,7 @@ var init_component_registry_generated = __esm({
45323
45486
  "MapView": MapViewPattern,
45324
45487
  "MapViewPattern": MapViewPattern,
45325
45488
  "MarkdownContent": MarkdownContent,
45489
+ "MarketingFooter": MarketingFooter,
45326
45490
  "MasterDetail": MasterDetail,
45327
45491
  "MasterDetailLayout": MasterDetailLayout,
45328
45492
  "MatrixQuestion": MatrixQuestion,
@@ -45438,6 +45602,7 @@ var init_component_registry_generated = __esm({
45438
45602
  "Table": Table,
45439
45603
  "Tabs": Tabs,
45440
45604
  "TagCloud": TagCloud,
45605
+ "TagInput": TagInput,
45441
45606
  "TeamCard": TeamCard,
45442
45607
  "TeamOrganism": TeamOrganism,
45443
45608
  "TextHighlight": TextHighlight,