@avenue-ticketing/ui 0.12.0-beta.1 → 0.12.0-beta.3

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 (82) hide show
  1. package/dist/react/badge-groups.js +2 -2
  2. package/dist/react/badge-groups.js.map +1 -1
  3. package/dist/react/badge.js +49 -18
  4. package/dist/react/badge.js.map +1 -1
  5. package/dist/react/button.js +2 -2
  6. package/dist/react/button.js.map +1 -1
  7. package/dist/react/checkbox.js +10 -7
  8. package/dist/react/checkbox.js.map +1 -1
  9. package/dist/react/combobox.d.ts +3 -2
  10. package/dist/react/combobox.js +284 -32
  11. package/dist/react/combobox.js.map +1 -1
  12. package/dist/react/dropdown-account-breadcrumb.js +176 -14
  13. package/dist/react/dropdown-account-breadcrumb.js.map +1 -1
  14. package/dist/react/dropdown-account-button.js +190 -25
  15. package/dist/react/dropdown-account-button.js.map +1 -1
  16. package/dist/react/dropdown-account-card-md.js +189 -24
  17. package/dist/react/dropdown-account-card-md.js.map +1 -1
  18. package/dist/react/dropdown-account-card-sm.js +189 -24
  19. package/dist/react/dropdown-account-card-sm.js.map +1 -1
  20. package/dist/react/dropdown-account-card-xs.js +189 -24
  21. package/dist/react/dropdown-account-card-xs.js.map +1 -1
  22. package/dist/react/dropdown-avatar.js +190 -25
  23. package/dist/react/dropdown-avatar.js.map +1 -1
  24. package/dist/react/dropdown-button-advanced.js +190 -25
  25. package/dist/react/dropdown-button-advanced.js.map +1 -1
  26. package/dist/react/dropdown-button-link.js +189 -24
  27. package/dist/react/dropdown-button-link.js.map +1 -1
  28. package/dist/react/dropdown-button-simple.js +190 -25
  29. package/dist/react/dropdown-button-simple.js.map +1 -1
  30. package/dist/react/dropdown-icon-advanced.js +189 -24
  31. package/dist/react/dropdown-icon-advanced.js.map +1 -1
  32. package/dist/react/dropdown-icon-simple.js +189 -24
  33. package/dist/react/dropdown-icon-simple.js.map +1 -1
  34. package/dist/react/dropdown-integration.js +190 -25
  35. package/dist/react/dropdown-integration.js.map +1 -1
  36. package/dist/react/dropdown-search-advanced.js +191 -26
  37. package/dist/react/dropdown-search-advanced.js.map +1 -1
  38. package/dist/react/dropdown-search-simple.js +191 -26
  39. package/dist/react/dropdown-search-simple.js.map +1 -1
  40. package/dist/react/dropdown.d.ts +4 -1
  41. package/dist/react/dropdown.js +189 -24
  42. package/dist/react/dropdown.js.map +1 -1
  43. package/dist/react/input-date.js.map +1 -1
  44. package/dist/react/input-file.js +3 -3
  45. package/dist/react/input-file.js.map +1 -1
  46. package/dist/react/input-group.js.map +1 -1
  47. package/dist/react/input-number.js +2 -2
  48. package/dist/react/input-number.js.map +1 -1
  49. package/dist/react/input-payment.js +1 -1
  50. package/dist/react/input-payment.js.map +1 -1
  51. package/dist/react/input-tags-outer.js +9 -9
  52. package/dist/react/input-tags-outer.js.map +1 -1
  53. package/dist/react/input-tags.js +8 -8
  54. package/dist/react/input-tags.js.map +1 -1
  55. package/dist/react/input.js +1 -1
  56. package/dist/react/input.js.map +1 -1
  57. package/dist/react/multi-select.d.ts +3 -2
  58. package/dist/react/multi-select.js +230 -29
  59. package/dist/react/multi-select.js.map +1 -1
  60. package/dist/react/popover.d.ts +10 -1
  61. package/dist/react/popover.js +195 -18
  62. package/dist/react/popover.js.map +1 -1
  63. package/dist/react/radio-buttons.js +2 -1
  64. package/dist/react/radio-buttons.js.map +1 -1
  65. package/dist/react/select-item.d.ts +2 -1
  66. package/dist/react/select-item.js +11 -7
  67. package/dist/react/select-item.js.map +1 -1
  68. package/dist/react/select.d.ts +4 -3
  69. package/dist/react/select.js +298 -42
  70. package/dist/react/select.js.map +1 -1
  71. package/dist/react/switch.js +1 -1
  72. package/dist/react/switch.js.map +1 -1
  73. package/dist/react/tag-select.d.ts +5 -2
  74. package/dist/react/tag-select.js +215 -25
  75. package/dist/react/tag-select.js.map +1 -1
  76. package/dist/react/tags.js +8 -8
  77. package/dist/react/tags.js.map +1 -1
  78. package/dist/react/textarea.js.map +1 -1
  79. package/dist/select-mobile-sheet-CB2ptDTJ.d.ts +12 -0
  80. package/dist/{select-shared-B3Y5SMXU.d.ts → select-shared-oJEeJxeB.d.ts} +6 -0
  81. package/package.json +1 -1
  82. package/theme.css +3 -1
@@ -13,7 +13,7 @@ var twMerge = extendTailwindMerge({
13
13
  var cx = twMerge;
14
14
  var CHECKBOX_TICK_DELAY_MS = 60;
15
15
  var CHECKBOX_TICK_DRAW_MS = 100;
16
- function CheckboxAnimatedCheckMark({ className }) {
16
+ function CheckboxAnimatedCheckMark({ pixelSize, className }) {
17
17
  const pathRef = useRef(null);
18
18
  useLayoutEffect(() => {
19
19
  const path = pathRef.current;
@@ -34,7 +34,7 @@ function CheckboxAnimatedCheckMark({ className }) {
34
34
  });
35
35
  return () => anim.cancel();
36
36
  }, []);
37
- return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 14 14", fill: "none", className: cx("block shrink-0", className), children: /* @__PURE__ */ jsx(
37
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", width: pixelSize, height: pixelSize, viewBox: "0 0 14 14", fill: "none", className: cx("block", className), children: /* @__PURE__ */ jsx(
38
38
  "path",
39
39
  {
40
40
  ref: pathRef,
@@ -49,14 +49,15 @@ function CheckboxAnimatedCheckMark({ className }) {
49
49
  var focusRingShadow = "outline-none [box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]";
50
50
  var CheckboxBase = ({ className, isSelected, isDisabled, isIndeterminate, size = "sm", isFocusVisible = false }) => {
51
51
  const isChecked = isSelected || isIndeterminate;
52
- const iconClassName = size === "sm" ? "size-2.5" : "size-3.5";
52
+ const iconPixelSize = size === "sm" ? 10 : 14;
53
53
  return /* @__PURE__ */ jsxs(
54
54
  "div",
55
55
  {
56
56
  className: cx(
57
- "relative flex shrink-0 cursor-pointer appearance-none items-center justify-center border border-solid border-primary",
57
+ "relative flex shrink-0 cursor-pointer appearance-none items-center justify-center overflow-clip border border-solid border-primary",
58
58
  size === "sm" ? "size-4 rounded-xs" : "size-5 rounded-sm",
59
59
  isChecked ? "border-transparent bg-brand-solid" : "bg-primary",
60
+ !isChecked && !isDisabled && "group-hover:bg-primary_hover",
60
61
  isDisabled && "cursor-not-allowed opacity-50",
61
62
  isDisabled && !isChecked && "bg-tertiary",
62
63
  isFocusVisible && !isDisabled && focusRingShadow,
@@ -67,13 +68,15 @@ var CheckboxBase = ({ className, isSelected, isDisabled, isIndeterminate, size =
67
68
  "svg",
68
69
  {
69
70
  "aria-hidden": "true",
71
+ width: iconPixelSize,
72
+ height: iconPixelSize,
70
73
  viewBox: "0 0 14 14",
71
74
  fill: "none",
72
- className: cx("pointer-events-none block shrink-0 text-fg-white", iconClassName),
75
+ className: "pointer-events-none block text-fg-white",
73
76
  children: /* @__PURE__ */ jsx("path", { d: "M2.91675 7H11.0834", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })
74
77
  }
75
78
  ),
76
- isSelected && !isIndeterminate && /* @__PURE__ */ jsx(CheckboxAnimatedCheckMark, { className: cx("pointer-events-none text-fg-white", iconClassName) })
79
+ isSelected && !isIndeterminate && /* @__PURE__ */ jsx(CheckboxAnimatedCheckMark, { pixelSize: iconPixelSize, className: "pointer-events-none text-fg-white" })
77
80
  ]
78
81
  }
79
82
  );
@@ -99,7 +102,7 @@ var Checkbox = ({ label, hint, size = "sm", className, ...ariaCheckboxProps }) =
99
102
  {
100
103
  ...ariaCheckboxProps,
101
104
  className: (state) => cx(
102
- "relative flex items-start",
105
+ "group relative flex items-start",
103
106
  state.isDisabled && "cursor-not-allowed",
104
107
  sizes[size].root,
105
108
  typeof className === "function" ? className(state) : className
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../utils/cx.ts","../../../../components/base/checkbox/checkbox.tsx"],"names":["AriaCheckbox"],"mappings":"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","file":"checkbox.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n text: [\"display-xs\", \"display-sm\", \"display-md\", \"display-lg\", \"display-xl\", \"display-2xl\"],\n },\n },\n});\n\n/**\n * This function is a wrapper around the twMerge function.\n * It is used to merge the classes inside style objects.\n */\nexport const cx = twMerge;\n\n/**\n * This function does nothing besides helping us to be able to\n * sort the classes inside style objects which is not supported\n * by the Tailwind IntelliSense by default.\n */\nexport function sortCx<T extends Record<string, string | number | Record<string, string | number | Record<string, string | number>>>>(classes: T): T {\n return classes;\n}\n","\"use client\";\n\nimport { useLayoutEffect, useRef, type ReactNode, type Ref } from \"react\";\nimport { Checkbox as AriaCheckbox, type CheckboxProps as AriaCheckboxProps } from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\n\nconst CHECKBOX_TICK_DELAY_MS = 60;\nconst CHECKBOX_TICK_DRAW_MS = 100;\n\n/** Draw-on-check tick animation — remounts when checked so it replays each time. */\nfunction CheckboxAnimatedCheckMark({ className }: { className?: string }) {\n const pathRef = useRef<SVGPathElement>(null);\n\n useLayoutEffect(() => {\n const path = pathRef.current;\n if (!path || typeof path.getTotalLength !== \"function\") return;\n const len = path.getTotalLength();\n if (len <= 0) return;\n\n path.style.strokeDasharray = `${len}`;\n path.style.strokeDashoffset = `${len}`;\n\n if (typeof path.animate !== \"function\") {\n path.style.strokeDashoffset = \"0\";\n return;\n }\n\n const anim = path.animate([{ strokeDashoffset: len }, { strokeDashoffset: 0 }], {\n duration: CHECKBOX_TICK_DRAW_MS,\n delay: CHECKBOX_TICK_DELAY_MS,\n easing: \"cubic-bezier(0.45, 0, 0.2, 1)\",\n fill: \"forwards\",\n });\n return () => anim.cancel();\n }, []);\n\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 14 14\" fill=\"none\" className={cx(\"block shrink-0\", className)}>\n <path\n ref={pathRef}\n d=\"M2.33325 7L5.24992 9.91667L11.6666 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/** Figma Focus rings/focus-ring — 2px surface gap + 4px brand ring (matches Button). */\nconst focusRingShadow =\n \"outline-none [box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\nexport interface CheckboxBaseProps {\n size?: \"sm\" | \"md\";\n className?: string;\n isFocusVisible?: boolean;\n isSelected?: boolean;\n isDisabled?: boolean;\n isIndeterminate?: boolean;\n}\n\nexport const CheckboxBase = ({ className, isSelected, isDisabled, isIndeterminate, size = \"sm\", isFocusVisible = false }: CheckboxBaseProps) => {\n const isChecked = isSelected || isIndeterminate;\n const iconClassName = size === \"sm\" ? \"size-2.5\" : \"size-3.5\";\n\n return (\n <div\n className={cx(\n \"relative flex shrink-0 cursor-pointer appearance-none items-center justify-center border border-solid border-primary\",\n size === \"sm\" ? \"size-4 rounded-xs\" : \"size-5 rounded-sm\",\n isChecked ? \"border-transparent bg-brand-solid\" : \"bg-primary\",\n isDisabled && \"cursor-not-allowed opacity-50\",\n isDisabled && !isChecked && \"bg-tertiary\",\n isFocusVisible && !isDisabled && focusRingShadow,\n className,\n )}\n >\n {isIndeterminate && (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n className={cx(\"pointer-events-none block shrink-0 text-fg-white\", iconClassName)}\n >\n <path d=\"M2.91675 7H11.0834\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n\n {isSelected && !isIndeterminate && (\n <CheckboxAnimatedCheckMark className={cx(\"pointer-events-none text-fg-white\", iconClassName)} />\n )}\n </div>\n );\n};\nCheckboxBase.displayName = \"CheckboxBase\";\n\ninterface CheckboxProps extends AriaCheckboxProps {\n ref?: Ref<HTMLLabelElement>;\n size?: \"sm\" | \"md\";\n label?: ReactNode;\n hint?: ReactNode;\n}\n\nexport const Checkbox = ({ label, hint, size = \"sm\", className, ...ariaCheckboxProps }: CheckboxProps) => {\n const sizes = {\n sm: {\n root: \"gap-2\",\n textWrapper: \"\",\n label: \"text-sm font-medium\",\n hint: \"text-sm\",\n },\n md: {\n root: \"gap-3\",\n textWrapper: \"gap-0.5 break-words\",\n label: \"text-md font-medium\",\n hint: \"text-md\",\n },\n };\n\n return (\n <AriaCheckbox\n {...ariaCheckboxProps}\n className={(state) =>\n cx(\n \"relative flex items-start\",\n state.isDisabled && \"cursor-not-allowed\",\n sizes[size].root,\n typeof className === \"function\" ? className(state) : className,\n )\n }\n >\n {({ isSelected, isIndeterminate, isDisabled, isFocusVisible }) => (\n <>\n <CheckboxBase\n size={size}\n isSelected={isSelected}\n isIndeterminate={isIndeterminate}\n isDisabled={isDisabled}\n isFocusVisible={isFocusVisible}\n className={label || hint ? \"mt-0.5\" : \"\"}\n />\n {(label || hint) && (\n <div className={cx(\"inline-flex flex-col\", sizes[size].textWrapper)}>\n {label && <p className={cx(\"text-secondary select-none\", sizes[size].label)}>{label}</p>}\n {hint && (\n <span className={cx(\"text-tertiary\", sizes[size].hint)} onClick={(event) => event.stopPropagation()}>\n {hint}\n </span>\n )}\n </div>\n )}\n </>\n )}\n </AriaCheckbox>\n );\n};\nCheckbox.displayName = \"Checkbox\";\n"]}
1
+ {"version":3,"sources":["../../../../utils/cx.ts","../../../../components/base/checkbox/checkbox.tsx"],"names":["AriaCheckbox"],"mappings":"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","file":"checkbox.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n text: [\"display-xs\", \"display-sm\", \"display-md\", \"display-lg\", \"display-xl\", \"display-2xl\"],\n },\n },\n});\n\n/**\n * This function is a wrapper around the twMerge function.\n * It is used to merge the classes inside style objects.\n */\nexport const cx = twMerge;\n\n/**\n * This function does nothing besides helping us to be able to\n * sort the classes inside style objects which is not supported\n * by the Tailwind IntelliSense by default.\n */\nexport function sortCx<T extends Record<string, string | number | Record<string, string | number | Record<string, string | number>>>>(classes: T): T {\n return classes;\n}\n","\"use client\";\n\nimport { useLayoutEffect, useRef, type ReactNode, type Ref } from \"react\";\nimport { Checkbox as AriaCheckbox, type CheckboxProps as AriaCheckboxProps } from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\n\nconst CHECKBOX_TICK_DELAY_MS = 60;\nconst CHECKBOX_TICK_DRAW_MS = 100;\n\n/** Draw-on-check tick animation — remounts when checked so it replays each time. */\nfunction CheckboxAnimatedCheckMark({ pixelSize, className }: { pixelSize: number; className?: string }) {\n const pathRef = useRef<SVGPathElement>(null);\n\n useLayoutEffect(() => {\n const path = pathRef.current;\n if (!path || typeof path.getTotalLength !== \"function\") return;\n const len = path.getTotalLength();\n if (len <= 0) return;\n\n path.style.strokeDasharray = `${len}`;\n path.style.strokeDashoffset = `${len}`;\n\n if (typeof path.animate !== \"function\") {\n path.style.strokeDashoffset = \"0\";\n return;\n }\n\n const anim = path.animate([{ strokeDashoffset: len }, { strokeDashoffset: 0 }], {\n duration: CHECKBOX_TICK_DRAW_MS,\n delay: CHECKBOX_TICK_DELAY_MS,\n easing: \"cubic-bezier(0.45, 0, 0.2, 1)\",\n fill: \"forwards\",\n });\n return () => anim.cancel();\n }, []);\n\n return (\n <svg aria-hidden=\"true\" width={pixelSize} height={pixelSize} viewBox=\"0 0 14 14\" fill=\"none\" className={cx(\"block\", className)}>\n <path\n ref={pathRef}\n d=\"M2.33325 7L5.24992 9.91667L11.6666 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/** Figma Focus rings/focus-ring — 2px surface gap + 4px brand ring (matches Button). */\nconst focusRingShadow =\n \"outline-none [box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\nexport interface CheckboxBaseProps {\n size?: \"sm\" | \"md\";\n className?: string;\n isFocusVisible?: boolean;\n isSelected?: boolean;\n isDisabled?: boolean;\n isIndeterminate?: boolean;\n}\n\nexport const CheckboxBase = ({ className, isSelected, isDisabled, isIndeterminate, size = \"sm\", isFocusVisible = false }: CheckboxBaseProps) => {\n const isChecked = isSelected || isIndeterminate;\n const iconPixelSize = size === \"sm\" ? 10 : 14;\n\n return (\n <div\n className={cx(\n \"relative flex shrink-0 cursor-pointer appearance-none items-center justify-center overflow-clip border border-solid border-primary\",\n size === \"sm\" ? \"size-4 rounded-xs\" : \"size-5 rounded-sm\",\n isChecked ? \"border-transparent bg-brand-solid\" : \"bg-primary\",\n !isChecked && !isDisabled && \"group-hover:bg-primary_hover\",\n isDisabled && \"cursor-not-allowed opacity-50\",\n isDisabled && !isChecked && \"bg-tertiary\",\n isFocusVisible && !isDisabled && focusRingShadow,\n className,\n )}\n >\n {isIndeterminate && (\n <svg\n aria-hidden=\"true\"\n width={iconPixelSize}\n height={iconPixelSize}\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n className=\"pointer-events-none block text-fg-white\"\n >\n <path d=\"M2.91675 7H11.0834\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n\n {isSelected && !isIndeterminate && (\n <CheckboxAnimatedCheckMark pixelSize={iconPixelSize} className=\"pointer-events-none text-fg-white\" />\n )}\n </div>\n );\n};\nCheckboxBase.displayName = \"CheckboxBase\";\n\ninterface CheckboxProps extends AriaCheckboxProps {\n ref?: Ref<HTMLLabelElement>;\n size?: \"sm\" | \"md\";\n label?: ReactNode;\n hint?: ReactNode;\n}\n\nexport const Checkbox = ({ label, hint, size = \"sm\", className, ...ariaCheckboxProps }: CheckboxProps) => {\n const sizes = {\n sm: {\n root: \"gap-2\",\n textWrapper: \"\",\n label: \"text-sm font-medium\",\n hint: \"text-sm\",\n },\n md: {\n root: \"gap-3\",\n textWrapper: \"gap-0.5 break-words\",\n label: \"text-md font-medium\",\n hint: \"text-md\",\n },\n };\n\n return (\n <AriaCheckbox\n {...ariaCheckboxProps}\n className={(state) =>\n cx(\n \"group relative flex items-start\",\n state.isDisabled && \"cursor-not-allowed\",\n sizes[size].root,\n typeof className === \"function\" ? className(state) : className,\n )\n }\n >\n {({ isSelected, isIndeterminate, isDisabled, isFocusVisible }) => (\n <>\n <CheckboxBase\n size={size}\n isSelected={isSelected}\n isIndeterminate={isIndeterminate}\n isDisabled={isDisabled}\n isFocusVisible={isFocusVisible}\n className={label || hint ? \"mt-0.5\" : \"\"}\n />\n {(label || hint) && (\n <div className={cx(\"inline-flex flex-col\", sizes[size].textWrapper)}>\n {label && <p className={cx(\"text-secondary select-none\", sizes[size].label)}>{label}</p>}\n {hint && (\n <span className={cx(\"text-tertiary\", sizes[size].hint)} onClick={(event) => event.stopPropagation()}>\n {hint}\n </span>\n )}\n </div>\n )}\n </>\n )}\n </AriaCheckbox>\n );\n};\nCheckbox.displayName = \"Checkbox\";\n"]}
@@ -1,7 +1,8 @@
1
1
  import * as react from 'react';
2
2
  import { RefAttributes, FC, ReactNode } from 'react';
3
3
  import { ComboBoxProps as ComboBoxProps$1, ListBoxProps } from 'react-aria-components';
4
- import { S as SelectItemType, C as CommonProps } from '../select-shared-B3Y5SMXU.js';
4
+ import { S as SelectItemType, C as CommonProps } from '../select-shared-oJEeJxeB.js';
5
+ import '../select-mobile-sheet-CB2ptDTJ.js';
5
6
 
6
7
  interface ComboBoxProps extends Omit<ComboBoxProps$1<SelectItemType>, "children" | "items">, RefAttributes<HTMLDivElement>, CommonProps {
7
8
  shortcut?: boolean;
@@ -12,6 +13,6 @@ interface ComboBoxProps extends Omit<ComboBoxProps$1<SelectItemType>, "children"
12
13
  icon?: FC | ReactNode;
13
14
  children: ListBoxProps<SelectItemType>["children"];
14
15
  }
15
- declare const ComboBox: ({ placeholder, shortcut, size, children, items, shortcutClassName, icon, hideRequiredIndicator, ...otherProps }: ComboBoxProps) => react.JSX.Element;
16
+ declare const ComboBox: ({ placeholder, shortcut, size, children, items, shortcutClassName, icon, hideRequiredIndicator, mobileOptions, ...otherProps }: ComboBoxProps) => react.JSX.Element;
16
17
 
17
18
  export { ComboBox };
@@ -1,9 +1,11 @@
1
- import { createContext, useRef, useState, useCallback, useEffect, useContext, isValidElement } from 'react';
1
+ import { createContext, useMemo, useRef, useState, useCallback, useEffect, useContext, isValidElement, useLayoutEffect } from 'react';
2
2
  import { MagnifyingGlassIcon } from '@phosphor-icons/react/dist/csr/MagnifyingGlass';
3
- import { ComboBox as ComboBox$1, ListBox, Label as Label$1, ComboBoxStateContext, Group, Input, Popover as Popover$1, Text, TooltipTrigger as TooltipTrigger$1, Tooltip as Tooltip$1, OverlayArrow, Button } from 'react-aria-components';
3
+ import { ComboBox as ComboBox$1, ListBox, Label as Label$1, ComboBoxStateContext, Button, Group, Input, OverlayTriggerStateContext, Popover as Popover$1, Text, TooltipTrigger as TooltipTrigger$1, Tooltip as Tooltip$1, OverlayArrow } from 'react-aria-components';
4
4
  import { extendTailwindMerge } from 'tailwind-merge';
5
- import { jsx, jsxs } from 'react/jsx-runtime';
5
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
  import { QuestionIcon } from '@phosphor-icons/react/dist/csr/Question';
7
+ import { createPortal } from 'react-dom';
8
+ import { XIcon } from '@phosphor-icons/react/dist/csr/X';
7
9
  import '@phosphor-icons/react/dist/csr/Eye';
8
10
  import '@phosphor-icons/react/dist/csr/EyeSlash';
9
11
  import '@phosphor-icons/react/dist/csr/Info';
@@ -131,25 +133,199 @@ var Label = ({ isInvalid, isRequired, tooltip, tooltipDescription, className, ..
131
133
  );
132
134
  };
133
135
  Label.displayName = "Label";
134
- var Popover = (props) => {
135
- return /* @__PURE__ */ jsx(
136
- Popover$1,
136
+ var MOBILE_SHEET_MAX_PX = 1024;
137
+ function useIsMobile(breakpoint = MOBILE_SHEET_MAX_PX + 1) {
138
+ const [isMobile, setIsMobile] = useState(() => {
139
+ if (typeof window === "undefined") return false;
140
+ return window.matchMedia(`(max-width: ${breakpoint - 1}px)`).matches;
141
+ });
142
+ useEffect(() => {
143
+ const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);
144
+ const handler = (e) => setIsMobile(e.matches);
145
+ mq.addEventListener("change", handler);
146
+ return () => mq.removeEventListener("change", handler);
147
+ }, [breakpoint]);
148
+ return isMobile;
149
+ }
150
+ var MOBILE_SHEET_MOTION_MS = 175;
151
+ var MOBILE_SHEET_ENTRY_EASING = "cubic-bezier(0.85, 0, 0.15, 1)";
152
+ var MOBILE_SHEET_EXIT_EASING = "cubic-bezier(0.85, 0, 1, 0.15)";
153
+ var MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_PX = 120;
154
+ function resolveSelectMobileOptions(mobileOptions) {
155
+ return {
156
+ sheet: mobileOptions?.sheet ?? true,
157
+ title: mobileOptions?.title,
158
+ sheetClassName: mobileOptions?.className,
159
+ contentClassName: mobileOptions?.contentClassName
160
+ };
161
+ }
162
+ function useMobileSheetAnimation(open, enabled, slideEntrance = true, slideOffsetPx = MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_PX) {
163
+ const [shouldRender, setShouldRender] = useState(open);
164
+ const [isAnimating, setIsAnimating] = useState(false);
165
+ useLayoutEffect(() => {
166
+ if (!enabled) {
167
+ setShouldRender(open);
168
+ return;
169
+ }
170
+ if (open) {
171
+ setShouldRender(true);
172
+ }
173
+ }, [open, enabled]);
174
+ useEffect(() => {
175
+ if (!enabled || open) return;
176
+ const timer = setTimeout(() => setShouldRender(false), MOBILE_SHEET_MOTION_MS);
177
+ return () => clearTimeout(timer);
178
+ }, [open, enabled]);
179
+ useLayoutEffect(() => {
180
+ if (!enabled || open || !shouldRender) return;
181
+ setIsAnimating(false);
182
+ }, [enabled, open, shouldRender]);
183
+ useEffect(() => {
184
+ if (!enabled || !shouldRender || !open) return;
185
+ let raf2 = 0;
186
+ const raf1 = requestAnimationFrame(() => {
187
+ raf2 = requestAnimationFrame(() => setIsAnimating(true));
188
+ });
189
+ return () => {
190
+ cancelAnimationFrame(raf1);
191
+ if (raf2) cancelAnimationFrame(raf2);
192
+ };
193
+ }, [shouldRender, open, enabled]);
194
+ const motionEasing = open ? MOBILE_SHEET_ENTRY_EASING : MOBILE_SHEET_EXIT_EASING;
195
+ const hiddenTransform = slideEntrance ? `translateY(${slideOffsetPx}px)` : "translateY(100%)";
196
+ const panelStyle = enabled ? {
197
+ transform: isAnimating ? "translateY(0)" : hiddenTransform,
198
+ opacity: isAnimating ? 1 : 0,
199
+ transitionProperty: "transform, opacity",
200
+ transitionDuration: `${MOBILE_SHEET_MOTION_MS}ms`,
201
+ transitionTimingFunction: motionEasing
202
+ } : void 0;
203
+ const backdropStyle = enabled ? {
204
+ opacity: isAnimating ? 1 : 0,
205
+ transitionProperty: "opacity",
206
+ transitionDuration: `${MOBILE_SHEET_MOTION_MS}ms`,
207
+ transitionTimingFunction: motionEasing
208
+ } : void 0;
209
+ return { shouldRender, isAnimating, panelStyle, backdropStyle };
210
+ }
211
+ function MobileSheetCloseButton({ onClose }) {
212
+ return /* @__PURE__ */ jsxs(
213
+ "button",
137
214
  {
138
- placement: "bottom",
139
- containerPadding: 0,
140
- offset: 4,
141
- ...props,
142
- className: (state) => cx(
143
- "w-(--trigger-width) origin-(--trigger-anchor-point) overflow-x-hidden overflow-y-auto rounded-lg bg-primary py-1 shadow-lg ring-1 ring-secondary_alt outline-hidden will-change-transform",
144
- state.isEntering && "duration-150 ease-out animate-in fade-in placement-right:slide-in-from-left-0.5 placement-top:slide-in-from-bottom-0.5 placement-bottom:slide-in-from-top-0.5",
145
- state.isExiting && "duration-100 ease-in animate-out fade-out placement-right:slide-out-to-left-0.5 placement-top:slide-out-to-bottom-0.5 placement-bottom:slide-out-to-top-0.5",
146
- props.size === "sm" && "max-h-56!",
147
- props.size === "md" && "max-h-64!",
148
- props.size === "lg" && "max-h-80!",
149
- typeof props.className === "function" ? props.className(state) : props.className
150
- )
215
+ type: "button",
216
+ onClick: (e) => {
217
+ e.stopPropagation();
218
+ onClose();
219
+ },
220
+ className: "flex size-12 shrink-0 cursor-pointer items-center justify-center rounded-full text-fg-primary transition duration-100 ease-linear hover:bg-primary_hover active:scale-[0.96] focus-visible:outline-none focus-visible:[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]",
221
+ children: [
222
+ /* @__PURE__ */ jsx(XIcon, { className: "size-5", "aria-hidden": "true" }),
223
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
224
+ ]
151
225
  }
152
226
  );
227
+ }
228
+ function MobileSheetChrome({
229
+ title,
230
+ contentClassName,
231
+ onClose,
232
+ children
233
+ }) {
234
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
235
+ /* @__PURE__ */ jsxs("div", { className: cx("flex w-full shrink-0 items-center py-2 pl-4 pr-2", title ? "justify-between gap-3" : "justify-end"), children: [
236
+ title ? /* @__PURE__ */ jsx("p", { className: "min-w-0 flex-1 truncate text-base font-semibold text-primary", children: title }) : null,
237
+ /* @__PURE__ */ jsx(MobileSheetCloseButton, { onClose })
238
+ ] }),
239
+ /* @__PURE__ */ jsx(
240
+ "div",
241
+ {
242
+ className: cx(
243
+ "min-h-0 flex-1 overflow-y-auto pb-[calc(5rem+env(safe-area-inset-bottom,0px))]",
244
+ contentClassName
245
+ ),
246
+ children
247
+ }
248
+ )
249
+ ] });
250
+ }
251
+ var Popover = ({ mobileOptions, children, size, className, style, compoundContent = false, ...props }) => {
252
+ const isMobile = useIsMobile();
253
+ const resolvedMobile = useMemo(() => resolveSelectMobileOptions(mobileOptions), [mobileOptions]);
254
+ const useMobileSheet = isMobile && resolvedMobile.sheet;
255
+ const overlayState = useContext(OverlayTriggerStateContext);
256
+ const open = overlayState?.isOpen ?? false;
257
+ const { shouldRender, panelStyle, backdropStyle } = useMobileSheetAnimation(open, useMobileSheet);
258
+ useEffect(() => {
259
+ if (!useMobileSheet || !open) return;
260
+ const prev = document.body.style.overflow;
261
+ document.body.style.overflow = "hidden";
262
+ return () => {
263
+ document.body.style.overflow = prev;
264
+ };
265
+ }, [useMobileSheet, open]);
266
+ const close = () => overlayState?.close();
267
+ const showMobileSheet = useMobileSheet && shouldRender;
268
+ const isMobileSheetExiting = showMobileSheet && !open;
269
+ const mobileScrim = useMobileSheet && shouldRender && typeof document !== "undefined" ? createPortal(
270
+ /* @__PURE__ */ jsx(
271
+ "div",
272
+ {
273
+ className: "fixed inset-0 z-50 bg-overlay/70",
274
+ style: backdropStyle,
275
+ onClick: close,
276
+ "aria-hidden": "true"
277
+ }
278
+ ),
279
+ document.body
280
+ ) : null;
281
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
282
+ mobileScrim,
283
+ /* @__PURE__ */ jsx(
284
+ Popover$1,
285
+ {
286
+ placement: "bottom",
287
+ containerPadding: 0,
288
+ offset: 4,
289
+ ...props,
290
+ isExiting: isMobileSheetExiting,
291
+ ...useMobileSheet ? { "data-select-mobile-sheet": true } : {},
292
+ style: useMobileSheet ? { ...panelStyle, ...style } : style,
293
+ className: (state) => cx(
294
+ "outline-hidden",
295
+ !useMobileSheet && [
296
+ "w-(--trigger-width) origin-(--trigger-anchor-point) rounded-lg bg-primary shadow-lg ring-1 ring-secondary_alt will-change-transform",
297
+ compoundContent ? "overflow-hidden outline-hidden" : "overflow-x-hidden overflow-y-auto py-1 outline-hidden",
298
+ state.isEntering && "duration-150 ease-out animate-in fade-in placement-right:slide-in-from-left-0.5 placement-top:slide-in-from-bottom-0.5 placement-bottom:slide-in-from-top-0.5",
299
+ state.isExiting && "duration-100 ease-in animate-out fade-out placement-right:slide-out-to-left-0.5 placement-top:slide-out-to-bottom-0.5 placement-bottom:slide-out-to-top-0.5",
300
+ !compoundContent && size === "sm" && "max-h-56!",
301
+ !compoundContent && size === "md" && "max-h-64!",
302
+ !compoundContent && size === "lg" && "max-h-80!"
303
+ ],
304
+ useMobileSheet && [
305
+ "fixed! inset-x-0! bottom-0! top-auto! left-0! right-0! z-[51] flex w-full! max-w-none! flex-col overflow-hidden rounded-t-2xl rounded-b-none border-x-0 border-t border-secondary bg-primary shadow-xl",
306
+ "max-h-[min(90dvh,calc(100dvh-env(safe-area-inset-bottom,0px)))]",
307
+ resolvedMobile.sheetClassName
308
+ ],
309
+ typeof className === "function" ? className(state) : className
310
+ ),
311
+ children: (state) => {
312
+ const content = typeof children === "function" ? children(state) : children;
313
+ if (useMobileSheet) {
314
+ return /* @__PURE__ */ jsx(
315
+ MobileSheetChrome,
316
+ {
317
+ title: resolvedMobile.title,
318
+ contentClassName: resolvedMobile.contentClassName,
319
+ onClose: close,
320
+ children: content
321
+ }
322
+ );
323
+ }
324
+ return content;
325
+ }
326
+ }
327
+ )
328
+ ] });
153
329
  };
154
330
  var sizes = {
155
331
  sm: {
@@ -162,6 +338,11 @@ var sizes = {
162
338
  md: { root: "py-2 px-3 gap-2 *:data-icon:size-5", withIcon: "", text: "text-md", textContainer: "gap-x-1.5", shortcut: "pr-2.5" },
163
339
  lg: { root: "py-2.5 px-3.5 gap-2 *:data-icon:size-5", withIcon: "", text: "text-md", textContainer: "gap-x-1.5", shortcut: "pr-3" }
164
340
  };
341
+ var searchSizes = {
342
+ sm: { wrapper: "py-1", root: "px-3 py-2 gap-2 *:data-icon:size-4 *:data-icon:stroke-[2.25px]", text: "text-sm" },
343
+ md: { wrapper: "py-0.5", root: "px-3 py-2 gap-2 *:data-icon:size-5", text: "text-md" },
344
+ lg: { wrapper: "py-0.5", root: "px-3.5 py-2.5 gap-2 *:data-icon:size-5", text: "text-md" }
345
+ };
165
346
  var SelectContext = createContext({ size: "md" });
166
347
  function hasResizeObserver() {
167
348
  return typeof window.ResizeObserver !== "undefined";
@@ -211,6 +392,47 @@ var isForwardRefComponent = (component) => {
211
392
  var isReactComponent = (component) => {
212
393
  return isFunctionComponent(component) || isForwardRefComponent(component) || isClassComponent(component);
213
394
  };
395
+ var ComboBoxMobileTrigger = ({ size, placeholder, icon: IconProp, isInvalid, onPointerEnter, ref }) => {
396
+ const state = useContext(ComboBoxStateContext);
397
+ const selectedItem = state?.selectedItem?.value ?? null;
398
+ return /* @__PURE__ */ jsxs(
399
+ Button,
400
+ {
401
+ ref,
402
+ onPress: () => state?.open(),
403
+ onPointerEnter,
404
+ className: ({ isFocusVisible, isDisabled }) => cx(
405
+ "relative flex w-full cursor-pointer items-center gap-2 rounded-lg border border-solid border-primary bg-primary text-left shadow-xs outline-hidden transition-[border-color,box-shadow] duration-100 ease-linear",
406
+ isDisabled && "cursor-not-allowed opacity-50",
407
+ !isInvalid && (isFocusVisible || state?.isOpen) && inputFocusRingShadow,
408
+ isInvalid && !(isFocusVisible || state?.isOpen) && "border-error_subtle",
409
+ isInvalid && (isFocusVisible || state?.isOpen) && inputErrorFocusRingShadow,
410
+ "*:data-icon:shrink-0 *:data-icon:text-fg-quaternary",
411
+ sizes[size].root
412
+ ),
413
+ children: [
414
+ isReactComponent(IconProp) ? /* @__PURE__ */ jsx(IconProp, { "data-icon": true, className: "pointer-events-none", "aria-hidden": "true" }) : isValidElement(IconProp) ? IconProp : /* @__PURE__ */ jsx(MagnifyingGlassIcon, { "data-icon": true, className: "pointer-events-none", "aria-hidden": "true" }),
415
+ selectedItem ? /* @__PURE__ */ jsxs("section", { className: cx("flex w-full truncate", sizes[size].textContainer), children: [
416
+ /* @__PURE__ */ jsx("p", { className: cx("truncate font-medium text-primary", sizes[size].text), children: selectedItem.label }),
417
+ selectedItem.supportingText && /* @__PURE__ */ jsx("p", { className: cx("text-tertiary", sizes[size].text), children: selectedItem.supportingText })
418
+ ] }) : /* @__PURE__ */ jsx("p", { className: cx("truncate text-placeholder", sizes[size].text), children: placeholder })
419
+ ]
420
+ }
421
+ );
422
+ };
423
+ var ComboBoxSheetSearch = ({ size, placeholder, icon: IconProp }) => /* @__PURE__ */ jsx("div", { className: cx("shrink-0 border-b border-secondary", searchSizes[size].wrapper), children: /* @__PURE__ */ jsxs("div", { className: cx("flex items-center", searchSizes[size].root), children: [
424
+ isReactComponent(IconProp) ? /* @__PURE__ */ jsx(IconProp, { "data-icon": true, "aria-hidden": "true", className: "shrink-0 text-fg-quaternary" }) : isValidElement(IconProp) ? IconProp : /* @__PURE__ */ jsx(MagnifyingGlassIcon, { "data-icon": true, "aria-hidden": "true", className: "shrink-0 text-fg-quaternary" }),
425
+ /* @__PURE__ */ jsx(
426
+ Input,
427
+ {
428
+ placeholder,
429
+ className: cx(
430
+ "w-full appearance-none bg-transparent text-primary caret-alpha-black/90 outline-hidden placeholder:text-placeholder",
431
+ searchSizes[size].text
432
+ )
433
+ }
434
+ )
435
+ ] }) });
214
436
  var ComboBoxValue = ({ size, shortcut, placeholder, shortcutClassName, icon: IconProp, isInvalid, ref, ...otherProps }) => {
215
437
  const state = useContext(ComboBoxStateContext);
216
438
  const value = state?.selectedItem?.value || null;
@@ -223,12 +445,14 @@ var ComboBoxValue = ({ size, shortcut, placeholder, shortcutClassName, icon: Ico
223
445
  ref,
224
446
  ...otherProps,
225
447
  isInvalid,
226
- className: ({ isFocusWithin, isDisabled, isInvalid: isGroupInvalid }) => cx(
448
+ className: ({ isDisabled, isInvalid: isGroupInvalid }) => cx(
227
449
  "relative flex w-full items-center gap-2 rounded-lg border border-solid border-primary bg-primary shadow-xs outline-hidden transition-[border-color,box-shadow] duration-100 ease-linear",
228
450
  isDisabled && "cursor-not-allowed opacity-50",
229
- !isGroupInvalid && isFocusWithin && inputFocusRingShadow,
230
- isGroupInvalid && !isFocusWithin && "border-error_subtle",
231
- isGroupInvalid && isFocusWithin && inputErrorFocusRingShadow,
451
+ !isGroupInvalid && state?.isOpen && inputFocusRingShadow,
452
+ !isGroupInvalid && "has-[input:focus-visible]:border-brand has-[input:focus-visible]:ring-1 has-[input:focus-visible]:ring-inset has-[input:focus-visible]:ring-brand",
453
+ isGroupInvalid && !state?.isOpen && "border-error_subtle",
454
+ isGroupInvalid && state?.isOpen && inputErrorFocusRingShadow,
455
+ isGroupInvalid && "has-[input:focus-visible]:border-error has-[input:focus-visible]:ring-1 has-[input:focus-visible]:ring-inset has-[input:focus-visible]:ring-error",
232
456
  // Icon styles
233
457
  "*:data-icon:shrink-0 *:data-icon:text-fg-quaternary",
234
458
  sizes[size].root
@@ -282,26 +506,40 @@ var ComboBox = ({
282
506
  shortcutClassName,
283
507
  icon,
284
508
  hideRequiredIndicator,
509
+ mobileOptions,
285
510
  ...otherProps
286
511
  }) => {
287
- const placeholderRef = useRef(null);
512
+ const isMobile = useIsMobile();
513
+ const resolvedMobile = useMemo(() => resolveSelectMobileOptions(mobileOptions), [mobileOptions]);
514
+ const useMobileSheet = isMobile && resolvedMobile.sheet;
515
+ const triggerRef = useRef(null);
288
516
  const [popoverWidth, setPopoverWidth] = useState("");
289
517
  const onResize = useCallback(() => {
290
- if (!placeholderRef.current) return;
291
- const divRect = placeholderRef.current?.getBoundingClientRect();
518
+ if (!triggerRef.current) return;
519
+ const divRect = triggerRef.current.getBoundingClientRect();
292
520
  setPopoverWidth(divRect.width + "px");
293
- }, [placeholderRef, setPopoverWidth]);
521
+ }, []);
294
522
  useResizeObserver({
295
- ref: placeholderRef,
523
+ ref: triggerRef,
296
524
  box: "border-box",
297
525
  onResize
298
526
  });
299
- return /* @__PURE__ */ jsx(SelectContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx(ComboBox$1, { menuTrigger: "focus", ...otherProps, children: (state) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
527
+ return /* @__PURE__ */ jsx(SelectContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx(ComboBox$1, { menuTrigger: useMobileSheet ? "manual" : "focus", ...otherProps, children: (state) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
300
528
  otherProps.label && /* @__PURE__ */ jsx(Label, { isRequired: hideRequiredIndicator ? false : state.isRequired, tooltip: otherProps.tooltip, children: otherProps.label }),
301
- /* @__PURE__ */ jsx(
529
+ useMobileSheet ? /* @__PURE__ */ jsx(
530
+ ComboBoxMobileTrigger,
531
+ {
532
+ ref: triggerRef,
533
+ placeholder,
534
+ icon,
535
+ size,
536
+ isInvalid: state.isInvalid,
537
+ onPointerEnter: onResize
538
+ }
539
+ ) : /* @__PURE__ */ jsx(
302
540
  ComboBoxValue,
303
541
  {
304
- ref: placeholderRef,
542
+ ref: triggerRef,
305
543
  placeholder,
306
544
  shortcut,
307
545
  shortcutClassName,
@@ -312,7 +550,21 @@ var ComboBox = ({
312
550
  onPointerEnter: onResize
313
551
  }
314
552
  ),
315
- /* @__PURE__ */ jsx(Popover, { size, triggerRef: placeholderRef, style: { width: popoverWidth }, className: otherProps.popoverClassName, children: /* @__PURE__ */ jsx(ListBox, { items, className: "size-full outline-hidden", children }) }),
553
+ /* @__PURE__ */ jsx(
554
+ Popover,
555
+ {
556
+ size,
557
+ triggerRef,
558
+ compoundContent: useMobileSheet,
559
+ style: useMobileSheet ? void 0 : { width: popoverWidth },
560
+ className: otherProps.popoverClassName,
561
+ mobileOptions: { title: otherProps.label, ...mobileOptions },
562
+ children: useMobileSheet ? /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-col overflow-hidden outline-hidden", children: [
563
+ /* @__PURE__ */ jsx(ComboBoxSheetSearch, { size, placeholder, icon }),
564
+ /* @__PURE__ */ jsx(ListBox, { items, className: "min-h-0 flex-1 overflow-y-auto py-1 outline-hidden", children })
565
+ ] }) : /* @__PURE__ */ jsx(ListBox, { items, className: "size-full outline-hidden", children })
566
+ }
567
+ ),
316
568
  otherProps.hint && /* @__PURE__ */ jsx(HintText, { isInvalid: state.isInvalid, className: cx(size === "sm" && "text-xs"), children: otherProps.hint })
317
569
  ] }) }) });
318
570
  };