@flamingo-stack/openframe-frontend-core 0.0.534 → 0.0.535-1763.4621.1

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.
Files changed (127) hide show
  1. package/dist/{chunk-NCUKKJRG.cjs → chunk-2P4J2YLI.cjs} +98 -98
  2. package/dist/{chunk-NCUKKJRG.cjs.map → chunk-2P4J2YLI.cjs.map} +1 -1
  3. package/dist/{chunk-GS4HJA2G.js → chunk-4A736Z6S.js} +74 -20
  4. package/dist/chunk-4A736Z6S.js.map +1 -0
  5. package/dist/{chunk-O6VJZX2N.js → chunk-4DTUUM5V.js} +95 -58
  6. package/dist/chunk-4DTUUM5V.js.map +1 -0
  7. package/dist/{chunk-UWB33C6R.cjs → chunk-4HQFV4PK.cjs} +14 -14
  8. package/dist/{chunk-UWB33C6R.cjs.map → chunk-4HQFV4PK.cjs.map} +1 -1
  9. package/dist/{chunk-GYONSC3U.cjs → chunk-4QYUNDS3.cjs} +3 -3
  10. package/dist/{chunk-GYONSC3U.cjs.map → chunk-4QYUNDS3.cjs.map} +1 -1
  11. package/dist/{chunk-M5ODB6RQ.cjs → chunk-5OLF6WXF.cjs} +40 -40
  12. package/dist/{chunk-M5ODB6RQ.cjs.map → chunk-5OLF6WXF.cjs.map} +1 -1
  13. package/dist/{chunk-SXLEPNY2.cjs → chunk-5RJUHUCI.cjs} +106 -52
  14. package/dist/chunk-5RJUHUCI.cjs.map +1 -0
  15. package/dist/{chunk-RHKH4YUY.cjs → chunk-7MHYRBBQ.cjs} +5 -5
  16. package/dist/{chunk-RHKH4YUY.cjs.map → chunk-7MHYRBBQ.cjs.map} +1 -1
  17. package/dist/{chunk-LYRGM25P.cjs → chunk-E3YB55RR.cjs} +223 -186
  18. package/dist/chunk-E3YB55RR.cjs.map +1 -0
  19. package/dist/{chunk-W4MXOBEW.js → chunk-EHPQKXXW.js} +3 -3
  20. package/dist/{chunk-LBZEPB4Y.cjs → chunk-GV4FDDFV.cjs} +18 -18
  21. package/dist/{chunk-LBZEPB4Y.cjs.map → chunk-GV4FDDFV.cjs.map} +1 -1
  22. package/dist/{chunk-D62VYSTL.js → chunk-JVO5CYMK.js} +8 -8
  23. package/dist/{chunk-BSE2UT6L.js → chunk-K6566PEB.js} +3 -3
  24. package/dist/{chunk-WBYRBTAS.js → chunk-KLFGP6PR.js} +2 -2
  25. package/dist/{chunk-KZ6PWFHK.js → chunk-LIQJAC6Z.js} +2 -2
  26. package/dist/{chunk-MTCU5MQN.js → chunk-LIX5OUHH.js} +2 -2
  27. package/dist/{chunk-RCBRCZUF.js → chunk-LQPHB2YF.js} +2 -2
  28. package/dist/{chunk-BUVD2OAI.js → chunk-MZVFZMQ6.js} +6 -6
  29. package/dist/{chunk-ZLLXYE2G.js → chunk-N3AEJTCK.js} +5 -5
  30. package/dist/{chunk-ONIYUMTO.js → chunk-NB6BP6JB.js} +3 -3
  31. package/dist/{chunk-ZKQXE2P4.cjs → chunk-P65EZEBW.cjs} +12 -12
  32. package/dist/{chunk-ZKQXE2P4.cjs.map → chunk-P65EZEBW.cjs.map} +1 -1
  33. package/dist/{chunk-VYOGAQLM.js → chunk-PLGITXT7.js} +2 -2
  34. package/dist/{chunk-YW2ZU7LC.cjs → chunk-PSBL3S2B.cjs} +7 -7
  35. package/dist/{chunk-YW2ZU7LC.cjs.map → chunk-PSBL3S2B.cjs.map} +1 -1
  36. package/dist/{chunk-H4W4LENJ.js → chunk-QUVIT4JP.js} +6 -6
  37. package/dist/{chunk-2YJ2CVRC.cjs → chunk-RO67OOKJ.cjs} +40 -40
  38. package/dist/{chunk-2YJ2CVRC.cjs.map → chunk-RO67OOKJ.cjs.map} +1 -1
  39. package/dist/{chunk-67MWXMNT.cjs → chunk-TS2EHMEX.cjs} +29 -29
  40. package/dist/{chunk-67MWXMNT.cjs.map → chunk-TS2EHMEX.cjs.map} +1 -1
  41. package/dist/{chunk-UMDGRL6A.cjs → chunk-U2Q7GEX2.cjs} +32 -32
  42. package/dist/{chunk-UMDGRL6A.cjs.map → chunk-U2Q7GEX2.cjs.map} +1 -1
  43. package/dist/{chunk-2ALT6CTY.js → chunk-VPDTDKO5.js} +2 -2
  44. package/dist/{chunk-MLILEBJU.cjs → chunk-Y55XQFJK.cjs} +75 -75
  45. package/dist/{chunk-MLILEBJU.cjs.map → chunk-Y55XQFJK.cjs.map} +1 -1
  46. package/dist/{chunk-POFCTXNH.js → chunk-Y72MXG5N.js} +4 -4
  47. package/dist/{chunk-JELZAWSM.cjs → chunk-ZKKEKG73.cjs} +3 -3
  48. package/dist/{chunk-JELZAWSM.cjs.map → chunk-ZKKEKG73.cjs.map} +1 -1
  49. package/dist/{chunk-EBSZWSC5.cjs → chunk-ZR5CJTNR.cjs} +4 -4
  50. package/dist/{chunk-EBSZWSC5.cjs.map → chunk-ZR5CJTNR.cjs.map} +1 -1
  51. package/dist/components/case-studies/index.cjs +9 -9
  52. package/dist/components/case-studies/index.js +3 -3
  53. package/dist/components/chat/chat-input.d.ts.map +1 -1
  54. package/dist/components/chat/index.cjs +3 -3
  55. package/dist/components/chat/index.js +2 -2
  56. package/dist/components/contact/index.cjs +4 -4
  57. package/dist/components/contact/index.js +3 -3
  58. package/dist/components/docs/index.cjs +6 -6
  59. package/dist/components/docs/index.js +5 -5
  60. package/dist/components/embeds/index.cjs +4 -4
  61. package/dist/components/embeds/index.js +3 -3
  62. package/dist/components/faq/index.cjs +5 -5
  63. package/dist/components/faq/index.js +4 -4
  64. package/dist/components/features/index.cjs +3 -3
  65. package/dist/components/features/index.js +2 -2
  66. package/dist/components/help-center-pages/index.cjs +24 -24
  67. package/dist/components/help-center-pages/index.js +15 -15
  68. package/dist/components/index.cjs +138 -138
  69. package/dist/components/index.js +13 -13
  70. package/dist/components/meeting-scheduler/index.cjs +40 -40
  71. package/dist/components/meeting-scheduler/index.js +4 -4
  72. package/dist/components/navigation/index.cjs +3 -3
  73. package/dist/components/navigation/index.js +2 -2
  74. package/dist/components/onboarding-guides/index.cjs +7 -7
  75. package/dist/components/onboarding-guides/index.js +6 -6
  76. package/dist/components/popover.d.ts.map +1 -1
  77. package/dist/components/related-content/index.cjs +5 -5
  78. package/dist/components/related-content/index.js +4 -4
  79. package/dist/components/tickets/index.cjs +7 -7
  80. package/dist/components/tickets/index.js +6 -6
  81. package/dist/components/ui/autocomplete.d.ts.map +1 -1
  82. package/dist/components/ui/file-upload.d.ts.map +1 -1
  83. package/dist/components/ui/index.cjs +3 -3
  84. package/dist/components/ui/index.js +2 -2
  85. package/dist/components/ui/search-input.d.ts.map +1 -1
  86. package/dist/components/ui/searchable-select.d.ts.map +1 -1
  87. package/dist/components/ui/tag-select-dropdown.d.ts.map +1 -1
  88. package/dist/components/ui/tags-manager.d.ts.map +1 -1
  89. package/dist/hooks/index.cjs +4 -2
  90. package/dist/hooks/index.cjs.map +1 -1
  91. package/dist/hooks/index.js +3 -1
  92. package/dist/hooks/ui/index.d.ts +1 -0
  93. package/dist/hooks/ui/index.d.ts.map +1 -1
  94. package/dist/hooks/ui/use-keyboard-collision-padding.d.ts +2 -0
  95. package/dist/hooks/ui/use-keyboard-collision-padding.d.ts.map +1 -0
  96. package/dist/index.cjs +5 -3
  97. package/dist/index.cjs.map +1 -1
  98. package/dist/index.js +4 -2
  99. package/package.json +1 -1
  100. package/src/components/chat/chat-input.tsx +84 -32
  101. package/src/components/popover.tsx +22 -14
  102. package/src/components/ui/autocomplete.tsx +9 -2
  103. package/src/components/ui/file-upload.tsx +5 -1
  104. package/src/components/ui/search-input.tsx +9 -2
  105. package/src/components/ui/searchable-select.tsx +9 -2
  106. package/src/components/ui/tag-select-dropdown.tsx +8 -2
  107. package/src/components/ui/tags-manager.tsx +9 -2
  108. package/src/hooks/ui/index.ts +1 -0
  109. package/src/hooks/ui/use-keyboard-collision-padding.ts +101 -0
  110. package/dist/chunk-GS4HJA2G.js.map +0 -1
  111. package/dist/chunk-LYRGM25P.cjs.map +0 -1
  112. package/dist/chunk-O6VJZX2N.js.map +0 -1
  113. package/dist/chunk-SXLEPNY2.cjs.map +0 -1
  114. /package/dist/{chunk-W4MXOBEW.js.map → chunk-EHPQKXXW.js.map} +0 -0
  115. /package/dist/{chunk-D62VYSTL.js.map → chunk-JVO5CYMK.js.map} +0 -0
  116. /package/dist/{chunk-BSE2UT6L.js.map → chunk-K6566PEB.js.map} +0 -0
  117. /package/dist/{chunk-WBYRBTAS.js.map → chunk-KLFGP6PR.js.map} +0 -0
  118. /package/dist/{chunk-KZ6PWFHK.js.map → chunk-LIQJAC6Z.js.map} +0 -0
  119. /package/dist/{chunk-MTCU5MQN.js.map → chunk-LIX5OUHH.js.map} +0 -0
  120. /package/dist/{chunk-RCBRCZUF.js.map → chunk-LQPHB2YF.js.map} +0 -0
  121. /package/dist/{chunk-BUVD2OAI.js.map → chunk-MZVFZMQ6.js.map} +0 -0
  122. /package/dist/{chunk-ZLLXYE2G.js.map → chunk-N3AEJTCK.js.map} +0 -0
  123. /package/dist/{chunk-ONIYUMTO.js.map → chunk-NB6BP6JB.js.map} +0 -0
  124. /package/dist/{chunk-VYOGAQLM.js.map → chunk-PLGITXT7.js.map} +0 -0
  125. /package/dist/{chunk-H4W4LENJ.js.map → chunk-QUVIT4JP.js.map} +0 -0
  126. /package/dist/{chunk-2ALT6CTY.js.map → chunk-VPDTDKO5.js.map} +0 -0
  127. /package/dist/{chunk-POFCTXNH.js.map → chunk-Y72MXG5N.js.map} +0 -0
@@ -39,6 +39,7 @@ import {
39
39
  useImageEdgeColor,
40
40
  useIsTruncated,
41
41
  useIsomorphicLayoutEffect,
42
+ useKeyboardCollisionPadding,
42
43
  useLgUp,
43
44
  useLocalStorage,
44
45
  useMarqueeEngine,
@@ -51,7 +52,7 @@ import {
51
52
  useResetOnPageHidden,
52
53
  useSuppressCloneFocus,
53
54
  useToast
54
- } from "./chunk-GS4HJA2G.js";
55
+ } from "./chunk-4A736Z6S.js";
55
56
  import {
56
57
  init_next_navigation,
57
58
  usePathname,
@@ -6530,6 +6531,7 @@ var ChatInput = forwardRef13((allProps, ref) => {
6530
6531
  // contenteditable div, not a <textarea>, so spreading them would warn.
6531
6532
  } = rest;
6532
6533
  const [value, setValue] = useState10("");
6534
+ const [hasChips, setHasChips] = useState10(false);
6533
6535
  const [focused, setFocused] = useState10(false);
6534
6536
  const [isStopping, setIsStopping] = useState10(false);
6535
6537
  const [previewDismissed, setPreviewDismissed] = useState10(false);
@@ -6565,26 +6567,32 @@ var ChatInput = forwardRef13((allProps, ref) => {
6565
6567
  if (typeof caret === "number") placeCaretAtOffset(el, caret);
6566
6568
  else placeCaretAtEnd(el);
6567
6569
  }
6570
+ setHasChips(el.querySelector("[data-token]") !== null);
6568
6571
  }
6572
+ valueRef.current = next;
6569
6573
  setValue(next);
6570
6574
  }, []);
6571
6575
  const fire = useCallback3(
6572
6576
  (message2) => {
6573
6577
  const can = (message2.length > 0 || allowEmptySend) && !sending && !disabled;
6574
6578
  if (!can || !onSend) return;
6575
- const result = onSend(message2);
6576
- const done = () => {
6577
- metaRef.current = /* @__PURE__ */ new Map();
6578
- applyValue("");
6579
- shouldRefocusRef.current = true;
6580
- focusEditor();
6579
+ const sentMeta = metaRef.current;
6580
+ metaRef.current = /* @__PURE__ */ new Map();
6581
+ applyValue("");
6582
+ shouldRefocusRef.current = true;
6583
+ focusEditor();
6584
+ const restore = () => {
6585
+ if (valueRef.current.length > 0) return;
6586
+ metaRef.current = sentMeta;
6587
+ applyValue(message2);
6581
6588
  };
6589
+ const result = onSend(message2);
6582
6590
  if (result instanceof Promise) {
6583
6591
  void result.then((ok) => {
6584
- if (ok !== false) done();
6592
+ if (ok === false) restore();
6585
6593
  });
6586
- } else if (result !== false) {
6587
- done();
6594
+ } else if (result === false) {
6595
+ restore();
6588
6596
  }
6589
6597
  },
6590
6598
  [allowEmptySend, sending, disabled, onSend, focusEditor, applyValue]
@@ -6673,6 +6681,7 @@ var ChatInput = forwardRef13((allProps, ref) => {
6673
6681
  const syncFromDom = useCallback3(() => {
6674
6682
  const el = editorRef.current;
6675
6683
  if (!el) return;
6684
+ setHasChips(el.querySelector("[data-token]") !== null);
6676
6685
  setValue(serialize(el));
6677
6686
  }, []);
6678
6687
  const handleInput = useCallback3(() => {
@@ -6778,8 +6787,7 @@ var ChatInput = forwardRef13((allProps, ref) => {
6778
6787
  const hasContent2 = value.trim().length > 0 || allowEmptySend;
6779
6788
  const sendDisabled = sending || disabled || !hasContent2;
6780
6789
  const isEmpty = value.length === 0;
6781
- const isDisabled = sending || disabled;
6782
- const showPreview = !isDisabled && !!previewText && !previewDismissed;
6790
+ const showPreview = !sending && !disabled && !!previewText && !previewDismissed;
6783
6791
  return /* @__PURE__ */ jsx30(
6784
6792
  "div",
6785
6793
  {
@@ -6813,23 +6821,24 @@ var ChatInput = forwardRef13((allProps, ref) => {
6813
6821
  },
6814
6822
  className: cn(
6815
6823
  // `items-center` keeps the empty single-line text AND a mention chip
6816
- // vertically centered the same way. `py-1.5` (6px) pairs with the
6817
- // editor's `leading-9` (36px) → a single line is exactly 48px
6818
- // (36 + 2*6). The 36px line box is just barely above the 32px chip
6819
- // (incl. its ~3.5px vertical-align overhead), so there's almost no
6820
- // slack for the chip to drift in → it reads as centered, and the row
6821
- // never overflows past 48px.
6824
+ // vertically centered the same way. With a chip in the box, `py-1.5`
6825
+ // (6px) pairs with the editor's `leading-9` (36px) → that row is
6826
+ // 36 + 2*6 = 48px. The 36px line box is just barely above the 32px
6827
+ // chip (incl. its ~3.5px vertical-align overhead), so there's almost
6828
+ // no slack for the chip to drift in → it reads as centered.
6829
+ // A chipless row is shorter than its content box and the `min-h-*`
6830
+ // here is what sets its height: 48px from `md` up, 44px below.
6822
6831
  "flex w-full items-center gap-2 px-3 py-1.5 min-h-11 md:min-h-12 cursor-text group transition-colors duration-200",
6823
6832
  !hideBorder && "rounded-[6px] border bg-ods-card border-ods-border",
6824
- !hideBorder && (focused ? "border-ods-accent" : !isDisabled && "hover:bg-ods-bg-hover hover:border-ods-border-hover"),
6825
- !hideBorder && isDisabled && "!cursor-not-allowed bg-ods-bg",
6833
+ !hideBorder && (focused ? "border-ods-accent" : !disabled && "hover:bg-ods-bg-hover hover:border-ods-border-hover"),
6834
+ !hideBorder && disabled && "!cursor-not-allowed bg-ods-bg",
6826
6835
  hideBorder && "bg-transparent"
6827
6836
  ),
6828
6837
  children: [
6829
6838
  startIcon && /* @__PURE__ */ jsx30("span", { className: "flex h-6 shrink-0 items-center", children: startIcon }),
6830
6839
  /* @__PURE__ */ jsxs23("div", { className: "relative flex-1 min-w-0", children: [
6831
- isEmpty && !showPreview && /* @__PURE__ */ jsx30("span", { className: "pointer-events-none absolute left-0 top-0 select-none text-h4 !leading-9 text-ods-text-secondary", children: disabled ? "Connection lost. Waiting to reconnect..." : placeholder }),
6832
- showPreview && /* @__PURE__ */ jsx30("p", { className: "pointer-events-none absolute inset-x-0 top-0 m-0 select-none truncate text-h4 !leading-9 text-ods-text-secondary", children: previewText }),
6840
+ isEmpty && !showPreview && /* @__PURE__ */ jsx30("span", { className: "pointer-events-none absolute left-0 top-0 select-none text-h4 text-ods-text-secondary", children: disabled ? "Connection lost. Waiting to reconnect..." : placeholder }),
6841
+ showPreview && /* @__PURE__ */ jsx30("p", { className: cn("pointer-events-none absolute inset-x-0 top-0 m-0 select-none truncate text-h4 text-ods-text-secondary", hasChips && "!leading-9"), children: previewText }),
6833
6842
  /* @__PURE__ */ jsx30(
6834
6843
  "div",
6835
6844
  {
@@ -6838,7 +6847,7 @@ var ChatInput = forwardRef13((allProps, ref) => {
6838
6847
  role: "textbox",
6839
6848
  "aria-multiline": "true",
6840
6849
  "aria-label": typeof placeholder === "string" ? placeholder : "Message",
6841
- contentEditable: !isDisabled,
6850
+ contentEditable: !disabled,
6842
6851
  suppressContentEditableWarning: true,
6843
6852
  spellCheck: true,
6844
6853
  onInput: handleInput,
@@ -6861,17 +6870,25 @@ var ChatInput = forwardRef13((allProps, ref) => {
6861
6870
  // see the preview comment above) and is only made transparent;
6862
6871
  // the absolutely-positioned single-line preview paints over it.
6863
6872
  showPreview && "opacity-0",
6864
- // `leading-9` (36px) sits just above the 32px chip's line-box need
6865
- // (~35.5px incl. vertical-align overhead): the LINE drives row
6866
- // height (deterministic 48px, no overflow) AND the near-zero slack
6867
- // keeps the chip centered. ~4px gap between wrapped chip rows.
6868
- // `min-h-9` pins that single-line box even when EMPTY: a non-editable
6869
- // (`contentEditable=false`, i.e. disabled/sending) empty div would
6870
- // otherwise collapse to 0px, and `items-center` would re-center the
6871
- // shorter wrapper in the row — dropping the `top-0` placeholder down.
6872
- "min-h-9 text-h4 text-ods-text-primary !leading-9",
6873
+ // WITH chips, `leading-9` (36px) sits just above the 32px chip's
6874
+ // line-box need (~35.5px incl. vertical-align overhead): the LINE
6875
+ // drives row height (deterministic 48px, no overflow) AND the
6876
+ // near-zero slack keeps the chip centered against the `align-top`
6877
+ // `h-9` wrapper `buildChipEl` gives it. ~4px gap between wrapped
6878
+ // chip rows.
6879
+ // WITHOUT chips there is nothing tall to center, and forcing the
6880
+ // same 36px box on 14px phone text (`text-h4`) put a blank line's
6881
+ // worth of air between every wrapped row — so plain drafts keep
6882
+ // `text-h4`'s own responsive line-height (20px / 24px at md).
6883
+ // `min-h-*` pins the single-line box even when EMPTY: a
6884
+ // non-editable (`contentEditable=false`, i.e. `disabled`) empty div
6885
+ // would otherwise collapse to 0px, and `items-center` would
6886
+ // re-center the shorter wrapper in the row — dropping the `top-0`
6887
+ // placeholder down.
6888
+ "text-h4 text-ods-text-primary",
6889
+ hasChips ? "min-h-9 !leading-9" : "min-h-[var(--font-line-space-h4-body)]",
6873
6890
  "scrollbar-thin scrollbar-track-transparent scrollbar-thumb-ods-border/30 hover:scrollbar-thumb-ods-text-secondary/30",
6874
- isDisabled && "cursor-not-allowed"
6891
+ disabled && "cursor-not-allowed"
6875
6892
  )
6876
6893
  }
6877
6894
  )
@@ -17422,6 +17439,7 @@ function AutocompleteInner(props, ref) {
17422
17439
  };
17423
17440
  const [isOpen, setIsOpen] = useState34(false);
17424
17441
  const [highlightedIndex, setHighlightedIndex] = useState34(-1);
17442
+ const keyboardPadding = useKeyboardCollisionPadding();
17425
17443
  const containerRef = useRef24(null);
17426
17444
  const hiddenTagsPopupRef = useRef24(null);
17427
17445
  const isInvalid = invalid || !!error;
@@ -17728,12 +17746,14 @@ function AutocompleteInner(props, ref) {
17728
17746
  className: cn(
17729
17747
  "z-50 w-[var(--radix-popover-trigger-width)] mt-1",
17730
17748
  "bg-ods-card border border-ods-border rounded-[4px]",
17749
+ "flex flex-col overflow-hidden max-h-[var(--radix-popper-available-height)]",
17731
17750
  "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
17732
17751
  "data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2",
17733
17752
  dropdownClassName
17734
17753
  ),
17735
17754
  sideOffset: 4,
17736
17755
  align: "start",
17756
+ collisionPadding: { bottom: keyboardPadding },
17737
17757
  onOpenAutoFocus: (e) => {
17738
17758
  e.preventDefault();
17739
17759
  autoLimitTags.inputRef.current?.focus();
@@ -17743,8 +17763,8 @@ function AutocompleteInner(props, ref) {
17743
17763
  e.preventDefault();
17744
17764
  }
17745
17765
  },
17746
- children: /* @__PURE__ */ jsxs84(ScrollAreaPrimitive.Root, { className: "overflow-hidden", children: [
17747
- /* @__PURE__ */ jsx110(ScrollAreaPrimitive.Viewport, { className: "max-h-[240px] w-full [&>div]:!block", children: /* @__PURE__ */ jsx110("div", { role: "listbox", children: loading ? /* @__PURE__ */ jsx110("div", { className: "px-3 py-2 text-ods-text-secondary text-h6", children: loadingText }) : filteredOptions.length === 0 ? showCreateOption ? isCreateTooLong ? /* @__PURE__ */ jsxs84("div", { className: "flex items-center h-11 md:h-12 px-[var(--spacing-system-mf)] text-h5 text-ods-error min-w-0", children: [
17766
+ children: /* @__PURE__ */ jsxs84(ScrollAreaPrimitive.Root, { className: "flex min-h-0 flex-col overflow-hidden", children: [
17767
+ /* @__PURE__ */ jsx110(ScrollAreaPrimitive.Viewport, { className: "min-h-0 max-h-[240px] w-full [&>div]:!block", children: /* @__PURE__ */ jsx110("div", { role: "listbox", children: loading ? /* @__PURE__ */ jsx110("div", { className: "px-3 py-2 text-ods-text-secondary text-h6", children: loadingText }) : filteredOptions.length === 0 ? showCreateOption ? isCreateTooLong ? /* @__PURE__ */ jsxs84("div", { className: "flex items-center h-11 md:h-12 px-[var(--spacing-system-mf)] text-h5 text-ods-error min-w-0", children: [
17748
17768
  "Maximum ",
17749
17769
  maxCreateLength,
17750
17770
  " characters"
@@ -19632,6 +19652,7 @@ function SearchableSelect({
19632
19652
  }) {
19633
19653
  const [isOpen, setIsOpen] = React54.useState(false);
19634
19654
  const [search, setSearch] = React54.useState("");
19655
+ const keyboardPadding = useKeyboardCollisionPadding();
19635
19656
  React54.useEffect(() => {
19636
19657
  if (!isOpen) setSearch("");
19637
19658
  }, [isOpen]);
@@ -19683,8 +19704,10 @@ function SearchableSelect({
19683
19704
  {
19684
19705
  align,
19685
19706
  sideOffset: 6,
19707
+ collisionPadding: { bottom: keyboardPadding },
19686
19708
  className: cn(
19687
19709
  "z-50 min-w-[var(--radix-popover-trigger-width)] bg-ods-card border border-ods-border rounded-md shadow-lg overflow-hidden",
19710
+ "flex flex-col max-h-[var(--radix-popper-available-height)]",
19688
19711
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
19689
19712
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
19690
19713
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -19692,7 +19715,7 @@ function SearchableSelect({
19692
19715
  contentClassName
19693
19716
  ),
19694
19717
  children: [
19695
- /* @__PURE__ */ jsx124("div", { className: "border-b border-ods-border", children: /* @__PURE__ */ jsx124(
19718
+ /* @__PURE__ */ jsx124("div", { className: "shrink-0 border-b border-ods-border", children: /* @__PURE__ */ jsx124(
19696
19719
  Input,
19697
19720
  {
19698
19721
  autoFocus: true,
@@ -19703,7 +19726,7 @@ function SearchableSelect({
19703
19726
  className: "rounded-none border-0"
19704
19727
  }
19705
19728
  ) }),
19706
- /* @__PURE__ */ jsx124("div", { className: "max-h-80 overflow-y-auto py-[var(--spacing-system-xs)]", role: "listbox", children: isLoading ? /* @__PURE__ */ jsx124("div", { className: "px-[var(--spacing-system-sf)] py-[var(--spacing-system-s)] text-h5 text-ods-text-secondary", children: loadingText }) : filtered.length === 0 ? /* @__PURE__ */ jsx124("div", { className: "px-[var(--spacing-system-sf)] py-[var(--spacing-system-s)] text-h5 text-ods-text-secondary", children: emptyText }) : filtered.map((opt) => {
19729
+ /* @__PURE__ */ jsx124("div", { className: "min-h-0 max-h-80 overflow-y-auto py-[var(--spacing-system-xs)]", role: "listbox", children: isLoading ? /* @__PURE__ */ jsx124("div", { className: "px-[var(--spacing-system-sf)] py-[var(--spacing-system-s)] text-h5 text-ods-text-secondary", children: loadingText }) : filtered.length === 0 ? /* @__PURE__ */ jsx124("div", { className: "px-[var(--spacing-system-sf)] py-[var(--spacing-system-s)] text-h5 text-ods-text-secondary", children: emptyText }) : filtered.map((opt) => {
19707
19730
  const isSelected = value === opt.value;
19708
19731
  return /* @__PURE__ */ jsx124(
19709
19732
  "button",
@@ -20530,6 +20553,7 @@ function TagSelectDropdown({
20530
20553
  }) {
20531
20554
  const [isOpen, setIsOpen] = React63.useState(false);
20532
20555
  const [search, setSearch] = React63.useState("");
20556
+ const keyboardPadding = useKeyboardCollisionPadding();
20533
20557
  React63.useEffect(() => {
20534
20558
  if (!isOpen) setSearch("");
20535
20559
  }, [isOpen]);
@@ -20573,15 +20597,17 @@ function TagSelectDropdown({
20573
20597
  {
20574
20598
  align,
20575
20599
  sideOffset: 6,
20600
+ collisionPadding: { bottom: keyboardPadding },
20576
20601
  className: cn(
20577
20602
  "z-50 w-72 bg-ods-card border border-ods-border rounded-[6px] shadow-lg overflow-hidden",
20603
+ "flex flex-col max-h-[var(--radix-popper-available-height)]",
20578
20604
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
20579
20605
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
20580
20606
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
20581
20607
  "data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2"
20582
20608
  ),
20583
20609
  children: [
20584
- /* @__PURE__ */ jsx135("div", { className: "border-b border-ods-border", children: /* @__PURE__ */ jsx135(
20610
+ /* @__PURE__ */ jsx135("div", { className: "shrink-0 border-b border-ods-border", children: /* @__PURE__ */ jsx135(
20585
20611
  Input,
20586
20612
  {
20587
20613
  autoFocus: true,
@@ -20598,7 +20624,7 @@ function TagSelectDropdown({
20598
20624
  className: "rounded-none border-0"
20599
20625
  }
20600
20626
  ) }),
20601
- /* @__PURE__ */ jsxs105("div", { className: "max-h-72 overflow-y-auto py-[var(--spacing-system-xs)]", role: "listbox", children: [
20627
+ /* @__PURE__ */ jsxs105("div", { className: "min-h-0 max-h-72 overflow-y-auto py-[var(--spacing-system-xs)]", role: "listbox", children: [
20602
20628
  ordered.map((opt) => {
20603
20629
  const isSelected = selectedIds.includes(opt.id);
20604
20630
  return /* @__PURE__ */ jsxs105(
@@ -20839,6 +20865,7 @@ function TagsManager({
20839
20865
  }) {
20840
20866
  const [open, setOpen] = React65.useState(false);
20841
20867
  const [search, setSearch] = React65.useState("");
20868
+ const keyboardPadding = useKeyboardCollisionPadding();
20842
20869
  const [editingId, setEditingId] = React65.useState(null);
20843
20870
  const [editingName, setEditingName] = React65.useState("");
20844
20871
  const editInputRef = React65.useRef(null);
@@ -20989,6 +21016,7 @@ function TagsManager({
20989
21016
  className: cn(
20990
21017
  "z-50 w-[var(--radix-popover-trigger-width)] mt-1",
20991
21018
  "bg-ods-card border border-ods-border rounded",
21019
+ "flex flex-col overflow-hidden max-h-[var(--radix-popper-available-height)]",
20992
21020
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
20993
21021
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
20994
21022
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -20996,6 +21024,7 @@ function TagsManager({
20996
21024
  ),
20997
21025
  sideOffset: 4,
20998
21026
  align: "start",
21027
+ collisionPadding: { bottom: keyboardPadding },
20999
21028
  onOpenAutoFocus: (e) => {
21000
21029
  e.preventDefault();
21001
21030
  inputRef.current?.focus();
@@ -21005,8 +21034,8 @@ function TagsManager({
21005
21034
  e.preventDefault();
21006
21035
  }
21007
21036
  },
21008
- children: /* @__PURE__ */ jsxs107(ScrollAreaPrimitive2.Root, { className: "overflow-hidden", children: [
21009
- /* @__PURE__ */ jsx138(ScrollAreaPrimitive2.Viewport, { className: "max-h-60 w-full", children: /* @__PURE__ */ jsxs107("div", { role: "listbox", children: [
21037
+ children: /* @__PURE__ */ jsxs107(ScrollAreaPrimitive2.Root, { className: "flex min-h-0 flex-col overflow-hidden", children: [
21038
+ /* @__PURE__ */ jsx138(ScrollAreaPrimitive2.Viewport, { className: "min-h-0 max-h-60 w-full", children: /* @__PURE__ */ jsxs107("div", { role: "listbox", children: [
21010
21039
  filtered.map((tag) => {
21011
21040
  const isSelected = selectedIds.includes(tag.id);
21012
21041
  const isEditing = editingId === tag.id;
@@ -45992,6 +46021,7 @@ function SearchInput({
45992
46021
  const debouncedValue = useDebounce(currentValue, debounceMs);
45993
46022
  const [isOpen, setIsOpen] = React132.useState(false);
45994
46023
  const [highlightedIndex, setHighlightedIndex] = React132.useState(-1);
46024
+ const keyboardPadding = useKeyboardCollisionPadding();
45995
46025
  const containerRef = React132.useRef(null);
45996
46026
  const currentPlaceholder = filterChips.length > 0 ? "Add filter..." : placeholder;
45997
46027
  const {
@@ -46251,6 +46281,7 @@ function SearchInput({
46251
46281
  className: cn(
46252
46282
  "z-50 w-[var(--radix-popover-trigger-width)] mt-1",
46253
46283
  "bg-ods-card border border-ods-border rounded-[6px] overflow-hidden shadow-lg",
46284
+ "flex flex-col max-h-[var(--radix-popper-available-height)]",
46254
46285
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
46255
46286
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
46256
46287
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -46259,6 +46290,7 @@ function SearchInput({
46259
46290
  ),
46260
46291
  sideOffset: 4,
46261
46292
  align: "start",
46293
+ collisionPadding: { bottom: keyboardPadding },
46262
46294
  onOpenAutoFocus: (e) => {
46263
46295
  e.preventDefault();
46264
46296
  inputRef.current?.focus();
@@ -46268,8 +46300,8 @@ function SearchInput({
46268
46300
  e.preventDefault();
46269
46301
  }
46270
46302
  },
46271
- children: /* @__PURE__ */ jsxs281(ScrollAreaPrimitive3.Root, { className: "overflow-hidden", children: [
46272
- /* @__PURE__ */ jsx357(ScrollAreaPrimitive3.Viewport, { className: "max-h-[320px] w-full", children: /* @__PURE__ */ jsx357("div", { role: "listbox", children: renderDropdownContent() }) }),
46303
+ children: /* @__PURE__ */ jsxs281(ScrollAreaPrimitive3.Root, { className: "flex min-h-0 flex-col overflow-hidden", children: [
46304
+ /* @__PURE__ */ jsx357(ScrollAreaPrimitive3.Viewport, { className: "min-h-0 max-h-[320px] w-full", children: /* @__PURE__ */ jsx357("div", { role: "listbox", children: renderDropdownContent() }) }),
46273
46305
  /* @__PURE__ */ jsx357(ScrollAreaPrimitive3.Scrollbar, { className: "hidden", orientation: "vertical", children: /* @__PURE__ */ jsx357(ScrollAreaPrimitive3.Thumb, {}) })
46274
46306
  ] })
46275
46307
  }
@@ -47107,7 +47139,8 @@ function FileUpload({
47107
47139
  return;
47108
47140
  }
47109
47141
  try {
47110
- handleFiles(await pickFiles());
47142
+ const picked = await pickFiles();
47143
+ if (picked.length > 0) handleFiles(picked);
47111
47144
  } catch (err) {
47112
47145
  setValidationError(err instanceof Error ? err.message : "Could not open the file picker");
47113
47146
  }
@@ -47461,19 +47494,23 @@ import * as PopoverPrimitive7 from "@radix-ui/react-popover";
47461
47494
  import { jsx as jsx363 } from "react/jsx-runtime";
47462
47495
  var Popover2 = PopoverPrimitive7.Root;
47463
47496
  var PopoverTrigger = PopoverPrimitive7.Trigger;
47464
- var PopoverContent = React137.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx363(PopoverPrimitive7.Portal, { children: /* @__PURE__ */ jsx363(
47465
- PopoverPrimitive7.Content,
47466
- {
47467
- ref,
47468
- align,
47469
- sideOffset,
47470
- className: cn(
47471
- "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
47472
- className
47473
- ),
47474
- ...props
47475
- }
47476
- ) }));
47497
+ var PopoverContent = React137.forwardRef(({ className, align = "center", sideOffset = 4, collisionPadding, ...props }, ref) => {
47498
+ const keyboardPadding = useKeyboardCollisionPadding();
47499
+ return /* @__PURE__ */ jsx363(PopoverPrimitive7.Portal, { children: /* @__PURE__ */ jsx363(
47500
+ PopoverPrimitive7.Content,
47501
+ {
47502
+ ref,
47503
+ align,
47504
+ sideOffset,
47505
+ collisionPadding: collisionPadding ?? { bottom: keyboardPadding },
47506
+ className: cn(
47507
+ "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
47508
+ className
47509
+ ),
47510
+ ...props
47511
+ }
47512
+ ) });
47513
+ });
47477
47514
  PopoverContent.displayName = PopoverPrimitive7.Content.displayName;
47478
47515
 
47479
47516
  // src/components/ui/color-preset-select.tsx
@@ -62071,4 +62108,4 @@ export {
62071
62108
  LogsList,
62072
62109
  assets
62073
62110
  };
62074
- //# sourceMappingURL=chunk-O6VJZX2N.js.map
62111
+ //# sourceMappingURL=chunk-4DTUUM5V.js.map