@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.
- package/dist/react/badge-groups.js +2 -2
- package/dist/react/badge-groups.js.map +1 -1
- package/dist/react/badge.js +49 -18
- package/dist/react/badge.js.map +1 -1
- package/dist/react/button.js +2 -2
- package/dist/react/button.js.map +1 -1
- package/dist/react/checkbox.js +10 -7
- package/dist/react/checkbox.js.map +1 -1
- package/dist/react/combobox.d.ts +3 -2
- package/dist/react/combobox.js +284 -32
- package/dist/react/combobox.js.map +1 -1
- package/dist/react/dropdown-account-breadcrumb.js +176 -14
- package/dist/react/dropdown-account-breadcrumb.js.map +1 -1
- package/dist/react/dropdown-account-button.js +190 -25
- package/dist/react/dropdown-account-button.js.map +1 -1
- package/dist/react/dropdown-account-card-md.js +189 -24
- package/dist/react/dropdown-account-card-md.js.map +1 -1
- package/dist/react/dropdown-account-card-sm.js +189 -24
- package/dist/react/dropdown-account-card-sm.js.map +1 -1
- package/dist/react/dropdown-account-card-xs.js +189 -24
- package/dist/react/dropdown-account-card-xs.js.map +1 -1
- package/dist/react/dropdown-avatar.js +190 -25
- package/dist/react/dropdown-avatar.js.map +1 -1
- package/dist/react/dropdown-button-advanced.js +190 -25
- package/dist/react/dropdown-button-advanced.js.map +1 -1
- package/dist/react/dropdown-button-link.js +189 -24
- package/dist/react/dropdown-button-link.js.map +1 -1
- package/dist/react/dropdown-button-simple.js +190 -25
- package/dist/react/dropdown-button-simple.js.map +1 -1
- package/dist/react/dropdown-icon-advanced.js +189 -24
- package/dist/react/dropdown-icon-advanced.js.map +1 -1
- package/dist/react/dropdown-icon-simple.js +189 -24
- package/dist/react/dropdown-icon-simple.js.map +1 -1
- package/dist/react/dropdown-integration.js +190 -25
- package/dist/react/dropdown-integration.js.map +1 -1
- package/dist/react/dropdown-search-advanced.js +191 -26
- package/dist/react/dropdown-search-advanced.js.map +1 -1
- package/dist/react/dropdown-search-simple.js +191 -26
- package/dist/react/dropdown-search-simple.js.map +1 -1
- package/dist/react/dropdown.d.ts +4 -1
- package/dist/react/dropdown.js +189 -24
- package/dist/react/dropdown.js.map +1 -1
- package/dist/react/input-date.js.map +1 -1
- package/dist/react/input-file.js +3 -3
- package/dist/react/input-file.js.map +1 -1
- package/dist/react/input-group.js.map +1 -1
- package/dist/react/input-number.js +2 -2
- package/dist/react/input-number.js.map +1 -1
- package/dist/react/input-payment.js +1 -1
- package/dist/react/input-payment.js.map +1 -1
- package/dist/react/input-tags-outer.js +9 -9
- package/dist/react/input-tags-outer.js.map +1 -1
- package/dist/react/input-tags.js +8 -8
- package/dist/react/input-tags.js.map +1 -1
- package/dist/react/input.js +1 -1
- package/dist/react/input.js.map +1 -1
- package/dist/react/multi-select.d.ts +3 -2
- package/dist/react/multi-select.js +230 -29
- package/dist/react/multi-select.js.map +1 -1
- package/dist/react/popover.d.ts +10 -1
- package/dist/react/popover.js +195 -18
- package/dist/react/popover.js.map +1 -1
- package/dist/react/radio-buttons.js +2 -1
- package/dist/react/radio-buttons.js.map +1 -1
- package/dist/react/select-item.d.ts +2 -1
- package/dist/react/select-item.js +11 -7
- package/dist/react/select-item.js.map +1 -1
- package/dist/react/select.d.ts +4 -3
- package/dist/react/select.js +298 -42
- package/dist/react/select.js.map +1 -1
- package/dist/react/switch.js +1 -1
- package/dist/react/switch.js.map +1 -1
- package/dist/react/tag-select.d.ts +5 -2
- package/dist/react/tag-select.js +215 -25
- package/dist/react/tag-select.js.map +1 -1
- package/dist/react/tags.js +8 -8
- package/dist/react/tags.js.map +1 -1
- package/dist/react/textarea.js.map +1 -1
- package/dist/select-mobile-sheet-CB2ptDTJ.d.ts +12 -0
- package/dist/{select-shared-B3Y5SMXU.d.ts → select-shared-oJEeJxeB.d.ts} +6 -0
- package/package.json +1 -1
- package/theme.css +3 -1
package/dist/react/checkbox.js
CHANGED
|
@@ -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
|
|
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
|
|
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:
|
|
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:
|
|
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"]}
|
package/dist/react/combobox.d.ts
CHANGED
|
@@ -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-
|
|
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 };
|
package/dist/react/combobox.js
CHANGED
|
@@ -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
|
|
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
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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: ({
|
|
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 &&
|
|
230
|
-
isGroupInvalid &&
|
|
231
|
-
isGroupInvalid &&
|
|
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
|
|
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 (!
|
|
291
|
-
const divRect =
|
|
518
|
+
if (!triggerRef.current) return;
|
|
519
|
+
const divRect = triggerRef.current.getBoundingClientRect();
|
|
292
520
|
setPopoverWidth(divRect.width + "px");
|
|
293
|
-
}, [
|
|
521
|
+
}, []);
|
|
294
522
|
useResizeObserver({
|
|
295
|
-
ref:
|
|
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:
|
|
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(
|
|
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
|
};
|