@andrilla/mado-ui 1.1.0 → 1.1.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.
package/dist/client.js CHANGED
@@ -3,7 +3,7 @@ import { extendTailwindMerge, twJoin } from "tailwind-merge";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Button as Button$1, Checkbox as Checkbox$1, Combobox, ComboboxButton, ComboboxInput, ComboboxOption, ComboboxOptions, Description, Dialog, DialogBackdrop, DialogPanel, DialogTitle, Disclosure, DisclosureButton, DisclosurePanel, Field, Fieldset as Fieldset$1, Input as Input$1, Label, Legend, Listbox, ListboxButton, ListboxOption, ListboxOptions, ListboxSelectedOption, Menu, MenuButton, MenuHeading, MenuItem, MenuItems, MenuSection, MenuSeparator, Textarea as Textarea$1 } from "@headlessui/react";
5
5
  import * as React from "react";
6
- import { Children, Suspense, cloneElement, createContext, isValidElement, useCallback, useContext, useEffect, useEffectEvent, useId, useLayoutEffect, useRef, useState, useSyncExternalStore } from "react";
6
+ import { Children, cloneElement, createContext, isValidElement, useCallback, useContext, useEffect, useEffectEvent, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
7
7
  import * as ReactDOM from "react-dom";
8
8
  import { createPortal } from "react-dom";
9
9
  //#region src/utils/custom-tailwind-merge.ts
@@ -6733,39 +6733,37 @@ function Input({ children, className, description, descriptionProps: { className
6733
6733
  }
6734
6734
  //#endregion
6735
6735
  //#region src/hooks/create-fast-context.tsx
6736
- function createFastContext(defaultInitialState) {
6737
- function useStoreData(initialState = defaultInitialState) {
6738
- const store = useRef(initialState), get = () => store.current, subscribers = useRef(/* @__PURE__ */ new Set());
6739
- const set = (value) => {
6740
- if (typeof value === "function") store.current = value(store.current);
6741
- else store.current = value;
6742
- subscribers.current.forEach((callback) => callback());
6743
- };
6744
- const subscribe = (callback) => {
6745
- subscribers.current.add(callback);
6746
- return () => subscribers.current.delete(callback);
6747
- };
6736
+ function createFastContext(initialState) {
6737
+ function useStoreData() {
6738
+ const store = useRef(initialState);
6739
+ const get = useCallback(() => store.current, []);
6740
+ const subscribers = useRef(/* @__PURE__ */ new Set());
6748
6741
  return {
6749
6742
  get,
6750
- set,
6751
- subscribe
6743
+ set: useCallback((value) => {
6744
+ store.current = {
6745
+ ...store.current,
6746
+ ...value
6747
+ };
6748
+ subscribers.current.forEach((callback) => callback());
6749
+ }, []),
6750
+ subscribe: useCallback((callback) => {
6751
+ subscribers.current.add(callback);
6752
+ return () => subscribers.current.delete(callback);
6753
+ }, [])
6752
6754
  };
6753
6755
  }
6754
6756
  const StoreContext = createContext(null);
6755
- function Provider({ initialValue = defaultInitialState, ...props }) {
6757
+ function Provider({ children }) {
6756
6758
  return /* @__PURE__ */ jsx(StoreContext.Provider, {
6757
- value: useStoreData(initialValue),
6758
- ...props
6759
+ value: useStoreData(),
6760
+ children
6759
6761
  });
6760
6762
  }
6761
- function useStore(selector, initialValue) {
6763
+ function useStore(selector) {
6762
6764
  const store = useContext(StoreContext);
6763
- if (!store) {
6764
- const selectedValue = selector(initialValue !== void 0 ? initialValue : defaultInitialState);
6765
- const noOpSet = () => console.warn("Attempting to set store value outside of Provider");
6766
- return [selectedValue, noOpSet];
6767
- }
6768
- return [useSyncExternalStore(store.subscribe, () => selector(store.get()), () => selector(initialValue !== void 0 ? initialValue : defaultInitialState)), store.set];
6765
+ if (!store) throw new Error("Store not found");
6766
+ return [useSyncExternalStore(store.subscribe, () => selector(store.get()), () => selector(initialState)), store.set];
6769
6767
  }
6770
6768
  return {
6771
6769
  Provider,
@@ -6775,15 +6773,12 @@ function createFastContext(defaultInitialState) {
6775
6773
  //#endregion
6776
6774
  //#region src/hooks/use-form-status.tsx
6777
6775
  const DEFAULT_STATUS = "incomplete";
6778
- const { Provider, useStore } = createFastContext(DEFAULT_STATUS);
6779
- function FormStatusProvider({ children, initialStatus = DEFAULT_STATUS }) {
6780
- return /* @__PURE__ */ jsx(Suspense, { children: /* @__PURE__ */ jsx(Provider, {
6781
- initialValue: initialStatus,
6782
- children
6783
- }) });
6784
- }
6785
- function useFormStatus() {
6786
- return useStore((store) => store);
6776
+ function useFormStatusContext(initialStatus = DEFAULT_STATUS) {
6777
+ const { Provider: FormStatusProvider, useStore: useFormStatus } = createFastContext(initialStatus);
6778
+ return {
6779
+ FormStatusProvider,
6780
+ useFormStatus
6781
+ };
6787
6782
  }
6788
6783
  //#endregion
6789
6784
  //#region src/hooks/use-pointer-movement.ts
@@ -7031,17 +7026,11 @@ function ModalDialog({ dialogPanelProps: { className: dialogPanelClassName, styl
7031
7026
  if (!setModalControls) return;
7032
7027
  if (progressY >= DRAG_TO_CLOSE_PROGRESS && !readyToCloseRef.current) {
7033
7028
  readyToCloseRef.current = true;
7034
- setModalControls((prev) => ({
7035
- ...prev,
7036
- readyToClose: true
7037
- }));
7029
+ setModalControls({ readyToClose: true });
7038
7030
  }
7039
7031
  if (progressY < DRAG_TO_CLOSE_PROGRESS && readyToCloseRef.current) {
7040
7032
  readyToCloseRef.current = false;
7041
- setModalControls((prev) => ({
7042
- ...prev,
7043
- readyToClose: false
7044
- }));
7033
+ setModalControls({ readyToClose: false });
7045
7034
  }
7046
7035
  },
7047
7036
  trigger: draggableTrigger
@@ -7178,11 +7167,10 @@ function ModalDisplay({ children, className, onClose, onOpen, place = "bottom" }
7178
7167
  const closeFunctions = () => {
7179
7168
  onClose?.();
7180
7169
  modalControls?.pseudoContainerRef?.current?.remove();
7181
- setModalControls?.((previous) => ({
7182
- ...previous,
7170
+ setModalControls?.({
7183
7171
  pseudoContainerRef: { current: null },
7184
7172
  readyToClose: false
7185
- }));
7173
+ });
7186
7174
  };
7187
7175
  const mobileAnimation = {
7188
7176
  y: "100%",
@@ -7211,15 +7199,14 @@ function ModalDisplay({ children, className, onClose, onOpen, place = "bottom" }
7211
7199
  });
7212
7200
  };
7213
7201
  useEffect(() => {
7214
- setModalControls?.((previous) => ({
7215
- ...previous,
7202
+ setModalControls?.({
7216
7203
  isOpen,
7217
7204
  place,
7218
7205
  className,
7219
7206
  openModal,
7220
7207
  closeModal,
7221
7208
  dialogPanelRef: localDialogPanelRef
7222
- }));
7209
+ });
7223
7210
  }, [
7224
7211
  className,
7225
7212
  closeModal,
@@ -7286,6 +7273,10 @@ function ChevronUpChevronDown({ weight = "regular", ...props }) {
7286
7273
  }
7287
7274
  //#endregion
7288
7275
  //#region src/components/select.tsx
7276
+ const { Provider: SelectContextProvider, useStore: useSelectContext } = createFastContext({
7277
+ multiple: false,
7278
+ selectedOptionDisplayProps: {}
7279
+ });
7289
7280
  /**
7290
7281
  * ## Select Section Title
7291
7282
  *
@@ -7300,48 +7291,32 @@ function SelectSectionTitle({ className, ...props }) {
7300
7291
  /**
7301
7292
  * ## SelectOption
7302
7293
  *
7303
- * @prop children - This is what is displayed in the drop down menu
7304
- * @prop name - This is displayed in the trigger button
7305
- * @prop value - This is used for FormData
7306
- */
7307
- function SelectOption({ children, className, name, ...props }) {
7294
+ * @prop children - This is what is displayed in the drop down menu.
7295
+ * @prop name - This is displayed in the trigger button.
7296
+ * @prop value - This is used for FormData.
7297
+ * @prop selectedDisplayProps - This is used to customize the display of the selected option (takes priority over selectedOptionDisplayProps).
7298
+ */
7299
+ function SelectOption({ children, className, name, selectedDisplayProps: { children: selectedDisplayChildren, className: selectedDisplayClassName, ...selectedDisplayProps } = {}, ...props }) {
7300
+ const [selectContext] = useSelectContext((store) => store), { multiple, selectedOptionDisplayProps } = selectContext || {};
7301
+ const { children: selectedOptionDisplayChildren, className: selectedOptionDisplayClassName } = selectedOptionDisplayProps || {};
7308
7302
  return /* @__PURE__ */ jsx(ListboxOption, {
7309
7303
  className: "group/option contents",
7310
7304
  ...props,
7311
7305
  children: (bag) => bag.selectedOption ? /* @__PURE__ */ jsx("span", {
7312
- className: `mr-3 before:absolute before:-left-3 before:content-[',_']`,
7313
- children: name
7306
+ ...selectedOptionDisplayProps,
7307
+ ...selectedDisplayProps,
7308
+ className: twMerge(!selectedDisplayClassName && !selectedOptionDisplayClassName && multiple && `before:content-[',_'] group-first-of-type/option:before:content-['']`, selectedOptionDisplayClassName, selectedDisplayClassName),
7309
+ children: selectedDisplayChildren ? typeof selectedDisplayChildren === "function" ? selectedDisplayChildren(name) : selectedDisplayChildren : selectedOptionDisplayChildren ? typeof selectedOptionDisplayChildren === "function" ? selectedOptionDisplayChildren(name) : selectedOptionDisplayChildren : name
7314
7310
  }) : /* @__PURE__ */ jsxs("div", {
7315
- className: twMerge("flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1 transition-[background-color] duration-200 ease-exponential select-none [--theme-color:var(--base-theme-color)] corner-super-1.5 group-disabled/option:opacity-50 group-data-focus/option:bg-(--theme-color)/15 group-data-selected/option:cursor-default group-data-selected/option:text-(--theme-color) group-data-focus/option:group-data-selected/option:bg-transparent dark:group-data-focus/option:bg-(--theme-color)/15", className),
7316
- children: [/* @__PURE__ */ jsx(Checkmark, { className: "invisible size-3.5 group-data-selected/option:visible" }), typeof children === "function" ? children(bag) : children]
7311
+ className: twMerge("flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1 transition-[background-color,color] duration-200 ease-exponential select-none [--theme-color:var(--base-theme-color)] corner-super-1.5 group-disabled/option:opacity-50 group-data-focus/option:bg-(--theme-color)/15 group-data-selected/option:text-(--theme-color) dark:group-data-focus/option:bg-(--theme-color)/15", !multiple && "group-data-selected/option:cursor-default group-data-focus/option:group-data-selected/option:bg-transparent", className),
7312
+ children: [/* @__PURE__ */ jsx(Checkmark, { className: "size-3.5 scale-70 opacity-0 transition-[opacity,scale] duration-200 ease-exponential group-data-selected/option:scale-100 group-data-selected/option:opacity-100" }), typeof children === "function" ? children(bag) : children]
7317
7313
  })
7318
7314
  });
7319
7315
  }
7320
- /**
7321
- * # Select
7322
- *
7323
- * A customizable select component intended to work very similar to HTML's `<select>` element.
7324
- *
7325
- * Use the `SelectOption` component to define the options.
7326
- *
7327
- * Use the `SelectSectionTitle` component to define titles.
7328
- *
7329
- * @prop label - The label for the select component.
7330
- * @prop description - The description for the select component.
7331
- * @prop placeholder - The placeholder for the select component.
7332
- * @prop required - Whether the select component is required.
7333
- * @prop invalid - Whether the select component is invalid.
7334
- * @prop multiple - Whether the select component allows multiple selections.
7335
- * @prop optionsProps - The props to be passed to each SelectOption component.
7336
- * @prop selectedOptionProps - The props to be passed to the selected option component.
7337
- * @prop fieldProps - The props to be passed to the parent field component.
7338
- * @prop labelProps - The props to be passed to the label component.
7339
- * @prop descriptionProps - The props to be passed to the description component.
7340
- * @prop anchor - The anchor point for the drop down menu.
7341
- */
7342
- function Select({ buttonProps, children, className, description, descriptionProps: { className: descriptionClassName, ...descriptionProps } = {}, fieldProps: { className: fieldClassName, ...fieldProps } = {}, invalid, label, labelProps: { className: labelClassName, ...labelProps } = {}, onChange, optionsProps: { anchor, className: optionsClassName, transition, ...optionsProps } = {}, placeholder, required, selectedOptionProps: { ...selectedOptionProps } = {}, ...props }) {
7316
+ function SelectField({ buttonProps, children, className, description, descriptionProps: { className: descriptionClassName, ...descriptionProps } = {}, fieldProps: { className: fieldClassName, ...fieldProps } = {}, invalid, label, labelProps: { className: labelClassName, ...labelProps } = {}, onChange, optionsProps: { anchor, className: optionsClassName, transition, ...optionsProps } = {}, placeholder, required, selectedOptionProps, selectedOptionDisplayProps, ...props }) {
7343
7317
  const uniqueId = useId();
7344
- const multiple = props.multiple;
7318
+ const multiple = Boolean(props.multiple);
7319
+ const [, setSelectContext] = useSelectContext((store) => store);
7345
7320
  const selectOptionList = Children.toArray(children).filter((child) => isValidElement(child) && child.props && typeof child.props === "object" && "name" in child.props && "value" in child.props && "children" in child.props);
7346
7321
  const listboxButtonRef = useRef(null);
7347
7322
  const [isInvalid, setIsInvalid] = useState(invalid);
@@ -7353,6 +7328,15 @@ function Select({ buttonProps, children, className, description, descriptionProp
7353
7328
  };
7354
7329
  const handleInvalid = () => setIsInvalid(true);
7355
7330
  const refocus = () => listboxButtonRef.current?.focus();
7331
+ const onVisible = useEffectEvent(() => {
7332
+ setSelectContext?.({
7333
+ multiple,
7334
+ selectedOptionDisplayProps
7335
+ });
7336
+ });
7337
+ useEffect(() => {
7338
+ onVisible();
7339
+ }, []);
7356
7340
  return /* @__PURE__ */ jsxs(Field, {
7357
7341
  ...fieldProps,
7358
7342
  className: (bag) => twMerge("grid gap-1", typeof fieldClassName === "function" ? fieldClassName(bag) : fieldClassName),
@@ -7409,6 +7393,32 @@ function Select({ buttonProps, children, className, description, descriptionProp
7409
7393
  ]
7410
7394
  });
7411
7395
  }
7396
+ /**
7397
+ * # Select
7398
+ *
7399
+ * A customizable select component intended to work very similar to HTML's `<select>` element.
7400
+ *
7401
+ * Use the `SelectOption` component to define the options.
7402
+ *
7403
+ * Use the `SelectSectionTitle` component to define titles.
7404
+ *
7405
+ * @prop label - The label for the select component.
7406
+ * @prop description - The description for the select component.
7407
+ * @prop placeholder - The placeholder for the select component.
7408
+ * @prop required - Whether the select component is required.
7409
+ * @prop invalid - Whether the select component is invalid.
7410
+ * @prop multiple - Whether the select component allows multiple selections.
7411
+ * @prop optionsProps - The props to be passed to each SelectOption component.
7412
+ * @prop selectedOptionProps - The props to be passed to the selected option component.
7413
+ * @prop selectedOptionDisplayProps - The props to be passed to each selected option in the selected option component.
7414
+ * @prop fieldProps - The props to be passed to the parent field component.
7415
+ * @prop labelProps - The props to be passed to the label component.
7416
+ * @prop descriptionProps - The props to be passed to the description component.
7417
+ * @prop anchor - The anchor point for the drop down menu.
7418
+ */
7419
+ function Select(props) {
7420
+ return /* @__PURE__ */ jsx(SelectContextProvider, { children: /* @__PURE__ */ jsx(SelectField, { ...props }) });
7421
+ }
7412
7422
  //#endregion
7413
7423
  //#region src/symbols/plus.tsx
7414
7424
  function Plus({ weight = "regular", ...props }) {
@@ -7462,6 +7472,23 @@ function Plus({ weight = "regular", ...props }) {
7462
7472
  }
7463
7473
  //#endregion
7464
7474
  //#region src/components/search.tsx
7475
+ const { Provider: SearchContextProvider, useStore: useSearchContext } = createFastContext({
7476
+ multiple: false,
7477
+ query: "",
7478
+ selectedOptionDisplayProps: {},
7479
+ selectedOptionList: []
7480
+ });
7481
+ /**
7482
+ * ## Search Section Title
7483
+ *
7484
+ * Displays a simple title.
7485
+ */
7486
+ function SearchSectionTitle({ className, ...props }) {
7487
+ return /* @__PURE__ */ jsx("div", {
7488
+ className: twMerge("sticky -top-1 z-10 -mx-1 bg-inherit mask-t-from-transparent mask-t-from-0 mask-t-to-white mask-t-to-1.5 pl-2 font-bold text-neutral-500/50 backdrop-blur-[2px] backdrop-brightness-101", className),
7489
+ ...props
7490
+ });
7491
+ }
7465
7492
  /**
7466
7493
  * ## SearchOption
7467
7494
  *
@@ -7469,8 +7496,17 @@ function Plus({ weight = "regular", ...props }) {
7469
7496
  * @prop name - This is used for filtering by default
7470
7497
  * @prop value - This is used as selected value and for FormData
7471
7498
  */
7472
- function SearchOption({ children, className, name, value, ...props }) {
7473
- return /* @__PURE__ */ jsx(ComboboxOption, {
7499
+ function SearchOption({ children, className, isInDisplay, name, selectedDisplayProps: { children: selectedDisplayChildren, className: selectedDisplayClassName, ...selectedDisplayProps } = {}, value, ...props }) {
7500
+ const [searchContext] = useSearchContext((store) => store);
7501
+ const { multiple, query, selectedOptionDisplayProps } = searchContext || {};
7502
+ if (!((query || "").trim() === "" || name.toLowerCase().includes((query || "").toLowerCase()) || isInDisplay)) return /* @__PURE__ */ jsx(Fragment, {});
7503
+ const { children: selectedOptionDisplayChildren, className: selectedOptionDisplayClassName } = selectedOptionDisplayProps || {};
7504
+ return isInDisplay ? /* @__PURE__ */ jsx("span", {
7505
+ ...selectedOptionDisplayProps,
7506
+ ...selectedDisplayProps,
7507
+ className: twMerge(!selectedDisplayClassName && !selectedOptionDisplayClassName && multiple && `after:content-[',_'] last-of-type:after:content-['']`, selectedOptionDisplayClassName, selectedDisplayClassName),
7508
+ children: selectedDisplayChildren ? typeof selectedDisplayChildren === "function" ? selectedDisplayChildren(name) : selectedDisplayChildren : selectedOptionDisplayChildren ? typeof selectedOptionDisplayChildren === "function" ? selectedOptionDisplayChildren(name) : selectedOptionDisplayChildren : name
7509
+ }) : /* @__PURE__ */ jsx(ComboboxOption, {
7474
7510
  className: "group/option contents",
7475
7511
  value: {
7476
7512
  id: value,
@@ -7478,46 +7514,130 @@ function SearchOption({ children, className, name, value, ...props }) {
7478
7514
  },
7479
7515
  ...props,
7480
7516
  children: (bag) => /* @__PURE__ */ jsxs("div", {
7481
- className: twMerge("flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1 transition-[background-color] duration-200 ease-exponential select-none [--theme-color:var(--base-theme-color)] corner-super-1.5 group-disabled/option:opacity-50 group-data-focus/option:bg-(--theme-color)/15 group-data-selected/option:cursor-default group-data-selected/option:text-(--theme-color) group-data-focus/option:group-data-selected/option:bg-transparent dark:group-data-focus/option:bg-(--theme-color)/15", className),
7482
- children: [/* @__PURE__ */ jsx(Checkmark, { className: "invisible size-3.5 group-data-selected/option:visible" }), typeof children === "function" ? children(bag) : children ?? name]
7517
+ className: twMerge("flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1 transition-[background-color,color] duration-200 ease-exponential select-none [--theme-color:var(--base-theme-color)] corner-super-1.5 group-disabled/option:opacity-50 group-data-focus/option:bg-(--theme-color)/15 group-data-selected/option:text-(--theme-color) dark:group-data-focus/option:bg-(--theme-color)/15", !multiple && "group-data-selected/option:cursor-default group-data-focus/option:group-data-selected/option:bg-transparent", className),
7518
+ children: [/* @__PURE__ */ jsx(Checkmark, { className: "size-3.5 scale-70 opacity-0 transition-[opacity,scale] duration-200 ease-exponential group-data-selected/option:scale-100 group-data-selected/option:opacity-100" }), typeof children === "function" ? children(bag) : children ?? name]
7483
7519
  })
7484
7520
  });
7485
7521
  }
7486
- /**
7487
- * # Search
7488
- *
7489
- * A searchable select component built on top of Headless UI's `Combobox`.
7490
- *
7491
- * Use the `SearchOption` component to define options.
7492
- */
7493
- function Search({ allowCustom, buttonProps, children, className, defaultValue, description, descriptionProps: { className: descriptionClassName, ...descriptionProps } = {}, fieldProps: { className: fieldClassName, ...fieldProps } = {}, inputProps, invalid, label, labelProps: { className: labelClassName, ...labelProps } = {}, multiple, onChange, optionsProps: { anchor, className: optionsClassName, transition, ...optionsProps } = {}, placeholder, required = true, ...props }) {
7522
+ function checkEquality(aOptionList, bOptionList) {
7523
+ if (aOptionList.length !== bOptionList.length) return false;
7524
+ for (let i = 0; i < aOptionList.length; i += 1) {
7525
+ const aOption = aOptionList[i], bOption = bOptionList[i];
7526
+ if (aOption?.id !== bOption?.id || aOption?.name !== bOption?.name) return false;
7527
+ }
7528
+ return true;
7529
+ }
7530
+ function SearchField({ allowCustom, buttonProps, children, className, defaultValue, description, descriptionProps: { className: descriptionClassName, ...descriptionProps } = {}, fieldProps: { className: fieldClassName, ...fieldProps } = {}, inputProps, invalid, label, labelProps: { className: labelClassName, ...labelProps } = {}, multiple, onChange, optionsProps: { anchor, className: optionsClassName, transition, ...optionsProps } = {}, placeholder, required = true, shelfProps: { className: shelfClassName, ...shelfProps } = {}, selectedOptionDisplayProps, singleDisplay, ...props }) {
7494
7531
  const uniqueId = useId();
7495
- const options = Children.toArray(children).flatMap((child) => {
7496
- if (!isValidElement(child)) return [];
7497
- const candidate = child;
7498
- if (typeof candidate.props?.name !== "string") return [];
7499
- if (typeof candidate.props?.value !== "string") return [];
7500
- return [{
7501
- name: candidate.props.name,
7502
- value: candidate.props.value,
7503
- element: child
7504
- }];
7505
- });
7506
- const [query, setQuery] = useState("");
7532
+ const [searchContext, setSearchContext] = useSearchContext((store) => store), { query } = searchContext || {};
7507
7533
  const [isInvalid, setIsInvalid] = useState(invalid);
7508
7534
  const [selectedOptionSync, setSelectedOptionSync] = useState(() => {
7509
7535
  if (multiple) return Array.isArray(defaultValue) ? defaultValue : [];
7510
7536
  return typeof defaultValue === "string" ? defaultValue : null;
7511
7537
  });
7512
7538
  const comboboxInputRef = useRef(null);
7513
- const filteredOptions = query.trim() === "" ? options : options.filter((option) => option.name.toLowerCase().includes(query.toLowerCase()));
7539
+ const childOptionList = useMemo(() => Children.toArray(children).filter((child) => isValidElement(child) && !!child.props && "value" in child.props && "name" in child.props), [children]);
7540
+ const staticOptionList = useMemo(() => childOptionList.map((child) => ({
7541
+ id: child.props.value,
7542
+ name: child.props.name,
7543
+ selectedDisplayProps: child.props.selectedDisplayProps
7544
+ })), [childOptionList]);
7545
+ const [addedOptionList, setAddedOptionList] = useState([]);
7546
+ const customOptionFromQuery = useMemo(() => {
7547
+ const trimmedQuery = query.trim();
7548
+ if (!allowCustom || trimmedQuery.length === 0) return null;
7549
+ return {
7550
+ id: props.customOptionParams?.formatID?.(trimmedQuery) ?? toLowerCase(trimmedQuery, [" ", "_"]),
7551
+ name: trimmedQuery
7552
+ };
7553
+ }, [
7554
+ allowCustom,
7555
+ props.customOptionParams,
7556
+ query
7557
+ ]);
7558
+ const optionLookupMap = useMemo(() => {
7559
+ const lookupMap = /* @__PURE__ */ new Map();
7560
+ for (const option of staticOptionList) lookupMap.set(option.id, option.name);
7561
+ for (const option of addedOptionList) lookupMap.set(option.id, option.name);
7562
+ return lookupMap;
7563
+ }, [addedOptionList, staticOptionList]);
7564
+ const saveCustomOption = useEffectEvent((option) => {
7565
+ if (!multiple) return;
7566
+ setAddedOptionList((prevOptionList) => {
7567
+ if (prevOptionList.some((prevOption) => prevOption.id === option.id)) return prevOptionList;
7568
+ return [...prevOptionList, option];
7569
+ });
7570
+ });
7514
7571
  const handleChange = (selected) => {
7515
7572
  setIsInvalid(false);
7573
+ if (multiple && Array.isArray(selected)) {
7574
+ const selectedValueList = selected.map((selectedValue) => {
7575
+ if (selectedValue && typeof selectedValue === "object" && "id" in selectedValue && "name" in selectedValue) {
7576
+ const option = {
7577
+ id: String(selectedValue.id),
7578
+ name: String(selectedValue.name)
7579
+ };
7580
+ saveCustomOption(option);
7581
+ return option.id;
7582
+ }
7583
+ return String(selectedValue);
7584
+ });
7585
+ setSelectedOptionSync(selectedValueList);
7586
+ onChange?.(selectedValueList);
7587
+ return;
7588
+ }
7589
+ if (!multiple) {
7590
+ const normalizedSelected = selected && typeof selected === "object" && !Array.isArray(selected) ? String(selected.id) : selected;
7591
+ setSelectedOptionSync(normalizedSelected);
7592
+ onChange?.(normalizedSelected);
7593
+ return;
7594
+ }
7516
7595
  setSelectedOptionSync(selected);
7517
- onChange?.(selected);
7596
+ };
7597
+ const formatSelectedDisplay = (name) => {
7598
+ const selectedOptionDisplayChildren = selectedOptionDisplayProps?.children;
7599
+ if (!selectedOptionDisplayChildren) return name;
7600
+ const selectedOptionDisplayValue = typeof selectedOptionDisplayChildren === "function" ? selectedOptionDisplayChildren(name) : selectedOptionDisplayChildren;
7601
+ return typeof selectedOptionDisplayValue === "string" ? selectedOptionDisplayValue : name;
7518
7602
  };
7519
7603
  const handleInvalid = () => setIsInvalid(true);
7520
7604
  const refocus = () => comboboxInputRef.current?.focus();
7605
+ const onVisible = useEffectEvent(() => {
7606
+ setSearchContext?.({
7607
+ multiple,
7608
+ query: "",
7609
+ selectedOptionDisplayProps
7610
+ });
7611
+ });
7612
+ useEffect(() => {
7613
+ onVisible();
7614
+ }, []);
7615
+ useEffect(() => {
7616
+ const selectedOptionList = (Array.isArray(selectedOptionSync) ? selectedOptionSync : typeof selectedOptionSync === "string" ? [selectedOptionSync] : []).map((selectedId) => ({
7617
+ id: selectedId,
7618
+ name: optionLookupMap.get(selectedId) ?? selectedId
7619
+ }));
7620
+ if (!checkEquality(searchContext?.selectedOptionList ?? [], selectedOptionList)) setSearchContext?.({ selectedOptionList });
7621
+ }, [
7622
+ optionLookupMap,
7623
+ searchContext?.selectedOptionList,
7624
+ selectedOptionSync,
7625
+ setSearchContext
7626
+ ]);
7627
+ const queryChange = (e) => {
7628
+ const { currentTarget } = e, { value } = currentTarget;
7629
+ setSearchContext?.({ query: value });
7630
+ };
7631
+ const handleClose = () => {
7632
+ setSearchContext?.({ query: "" });
7633
+ };
7634
+ const updateDisplayValue = (value) => {
7635
+ if (multiple && Array.isArray(value)) {
7636
+ if (singleDisplay) return value.map((v) => formatSelectedDisplay(v.name)).join(", ");
7637
+ }
7638
+ if (!multiple && value) return formatSelectedDisplay(value.name);
7639
+ return "";
7640
+ };
7521
7641
  return /* @__PURE__ */ jsxs(Field, {
7522
7642
  ...fieldProps,
7523
7643
  className: (bag) => twMerge("grid gap-1", typeof fieldClassName === "function" ? fieldClassName(bag) : fieldClassName),
@@ -7532,64 +7652,88 @@ function Search({ allowCustom, buttonProps, children, className, defaultValue, d
7532
7652
  invalid: isInvalid || invalid,
7533
7653
  multiple,
7534
7654
  onChange: handleChange,
7535
- onClose: () => setQuery(""),
7536
- value: selectedOptionSync || "",
7655
+ onClose: handleClose,
7537
7656
  children: [/* @__PURE__ */ jsxs("div", {
7538
- className: "relative",
7539
- children: [
7540
- /* @__PURE__ */ jsx(ComboboxInput, {
7541
- ...inputProps,
7542
- "aria-label": typeof label === "string" ? label : props.name,
7543
- className: (bag) => twMerge("inline-block w-full overflow-clip rounded-xl border border-neutral-500/50 bg-neutral-100 py-1 pr-8 pl-2 text-left text-neutral-950 outline-offset-1 outline-blue-400/95 transition-[background-color] duration-300 ease-exponential corner-super-1.5 dark:bg-neutral-700 dark:text-neutral-50", "focus:outline-3 focus-visible:bg-neutral-50 focus-visible:outline-3 active:bg-neutral-200 dark:focus-visible:bg-neutral-600 dark:active:bg-neutral-800 pointer-fine:hover:bg-neutral-50 pointer-fine:active:bg-neutral-200 dark:pointer-fine:hover:bg-neutral-600 dark:pointer-fine:active:bg-neutral-800", "data-invalid:border-red-500 data-invalid:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-100)_5%)] data-invalid:focus-visible:bg-[color-mix(in_oklch,var(--color-red-500)_1%,var(--color-neutral-100))] data-invalid:active:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-100))] dark:data-invalid:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-800)_5%)] dark:data-invalid:focus-visible:bg-[color-mix(in_oklch,var(--color-red-500)_1%,var(--color-neutral-800))] dark:data-invalid:active:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-800)_5%)] data-invalid:pointer-fine:hover:bg-[color-mix(in_oklch,var(--color-red-500)_10%,var(--color-neutral-500)_5%)] data-invalid:pointer-fine:focus-visible:bg-[color-mix(in_oklch,var(--color-red-500)_1%,var(--color-neutral-100))] data-invalid:pointer-fine:active:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-100))] dark:data-invalid:pointer-fine:hover:bg-[color-mix(in_oklch,var(--color-red-500)_10%,var(--color-neutral-800)_5%)] dark:data-invalid:pointer-fine:focus-visible:bg-[color-mix(in_oklch,var(--color-red-500)_1%,var(--color-neutral-800))] dark:data-invalid:pointer-fine:active:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-800)_5%)]", typeof className === "function" ? className(bag) : className),
7544
- displayValue: (value) => Array.isArray(value) ? value.map((v) => v.name).join(", ") : value?.name ?? "",
7545
- name: props.name,
7546
- onChange: (event) => setQuery(event.target.value),
7547
- placeholder: placeholder || (multiple ? "Choose Any" : "Choose One"),
7548
- ref: comboboxInputRef,
7549
- required
7550
- }),
7551
- /* @__PURE__ */ jsx("input", {
7552
- "aria-hidden": "true",
7553
- className: "sr-only top-0 left-1/2",
7554
- id: props.name + ":input:id" + uniqueId,
7555
- name: props.name,
7556
- onChange: () => {},
7557
- onFocus: refocus,
7558
- onInvalid: handleInvalid,
7559
- required,
7560
- tabIndex: -1,
7561
- value: Array.isArray(selectedOptionSync) ? selectedOptionSync.join(", ") : selectedOptionSync ?? ""
7562
- }),
7563
- /* @__PURE__ */ jsx(ComboboxButton, {
7564
- ...buttonProps,
7565
- className: "absolute top-1/2 right-1.5 -translate-y-1/2 rounded p-0.5",
7566
- children: /* @__PURE__ */ jsx(ChevronUpChevronDown, { className: "size-3 fill-current/50" })
7567
- })
7568
- ]
7657
+ ...multiple ? { "data-multiple": "" } : {},
7658
+ className: "isolate contents data-multiple:grid",
7659
+ children: [/* @__PURE__ */ jsxs("div", {
7660
+ className: "relative",
7661
+ children: [
7662
+ /* @__PURE__ */ jsx(ComboboxInput, {
7663
+ ...inputProps,
7664
+ "aria-label": typeof label === "string" ? label : props.name,
7665
+ className: (bag) => twMerge("inline-block w-full overflow-clip rounded-xl border border-neutral-500/50 bg-neutral-100 py-1 pr-8 pl-2 text-left text-neutral-950 outline-offset-1 outline-blue-400/95 transition-[background-color] duration-300 ease-exponential corner-super-1.5 dark:bg-neutral-700 dark:text-neutral-50", "focus:outline-3 focus-visible:bg-neutral-50 focus-visible:outline-3 active:bg-neutral-200 dark:focus-visible:bg-neutral-600 dark:active:bg-neutral-800 pointer-fine:hover:bg-neutral-50 pointer-fine:active:bg-neutral-200 dark:pointer-fine:hover:bg-neutral-600 dark:pointer-fine:active:bg-neutral-800", "data-invalid:border-red-500 data-invalid:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-100)_5%)] data-invalid:focus-visible:bg-[color-mix(in_oklch,var(--color-red-500)_1%,var(--color-neutral-100))] data-invalid:active:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-100))] dark:data-invalid:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-800)_5%)] dark:data-invalid:focus-visible:bg-[color-mix(in_oklch,var(--color-red-500)_1%,var(--color-neutral-800))] dark:data-invalid:active:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-800)_5%)] data-invalid:pointer-fine:hover:bg-[color-mix(in_oklch,var(--color-red-500)_10%,var(--color-neutral-500)_5%)] data-invalid:pointer-fine:focus-visible:bg-[color-mix(in_oklch,var(--color-red-500)_1%,var(--color-neutral-100))] data-invalid:pointer-fine:active:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-100))] dark:data-invalid:pointer-fine:hover:bg-[color-mix(in_oklch,var(--color-red-500)_10%,var(--color-neutral-800)_5%)] dark:data-invalid:pointer-fine:focus-visible:bg-[color-mix(in_oklch,var(--color-red-500)_1%,var(--color-neutral-800))] dark:data-invalid:pointer-fine:active:bg-[color-mix(in_oklch,var(--color-red-500)_5%,var(--color-neutral-800)_5%)]", typeof className === "function" ? className(bag) : className),
7666
+ displayValue: updateDisplayValue,
7667
+ name: props.name,
7668
+ onChange: queryChange,
7669
+ placeholder: placeholder || `${multiple ? "Choose Any" : "Choose One"}${allowCustom ? " or Create Your Own" : ""}`,
7670
+ ref: comboboxInputRef,
7671
+ required
7672
+ }),
7673
+ /* @__PURE__ */ jsx("input", {
7674
+ "aria-hidden": "true",
7675
+ className: "sr-only top-0 left-1/2",
7676
+ id: props.name + ":input:id" + uniqueId,
7677
+ name: props.name,
7678
+ onChange: () => {},
7679
+ onFocus: refocus,
7680
+ onInvalid: handleInvalid,
7681
+ required,
7682
+ tabIndex: -1,
7683
+ value: Array.isArray(selectedOptionSync) ? selectedOptionSync.join(", ") : selectedOptionSync ?? ""
7684
+ }),
7685
+ /* @__PURE__ */ jsx(ComboboxButton, {
7686
+ ...buttonProps,
7687
+ className: "absolute top-1/2 right-1.5 -translate-y-1/2 rounded p-0.5",
7688
+ children: /* @__PURE__ */ jsx(ChevronUpChevronDown, { className: "size-3 fill-current/50" })
7689
+ })
7690
+ ]
7691
+ }), multiple && !singleDisplay && /* @__PURE__ */ jsx("div", {
7692
+ ...shelfProps,
7693
+ className: twMerge("flex min-h-8 flex-wrap gap-1 p-2 before:absolute before:inset-x-0 before:-top-4 before:bottom-0 before:-z-10 before:rounded-b-xl before:border before:border-t-0 before:border-neutral-500/50", shelfClassName),
7694
+ children: searchContext?.selectedOptionList?.length > 0 && [...staticOptionList, ...addedOptionList].filter((option, optionIndex, optionList) => {
7695
+ return optionList.findIndex((innerOption) => innerOption.id === option.id) === optionIndex;
7696
+ }).map((option) => {
7697
+ if (!searchContext.selectedOptionList.some(({ id }) => id === option.id)) return null;
7698
+ return /* @__PURE__ */ jsx(SearchOption, {
7699
+ name: option.name,
7700
+ value: option.id,
7701
+ selectedDisplayProps: option.selectedDisplayProps,
7702
+ isInDisplay: true,
7703
+ children: option.name
7704
+ }, option.id);
7705
+ }).filter(Boolean)
7706
+ })]
7569
7707
  }), /* @__PURE__ */ jsxs(ComboboxOptions, {
7570
7708
  ...optionsProps,
7571
7709
  anchor: anchor || "bottom start",
7572
- className: (bag) => twMerge("z-50 w-(--input-width) origin-top rounded-xl border border-neutral-500/50 bg-neutral-50/95 p-1 backdrop-blur-sm backdrop-brightness-110 transition-[opacity,scale,translate] duration-300 ease-exponential [--anchor-gap:--spacing(1)] corner-super-1.5 empty:invisible focus:outline-none data-closed:-translate-y-0.5 data-closed:scale-y-0 data-closed:opacity-0 data-[anchor*=top]:origin-bottom dark:bg-neutral-800/95", typeof optionsClassName === "function" ? optionsClassName(bag) : optionsClassName),
7710
+ className: (bag) => twMerge("z-50 w-(--input-width) origin-top rounded-xl border border-neutral-500/50 bg-neutral-50/95 p-1 backdrop-blur-sm backdrop-brightness-110 transition-[opacity,scale,translate] duration-300 ease-exponential corner-super-1.5 empty:invisible focus:outline-none data-closed:-translate-y-0.5 data-closed:scale-y-0 data-closed:opacity-0 data-[anchor*=top]:origin-bottom dark:bg-neutral-800/95", multiple && !singleDisplay ? "[--anchor-gap:--spacing(8)]" : "[--anchor-gap:--spacing(1)]", typeof optionsClassName === "function" ? optionsClassName(bag) : optionsClassName),
7573
7711
  transition: transition ?? true,
7574
- children: [allowCustom && query.length > 0 && /* @__PURE__ */ jsx(ComboboxOption, {
7575
- value: {
7576
- id: props.customOptionParams?.formatID?.(query) ?? toLowerCase(query, [" ", "_"]),
7577
- name: query
7578
- },
7579
- className: "group/option contents",
7580
- children: ({ selected }) => /* @__PURE__ */ jsx("div", {
7581
- className: "flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1 transition-[background-color] duration-200 ease-exponential select-none [--theme-color:var(--base-theme-color)] corner-super-1.5 group-disabled/option:opacity-50 group-data-focus/option:bg-(--theme-color)/15 group-data-selected/option:cursor-default group-data-selected/option:text-(--theme-color) group-data-focus/option:group-data-selected/option:bg-transparent dark:group-data-focus/option:bg-(--theme-color)/15",
7582
- children: selected ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Checkmark, { className: "size-3.5" }), query] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
7583
- /* @__PURE__ */ jsx(Plus, { className: "size-3.5" }),
7584
- "Use ",
7585
- /* @__PURE__ */ jsxs("b", { children: [
7586
- "\"",
7587
- query,
7588
- "\""
7589
- ] })
7590
- ] })
7591
- })
7592
- }), filteredOptions.map((option) => option.element)]
7712
+ children: [
7713
+ allowCustom && query.length > 0 && customOptionFromQuery && !addedOptionList.some((addedOption) => addedOption.id === customOptionFromQuery.id) && /* @__PURE__ */ jsx(ComboboxOption, {
7714
+ value: customOptionFromQuery,
7715
+ className: "group/option contents",
7716
+ children: /* @__PURE__ */ jsxs("div", {
7717
+ className: "flex cursor-pointer items-center gap-2 rounded-lg px-2 py-1 transition-[background-color] duration-200 ease-exponential select-none [--theme-color:var(--base-theme-color)] corner-super-1.5 group-disabled/option:opacity-50 group-data-focus/option:bg-(--theme-color)/15 dark:group-data-focus/option:bg-(--theme-color)/15",
7718
+ children: [
7719
+ /* @__PURE__ */ jsx(Plus, { className: "size-3.5" }),
7720
+ "Use ",
7721
+ /* @__PURE__ */ jsxs("b", { children: [
7722
+ "\"",
7723
+ query,
7724
+ "\""
7725
+ ] })
7726
+ ]
7727
+ })
7728
+ }),
7729
+ children,
7730
+ multiple && addedOptionList.filter((addedOption) => !staticOptionList.some((staticOption) => staticOption.id === addedOption.id)).map((addedOption) => /* @__PURE__ */ jsx(SearchOption, {
7731
+ name: addedOption.name,
7732
+ value: addedOption.id,
7733
+ selectedDisplayProps: addedOption.selectedDisplayProps,
7734
+ children: addedOption.name
7735
+ }, "added:" + addedOption.id))
7736
+ ]
7593
7737
  })]
7594
7738
  }),
7595
7739
  description && /* @__PURE__ */ jsx(Description, {
@@ -7600,6 +7744,31 @@ function Search({ allowCustom, buttonProps, children, className, defaultValue, d
7600
7744
  ]
7601
7745
  });
7602
7746
  }
7747
+ /**
7748
+ * # Search
7749
+ *
7750
+ * A searchable select component built on top of Headless UI's `Combobox`.
7751
+ *
7752
+ * Use the `SearchOption` component to define options.
7753
+ *
7754
+ * Use the `SearchSectionTitle` component to define titles.
7755
+ *
7756
+ * @prop label - The label for the select component.
7757
+ * @prop description - The description for the select component.
7758
+ * @prop placeholder - The placeholder for the select component.
7759
+ * @prop required - Whether the select component is required.
7760
+ * @prop invalid - Whether the select component is invalid.
7761
+ * @prop multiple - Whether the select component allows multiple selections.
7762
+ * @prop optionsProps - The props to be passed to each SearchOption component.
7763
+ * @prop selectedOptionDisplayProps - The props to be passed to each selected option in the selected option component.
7764
+ * @prop fieldProps - The props to be passed to the parent field component.
7765
+ * @prop labelProps - The props to be passed to the label component.
7766
+ * @prop descriptionProps - The props to be passed to the description component.
7767
+ * @prop anchor - The anchor point for the drop down menu.
7768
+ */
7769
+ function Search(props) {
7770
+ return /* @__PURE__ */ jsx(SearchContextProvider, { children: /* @__PURE__ */ jsx(SearchField, { ...props }) });
7771
+ }
7603
7772
  //#endregion
7604
7773
  //#region src/symbols/circle.fill.tsx
7605
7774
  function CircleFill({ weight = "regular", ...props }) {
@@ -9602,25 +9771,21 @@ function TooltipDisplay({ anchor = "top", arrow: arrow$4, arrowClassName, childr
9602
9771
  clearTimeout(timeoutRef.current);
9603
9772
  };
9604
9773
  }, []);
9605
- const [, setTooltipContext] = useTooltipContext(() => void 0, defaultTooltipContext);
9774
+ const [tooltipContext, setTooltipContext] = useTooltipContext(() => defaultTooltipContext);
9606
9775
  useEffect(() => {
9607
- setTooltipContext?.((previous) => {
9608
- const nextArrow = arrow$4 || false, nextArrowClassName = arrowClassName || "";
9609
- if (previous.isOpen === isOpen && previous.openTooltip === openTooltip && previous.closeTooltip === closeTooltip && previous.refs === refs && previous.floatingStyles === floatingStyles && previous.isPositioned === isPositioned && previous.placement === placement && previous.middlewareData === middlewareData && previous.arrowRef === arrowRef && previous.arrow === nextArrow && previous.arrowClassName === nextArrowClassName) return previous;
9610
- return {
9611
- ...previous,
9612
- isOpen,
9613
- openTooltip,
9614
- closeTooltip,
9615
- refs,
9616
- floatingStyles,
9617
- isPositioned,
9618
- placement,
9619
- middlewareData,
9620
- arrowRef,
9621
- arrow: nextArrow,
9622
- arrowClassName: nextArrowClassName
9623
- };
9776
+ const nextArrow = arrow$4 || false, nextArrowClassName = arrowClassName || "";
9777
+ if (tooltipContext && tooltipContext.isOpen !== isOpen || tooltipContext.openTooltip !== openTooltip || tooltipContext.closeTooltip !== closeTooltip || tooltipContext.refs !== refs || tooltipContext.floatingStyles !== floatingStyles || tooltipContext.isPositioned !== isPositioned || tooltipContext.placement !== placement || tooltipContext.middlewareData !== middlewareData || tooltipContext.arrowRef !== arrowRef || tooltipContext.arrow !== nextArrow || tooltipContext.arrowClassName !== nextArrowClassName) setTooltipContext?.({
9778
+ isOpen,
9779
+ openTooltip,
9780
+ closeTooltip,
9781
+ refs,
9782
+ floatingStyles,
9783
+ isPositioned,
9784
+ placement,
9785
+ middlewareData,
9786
+ arrowRef,
9787
+ arrow: nextArrow,
9788
+ arrowClassName: nextArrowClassName
9624
9789
  });
9625
9790
  }, [
9626
9791
  arrow$4,
@@ -10095,4 +10260,4 @@ function YouTubeLogo({ className, cutout = false, targets, ...props }) {
10095
10260
  });
10096
10261
  }
10097
10262
  //#endregion
10098
- export { Anchor, Button, Checkbox, Details, DetailsBody, DetailsSummary, DropDown, DropDownButton, DropDownItem, DropDownItems, DropDownSection, DropDownSeparator, FacebookLogo, Fieldset, Form, FormStatusProvider, Ghost, GoogleLogo, Heading, HumanVerification, IFrame, Input, InstagramLogo, Link, LinkedInLogo, Modal, ModalClose, ModalDialog, ModalTitle, ModalTrigger, Search, SearchOption, Select, SelectOption, SelectSectionTitle, SubmitButton, Textarea, TikTokLogo, Time, Tooltip, TooltipPanel, TooltipTrigger, XLogo, YouTubeLogo, addClass, createFastContext, currentMonthName, currentWeekdayName, daysInMonth, easeOutExpo, emailRegex, extendMadoTailwindMerge, firstOfMonth, formatPhoneNumber, generateHumanValidationToken, getDate, getHours, getHoursIn12, getLinkClasses, getLocalTime, getMeridianFromHour, getMilliseconds, getMinutes, getMonth, getMonthIndexFromName, getMonthName, getNextMonth, getPreviousMonth, getSeconds, getTimezone, getUserReadableDate, getUserReadableDateFromTimestampz, getWeekdayName, getYearsInRange, hasClass, isEmail, isPhoneNumber, monthNamesList, removeClass, splitCamelCase, telRegex, toCamelCase, toFullDateString, toLowerCase, toTitleCase, toggleClass, twMerge, useFormStatus, useMobileDevice, usePointerMovement, validateHuman, weekdayNamesList };
10263
+ export { Anchor, Button, Checkbox, Details, DetailsBody, DetailsSummary, DropDown, DropDownButton, DropDownItem, DropDownItems, DropDownSection, DropDownSeparator, FacebookLogo, Fieldset, Form, Ghost, GoogleLogo, Heading, HumanVerification, IFrame, Input, InstagramLogo, Link, LinkedInLogo, Modal, ModalClose, ModalDialog, ModalTitle, ModalTrigger, Search, SearchOption, SearchSectionTitle, Select, SelectOption, SelectSectionTitle, SubmitButton, Textarea, TikTokLogo, Time, Tooltip, TooltipPanel, TooltipTrigger, XLogo, YouTubeLogo, addClass, createFastContext, currentMonthName, currentWeekdayName, daysInMonth, easeOutExpo, emailRegex, extendMadoTailwindMerge, firstOfMonth, formatPhoneNumber, generateHumanValidationToken, getDate, getHours, getHoursIn12, getLinkClasses, getLocalTime, getMeridianFromHour, getMilliseconds, getMinutes, getMonth, getMonthIndexFromName, getMonthName, getNextMonth, getPreviousMonth, getSeconds, getTimezone, getUserReadableDate, getUserReadableDateFromTimestampz, getWeekdayName, getYearsInRange, hasClass, isEmail, isPhoneNumber, monthNamesList, removeClass, splitCamelCase, telRegex, toCamelCase, toFullDateString, toLowerCase, toTitleCase, toggleClass, twMerge, useFormStatusContext, useMobileDevice, usePointerMovement, validateHuman, weekdayNamesList };