@flamingo-stack/openframe-frontend-core 0.0.173 → 0.0.174-snapshot.20260514021733

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.
@@ -413,7 +413,7 @@ function useDynamicTheme() {
413
413
  }
414
414
 
415
415
  // src/components/features/array-entry-manager.tsx
416
- import { useState as useState57, useEffect as useEffect43 } from "react";
416
+ import { useState as useState58, useEffect as useEffect43 } from "react";
417
417
 
418
418
  // src/components/ui/allowed-domains-input.tsx
419
419
  init_cn();
@@ -3021,10 +3021,10 @@ var ApprovalRequestMessage = forwardRef9(
3021
3021
  children: [
3022
3022
  /* @__PURE__ */ jsxs10("div", { className: "flex flex-col gap-1", children: [
3023
3023
  /* @__PURE__ */ jsxs10("div", { className: "bg-ods-bg border border-ods-border rounded-md p-3 flex gap-2 items-start max-h-32 overflow-y-auto", children: [
3024
- /* @__PURE__ */ jsx13("code", { className: "font-['DM_Sans'] font-medium text-sm text-ods-text-primary flex-1 leading-5 whitespace-pre-wrap break-all", children: data.command }),
3024
+ /* @__PURE__ */ jsx13("code", { className: "font-['DM_Sans'] font-medium text-sm text-ods-text-primary flex-1 leading-5 whitespace-pre-wrap break-words", children: data.command }),
3025
3025
  data.icon && /* @__PURE__ */ jsx13("div", { className: "w-4 h-4 shrink-0 text-ods-text-tertiary", children: data.icon })
3026
3026
  ] }),
3027
- data.explanation && /* @__PURE__ */ jsx13("p", { className: "font-['DM_Sans'] font-medium text-sm text-ods-text-secondary leading-5", children: data.explanation })
3027
+ data.explanation && /* @__PURE__ */ jsx13("p", { className: "font-['DM_Sans'] font-medium text-sm text-ods-text-secondary leading-5 whitespace-pre-line break-words", children: data.explanation })
3028
3028
  ] }),
3029
3029
  /* @__PURE__ */ jsx13("div", { className: "flex", children: /* @__PURE__ */ jsx13(
3030
3030
  Tag,
@@ -5315,7 +5315,7 @@ MemoizedChatMessageEnhanced.displayName = "MemoizedChatMessageEnhanced";
5315
5315
 
5316
5316
  // src/components/chat/chat-message-list.tsx
5317
5317
  init_cn();
5318
- import { useRef as useRef6, useEffect as useEffect6, useLayoutEffect as useLayoutEffect2, useImperativeHandle as useImperativeHandle3, forwardRef as forwardRef22 } from "react";
5318
+ import { useRef as useRef6, useState as useState14, useEffect as useEffect6, useLayoutEffect as useLayoutEffect2, useImperativeHandle as useImperativeHandle3, forwardRef as forwardRef22 } from "react";
5319
5319
  import { useStickToBottom } from "use-stick-to-bottom";
5320
5320
 
5321
5321
  // src/components/chat/chat-message-loader.tsx
@@ -5406,17 +5406,18 @@ var ChatMessageList = forwardRef22(
5406
5406
  }, ref) => {
5407
5407
  const { scrollRef, contentRef, scrollToBottom } = useStickToBottom({
5408
5408
  resize: "smooth",
5409
- initial: false
5409
+ initial: "instant"
5410
5410
  });
5411
- const sentinelRef = useRef6(null);
5411
+ const [scrollEl, setScrollEl] = useState14(null);
5412
+ const [sentinelEl, setSentinelEl] = useState14(null);
5412
5413
  const onLoadMoreRef = useRef6(onLoadMore);
5413
5414
  onLoadMoreRef.current = onLoadMore;
5414
5415
  const isFetchingRef = useRef6(isFetchingNextPage);
5415
5416
  isFetchingRef.current = isFetchingNextPage;
5416
5417
  const prevRenderRef = useRef6({ dialogId: void 0, messageCount: 0, lastMessageId: void 0 });
5417
5418
  const prependRef = useRef6({ firstMessageId: void 0, firstMessageContent: void 0, scrollHeight: 0 });
5418
- useEffect6(() => {
5419
- if (!autoScroll) return;
5419
+ useLayoutEffect2(() => {
5420
+ if (!autoScroll || !scrollEl) return;
5420
5421
  const dialogChanged = dialogId !== prevRenderRef.current.dialogId;
5421
5422
  const prevCount = prevRenderRef.current.messageCount;
5422
5423
  const newCount = messages.length;
@@ -5437,9 +5438,9 @@ var ChatMessageList = forwardRef22(
5437
5438
  void scrollToBottom({ animation: "instant", ignoreEscapes: true });
5438
5439
  }
5439
5440
  }
5440
- }, [autoScroll, messages, dialogId, scrollToBottom]);
5441
+ }, [autoScroll, messages, dialogId, scrollToBottom, scrollEl]);
5441
5442
  useLayoutEffect2(() => {
5442
- const el = scrollRef.current;
5443
+ const el = scrollEl;
5443
5444
  if (!el) {
5444
5445
  prependRef.current = { firstMessageId: void 0, firstMessageContent: void 0, scrollHeight: 0 };
5445
5446
  return;
@@ -5467,24 +5468,35 @@ var ChatMessageList = forwardRef22(
5467
5468
  if (currentFirstContent !== prependRef.current.firstMessageContent) {
5468
5469
  prependRef.current.firstMessageContent = currentFirstContent;
5469
5470
  }
5470
- }, [messages, scrollRef]);
5471
+ }, [messages, scrollEl]);
5471
5472
  useEffect6(() => {
5472
- const scrollContainer = scrollRef.current;
5473
- const sentinelElement = sentinelRef.current;
5474
- if (!scrollContainer || !sentinelElement || !hasNextPage) return;
5475
- const observer = new IntersectionObserver(
5476
- (entries) => {
5477
- const entry = entries[0];
5478
- if (!entry) return;
5479
- if (entry.isIntersecting && !isFetchingRef.current) {
5480
- onLoadMoreRef.current?.();
5481
- }
5482
- },
5483
- { root: scrollContainer, rootMargin: "200px", threshold: 0.1 }
5484
- );
5485
- observer.observe(sentinelElement);
5486
- return () => observer.disconnect();
5487
- }, [hasNextPage, scrollRef]);
5473
+ const scrollContainer = scrollEl;
5474
+ const sentinelElement = sentinelEl;
5475
+ if (!scrollContainer || !hasNextPage) return;
5476
+ const tryLoad = () => {
5477
+ if (isFetchingRef.current) return;
5478
+ onLoadMoreRef.current?.();
5479
+ };
5480
+ let observer;
5481
+ if (sentinelElement) {
5482
+ observer = new IntersectionObserver(
5483
+ (entries) => {
5484
+ const entry = entries[0];
5485
+ if (entry?.isIntersecting) tryLoad();
5486
+ },
5487
+ { root: scrollContainer, rootMargin: "200px", threshold: 0.1 }
5488
+ );
5489
+ observer.observe(sentinelElement);
5490
+ }
5491
+ const onScroll = () => {
5492
+ if (scrollContainer.scrollTop <= 200) tryLoad();
5493
+ };
5494
+ scrollContainer.addEventListener("scroll", onScroll, { passive: true });
5495
+ return () => {
5496
+ observer?.disconnect();
5497
+ scrollContainer.removeEventListener("scroll", onScroll);
5498
+ };
5499
+ }, [hasNextPage, scrollEl, sentinelEl, messages.length]);
5488
5500
  useImperativeHandle3(ref, () => scrollRef.current, [scrollRef]);
5489
5501
  const showLoader = useDelayedFlag(isLoading, { delay: 200, minDuration: 400 });
5490
5502
  if (showLoader) {
@@ -5499,6 +5511,7 @@ var ChatMessageList = forwardRef22(
5499
5511
  }
5500
5512
  const setScrollRef = (el) => {
5501
5513
  scrollRef(el);
5514
+ setScrollEl(el);
5502
5515
  };
5503
5516
  const setContentRef = (el) => {
5504
5517
  contentRef(el);
@@ -5524,7 +5537,7 @@ var ChatMessageList = forwardRef22(
5524
5537
  ),
5525
5538
  style: { minHeight: "100%" },
5526
5539
  children: [
5527
- hasNextPage && /* @__PURE__ */ jsx33("div", { ref: sentinelRef, className: "h-px" }),
5540
+ hasNextPage && /* @__PURE__ */ jsx33("div", { ref: setSentinelEl, className: "h-px" }),
5528
5541
  isFetchingNextPage && /* @__PURE__ */ jsx33(
5529
5542
  "div",
5530
5543
  {
@@ -6419,7 +6432,7 @@ function useChunkCatchup({
6419
6432
  }
6420
6433
 
6421
6434
  // src/components/chat/hooks/use-nats-dialog-subscription.ts
6422
- import { useCallback as useCallback6, useEffect as useEffect8, useRef as useRef10, useState as useState15 } from "react";
6435
+ import { useCallback as useCallback6, useEffect as useEffect8, useRef as useRef10, useState as useState16 } from "react";
6423
6436
  var shared = null;
6424
6437
  function useNatsDialogSubscription({
6425
6438
  enabled,
@@ -6434,9 +6447,9 @@ function useNatsDialogSubscription({
6434
6447
  clientConfig = {},
6435
6448
  reconnectionBackoff
6436
6449
  }) {
6437
- const [isConnected, setIsConnected] = useState15(false);
6438
- const [isSubscribed, setIsSubscribed] = useState15(false);
6439
- const [reconnectionCount, setReconnectionCount] = useState15(0);
6450
+ const [isConnected, setIsConnected] = useState16(false);
6451
+ const [isSubscribed, setIsSubscribed] = useState16(false);
6452
+ const [reconnectionCount, setReconnectionCount] = useState16(0);
6440
6453
  const clientRef = useRef10(null);
6441
6454
  const subscriptionRefs = useRef10(/* @__PURE__ */ new Map());
6442
6455
  const onEventRef = useRef10(onEvent);
@@ -8091,13 +8104,13 @@ function extractIncompleteMessageState(lastMessage) {
8091
8104
 
8092
8105
  // src/components/navigation/header.tsx
8093
8106
  import Link from "next/link";
8094
- import React20, { useEffect as useEffect10, useRef as useRef12, useState as useState16 } from "react";
8107
+ import React20, { useEffect as useEffect10, useRef as useRef12, useState as useState17 } from "react";
8095
8108
  init_button2();
8096
8109
  import { Fragment as Fragment4, jsx as jsx41, jsxs as jsxs35 } from "react/jsx-runtime";
8097
8110
  function Header({ config, platform }) {
8098
- const [show, setShow] = useState16(true);
8099
- const [lastScrollY, setLastScrollY] = useState16(0);
8100
- const [openDropdowns, setOpenDropdowns] = useState16({});
8111
+ const [show, setShow] = useState17(true);
8112
+ const [lastScrollY, setLastScrollY] = useState17(0);
8113
+ const [openDropdowns, setOpenDropdowns] = useState17({});
8101
8114
  const dropdownRefs = useRef12({});
8102
8115
  const triggerRefs = useRef12({});
8103
8116
  useEffect10(() => {
@@ -8359,7 +8372,7 @@ function Header({ config, platform }) {
8359
8372
  }
8360
8373
 
8361
8374
  // src/components/navigation/client-only-header.tsx
8362
- import { useState as useState17, useEffect as useEffect11 } from "react";
8375
+ import { useState as useState18, useEffect as useEffect11 } from "react";
8363
8376
 
8364
8377
  // src/components/navigation/header-skeleton.tsx
8365
8378
  import { jsx as jsx42, jsxs as jsxs36 } from "react/jsx-runtime";
@@ -8407,7 +8420,7 @@ function HeaderSkeleton({ config }) {
8407
8420
  // src/components/navigation/client-only-header.tsx
8408
8421
  import { jsx as jsx43 } from "react/jsx-runtime";
8409
8422
  function ClientOnlyHeader({ config, skeleton }) {
8410
- const [isClient, setIsClient] = useState17(false);
8423
+ const [isClient, setIsClient] = useState18(false);
8411
8424
  useEffect11(() => {
8412
8425
  setIsClient(true);
8413
8426
  }, []);
@@ -8542,14 +8555,14 @@ function MobileNavPanel({ isOpen, config }) {
8542
8555
  }
8543
8556
 
8544
8557
  // src/components/navigation/sliding-sidebar.tsx
8545
- import { useState as useState18, useEffect as useEffect13 } from "react";
8558
+ import { useState as useState19, useEffect as useEffect13 } from "react";
8546
8559
  import { motion, AnimatePresence } from "framer-motion";
8547
8560
  init_button2();
8548
8561
  import { Fragment as Fragment6, jsx as jsx45, jsxs as jsxs38 } from "react/jsx-runtime";
8549
8562
  function SlidingSidebar({ config }) {
8550
- const [expandedItems, setExpandedItems] = useState18(/* @__PURE__ */ new Set());
8551
- const [mounted, setMounted] = useState18(false);
8552
- const [headerHeight, setHeaderHeight] = useState18(64);
8563
+ const [expandedItems, setExpandedItems] = useState19(/* @__PURE__ */ new Set());
8564
+ const [mounted, setMounted] = useState19(false);
8565
+ const [headerHeight, setHeaderHeight] = useState19(64);
8553
8566
  useEffect13(() => {
8554
8567
  setMounted(true);
8555
8568
  const calculateHeaderHeight = () => {
@@ -8761,7 +8774,7 @@ function SlidingSidebar({ config }) {
8761
8774
  }
8762
8775
 
8763
8776
  // src/components/navigation/sticky-section-nav.tsx
8764
- import { useEffect as useEffect14, useState as useState19, useCallback as useCallback8, useRef as useRef14 } from "react";
8777
+ import { useEffect as useEffect14, useState as useState20, useCallback as useCallback8, useRef as useRef14 } from "react";
8765
8778
  import { jsx as jsx46, jsxs as jsxs39 } from "react/jsx-runtime";
8766
8779
  function StickySectionNav({
8767
8780
  sections,
@@ -8822,7 +8835,7 @@ function StickySectionNav({
8822
8835
  ] });
8823
8836
  }
8824
8837
  function useSectionNavigation(sections, options) {
8825
- const [activeSection, setActiveSection] = useState19(sections[0]?.id || "");
8838
+ const [activeSection, setActiveSection] = useState20(sections[0]?.id || "");
8826
8839
  const isScrollingFromClick = useRef14(false);
8827
8840
  const { offset: offset2 = 100 } = options || {};
8828
8841
  const handleSectionClick = useCallback8((sectionId) => {
@@ -8876,7 +8889,7 @@ function useSectionNavigation(sections, options) {
8876
8889
  }
8877
8890
 
8878
8891
  // src/components/navigation/navigation-sidebar.tsx
8879
- import { useCallback as useCallback9, useLayoutEffect as useLayoutEffect4, useMemo as useMemo7, useState as useState20 } from "react";
8892
+ import { useCallback as useCallback9, useLayoutEffect as useLayoutEffect4, useMemo as useMemo7, useState as useState21 } from "react";
8880
8893
 
8881
8894
  // src/components/navigation/navigation-sidebar-header.tsx
8882
8895
  import { jsx as jsx47, jsxs as jsxs40 } from "react/jsx-runtime";
@@ -9026,7 +9039,7 @@ function NavigationSidebar({ config, disabled = false }) {
9026
9039
  STORAGE_KEY,
9027
9040
  !isLgUp || (config.minimized ?? false)
9028
9041
  );
9029
- const [transitionsEnabled, setTransitionsEnabled] = useState20(false);
9042
+ const [transitionsEnabled, setTransitionsEnabled] = useState21(false);
9030
9043
  const isMinimized = !isLgUp || minimized;
9031
9044
  const showLabel = isLgUp && !minimized;
9032
9045
  const handleToggle = useCallback9(() => {
@@ -9556,7 +9569,7 @@ function NotificationsHeaderButton({
9556
9569
  }
9557
9570
 
9558
9571
  // src/components/navigation/app-layout.tsx
9559
- import { Suspense, useCallback as useCallback12, useState as useState23 } from "react";
9572
+ import { Suspense, useCallback as useCallback12, useState as useState24 } from "react";
9560
9573
 
9561
9574
  // src/components/features/notifications/notification-drawer.tsx
9562
9575
  import * as DialogPrimitive2 from "@radix-ui/react-dialog";
@@ -10145,7 +10158,7 @@ function AppLayout({
10145
10158
  mobileBurgerMenuProps,
10146
10159
  disabled = false
10147
10160
  }) {
10148
- const [mobileMenuOpen, setMobileMenuOpen] = useState23(false);
10161
+ const [mobileMenuOpen, setMobileMenuOpen] = useState24(false);
10149
10162
  const handleToggleMobileMenu = useCallback12(() => {
10150
10163
  setMobileMenuOpen((prev) => !prev);
10151
10164
  }, []);
@@ -10519,7 +10532,7 @@ ScriptArguments.displayName = "ScriptArguments";
10519
10532
 
10520
10533
  // src/components/announcement-bar.tsx
10521
10534
  init_button2();
10522
- import { useState as useState24, useEffect as useEffect18 } from "react";
10535
+ import { useState as useState25, useEffect as useEffect18 } from "react";
10523
10536
  import Image4 from "next/image";
10524
10537
  import { X as X4 } from "lucide-react";
10525
10538
 
@@ -10725,8 +10738,8 @@ var getSvgIcon = (name, size = "main", extra = {}) => {
10725
10738
  return renderSvgIcon(name, { className: cls, ...extra });
10726
10739
  };
10727
10740
  function AnnouncementBar() {
10728
- const [announcement, setAnnouncement] = useState24(null);
10729
- const [isVisible, setIsVisible] = useState24(false);
10741
+ const [announcement, setAnnouncement] = useState25(null);
10742
+ const [isVisible, setIsVisible] = useState25(false);
10730
10743
  const platform = getAppType();
10731
10744
  const getDismissKey = (id) => `${platform}-announcement-${id}-dismissed`;
10732
10745
  const getCacheKey = () => `${platform}-announcement-cache`;
@@ -11865,7 +11878,7 @@ function EmptyState2({
11865
11878
  }
11866
11879
 
11867
11880
  // src/components/faq-accordion.tsx
11868
- import { useRef as useRef15, useState as useState25, useEffect as useEffect19, useCallback as useCallback13 } from "react";
11881
+ import { useRef as useRef15, useState as useState26, useEffect as useEffect19, useCallback as useCallback13 } from "react";
11869
11882
 
11870
11883
  // src/components/ui/chevron-button.tsx
11871
11884
  init_cn();
@@ -11906,7 +11919,7 @@ init_cn();
11906
11919
  import { jsx as jsx85, jsxs as jsxs70 } from "react/jsx-runtime";
11907
11920
  var useMeasuredHeight = (isOpen) => {
11908
11921
  const ref = useRef15(null);
11909
- const [maxHeight, setMaxHeight] = useState25("0px");
11922
+ const [maxHeight, setMaxHeight] = useState26("0px");
11910
11923
  const measure = useCallback13(() => {
11911
11924
  if (ref.current) {
11912
11925
  const height = ref.current.scrollHeight;
@@ -11923,7 +11936,7 @@ var useMeasuredHeight = (isOpen) => {
11923
11936
  return { ref, maxHeight };
11924
11937
  };
11925
11938
  function FaqAccordion({ items, defaultOpenIds = [] }) {
11926
- const [openSet, setOpenSet] = useState25(new Set(defaultOpenIds));
11939
+ const [openSet, setOpenSet] = useState26(new Set(defaultOpenIds));
11927
11940
  const toggle = (id) => {
11928
11941
  setOpenSet((prev) => {
11929
11942
  const next = new Set(prev);
@@ -12526,13 +12539,13 @@ function FooterWaitlistButton({ className }) {
12526
12539
 
12527
12540
  // src/components/hero-image-uploader.tsx
12528
12541
  init_button2();
12529
- import { useRef as useRef16, useState as useState26 } from "react";
12542
+ import { useRef as useRef16, useState as useState27 } from "react";
12530
12543
  import { Loader2 as Loader22, Image as ImageIcon, Upload, X as X6 } from "lucide-react";
12531
12544
  import { Fragment as Fragment12, jsx as jsx92, jsxs as jsxs74 } from "react/jsx-runtime";
12532
12545
  function HeroImageUploader({ imageUrl, onChange, uploadEndpoint, height = 300, objectFit = "cover", showReplaceButton = true, deferUpload = false, onUpload, onDelete }) {
12533
12546
  const inputRef = useRef16(null);
12534
12547
  const { toast } = useToast();
12535
- const [uploading, setUploading] = useState26(false);
12548
+ const [uploading, setUploading] = useState27(false);
12536
12549
  const ALLOWED_TYPES = ["image/jpeg", "image/jpg", "image/png", "image/webp", "image/gif"];
12537
12550
  const MAX_SIZE = 5 * 1024 * 1024;
12538
12551
  const openDialog = () => inputRef.current?.click();
@@ -12648,7 +12661,7 @@ function HeroImageUploader({ imageUrl, onChange, uploadEndpoint, height = 300, o
12648
12661
  }
12649
12662
 
12650
12663
  // src/components/icons-block.tsx
12651
- import { useState as useState27, useEffect as useEffect20, useRef as useRef17 } from "react";
12664
+ import { useState as useState28, useEffect as useEffect20, useRef as useRef17 } from "react";
12652
12665
 
12653
12666
  // src/components/icons-stub.tsx
12654
12667
  import { DollarSign, Code, Users, Building, GitCompare, MessageSquare } from "lucide-react";
@@ -12684,9 +12697,9 @@ var availableIcons = [
12684
12697
  OpenmspLogo2
12685
12698
  ];
12686
12699
  function ResponsiveIconsBlock({ loading = false }) {
12687
- const [columns, setColumns] = useState27(24);
12688
- const [iconGrid, setIconGrid] = useState27([]);
12689
- const [iconsLoaded, setIconsLoaded] = useState27(false);
12700
+ const [columns, setColumns] = useState28(24);
12701
+ const [iconGrid, setIconGrid] = useState28([]);
12702
+ const [iconsLoaded, setIconsLoaded] = useState28(false);
12690
12703
  const randomSeedRef = useRef17(0);
12691
12704
  useEffect20(() => {
12692
12705
  function calculateColumns() {
@@ -12803,7 +12816,7 @@ function ResponsiveIconsBlock({ loading = false }) {
12803
12816
 
12804
12817
  // src/components/image-cropper.tsx
12805
12818
  init_button2();
12806
- import { useCallback as useCallback15, useState as useState28 } from "react";
12819
+ import { useCallback as useCallback15, useState as useState29 } from "react";
12807
12820
  import Cropper from "react-easy-crop";
12808
12821
 
12809
12822
  // src/components/ui/slider.tsx
@@ -12861,10 +12874,10 @@ var ImageCropper = ({
12861
12874
  maxSizePx = 512,
12862
12875
  className
12863
12876
  }) => {
12864
- const [crop, setCrop] = useState28({ x: 0, y: 0 });
12865
- const [zoom, setZoom] = useState28(1);
12866
- const [rotation, setRotation] = useState28(0);
12867
- const [croppedAreaPixels, setCroppedAreaPixels] = useState28(null);
12877
+ const [crop, setCrop] = useState29({ x: 0, y: 0 });
12878
+ const [zoom, setZoom] = useState29(1);
12879
+ const [rotation, setRotation] = useState29(0);
12880
+ const [croppedAreaPixels, setCroppedAreaPixels] = useState29(null);
12868
12881
  const onCropComplete = useCallback15((_, area) => {
12869
12882
  setCroppedAreaPixels(area);
12870
12883
  }, []);
@@ -13032,7 +13045,7 @@ var ImageCropper = ({
13032
13045
 
13033
13046
  // src/components/media-carousel.tsx
13034
13047
  init_cn();
13035
- import { useState as useState29, useRef as useRef19, useEffect as useEffect22, memo as memo3, useCallback as useCallback16 } from "react";
13048
+ import { useState as useState30, useRef as useRef19, useEffect as useEffect22, memo as memo3, useCallback as useCallback16 } from "react";
13036
13049
  import { Fragment as Fragment13, jsx as jsx96, jsxs as jsxs77 } from "react/jsx-runtime";
13037
13050
  var ChevronLeftIcon = () => /* @__PURE__ */ jsx96("svg", { width: "24", height: "24", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx96("polyline", { points: "15,18 9,12 15,6" }) });
13038
13051
  var ChevronRightIcon = () => /* @__PURE__ */ jsx96("svg", { width: "24", height: "24", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx96("polyline", { points: "9,18 15,12 9,6" }) });
@@ -13042,9 +13055,9 @@ function getYouTubeVideoId(url) {
13042
13055
  return match ? match[1] : null;
13043
13056
  }
13044
13057
  var CarouselYouTubeEmbed = ({ videoId, title }) => {
13045
- const [mounted, setMounted] = useState29(false);
13046
- const [isActivated, setIsActivated] = useState29(false);
13047
- const [isLoaded, setIsLoaded] = useState29(false);
13058
+ const [mounted, setMounted] = useState30(false);
13059
+ const [isActivated, setIsActivated] = useState30(false);
13060
+ const [isLoaded, setIsLoaded] = useState30(false);
13048
13061
  useEffect22(() => {
13049
13062
  setMounted(true);
13050
13063
  }, []);
@@ -13095,10 +13108,10 @@ var MediaCarousel = memo3(function MediaCarousel2({
13095
13108
  autoPlay = false,
13096
13109
  objectFit = "contain"
13097
13110
  }) {
13098
- const [currentIndex, setCurrentIndex] = useState29(0);
13099
- const [touchStart, setTouchStart] = useState29(null);
13100
- const [touchEnd, setTouchEnd] = useState29(null);
13101
- const [playingVideos, setPlayingVideos] = useState29(/* @__PURE__ */ new Set());
13111
+ const [currentIndex, setCurrentIndex] = useState30(0);
13112
+ const [touchStart, setTouchStart] = useState30(null);
13113
+ const [touchEnd, setTouchEnd] = useState30(null);
13114
+ const [playingVideos, setPlayingVideos] = useState30(/* @__PURE__ */ new Set());
13102
13115
  const carouselRef = useRef19(null);
13103
13116
  const thumbnailsRef = useRef19(null);
13104
13117
  if (!media || media.length === 0) {
@@ -15590,15 +15603,15 @@ function evaluateFeatureValue(value, dataType) {
15590
15603
  }
15591
15604
 
15592
15605
  // src/components/made-with-love.tsx
15593
- import { useState as useState30, useEffect as useEffect23 } from "react";
15606
+ import { useState as useState31, useEffect as useEffect23 } from "react";
15594
15607
  import { jsx as jsx126, jsxs as jsxs102 } from "react/jsx-runtime";
15595
15608
  function MadeWithLove({
15596
15609
  className = "",
15597
15610
  size = "md",
15598
15611
  showOnMobile = true
15599
15612
  }) {
15600
- const [isMobile, setIsMobile] = useState30(false);
15601
- const [isHovered, setIsHovered] = useState30(false);
15613
+ const [isMobile, setIsMobile] = useState31(false);
15614
+ const [isHovered, setIsHovered] = useState31(false);
15602
15615
  useEffect23(() => {
15603
15616
  const checkMobile = () => {
15604
15617
  setIsMobile(window.innerWidth < 640);
@@ -16381,7 +16394,7 @@ function ProductReleaseCardSkeleton({ className, size = "default" }) {
16381
16394
  }
16382
16395
 
16383
16396
  // src/components/shared/product-release/release-detail-page.tsx
16384
- import { useState as useState36, useEffect as useEffect27 } from "react";
16397
+ import { useState as useState37, useEffect as useEffect27 } from "react";
16385
16398
  import Link4 from "next/link";
16386
16399
 
16387
16400
  // src/components/layout/article-detail-layout.tsx
@@ -16400,7 +16413,7 @@ function ArticleDetailLayout({ children, schemas }) {
16400
16413
  }
16401
16414
 
16402
16415
  // src/components/ui/release-changelog-section.tsx
16403
- import { useState as useState31 } from "react";
16416
+ import { useState as useState32 } from "react";
16404
16417
 
16405
16418
  // src/components/ui/badge.tsx
16406
16419
  init_cn();
@@ -16440,7 +16453,7 @@ function ReleaseChangelogSection({
16440
16453
  defaultCollapsed = true,
16441
16454
  SimpleMarkdownRenderer: SimpleMarkdownRenderer2
16442
16455
  }) {
16443
- const [collapsed, setCollapsed] = useState31(collapsible ? defaultCollapsed : false);
16456
+ const [collapsed, setCollapsed] = useState32(collapsible ? defaultCollapsed : false);
16444
16457
  if (!entries || entries.length === 0) return null;
16445
16458
  const showEntries = !collapsible || !collapsed;
16446
16459
  return /* @__PURE__ */ jsxs109("div", { className: "space-y-4", children: [
@@ -16475,7 +16488,7 @@ function ReleaseChangelogSection({
16475
16488
  }
16476
16489
 
16477
16490
  // src/components/ui/image-gallery-modal.tsx
16478
- import { useState as useState32, useEffect as useEffect24 } from "react";
16491
+ import { useState as useState33, useEffect as useEffect24 } from "react";
16479
16492
  import { ChevronLeft as ChevronLeft3, ChevronRight as ChevronRight7 } from "lucide-react";
16480
16493
  import Image8 from "next/image";
16481
16494
  import { Fragment as Fragment18, jsx as jsx137, jsxs as jsxs110 } from "react/jsx-runtime";
@@ -16485,7 +16498,7 @@ function ImageGalleryModal({
16485
16498
  onClose,
16486
16499
  initialIndex = 0
16487
16500
  }) {
16488
- const [selectedImageIndex, setSelectedImageIndex] = useState32(initialIndex);
16501
+ const [selectedImageIndex, setSelectedImageIndex] = useState33(initialIndex);
16489
16502
  useEffect24(() => {
16490
16503
  if (isOpen) {
16491
16504
  setSelectedImageIndex(initialIndex);
@@ -16600,7 +16613,7 @@ function ImageGalleryModal({
16600
16613
  import { AlertTriangle, ExternalLink, BookMarked } from "lucide-react";
16601
16614
 
16602
16615
  // src/components/features/youtube-embed.tsx
16603
- import { useState as useState33, useEffect as useEffect25 } from "react";
16616
+ import { useState as useState34, useEffect as useEffect25 } from "react";
16604
16617
  import ReactPlayer from "react-player/youtube";
16605
16618
  import { jsx as jsx138, jsxs as jsxs111 } from "react/jsx-runtime";
16606
16619
  var Play = ({ size = 16, className }) => /* @__PURE__ */ jsx138("svg", { width: size, height: size, fill: "currentColor", viewBox: "0 0 24 24", className, children: /* @__PURE__ */ jsx138("polygon", { points: "5,3 19,12 5,21" }) });
@@ -16622,11 +16635,11 @@ var YouTubeEmbed = ({
16622
16635
  showMeta = true,
16623
16636
  minimalControls = false
16624
16637
  }) => {
16625
- const [isLoading, setIsLoading] = useState33(true);
16626
- const [hasError, setHasError] = useState33(false);
16627
- const [isPlaying, setIsPlaying] = useState33(false);
16628
- const [useIframe, setUseIframe] = useState33(false);
16629
- const [mounted, setMounted] = useState33(false);
16638
+ const [isLoading, setIsLoading] = useState34(true);
16639
+ const [hasError, setHasError] = useState34(false);
16640
+ const [isPlaying, setIsPlaying] = useState34(false);
16641
+ const [useIframe, setUseIframe] = useState34(false);
16642
+ const [mounted, setMounted] = useState34(false);
16630
16643
  useEffect25(() => {
16631
16644
  setMounted(true);
16632
16645
  setUseIframe(true);
@@ -16790,12 +16803,12 @@ var YouTubeLinkParser = ({ href, children }) => {
16790
16803
  };
16791
16804
 
16792
16805
  // src/components/features/video-player.tsx
16793
- import { useState as useState34, useEffect as useEffect26, useRef as useRef21, useMemo as useMemo11, useCallback as useCallback18 } from "react";
16806
+ import { useState as useState35, useEffect as useEffect26, useRef as useRef21, useMemo as useMemo11, useCallback as useCallback18 } from "react";
16794
16807
  import ReactPlayer2 from "react-player";
16795
16808
  init_button2();
16796
16809
  import { jsx as jsx139, jsxs as jsxs112 } from "react/jsx-runtime";
16797
16810
  function useVideoFirstFramePoster(url, enabled) {
16798
- const [poster, setPoster] = useState34(null);
16811
+ const [poster, setPoster] = useState35(null);
16799
16812
  useEffect26(() => {
16800
16813
  if (!enabled || !url) {
16801
16814
  setPoster(null);
@@ -16904,7 +16917,7 @@ function parseSrtTimestamp(ts) {
16904
16917
  }
16905
16918
  function useSubtitleOverlay(srtContent) {
16906
16919
  const cues = useMemo11(() => srtContent ? parseSrt(srtContent) : [], [srtContent]);
16907
- const [activeText, setActiveText] = useState34(null);
16920
+ const [activeText, setActiveText] = useState35(null);
16908
16921
  const updateTime = useCallback18((playedSeconds) => {
16909
16922
  const timeMs = playedSeconds * 1e3;
16910
16923
  const active = cues.find((c) => timeMs >= c.from && timeMs <= c.to);
@@ -16937,26 +16950,26 @@ var VideoPlayer = ({
16937
16950
  subtitleLabel,
16938
16951
  lazyMount = false
16939
16952
  }) => {
16940
- const [hasError, setHasError] = useState34(false);
16941
- const [isPlaying, setIsPlaying] = useState34(autoPlay);
16942
- const [mounted, setMounted] = useState34(false);
16943
- const [hasStarted, setHasStarted] = useState34(autoPlay);
16953
+ const [hasError, setHasError] = useState35(false);
16954
+ const [isPlaying, setIsPlaying] = useState35(autoPlay);
16955
+ const [mounted, setMounted] = useState35(false);
16956
+ const [hasStarted, setHasStarted] = useState35(autoPlay);
16944
16957
  const playerRef = useRef21(null);
16945
16958
  const containerRef = useRef21(null);
16946
- const [played, setPlayed] = useState34(0);
16947
- const [loaded, setLoaded] = useState34(0);
16948
- const [duration, setDuration] = useState34(0);
16949
- const [volume, setVolume] = useState34(0.8);
16950
- const [prevVolume, setPrevVolume] = useState34(0.8);
16951
- const [isMuted, setIsMuted] = useState34(muted);
16952
- const [isBuffering, setIsBuffering] = useState34(false);
16953
- const [showControls, setShowControls] = useState34(true);
16959
+ const [played, setPlayed] = useState35(0);
16960
+ const [loaded, setLoaded] = useState35(0);
16961
+ const [duration, setDuration] = useState35(0);
16962
+ const [volume, setVolume] = useState35(0.8);
16963
+ const [prevVolume, setPrevVolume] = useState35(0.8);
16964
+ const [isMuted, setIsMuted] = useState35(muted);
16965
+ const [isBuffering, setIsBuffering] = useState35(false);
16966
+ const [showControls, setShowControls] = useState35(true);
16954
16967
  const hideTimeoutRef = useRef21(void 0);
16955
16968
  const clickTimerRef = useRef21(void 0);
16956
16969
  const iosFullscreenTimerRef = useRef21(void 0);
16957
16970
  const lazyMountFailureTimerRef = useRef21(void 0);
16958
- const [captionsEnabled, setCaptionsEnabled] = useState34(true);
16959
- const [isFullscreen, setIsFullscreen] = useState34(false);
16971
+ const [captionsEnabled, setCaptionsEnabled] = useState35(true);
16972
+ const [isFullscreen, setIsFullscreen] = useState35(false);
16960
16973
  const { activeText, updateTime, hasCues } = useSubtitleOverlay(srtContent);
16961
16974
  useEffect26(() => {
16962
16975
  const onChange = () => {
@@ -17128,8 +17141,8 @@ var VideoPlayer = ({
17128
17141
  el.addEventListener("keydown", onKey);
17129
17142
  return () => el.removeEventListener("keydown", onKey);
17130
17143
  }, [hasStarted, duration, toggleMute, toggleFullscreen]);
17131
- const [seekPreview, setSeekPreview] = useState34(null);
17132
- const [playbackRate, setPlaybackRate] = useState34(1);
17144
+ const [seekPreview, setSeekPreview] = useState35(null);
17145
+ const [playbackRate, setPlaybackRate] = useState35(1);
17133
17146
  const cycleSpeed = useCallback18(() => {
17134
17147
  setPlaybackRate((prev) => {
17135
17148
  const idx = SPEED_OPTIONS.indexOf(prev);
@@ -17572,7 +17585,7 @@ import React46 from "react";
17572
17585
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
17573
17586
  import { Check as Check2 } from "lucide-react";
17574
17587
  import Link3 from "next/link";
17575
- import React45, { useCallback as useCallback19, useState as useState35 } from "react";
17588
+ import React45, { useCallback as useCallback19, useState as useState36 } from "react";
17576
17589
  init_cn();
17577
17590
  init_button2();
17578
17591
  import { Fragment as Fragment19, jsx as jsx140, jsxs as jsxs113 } from "react/jsx-runtime";
@@ -17813,7 +17826,7 @@ var ActionsMenuDropdown = ({
17813
17826
  side = "bottom",
17814
17827
  sideOffset = 6
17815
17828
  }) => {
17816
- const [open, setOpen] = useState35(false);
17829
+ const [open, setOpen] = useState36(false);
17817
17830
  const handleItemClick = useCallback19(
17818
17831
  (item) => {
17819
17832
  onItemClick?.(item);
@@ -18336,12 +18349,12 @@ function ReleaseDetailPage({
18336
18349
  }) {
18337
18350
  const { data: fetchedRelease, error, isLoading } = useRelease(initialData ? void 0 : slug);
18338
18351
  const release = initialData || fetchedRelease;
18339
- const [galleryOpen, setGalleryOpen] = useState36(false);
18340
- const [galleryIndex, setGalleryIndex] = useState36(0);
18341
- const [roadmapTasks, setRoadmapTasks] = useState36([]);
18342
- const [deliveryData, setDeliveryData] = useState36(null);
18343
- const [roadmapLoading, setRoadmapLoading] = useState36(false);
18344
- const [deliveryLoading, setDeliveryLoading] = useState36(false);
18352
+ const [galleryOpen, setGalleryOpen] = useState37(false);
18353
+ const [galleryIndex, setGalleryIndex] = useState37(0);
18354
+ const [roadmapTasks, setRoadmapTasks] = useState37([]);
18355
+ const [deliveryData, setDeliveryData] = useState37(null);
18356
+ const [roadmapLoading, setRoadmapLoading] = useState37(false);
18357
+ const [deliveryLoading, setDeliveryLoading] = useState37(false);
18345
18358
  useEffect27(() => {
18346
18359
  async function fetchLinkedTasks() {
18347
18360
  if (!release) return;
@@ -18897,7 +18910,7 @@ function CompactPageLoader({
18897
18910
  }
18898
18911
 
18899
18912
  // src/components/ui/progress-bar.tsx
18900
- import { useEffect as useEffect29, useRef as useRef22, useState as useState38 } from "react";
18913
+ import { useEffect as useEffect29, useRef as useRef22, useState as useState39 } from "react";
18901
18914
  import { jsx as jsx152 } from "react/jsx-runtime";
18902
18915
  var ProgressBar = ({
18903
18916
  progress,
@@ -18914,7 +18927,7 @@ var ProgressBar = ({
18914
18927
  const effectiveSegmentWidth = isMdUp ? segmentWidth : mobileSegmentWidth;
18915
18928
  const effectiveHeight = isMdUp ? height : mobileHeight;
18916
18929
  const containerRef = useRef22(null);
18917
- const [segmentCount, setSegmentCount] = useState38(0);
18930
+ const [segmentCount, setSegmentCount] = useState39(0);
18918
18931
  useEffect29(() => {
18919
18932
  if (!containerRef.current) return;
18920
18933
  const resizeObserver = new ResizeObserver(() => {
@@ -20505,7 +20518,7 @@ function TabContent({
20505
20518
 
20506
20519
  // src/components/ui/tab-navigation.tsx
20507
20520
  init_cn();
20508
- import { useState as useState41, useEffect as useEffect32, useMemo as useMemo12, useRef as useRef24, useCallback as useCallback21 } from "react";
20521
+ import { useState as useState42, useEffect as useEffect32, useMemo as useMemo12, useRef as useRef24, useCallback as useCallback21 } from "react";
20509
20522
  import { useSearchParams as useSearchParams3, useRouter as useRouter5, usePathname as usePathname3 } from "next/navigation";
20510
20523
  import { Fragment as Fragment22, jsx as jsx168, jsxs as jsxs137 } from "react/jsx-runtime";
20511
20524
  function TabNavigation({
@@ -20536,7 +20549,7 @@ function TabNavigation({
20536
20549
  }
20537
20550
  return defaultTab || tabs[0]?.id || "";
20538
20551
  };
20539
- const [internalActiveTab, setInternalActiveTab] = useState41(getInitialTab);
20552
+ const [internalActiveTab, setInternalActiveTab] = useState42(getInitialTab);
20540
20553
  const activeTab = isUrlSyncEnabled ? internalActiveTab : controlledActiveTab || "";
20541
20554
  useEffect32(() => {
20542
20555
  if (!isUrlSyncEnabled) return;
@@ -20559,8 +20572,8 @@ function TabNavigation({
20559
20572
  }
20560
20573
  };
20561
20574
  const scrollRef = useRef24(null);
20562
- const [canScrollLeft, setCanScrollLeft] = useState41(false);
20563
- const [canScrollRight, setCanScrollRight] = useState41(false);
20575
+ const [canScrollLeft, setCanScrollLeft] = useState42(false);
20576
+ const [canScrollRight, setCanScrollRight] = useState42(false);
20564
20577
  const updateScrollShadows = useCallback21(() => {
20565
20578
  const el = scrollRef.current;
20566
20579
  if (!el) return;
@@ -20756,11 +20769,11 @@ function StatusIndicator({ status, label, href }) {
20756
20769
 
20757
20770
  // src/components/layout/list-page-layout.tsx
20758
20771
  init_cn();
20759
- import { useEffect as useEffect34, useState as useState43 } from "react";
20772
+ import { useEffect as useEffect34, useState as useState44 } from "react";
20760
20773
 
20761
20774
  // src/components/ui/filter-modal.tsx
20762
20775
  init_cn();
20763
- import { useEffect as useEffect33, useState as useState42 } from "react";
20776
+ import { useEffect as useEffect33, useState as useState43 } from "react";
20764
20777
  init_button2();
20765
20778
 
20766
20779
  // src/components/ui/filter-checkbox-item.tsx
@@ -20956,10 +20969,10 @@ function FilterModal({
20956
20969
  emptyStateTitle = "No filters available",
20957
20970
  emptyStateDescription = "There are no filter options to display at the moment"
20958
20971
  }) {
20959
- const [selectedFilters, setSelectedFilters] = useState42(() => {
20972
+ const [selectedFilters, setSelectedFilters] = useState43(() => {
20960
20973
  return { ...currentFilters };
20961
20974
  });
20962
- const [pendingTags, setPendingTags] = useState42(selectedTags ?? []);
20975
+ const [pendingTags, setPendingTags] = useState43(selectedTags ?? []);
20963
20976
  useEffect33(() => {
20964
20977
  if (isOpen) {
20965
20978
  setSelectedFilters({ ...currentFilters });
@@ -21103,8 +21116,8 @@ function ListPageLayout({
21103
21116
  mobileFilterTitle,
21104
21117
  stickyHeader = false
21105
21118
  }) {
21106
- const [mobileFilterOpen, setMobileFilterOpen] = useState43(false);
21107
- const [localSearchValue, setLocalSearchValue] = useState43(searchValue);
21119
+ const [mobileFilterOpen, setMobileFilterOpen] = useState44(false);
21120
+ const [localSearchValue, setLocalSearchValue] = useState44(searchValue);
21108
21121
  const debouncedSearchValue = useDebounce(localSearchValue, 500);
21109
21122
  useEffect34(() => {
21110
21123
  setLocalSearchValue(searchValue);
@@ -22647,7 +22660,7 @@ function OrganizationCard({
22647
22660
 
22648
22661
  // src/components/ui/service-card.tsx
22649
22662
  init_cn();
22650
- import { useMemo as useMemo15, useState as useState45 } from "react";
22663
+ import { useMemo as useMemo15, useState as useState46 } from "react";
22651
22664
  import { ExternalLink as ExternalLink3 } from "lucide-react";
22652
22665
 
22653
22666
  // src/components/logs-list.tsx
@@ -22951,7 +22964,7 @@ function ServiceCard({ title, subtitle, icon, tag, rows, className }) {
22951
22964
  ] });
22952
22965
  }
22953
22966
  function ServiceCardRowItem({ row }) {
22954
- const [revealed, setRevealed] = useState45(false);
22967
+ const [revealed, setRevealed] = useState46(false);
22955
22968
  const { copy, copied } = useCopyToClipboard();
22956
22969
  const actions = useMemo15(() => ({ copy: true, open: !!row.href, reveal: !!row.isSecret, ...row.actions }), [row]);
22957
22970
  const displayValue = row.isSecret ? /* @__PURE__ */ jsx201(MaskedValue, { value: row.value, isRevealed: revealed }) : /* @__PURE__ */ jsx201("span", { children: row.value });
@@ -24252,7 +24265,7 @@ import { useMemo as useMemo16 } from "react";
24252
24265
 
24253
24266
  // src/components/ui/query-report-table/query-report-table-header.tsx
24254
24267
  init_cn();
24255
- import { useRef as useRef28, useState as useState46, useCallback as useCallback22 } from "react";
24268
+ import { useRef as useRef28, useState as useState47, useCallback as useCallback22 } from "react";
24256
24269
  import { jsx as jsx217, jsxs as jsxs176 } from "react/jsx-runtime";
24257
24270
  function QueryReportTableHeader({
24258
24271
  columns,
@@ -24282,7 +24295,7 @@ function QueryReportTableHeader({
24282
24295
  }
24283
24296
  function TruncatedHeaderCell({ value, width }) {
24284
24297
  const textRef = useRef28(null);
24285
- const [isTruncated, setIsTruncated] = useState46(false);
24298
+ const [isTruncated, setIsTruncated] = useState47(false);
24286
24299
  const checkTruncation = useCallback22(() => {
24287
24300
  const el = textRef.current;
24288
24301
  if (el) {
@@ -24311,7 +24324,7 @@ function TruncatedHeaderCell({ value, width }) {
24311
24324
 
24312
24325
  // src/components/ui/query-report-table/query-report-table-row.tsx
24313
24326
  init_cn();
24314
- import { useRef as useRef29, useState as useState47, useCallback as useCallback23 } from "react";
24327
+ import { useRef as useRef29, useState as useState48, useCallback as useCallback23 } from "react";
24315
24328
  import { jsx as jsx218, jsxs as jsxs177 } from "react/jsx-runtime";
24316
24329
  function QueryReportTableRow({
24317
24330
  row,
@@ -24358,7 +24371,7 @@ function QueryReportTableRow({
24358
24371
  }
24359
24372
  function TruncatedCell({ value, className }) {
24360
24373
  const textRef = useRef29(null);
24361
- const [isTruncated, setIsTruncated] = useState47(false);
24374
+ const [isTruncated, setIsTruncated] = useState48(false);
24362
24375
  const checkTruncation = useCallback23(() => {
24363
24376
  const el = textRef.current;
24364
24377
  if (el) {
@@ -25231,7 +25244,7 @@ var DataTable = Object.assign(DataTableRoot, {
25231
25244
  });
25232
25245
 
25233
25246
  // src/components/ui/phone-input.tsx
25234
- import { useCallback as useCallback26, useEffect as useEffect37, useMemo as useMemo18, useRef as useRef31, useState as useState48 } from "react";
25247
+ import { useCallback as useCallback26, useEffect as useEffect37, useMemo as useMemo18, useRef as useRef31, useState as useState49 } from "react";
25235
25248
  import { jsx as jsx230, jsxs as jsxs188 } from "react/jsx-runtime";
25236
25249
  function PhoneInput({
25237
25250
  value,
@@ -25248,7 +25261,7 @@ function PhoneInput({
25248
25261
  () => [...priority, ...others].find((c) => c.code === countryCode),
25249
25262
  [countryCode, priority, others]
25250
25263
  );
25251
- const [isInvalid, setIsInvalid] = useState48(false);
25264
+ const [isInvalid, setIsInvalid] = useState49(false);
25252
25265
  const debounceRef = useRef31(null);
25253
25266
  const digitCount = useCallback26((val) => val.replace(/[^0-9]/g, "").length, []);
25254
25267
  const runValidation = useCallback26((phone) => {
@@ -25829,7 +25842,7 @@ function FilterList({
25829
25842
  import {
25830
25843
  useEffect as useEffect39,
25831
25844
  useRef as useRef33,
25832
- useState as useState50
25845
+ useState as useState51
25833
25846
  } from "react";
25834
25847
  init_cn();
25835
25848
  import { jsx as jsx233, jsxs as jsxs191 } from "react/jsx-runtime";
@@ -25866,7 +25879,7 @@ function TagSearchInput({
25866
25879
  const wrapperRef = useRef33(null);
25867
25880
  const hiddenTagsRef = useRef33(null);
25868
25881
  const hiddenTagsPopupRef = useRef33(null);
25869
- const [showHiddenTags, setShowHiddenTags] = useState50(false);
25882
+ const [showHiddenTags, setShowHiddenTags] = useState51(false);
25870
25883
  useEffect39(() => {
25871
25884
  if (!showHiddenTags) return;
25872
25885
  const handleClick = (e) => {
@@ -26023,7 +26036,7 @@ function TagSearchInput({
26023
26036
 
26024
26037
  // src/components/ui/markdown-editor.tsx
26025
26038
  init_cn();
26026
- import { useRef as useRef34, useCallback as useCallback27, useState as useState51, useEffect as useEffect40 } from "react";
26039
+ import { useRef as useRef34, useCallback as useCallback27, useState as useState52, useEffect as useEffect40 } from "react";
26027
26040
  import dynamic from "next/dynamic";
26028
26041
  import { Loader2 as Loader23, Upload as Upload2 } from "lucide-react";
26029
26042
  import { jsx as jsx234, jsxs as jsxs192 } from "react/jsx-runtime";
@@ -26079,9 +26092,9 @@ function MarkdownEditor({
26079
26092
  renderPreview
26080
26093
  }) {
26081
26094
  const fileInputRef = useRef34(null);
26082
- const [isUploading, setIsUploading] = useState51(false);
26083
- const [uploadProgress, setUploadProgress] = useState51("");
26084
- const [defaultExtraCommands, setDefaultExtraCommands] = useState51([]);
26095
+ const [isUploading, setIsUploading] = useState52(false);
26096
+ const [uploadProgress, setUploadProgress] = useState52("");
26097
+ const [defaultExtraCommands, setDefaultExtraCommands] = useState52([]);
26085
26098
  useEffect40(() => {
26086
26099
  import("@uiw/react-md-editor").then((mod) => {
26087
26100
  if (mod.commands?.getExtraCommands) {
@@ -27485,8 +27498,8 @@ function ArrayEntryManager({
27485
27498
  renderLabel,
27486
27499
  isSaving = false
27487
27500
  }) {
27488
- const [draftItems, setDraftItems] = useState57(items);
27489
- const [isDirty, setIsDirty] = useState57(false);
27501
+ const [draftItems, setDraftItems] = useState58(items);
27502
+ const [isDirty, setIsDirty] = useState58(false);
27490
27503
  useEffect43(() => {
27491
27504
  if (!isDirty && !isSaving) {
27492
27505
  setDraftItems(items);
@@ -27602,7 +27615,7 @@ function ArrayEntryManager({
27602
27615
 
27603
27616
  // src/components/features/provider-button.tsx
27604
27617
  init_button2();
27605
- import { useState as useState58 } from "react";
27618
+ import { useState as useState59 } from "react";
27606
27619
  import { jsx as jsx245 } from "react/jsx-runtime";
27607
27620
  var PROVIDER_CONFIG = {
27608
27621
  microsoft: {
@@ -27623,7 +27636,7 @@ var PROVIDER_CONFIG = {
27623
27636
  }
27624
27637
  };
27625
27638
  function ProviderButton({ provider, onClick, disabled = false, loading = false }) {
27626
- const [internalLoading, setInternalLoading] = useState58(false);
27639
+ const [internalLoading, setInternalLoading] = useState59(false);
27627
27640
  const config = PROVIDER_CONFIG[provider];
27628
27641
  const IconComponent = config.icon;
27629
27642
  const isLoading = loading || internalLoading;
@@ -27707,7 +27720,7 @@ function AuthProvidersList({
27707
27720
 
27708
27721
  // src/components/features/changelog-manager.tsx
27709
27722
  import { Trash2 as Trash23, Plus as Plus3, ChevronDown as ChevronDown7, ChevronUp as ChevronUp3, Eye, EyeOff } from "lucide-react";
27710
- import { useState as useState59, useEffect as useEffect44 } from "react";
27723
+ import { useState as useState60, useEffect as useEffect44 } from "react";
27711
27724
  import { jsx as jsx247, jsxs as jsxs204 } from "react/jsx-runtime";
27712
27725
  function ChangelogManager({
27713
27726
  title,
@@ -27717,7 +27730,7 @@ function ChangelogManager({
27717
27730
  expandAll = false,
27718
27731
  showVisibilityToggle = false
27719
27732
  }) {
27720
- const [expandedIndices, setExpandedIndices] = useState59(/* @__PURE__ */ new Set());
27733
+ const [expandedIndices, setExpandedIndices] = useState60(/* @__PURE__ */ new Set());
27721
27734
  useEffect44(() => {
27722
27735
  if (expandAll && entries.length > 0) {
27723
27736
  setExpandedIndices(new Set(entries.map((_, i) => i)));
@@ -28030,7 +28043,7 @@ var ErrorBoundary = class extends Component {
28030
28043
 
28031
28044
  // src/components/features/figma-prototype-viewer.tsx
28032
28045
  init_cn();
28033
- import { useState as useState60, useRef as useRef37, useEffect as useEffect45, useCallback as useCallback29, useMemo as useMemo22 } from "react";
28046
+ import { useState as useState61, useRef as useRef37, useEffect as useEffect45, useCallback as useCallback29, useMemo as useMemo22 } from "react";
28034
28047
 
28035
28048
  // src/components/features/section-selector.tsx
28036
28049
  init_cn();
@@ -28403,23 +28416,23 @@ var FigmaPrototypeViewer = ({
28403
28416
  const containerRef = useRef37(null);
28404
28417
  const navTimerRef = useRef37(null);
28405
28418
  const touchTimerRef = useRef37(null);
28406
- const [screenWidth, setScreenWidth] = useState60(
28419
+ const [screenWidth, setScreenWidth] = useState61(
28407
28420
  typeof window !== "undefined" ? window.innerWidth : DESKTOP_BREAKPOINT
28408
28421
  );
28409
- const [isTouchDevice, setIsTouchDevice] = useState60(() => {
28422
+ const [isTouchDevice, setIsTouchDevice] = useState61(() => {
28410
28423
  if (typeof window === "undefined") return false;
28411
28424
  return "ontouchstart" in window;
28412
28425
  });
28413
- const [iframeState, setIframeState] = useState60("INITIAL");
28414
- const [iframeKey, setIframeKey] = useState60(0);
28415
- const [isInitialized, setIsInitialized] = useState60(false);
28416
- const [currentNodeId, setCurrentNodeId] = useState60(null);
28417
- const [internalActiveSection, setInternalActiveSection] = useState60(
28426
+ const [iframeState, setIframeState] = useState61("INITIAL");
28427
+ const [iframeKey, setIframeKey] = useState61(0);
28428
+ const [isInitialized, setIsInitialized] = useState61(false);
28429
+ const [currentNodeId, setCurrentNodeId] = useState61(null);
28430
+ const [internalActiveSection, setInternalActiveSection] = useState61(
28418
28431
  config.defaultSectionId || config.sections[0]?.id || ""
28419
28432
  );
28420
28433
  const activeSection = externalActiveSection || internalActiveSection;
28421
- const [isNavigating, setIsNavigating] = useState60(false);
28422
- const [containerDimensions, setContainerDimensions] = useState60({ width: 1200, height: 800 });
28434
+ const [isNavigating, setIsNavigating] = useState61(false);
28435
+ const [containerDimensions, setContainerDimensions] = useState61({ width: 1200, height: 800 });
28423
28436
  const viewMode = useMemo22(
28424
28437
  () => getViewMode(screenWidth, isTouchDevice),
28425
28438
  [screenWidth, isTouchDevice]
@@ -28481,7 +28494,7 @@ var FigmaPrototypeViewer = ({
28481
28494
  window.addEventListener("resize", handleResize);
28482
28495
  return () => window.removeEventListener("resize", handleResize);
28483
28496
  }, []);
28484
- const [lastViewMode, setLastViewMode] = useState60(viewMode);
28497
+ const [lastViewMode, setLastViewMode] = useState61(viewMode);
28485
28498
  useEffect45(() => {
28486
28499
  if (lastViewMode !== viewMode && iframeState === "READY") {
28487
28500
  console.log("[ViewMode Change]", lastViewMode, "\u2192", viewMode);
@@ -28693,7 +28706,7 @@ var FigmaPrototypeViewer = ({
28693
28706
 
28694
28707
  // src/components/features/filters-dropdown.tsx
28695
28708
  init_cn();
28696
- import { useEffect as useEffect46, useRef as useRef38, useState as useState61 } from "react";
28709
+ import { useEffect as useEffect46, useRef as useRef38, useState as useState62 } from "react";
28697
28710
  import { jsx as jsx253, jsxs as jsxs209 } from "react/jsx-runtime";
28698
28711
  var FilterCheckbox = ({ checked, disabled = false, className }) => {
28699
28712
  return /* @__PURE__ */ jsx253(
@@ -28725,11 +28738,11 @@ var FiltersDropdown = ({
28725
28738
  placement = "bottom-start",
28726
28739
  responsive = true
28727
28740
  }) => {
28728
- const [isOpen, setIsOpen] = useState61(false);
28729
- const [shouldRender, setShouldRender] = useState61(false);
28730
- const [isVisible, setIsVisible] = useState61(false);
28731
- const [isMobile, setIsMobile] = useState61(false);
28732
- const [actualPlacement, setActualPlacement] = useState61(placement);
28741
+ const [isOpen, setIsOpen] = useState62(false);
28742
+ const [shouldRender, setShouldRender] = useState62(false);
28743
+ const [isVisible, setIsVisible] = useState62(false);
28744
+ const [isMobile, setIsMobile] = useState62(false);
28745
+ const [actualPlacement, setActualPlacement] = useState62(placement);
28733
28746
  const dropdownRef = useRef38(null);
28734
28747
  const triggerRef = useRef38(null);
28735
28748
  const containerRef = useRef38(null);
@@ -28787,7 +28800,7 @@ var FiltersDropdown = ({
28787
28800
  window.addEventListener("resize", calculateOptimalPlacement);
28788
28801
  return () => window.removeEventListener("resize", calculateOptimalPlacement);
28789
28802
  }, [isOpen, isMobile, placement]);
28790
- const [selectedFilters, setSelectedFilters] = useState61(() => {
28803
+ const [selectedFilters, setSelectedFilters] = useState62(() => {
28791
28804
  if (currentFilters) {
28792
28805
  return { ...currentFilters };
28793
28806
  }
@@ -29007,7 +29020,7 @@ var FiltersDropdown = ({
29007
29020
  ] });
29008
29021
  };
29009
29022
  var useFiltersDropdown = (initialSections) => {
29010
- const [appliedFilters, setAppliedFilters] = useState61(() => {
29023
+ const [appliedFilters, setAppliedFilters] = useState62(() => {
29011
29024
  const initial = {};
29012
29025
  initialSections.forEach((section) => {
29013
29026
  if (section.defaultSelected) {
@@ -29086,12 +29099,12 @@ function KnowledgeBaseLinksManager({
29086
29099
  }
29087
29100
 
29088
29101
  // src/components/features/loading-provider.tsx
29089
- import { createContext as createContext7, useContext as useContext7, useState as useState62, useEffect as useEffect47 } from "react";
29102
+ import { createContext as createContext7, useContext as useContext7, useState as useState63, useEffect as useEffect47 } from "react";
29090
29103
  import { jsx as jsx256, jsxs as jsxs210 } from "react/jsx-runtime";
29091
29104
  var LoadingContext = createContext7(void 0);
29092
29105
  function LoadingProvider({ children }) {
29093
- const [isLoading, setIsLoading] = useState62(false);
29094
- const [progress, setProgress] = useState62(0);
29106
+ const [isLoading, setIsLoading] = useState63(false);
29107
+ const [progress, setProgress] = useState63(0);
29095
29108
  useEffect47(() => {
29096
29109
  let interval;
29097
29110
  if (isLoading) {
@@ -29137,7 +29150,7 @@ function useLoading() {
29137
29150
  }
29138
29151
 
29139
29152
  // src/components/features/media-gallery-manager.tsx
29140
- import { useState as useState63, useRef as useRef39, useCallback as useCallback30 } from "react";
29153
+ import { useState as useState64, useRef as useRef39, useCallback as useCallback30 } from "react";
29141
29154
  import {
29142
29155
  Upload as Upload3,
29143
29156
  Image as ImageIcon2,
@@ -29159,8 +29172,8 @@ function MediaGalleryManager({
29159
29172
  className = ""
29160
29173
  }) {
29161
29174
  const fileInputRef = useRef39(null);
29162
- const [deletingIndex, setDeletingIndex] = useState63(null);
29163
- const [draggedIndex, setDraggedIndex] = useState63(null);
29175
+ const [deletingIndex, setDeletingIndex] = useState64(null);
29176
+ const [draggedIndex, setDraggedIndex] = useState64(null);
29164
29177
  const handleFileSelect = useCallback30(async (event) => {
29165
29178
  const file = event.target.files?.[0];
29166
29179
  if (!file) return;
@@ -29370,7 +29383,7 @@ function OSTypeBadgeGroup({
29370
29383
  }
29371
29384
 
29372
29385
  // src/components/features/parallax-image-showcase.tsx
29373
- import { useEffect as useEffect48, useState as useState64, useRef as useRef40 } from "react";
29386
+ import { useEffect as useEffect48, useState as useState65, useRef as useRef40 } from "react";
29374
29387
  import Image12 from "next/image";
29375
29388
  import { motion as motion2, useScroll, useTransform, useMotionValue, useSpring } from "framer-motion";
29376
29389
  import { jsx as jsx260, jsxs as jsxs213 } from "react/jsx-runtime";
@@ -29389,7 +29402,7 @@ var ParallaxImageShowcase = ({
29389
29402
  const springConfig = { stiffness: 100, damping: 30 };
29390
29403
  const mouseXSpring = useSpring(mouseX, springConfig);
29391
29404
  const mouseYSpring = useSpring(mouseY, springConfig);
29392
- const [componentRect, setComponentRect] = useState64(null);
29405
+ const [componentRect, setComponentRect] = useState65(null);
29393
29406
  const componentRef = useRef40(null);
29394
29407
  useEffect48(() => {
29395
29408
  const updateRect = () => {
@@ -30049,7 +30062,7 @@ function PushButtonSelector({
30049
30062
  }
30050
30063
 
30051
30064
  // src/components/features/release-media-manager.tsx
30052
- import { useState as useState65, useRef as useRef41 } from "react";
30065
+ import { useState as useState66, useRef as useRef41 } from "react";
30053
30066
  import { Trash2 as Trash25, Plus as Plus5, Image as ImageIcon3, Video as Video4, Upload as Upload4, Loader2 as Loader28, GripVertical as GripVertical2 } from "lucide-react";
30054
30067
  import Image13 from "next/image";
30055
30068
  import { jsx as jsx265, jsxs as jsxs218 } from "react/jsx-runtime";
@@ -30060,7 +30073,7 @@ function ReleaseMediaManager({
30060
30073
  className = ""
30061
30074
  }) {
30062
30075
  const fileInputRef = useRef41(null);
30063
- const [uploadingIndex, setUploadingIndex] = useState65(null);
30076
+ const [uploadingIndex, setUploadingIndex] = useState66(null);
30064
30077
  const handleFileSelect = async (event) => {
30065
30078
  const file = event.target.files?.[0];
30066
30079
  if (!file) return;
@@ -30321,7 +30334,7 @@ var SelectButton = React93.forwardRef(
30321
30334
  SelectButton.displayName = "SelectButton";
30322
30335
 
30323
30336
  // src/components/features/seo-editor-preview.tsx
30324
- import { useState as useState66 } from "react";
30337
+ import { useState as useState67 } from "react";
30325
30338
  import { Globe as Globe3, ExternalLink as ExternalLink5, Upload as Upload5, X as X11, Loader2 as Loader29, Sparkles as Sparkles2 } from "lucide-react";
30326
30339
  import Image14 from "next/image";
30327
30340
  import { Fragment as Fragment39, jsx as jsx267, jsxs as jsxs220 } from "react/jsx-runtime";
@@ -30345,9 +30358,9 @@ function SEOEditorPreview({
30345
30358
  disabled = false,
30346
30359
  className = ""
30347
30360
  }) {
30348
- const [imageError, setImageError] = useState66(false);
30349
- const [isUploading, setIsUploading] = useState66(false);
30350
- const [fileInputRef, setFileInputRef] = useState66(null);
30361
+ const [imageError, setImageError] = useState67(false);
30362
+ const [isUploading, setIsUploading] = useState67(false);
30363
+ const [fileInputRef, setFileInputRef] = useState67(null);
30351
30364
  const displayTitle = seoTitle.trim() || title || "Untitled";
30352
30365
  const displayDescription = seoDescription.trim() || summary || "No description";
30353
30366
  const hasOgImage = ogImageUrl.trim();
@@ -30791,7 +30804,7 @@ function StatusFilterComponent({
30791
30804
  }
30792
30805
 
30793
30806
  // src/components/features/tags-selector.tsx
30794
- import { useState as useState67 } from "react";
30807
+ import { useState as useState68 } from "react";
30795
30808
  import { Search as Search2, X as X12, Plus as Plus6, Loader2 as Loader210 } from "lucide-react";
30796
30809
  import { jsx as jsx271, jsxs as jsxs223 } from "react/jsx-runtime";
30797
30810
  function TagsSelector({
@@ -30805,9 +30818,9 @@ function TagsSelector({
30805
30818
  disabled = false,
30806
30819
  allowCreate = true
30807
30820
  }) {
30808
- const [searchQuery, setSearchQuery] = useState67("");
30809
- const [showDropdown, setShowDropdown] = useState67(false);
30810
- const [isCreating, setIsCreating] = useState67(false);
30821
+ const [searchQuery, setSearchQuery] = useState68("");
30822
+ const [showDropdown, setShowDropdown] = useState68(false);
30823
+ const [isCreating, setIsCreating] = useState68(false);
30811
30824
  const handleTagAdd = (tagId) => {
30812
30825
  if (!selectedTagIds.includes(tagId) && selectedTagIds.length < maxTags) {
30813
30826
  onTagsChange([...selectedTagIds, tagId]);
@@ -30973,7 +30986,7 @@ function TagsSelector({
30973
30986
 
30974
30987
  // src/components/features/video-source-selector.tsx
30975
30988
  init_button2();
30976
- import { useState as useState68, useCallback as useCallback31 } from "react";
30989
+ import { useState as useState69, useCallback as useCallback31 } from "react";
30977
30990
  import { Upload as Upload6, Sparkles as Sparkles3, X as X13, Video as Video5 } from "lucide-react";
30978
30991
  import { jsx as jsx272, jsxs as jsxs224 } from "react/jsx-runtime";
30979
30992
  function VideoSourceSelector({
@@ -30998,10 +31011,10 @@ function VideoSourceSelector({
30998
31011
  showTitle = true,
30999
31012
  className = ""
31000
31013
  }) {
31001
- const [isUploading, setIsUploading] = useState68(false);
31002
- const [uploadProgress, setUploadProgress] = useState68(0);
31003
- const [uploadMessage, setUploadMessage] = useState68("");
31004
- const [uploadError, setUploadError] = useState68(null);
31014
+ const [isUploading, setIsUploading] = useState69(false);
31015
+ const [uploadProgress, setUploadProgress] = useState69(0);
31016
+ const [uploadMessage, setUploadMessage] = useState69("");
31017
+ const [uploadError, setUploadError] = useState69(null);
31005
31018
  const handleUploadClick = useCallback31(() => {
31006
31019
  const input = document.createElement("input");
31007
31020
  input.type = "file";
@@ -31352,7 +31365,7 @@ function TranscriptSummaryEditor({
31352
31365
  }
31353
31366
 
31354
31367
  // src/components/features/highlight-video-section.tsx
31355
- import { useState as useState69 } from "react";
31368
+ import { useState as useState70 } from "react";
31356
31369
  import { Sparkles as Sparkles5, Upload as Upload7 } from "lucide-react";
31357
31370
  init_button2();
31358
31371
 
@@ -31651,7 +31664,7 @@ function HighlightVideoSection({
31651
31664
  disabled = false,
31652
31665
  className = ""
31653
31666
  }) {
31654
- const [uploadError, setUploadError] = useState69(null);
31667
+ const [uploadError, setUploadError] = useState70(null);
31655
31668
  const handleUploadClick = () => {
31656
31669
  const input = document.createElement("input");
31657
31670
  input.type = "file";
@@ -32495,7 +32508,7 @@ function ViewToggle({
32495
32508
 
32496
32509
  // src/components/features/policy-configuration-panel.tsx
32497
32510
  init_cn();
32498
- import { useRef as useRef42, useEffect as useEffect49, useState as useState70 } from "react";
32511
+ import { useRef as useRef42, useEffect as useEffect49, useState as useState71 } from "react";
32499
32512
  import { ChevronDown as ChevronDown8 } from "lucide-react";
32500
32513
  init_button2();
32501
32514
 
@@ -32676,7 +32689,7 @@ var PolicyRow = ({ policy, categoryId, editMode, onPermissionChange }) => {
32676
32689
  ] });
32677
32690
  };
32678
32691
  var useAnimatedHeight = (isExpanded) => {
32679
- const [height, setHeight] = useState70(0);
32692
+ const [height, setHeight] = useState71(0);
32680
32693
  const contentRef = useRef42(null);
32681
32694
  useEffect49(() => {
32682
32695
  if (contentRef.current) {
@@ -32834,7 +32847,7 @@ PolicyConfigurationPanel.displayName = "PolicyConfigurationPanel";
32834
32847
  init_button2();
32835
32848
  init_cn();
32836
32849
  import { getCountries as getCountries2 } from "libphonenumber-js";
32837
- import { useEffect as useEffect50, useState as useState71 } from "react";
32850
+ import { useEffect as useEffect50, useState as useState72 } from "react";
32838
32851
  import { Fragment as Fragment41, jsx as jsx292, jsxs as jsxs240 } from "react/jsx-runtime";
32839
32852
  function WaitlistForm({
32840
32853
  id = "waitlist-form",
@@ -32854,14 +32867,14 @@ function WaitlistForm({
32854
32867
  privacyPolicyUrl,
32855
32868
  consentText = "I agree to receive recurring automated text messages at the phone number provided. Msg & data rates may apply. Msg frequency varies. Reply HELP for help and STOP to cancel."
32856
32869
  }) {
32857
- const [email, setEmail] = useState71(defaultEmail);
32858
- const [phone, setPhone] = useState71(defaultPhone);
32859
- const [countryCode, setCountryCode] = useState71("US");
32870
+ const [email, setEmail] = useState72(defaultEmail);
32871
+ const [phone, setPhone] = useState72(defaultPhone);
32872
+ const [countryCode, setCountryCode] = useState72("US");
32860
32873
  const { toast } = useToast();
32861
- const [smsConsent, setSmsConsent] = useState71(false);
32862
- const [isClient, setIsClient] = useState71(false);
32863
- const [isPhoneInvalid, setIsPhoneInvalid] = useState71(false);
32864
- const [showConsentError, setShowConsentError] = useState71(false);
32874
+ const [smsConsent, setSmsConsent] = useState72(false);
32875
+ const [isClient, setIsClient] = useState72(false);
32876
+ const [isPhoneInvalid, setIsPhoneInvalid] = useState72(false);
32877
+ const [showConsentError, setShowConsentError] = useState72(false);
32865
32878
  const isMailDomainGeneric = hasGenericEmailDomain(email);
32866
32879
  useEffect50(() => {
32867
32880
  if (defaultEmail) {
@@ -33441,13 +33454,13 @@ function EmptyState3() {
33441
33454
  }
33442
33455
 
33443
33456
  // src/components/features/board/use-board-collapse.ts
33444
- import { useCallback as useCallback33, useState as useState72 } from "react";
33457
+ import { useCallback as useCallback33, useState as useState73 } from "react";
33445
33458
  function useBoardCollapse(storageKey) {
33446
33459
  const [persisted, setPersisted] = useLocalStorage(
33447
33460
  storageKey ?? "__board_collapse_unused__",
33448
33461
  {}
33449
33462
  );
33450
- const [memory, setMemory] = useState72({});
33463
+ const [memory, setMemory] = useState73({});
33451
33464
  const collapsed = storageKey ? persisted : memory;
33452
33465
  const setMap = storageKey ? setPersisted : setMemory;
33453
33466
  const toggle = useCallback33(
@@ -34329,4 +34342,4 @@ export {
34329
34342
  TMCG_SOCIAL_PLATFORMS,
34330
34343
  assets
34331
34344
  };
34332
- //# sourceMappingURL=chunk-J3ZCNPDM.js.map
34345
+ //# sourceMappingURL=chunk-KCKMK4UF.js.map