@yamada-ui/react 2.2.3-dev-20260622135744 → 2.2.3-dev-20260624122859
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/cjs/components/accordion/use-accordion.cjs.map +1 -1
- package/dist/cjs/components/autocomplete/use-autocomplete.cjs.map +1 -1
- package/dist/cjs/components/calendar/use-calendar.cjs +1 -1
- package/dist/cjs/components/calendar/use-calendar.cjs.map +1 -1
- package/dist/cjs/components/carousel/carousel.cjs.map +1 -1
- package/dist/cjs/components/chart/chart.cjs.map +1 -1
- package/dist/cjs/components/chart/use-polar-chart.cjs.map +1 -1
- package/dist/cjs/components/checkbox/checkbox.cjs.map +1 -1
- package/dist/cjs/components/checkbox/use-checkbox-group.cjs.map +1 -1
- package/dist/cjs/components/checkbox-card/checkbox-card.cjs.map +1 -1
- package/dist/cjs/components/collapse/collapse.cjs.map +1 -1
- package/dist/cjs/components/color-picker/use-color-picker.cjs.map +1 -1
- package/dist/cjs/components/color-swatch/color-swatch-group.cjs.map +1 -1
- package/dist/cjs/components/date-picker/date-picker.cjs.map +1 -1
- package/dist/cjs/components/date-picker/use-date-picker.cjs +1 -1
- package/dist/cjs/components/date-picker/use-date-picker.cjs.map +1 -1
- package/dist/cjs/components/editable/use-editable.cjs.map +1 -1
- package/dist/cjs/components/field/field.cjs.map +1 -1
- package/dist/cjs/components/file-input/file-input.cjs.map +1 -1
- package/dist/cjs/components/flip/flip.cjs.map +1 -1
- package/dist/cjs/components/highlight/highlight.cjs.map +1 -1
- package/dist/cjs/components/indicator/indicator.cjs.map +1 -1
- package/dist/cjs/components/infinite-scroll-area/use-infinite-scroll.cjs.map +1 -1
- package/dist/cjs/components/input/input-group.cjs.map +1 -1
- package/dist/cjs/components/list/list.cjs.map +1 -1
- package/dist/cjs/components/menu/use-menu.cjs.map +1 -1
- package/dist/cjs/components/native-select/use-native-select.cjs.map +1 -1
- package/dist/cjs/components/native-table/native-table.cjs.map +1 -1
- package/dist/cjs/components/notice/notice.cjs.map +1 -1
- package/dist/cjs/components/number-input/use-number-input.cjs.map +1 -1
- package/dist/cjs/components/pagination/pagination.cjs.map +1 -1
- package/dist/cjs/components/pagination/use-pagination.cjs.map +1 -1
- package/dist/cjs/components/picture/picture.cjs.map +1 -1
- package/dist/cjs/components/pin-input/pin-input.cjs.map +1 -1
- package/dist/cjs/components/pin-input/use-pin-input.cjs.map +1 -1
- package/dist/cjs/components/qr-code/use-qr-code.cjs.map +1 -1
- package/dist/cjs/components/radio/use-radio-group.cjs.map +1 -1
- package/dist/cjs/components/segmented-control/segmented-control.cjs.map +1 -1
- package/dist/cjs/components/select/use-select.cjs.map +1 -1
- package/dist/cjs/components/show/show.cjs.map +1 -1
- package/dist/cjs/components/sidebar/sidebar.cjs.map +1 -1
- package/dist/cjs/components/sidebar/use-sidebar.cjs.map +1 -1
- package/dist/cjs/components/simple-grid/simple-grid.cjs.map +1 -1
- package/dist/cjs/components/stack/z-stack.cjs.map +1 -1
- package/dist/cjs/components/steps/steps.cjs.map +1 -1
- package/dist/cjs/components/steps/use-steps.cjs.map +1 -1
- package/dist/cjs/components/table/table.cjs.map +1 -1
- package/dist/cjs/components/tabs/tabs.cjs.map +1 -1
- package/dist/cjs/components/toggle/use-toggle-group.cjs.map +1 -1
- package/dist/cjs/components/toggle/use-toggle.cjs.map +1 -1
- package/dist/cjs/components/tree/tree.cjs.map +1 -1
- package/dist/cjs/components/tree/use-tree.cjs.map +1 -1
- package/dist/cjs/core/components/create-component.cjs.map +1 -1
- package/dist/cjs/core/components/props.cjs +5 -1
- package/dist/cjs/core/components/props.cjs.map +1 -1
- package/dist/cjs/core/components/use-component-style.cjs.map +1 -1
- package/dist/cjs/core/css/animation.cjs.map +1 -1
- package/dist/cjs/core/css/at-rule.cjs.map +1 -1
- package/dist/cjs/core/css/calc.cjs.map +1 -1
- package/dist/cjs/core/css/color-mix.cjs.map +1 -1
- package/dist/cjs/core/css/config.cjs.map +1 -1
- package/dist/cjs/core/css/css.cjs.map +1 -1
- package/dist/cjs/core/css/gradient.cjs.map +1 -1
- package/dist/cjs/core/css/grid.cjs.map +1 -1
- package/dist/cjs/core/css/index.cjs +1 -0
- package/dist/cjs/core/css/styles.cjs +253 -0
- package/dist/cjs/core/css/styles.cjs.map +1 -1
- package/dist/cjs/core/css/transition.cjs.map +1 -1
- package/dist/cjs/core/css/utils.cjs.map +1 -1
- package/dist/cjs/core/index.cjs +1 -0
- package/dist/cjs/core/system/breakpoint.cjs.map +1 -1
- package/dist/cjs/core/system/color-mode-provider.cjs.map +1 -1
- package/dist/cjs/core/system/create-system.cjs.map +1 -1
- package/dist/cjs/core/system/environment-provider.cjs.map +1 -1
- package/dist/cjs/core/system/storage-manager.cjs.map +1 -1
- package/dist/cjs/core/system/storage-script.cjs.map +1 -1
- package/dist/cjs/core/system/use-system-color-mode.cjs.map +1 -1
- package/dist/cjs/core/system/var.cjs.map +1 -1
- package/dist/cjs/hooks/use-animation/index.cjs.map +1 -1
- package/dist/cjs/hooks/use-breakpoint/use-breakpoint-value.cjs.map +1 -1
- package/dist/cjs/hooks/use-breakpoint/use-breakpoint.cjs.map +1 -1
- package/dist/cjs/hooks/use-clickable/index.cjs.map +1 -1
- package/dist/cjs/hooks/use-clipboard/index.cjs.map +1 -1
- package/dist/cjs/hooks/use-controllable-state/index.cjs.map +1 -1
- package/dist/cjs/hooks/use-counter/index.cjs.map +1 -1
- package/dist/cjs/hooks/use-descendants/index.cjs.map +1 -1
- package/dist/cjs/hooks/use-focus/index.cjs.map +1 -1
- package/dist/cjs/hooks/use-local-storage/index.cjs.map +1 -1
- package/dist/cjs/hooks/use-mounted/index.cjs.map +1 -1
- package/dist/cjs/hooks/use-outside-click/index.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/providers/i18n-provider/i18n-provider.cjs.map +1 -1
- package/dist/cjs/utils/children.cjs.map +1 -1
- package/dist/cjs/utils/dom.cjs.map +1 -1
- package/dist/cjs/utils/store.cjs.map +1 -1
- package/dist/esm/components/accordion/use-accordion.js.map +1 -1
- package/dist/esm/components/autocomplete/use-autocomplete.js.map +1 -1
- package/dist/esm/components/calendar/use-calendar.js +1 -1
- package/dist/esm/components/calendar/use-calendar.js.map +1 -1
- package/dist/esm/components/carousel/carousel.js.map +1 -1
- package/dist/esm/components/chart/chart.js.map +1 -1
- package/dist/esm/components/chart/use-polar-chart.js.map +1 -1
- package/dist/esm/components/checkbox/checkbox.js.map +1 -1
- package/dist/esm/components/checkbox/use-checkbox-group.js.map +1 -1
- package/dist/esm/components/checkbox-card/checkbox-card.js.map +1 -1
- package/dist/esm/components/collapse/collapse.js.map +1 -1
- package/dist/esm/components/color-picker/use-color-picker.js.map +1 -1
- package/dist/esm/components/color-swatch/color-swatch-group.js.map +1 -1
- package/dist/esm/components/date-picker/date-picker.js.map +1 -1
- package/dist/esm/components/date-picker/use-date-picker.js +1 -1
- package/dist/esm/components/date-picker/use-date-picker.js.map +1 -1
- package/dist/esm/components/editable/use-editable.js.map +1 -1
- package/dist/esm/components/field/field.js.map +1 -1
- package/dist/esm/components/file-input/file-input.js.map +1 -1
- package/dist/esm/components/flip/flip.js.map +1 -1
- package/dist/esm/components/highlight/highlight.js.map +1 -1
- package/dist/esm/components/indicator/indicator.js.map +1 -1
- package/dist/esm/components/infinite-scroll-area/use-infinite-scroll.js.map +1 -1
- package/dist/esm/components/input/input-group.js.map +1 -1
- package/dist/esm/components/list/list.js.map +1 -1
- package/dist/esm/components/menu/use-menu.js.map +1 -1
- package/dist/esm/components/native-select/use-native-select.js.map +1 -1
- package/dist/esm/components/native-table/native-table.js.map +1 -1
- package/dist/esm/components/notice/notice.js.map +1 -1
- package/dist/esm/components/number-input/use-number-input.js.map +1 -1
- package/dist/esm/components/pagination/pagination.js.map +1 -1
- package/dist/esm/components/pagination/use-pagination.js.map +1 -1
- package/dist/esm/components/picture/picture.js.map +1 -1
- package/dist/esm/components/pin-input/pin-input.js.map +1 -1
- package/dist/esm/components/pin-input/use-pin-input.js.map +1 -1
- package/dist/esm/components/qr-code/use-qr-code.js.map +1 -1
- package/dist/esm/components/radio/use-radio-group.js.map +1 -1
- package/dist/esm/components/segmented-control/segmented-control.js.map +1 -1
- package/dist/esm/components/select/use-select.js.map +1 -1
- package/dist/esm/components/show/show.js.map +1 -1
- package/dist/esm/components/sidebar/sidebar.js.map +1 -1
- package/dist/esm/components/sidebar/use-sidebar.js.map +1 -1
- package/dist/esm/components/simple-grid/simple-grid.js.map +1 -1
- package/dist/esm/components/stack/z-stack.js.map +1 -1
- package/dist/esm/components/steps/steps.js.map +1 -1
- package/dist/esm/components/steps/use-steps.js.map +1 -1
- package/dist/esm/components/table/table.js.map +1 -1
- package/dist/esm/components/tabs/tabs.js.map +1 -1
- package/dist/esm/components/toggle/use-toggle-group.js.map +1 -1
- package/dist/esm/components/toggle/use-toggle.js.map +1 -1
- package/dist/esm/components/tree/tree.js.map +1 -1
- package/dist/esm/components/tree/use-tree.js.map +1 -1
- package/dist/esm/core/components/create-component.js.map +1 -1
- package/dist/esm/core/components/props.js +6 -2
- package/dist/esm/core/components/props.js.map +1 -1
- package/dist/esm/core/components/use-component-style.js.map +1 -1
- package/dist/esm/core/css/animation.js.map +1 -1
- package/dist/esm/core/css/at-rule.js.map +1 -1
- package/dist/esm/core/css/calc.js.map +1 -1
- package/dist/esm/core/css/color-mix.js.map +1 -1
- package/dist/esm/core/css/config.js.map +1 -1
- package/dist/esm/core/css/css.js.map +1 -1
- package/dist/esm/core/css/gradient.js.map +1 -1
- package/dist/esm/core/css/grid.js.map +1 -1
- package/dist/esm/core/css/index.js +2 -2
- package/dist/esm/core/css/styles.js +253 -1
- package/dist/esm/core/css/styles.js.map +1 -1
- package/dist/esm/core/css/transition.js.map +1 -1
- package/dist/esm/core/css/utils.js.map +1 -1
- package/dist/esm/core/index.js +2 -2
- package/dist/esm/core/system/breakpoint.js.map +1 -1
- package/dist/esm/core/system/color-mode-provider.js.map +1 -1
- package/dist/esm/core/system/create-system.js.map +1 -1
- package/dist/esm/core/system/environment-provider.js.map +1 -1
- package/dist/esm/core/system/storage-manager.js.map +1 -1
- package/dist/esm/core/system/storage-script.js.map +1 -1
- package/dist/esm/core/system/use-system-color-mode.js.map +1 -1
- package/dist/esm/core/system/var.js.map +1 -1
- package/dist/esm/hooks/use-animation/index.js.map +1 -1
- package/dist/esm/hooks/use-breakpoint/use-breakpoint-value.js.map +1 -1
- package/dist/esm/hooks/use-breakpoint/use-breakpoint.js.map +1 -1
- package/dist/esm/hooks/use-clickable/index.js.map +1 -1
- package/dist/esm/hooks/use-clipboard/index.js.map +1 -1
- package/dist/esm/hooks/use-controllable-state/index.js.map +1 -1
- package/dist/esm/hooks/use-counter/index.js.map +1 -1
- package/dist/esm/hooks/use-descendants/index.js.map +1 -1
- package/dist/esm/hooks/use-focus/index.js.map +1 -1
- package/dist/esm/hooks/use-local-storage/index.js.map +1 -1
- package/dist/esm/hooks/use-mounted/index.js.map +1 -1
- package/dist/esm/hooks/use-outside-click/index.js.map +1 -1
- package/dist/esm/index.js +3 -2
- package/dist/esm/providers/i18n-provider/i18n-provider.js.map +1 -1
- package/dist/esm/utils/children.js.map +1 -1
- package/dist/esm/utils/dom.js.map +1 -1
- package/dist/esm/utils/store.js.map +1 -1
- package/dist/types/core/css/index.d.ts +2 -2
- package/dist/types/core/css/styles.d.ts +3 -1
- package/dist/types/core/index.d.ts +2 -2
- package/dist/types/index.d.ts +3 -3
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["useCallbackRef"],"sources":["../../../../src/hooks/use-counter/index.ts"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useState } from \"react\"\nimport {\n clampNumber,\n countDecimal,\n toPrecision,\n useCallbackRef,\n} from \"../../utils\"\n\nconst parse = (value: number | string): number =>\n parseFloat(value.toString().replace(/[^\\w.-]+/g, \"\"))\n\nconst getCountDecimal = (value: number, step: number): number =>\n Math.max(countDecimal(step), countDecimal(value))\n\nconst casting = (\n value: number | string,\n step: number,\n precision?: number,\n): string | undefined => {\n value = parse(value)\n\n return !Number.isNaN(value)\n ? toPrecision(value, precision ?? getCountDecimal(value, step))\n : undefined\n}\n\nexport interface UseCounterProps {\n /**\n * The initial value of the counter.\n * Should be less than `max` and greater than `min`.\n */\n defaultValue?: number | string\n /**\n * This controls the value update behavior in general.\n *\n * - If `true` and you use the stepper or up/down arrow keys,\n * the value will not exceed the `max` or go lower than `min`.\n *\n * - If `false`, the value will be allowed to go out of range.\n *\n * @default true\n */\n keepWithinRange?: boolean\n /**\n * The maximum value of the counter\n *\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number\n /**\n * The minimum value of the counter\n *\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number\n /**\n * The number of decimal points used to round the value.\n */\n precision?: number\n /**\n * The step used to increment or decrement the value.\n *\n * @default 1\n */\n step?: number\n /**\n * The value of the counter.\n * Should be less than `max` and greater than `min`.\n */\n value?: number | string\n /**\n * The callback fired when the value changes.\n */\n onChange?: (valueAsString: string, valueAsNumber: number) => void\n}\n\n/**\n * `useCounter` is a custom hook that returns the current counter value.\n *\n * @see https://yamada-ui.com/docs/hooks/use-counter\n */\nexport const useCounter = ({\n keepWithinRange = true,\n max: maxValue = Number.MAX_SAFE_INTEGER,\n min: minValue = Number.MIN_SAFE_INTEGER,\n step: stepProp = 1,\n ...props\n}: UseCounterProps = {}) => {\n const onChange = useCallbackRef(props.onChange)\n\n const [defaultValue, setValue] = useState<number | string>(() => {\n if (props.defaultValue == null) return \"\"\n\n return casting(props.defaultValue, stepProp, props.precision) ?? \"\"\n })\n\n const isControlled = typeof props.value !== \"undefined\"\n const value = isControlled ? (props.value as number | string) : defaultValue\n\n const countDecimal = getCountDecimal(parse(value), stepProp)\n\n const precision = props.precision ?? countDecimal\n\n const update = useCallback(\n (next: number | string) => {\n if (next === value) return\n\n if (!isControlled) setValue(next.toString())\n\n onChange(next.toString(), parse(next))\n },\n [onChange, isControlled, value],\n )\n\n const clamp = useCallback(\n (value: number) => {\n let nextValue = value\n\n if (keepWithinRange)\n nextValue = clampNumber(nextValue, minValue, maxValue)\n\n return toPrecision(nextValue, precision)\n },\n [precision, keepWithinRange, maxValue, minValue],\n )\n\n const increment = useCallback(\n (step = stepProp) => {\n let next: number | string\n\n if (value === \"\")
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["useCallbackRef"],"sources":["../../../../src/hooks/use-counter/index.ts"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useState } from \"react\"\nimport {\n clampNumber,\n countDecimal,\n toPrecision,\n useCallbackRef,\n} from \"../../utils\"\n\nconst parse = (value: number | string): number =>\n parseFloat(value.toString().replace(/[^\\w.-]+/g, \"\"))\n\nconst getCountDecimal = (value: number, step: number): number =>\n Math.max(countDecimal(step), countDecimal(value))\n\nconst casting = (\n value: number | string,\n step: number,\n precision?: number,\n): string | undefined => {\n value = parse(value)\n\n return !Number.isNaN(value)\n ? toPrecision(value, precision ?? getCountDecimal(value, step))\n : undefined\n}\n\nexport interface UseCounterProps {\n /**\n * The initial value of the counter.\n * Should be less than `max` and greater than `min`.\n */\n defaultValue?: number | string\n /**\n * This controls the value update behavior in general.\n *\n * - If `true` and you use the stepper or up/down arrow keys,\n * the value will not exceed the `max` or go lower than `min`.\n *\n * - If `false`, the value will be allowed to go out of range.\n *\n * @default true\n */\n keepWithinRange?: boolean\n /**\n * The maximum value of the counter\n *\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number\n /**\n * The minimum value of the counter\n *\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number\n /**\n * The number of decimal points used to round the value.\n */\n precision?: number\n /**\n * The step used to increment or decrement the value.\n *\n * @default 1\n */\n step?: number\n /**\n * The value of the counter.\n * Should be less than `max` and greater than `min`.\n */\n value?: number | string\n /**\n * The callback fired when the value changes.\n */\n onChange?: (valueAsString: string, valueAsNumber: number) => void\n}\n\n/**\n * `useCounter` is a custom hook that returns the current counter value.\n *\n * @see https://yamada-ui.com/docs/hooks/use-counter\n */\nexport const useCounter = ({\n keepWithinRange = true,\n max: maxValue = Number.MAX_SAFE_INTEGER,\n min: minValue = Number.MIN_SAFE_INTEGER,\n step: stepProp = 1,\n ...props\n}: UseCounterProps = {}) => {\n const onChange = useCallbackRef(props.onChange)\n\n const [defaultValue, setValue] = useState<number | string>(() => {\n if (props.defaultValue == null) return \"\"\n\n return casting(props.defaultValue, stepProp, props.precision) ?? \"\"\n })\n\n const isControlled = typeof props.value !== \"undefined\"\n const value = isControlled ? (props.value as number | string) : defaultValue\n\n const countDecimal = getCountDecimal(parse(value), stepProp)\n\n const precision = props.precision ?? countDecimal\n\n const update = useCallback(\n (next: number | string) => {\n if (next === value) return\n\n if (!isControlled) setValue(next.toString())\n\n onChange(next.toString(), parse(next))\n },\n [onChange, isControlled, value],\n )\n\n const clamp = useCallback(\n (value: number) => {\n let nextValue = value\n\n if (keepWithinRange)\n nextValue = clampNumber(nextValue, minValue, maxValue)\n\n return toPrecision(nextValue, precision)\n },\n [precision, keepWithinRange, maxValue, minValue],\n )\n\n const increment = useCallback(\n (step = stepProp) => {\n let next: number | string\n\n if (value === \"\") next = parse(step)\n else next = parse(value) + step\n\n next = clamp(next)\n\n update(next)\n },\n [clamp, stepProp, update, value],\n )\n\n const decrement = useCallback(\n (step = stepProp) => {\n let next: number | string\n\n if (value === \"\") next = parse(-step)\n else next = parse(value) - step\n\n next = clamp(next)\n\n update(next)\n },\n [clamp, stepProp, update, value],\n )\n\n const reset = useCallback(() => {\n let next: number | string\n\n if (props.defaultValue == null) next = \"\"\n else\n next = casting(props.defaultValue, stepProp, props.precision) ?? minValue\n\n update(next)\n }, [props.defaultValue, props.precision, stepProp, update, minValue])\n\n const cast = useCallback(\n (value: number | string) => {\n const nextValue = casting(value, stepProp, precision) ?? minValue\n\n update(nextValue)\n },\n [precision, stepProp, update, minValue],\n )\n\n const valueAsNumber = parse(value)\n\n const out = valueAsNumber < minValue || maxValue < valueAsNumber\n const max = valueAsNumber === maxValue\n const min = valueAsNumber === minValue\n\n return {\n cast,\n clamp,\n decrement,\n increment,\n max,\n min,\n out,\n precision,\n reset,\n setValue,\n step: stepProp,\n update,\n value,\n valueAsNumber,\n }\n}\n\nexport type UseCounterReturn = ReturnType<typeof useCounter>\n"],"mappings":";;;;;;AAUA,MAAM,SAAS,UACb,WAAW,MAAM,SAAS,CAAC,CAAC,QAAQ,aAAa,EAAE,CAAC;AAEtD,MAAM,mBAAmB,OAAe,SACtC,KAAK,KAAA,GAAA,oBAAA,cAAA,aAAA,CAAiB,IAAI,IAAA,GAAA,oBAAA,cAAA,aAAA,CAAgB,KAAK,CAAC;AAElD,MAAM,WACJ,OACA,MACA,cACuB;CACvB,QAAQ,MAAM,KAAK;CAEnB,OAAO,CAAC,OAAO,MAAM,KAAK,KAAA,GAAA,oBAAA,cAAA,YAAA,CACV,OAAO,aAAa,gBAAgB,OAAO,IAAI,CAAC,IAC5D,KAAA;AACN;;;;;;AAyDA,MAAa,cAAc,EACzB,kBAAkB,MAClB,KAAK,WAAW,OAAO,kBACvB,KAAK,WAAW,OAAO,kBACvB,MAAM,WAAW,GACjB,GAAG,UACgB,CAAC,MAAM;CAC1B,MAAM,WAAWA,YAAAA,eAAe,MAAM,QAAQ;CAE9C,MAAM,CAAC,cAAc,aAAA,GAAA,MAAA,SAAA,OAA4C;EAC/D,IAAI,MAAM,gBAAgB,MAAM,OAAO;EAEvC,OAAO,QAAQ,MAAM,cAAc,UAAU,MAAM,SAAS,KAAK;CACnE,CAAC;CAED,MAAM,eAAe,OAAO,MAAM,UAAU;CAC5C,MAAM,QAAQ,eAAgB,MAAM,QAA4B;CAEhE,MAAM,eAAe,gBAAgB,MAAM,KAAK,GAAG,QAAQ;CAE3D,MAAM,YAAY,MAAM,aAAa;CAErC,MAAM,UAAA,GAAA,MAAA,YAAA,EACH,SAA0B;EACzB,IAAI,SAAS,OAAO;EAEpB,IAAI,CAAC,cAAc,SAAS,KAAK,SAAS,CAAC;EAE3C,SAAS,KAAK,SAAS,GAAG,MAAM,IAAI,CAAC;CACvC,GACA;EAAC;EAAU;EAAc;CAAK,CAChC;CAEA,MAAM,SAAA,GAAA,MAAA,YAAA,EACH,UAAkB;EACjB,IAAI,YAAY;EAEhB,IAAI,iBACF,aAAA,GAAA,oBAAA,cAAA,YAAA,CAAwB,WAAW,UAAU,QAAQ;EAEvD,QAAA,GAAA,oBAAA,cAAA,YAAA,CAAmB,WAAW,SAAS;CACzC,GACA;EAAC;EAAW;EAAiB;EAAU;CAAQ,CACjD;CAEA,MAAM,aAAA,GAAA,MAAA,YAAA,EACH,OAAO,aAAa;EACnB,IAAI;EAEJ,IAAI,UAAU,IAAI,OAAO,MAAM,IAAI;OAC9B,OAAO,MAAM,KAAK,IAAI;EAE3B,OAAO,MAAM,IAAI;EAEjB,OAAO,IAAI;CACb,GACA;EAAC;EAAO;EAAU;EAAQ;CAAK,CACjC;CAEA,MAAM,aAAA,GAAA,MAAA,YAAA,EACH,OAAO,aAAa;EACnB,IAAI;EAEJ,IAAI,UAAU,IAAI,OAAO,MAAM,CAAC,IAAI;OAC/B,OAAO,MAAM,KAAK,IAAI;EAE3B,OAAO,MAAM,IAAI;EAEjB,OAAO,IAAI;CACb,GACA;EAAC;EAAO;EAAU;EAAQ;CAAK,CACjC;CAEA,MAAM,SAAA,GAAA,MAAA,YAAA,OAA0B;EAC9B,IAAI;EAEJ,IAAI,MAAM,gBAAgB,MAAM,OAAO;OAErC,OAAO,QAAQ,MAAM,cAAc,UAAU,MAAM,SAAS,KAAK;EAEnE,OAAO,IAAI;CACb,GAAG;EAAC,MAAM;EAAc,MAAM;EAAW;EAAU;EAAQ;CAAQ,CAAC;CAEpE,MAAM,QAAA,GAAA,MAAA,YAAA,EACH,UAA2B;EAG1B,OAFkB,QAAQ,OAAO,UAAU,SAAS,KAAK,QAEzC;CAClB,GACA;EAAC;EAAW;EAAU;EAAQ;CAAQ,CACxC;CAEA,MAAM,gBAAgB,MAAM,KAAK;CAMjC,OAAO;EACL;EACA;EACA;EACA;EACA,KARU,kBAAkB;EAS5B,KARU,kBAAkB;EAS5B,KAXU,gBAAgB,YAAY,WAAW;EAYjD;EACA;EACA;EACA,MAAM;EACN;EACA;EACA;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["createContext","mergeRefs"],"sources":["../../../../src/hooks/use-descendants/index.ts"],"sourcesContent":["\"use client\"\n\nimport type { RefCallback } from \"react\"\nimport { useRef } from \"react\"\nimport {\n createContext,\n isNumber,\n isTruthyDataAttr,\n mergeRefs,\n runIfFn,\n useSafeLayoutEffect,\n} from \"../../utils\"\n\nconst sortNodes = (nodes: Node[]) =>\n nodes.sort((a, b) => {\n const compare = a.compareDocumentPosition(b)\n\n if (\n compare & Node.DOCUMENT_POSITION_FOLLOWING ||\n compare & Node.DOCUMENT_POSITION_CONTAINED_BY\n )\n return -1\n\n if (\n compare & Node.DOCUMENT_POSITION_PRECEDING ||\n compare & Node.DOCUMENT_POSITION_CONTAINS\n )\n return 1\n\n if (\n compare & Node.DOCUMENT_POSITION_DISCONNECTED ||\n compare & Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC\n ) {\n console.warn(\"Cannot sort the given nodes.\")\n return 0\n } else {\n return 0\n }\n })\n\nconst getNextIndex = (current: number, max: number, loop: boolean) => {\n let next = current + 1\n\n if (loop && next >= max) next = 0\n\n return next\n}\n\nconst getPrevIndex = (current: number, max: number, loop: boolean) => {\n let next = current - 1\n\n if (loop && next < 0) next = max\n\n return next\n}\n\nconst isMatch =\n <Y extends HTMLElement = HTMLElement, M = {}>(props?: Partial<M>) =>\n (descendant: Descendant<Y, M>) =>\n Object.entries(props ?? {}).every(\n ([key, value]) => descendant[key as keyof Descendant<Y, M>] === value,\n )\n\nexport type DescendantProps<Y extends HTMLElement = HTMLElement, M = {}> = M & {\n disabled?: ((node: Y) => boolean) | boolean\n}\n\nexport type Descendant<\n Y extends HTMLElement = HTMLElement,\n M = {},\n> = DescendantProps<Y, M> & {\n index: number\n node: Y\n recurred?: boolean\n}\n\nconst descendantManager = <Y extends HTMLElement = HTMLElement, M = {}>() => {\n const descendants = new Map<Y, Descendant<Y, M>>()\n\n const setIndexes = (next: Node[]) => {\n descendants.forEach((descendant) => {\n const index = next.indexOf(descendant.node)\n\n descendant.index = index\n descendant.node.dataset.index = descendant.index.toString()\n })\n }\n\n const set = (node: null | Y, props?: DescendantProps<Y, M>) => {\n if (!node) return\n\n if (descendants.has(node)) {\n const descendant = descendants.get(node)!\n\n descendants.set(node, {\n ...descendant,\n ...props,\n index: descendant.index,\n node: descendant.node,\n })\n } else {\n const keys = Array.from(descendants.keys()).concat(node)\n const sorted = sortNodes(keys)\n\n const descendant = { ...props, index: -1, node } as Descendant<Y, M>\n\n descendants.set(node, descendant)\n\n setIndexes(sorted)\n }\n }\n\n const destroy = () => descendants.clear()\n\n const register = (props?: DescendantProps<Y, M>): RefCallback<Y> => {\n return (node: null | Y) => set(node, props)\n }\n\n const unregister = (node?: null | Y) => {\n if (node == null) return\n\n descendants.delete(node)\n\n const sorted = sortNodes(Array.from(descendants.keys()))\n\n setIndexes(sorted)\n }\n\n const count = (props?: Partial<M>) => values(props).length\n\n const enabledCount = (props?: Partial<M>) => enabledValues(props).length\n\n const active = (\n target?: Descendant<Y, M> | null | Y,\n options?: FocusOptions,\n ) => {\n if (!target) return\n\n if (!(target instanceof Node)) target = target.node\n\n if (isTruthyDataAttr(target.dataset.activedescendant)) return\n\n const descendants = values()\n\n descendants.forEach(({ node }) => {\n delete node.dataset.activedescendant\n })\n\n target.dataset.activedescendant = \"\"\n\n if (options) target.focus(options)\n }\n\n const indexOf = (target?: Descendant<Y, M> | null | Y) => {\n if (!target) return -1\n\n if (target instanceof Node) {\n return descendants.get(target)?.index ?? -1\n } else {\n return descendants.get(target.node)?.index ?? -1\n }\n }\n\n const enabledIndexOf = (target?: Descendant<Y, M> | null | Y) => {\n if (!target) return -1\n\n if (target instanceof Node) {\n return enabledValues().findIndex(({ node }) => node.isSameNode(target))\n } else {\n return enabledValues().findIndex(({ node }) =>\n node.isSameNode(target.node),\n )\n }\n }\n\n const values = (props?: Partial<M>) =>\n Array.from(descendants.values())\n .filter(isMatch(props))\n .sort((a, b) => a.index - b.index)\n\n const enabledValues = (props?: Partial<M>) =>\n values(props).filter(({ disabled, node }) => !runIfFn(disabled, node))\n\n const value = (indexOrNode: null | number | Y) => {\n if (!count() || indexOrNode == null) return undefined\n\n return isNumber(indexOrNode)\n ? values()[indexOrNode]\n : descendants.get(indexOrNode)\n }\n\n const enabledValue = (indexOrNode: null | number | Y) => {\n if (!enabledCount() || indexOrNode == null) return undefined\n\n return enabledValues()[\n isNumber(indexOrNode) ? indexOrNode : enabledIndexOf(indexOrNode)\n ]\n }\n\n const firstValue = (props?: Partial<M>) => values(props).at(0)\n\n const enabledFirstValue = (props?: Partial<M>) => enabledValues(props).at(0)\n\n const lastValue = (props?: Partial<M>) => values(props).at(-1)\n\n const enabledLastValue = (props?: Partial<M>) => enabledValues(props).at(-1)\n\n const prevValue = (\n indexOrNode: Descendant<Y, M> | null | number | Y,\n loop = true,\n props?: Partial<M>,\n ) => {\n const filtered = values(props)\n\n if (!filtered.length || indexOrNode == null) return undefined\n\n const currentIndex = isNumber(indexOrNode)\n ? filtered.findIndex((d) => d.index === indexOrNode)\n : filtered.findIndex((d) =>\n d.node.isSameNode(\n indexOrNode instanceof Node ? indexOrNode : indexOrNode.node,\n ),\n )\n\n if (currentIndex === -1) return undefined\n\n const prevIndex = getPrevIndex(currentIndex, filtered.length - 1, loop)\n\n return filtered[prevIndex]\n }\n\n const enabledPrevValue = (\n indexOrNode: Descendant<Y, M> | null | number | Y,\n loop = true,\n props?: Partial<M>,\n ) => {\n if (!enabledCount(props)) return undefined\n\n let index = isNumber(indexOrNode) ? indexOrNode : indexOf(indexOrNode)\n let enabledValue = null\n let recurred = false\n\n while (enabledValue == null) {\n index--\n\n if (index < 0) {\n if (!loop) return\n\n index = count() - 1\n recurred = true\n }\n\n const descendant = value(index)\n\n enabledValue =\n descendant &&\n !runIfFn(descendant.disabled, descendant.node) &&\n isMatch<Y, M>(props)(descendant)\n ? descendant\n : null\n }\n\n if (recurred) enabledValue.recurred = recurred\n\n return enabledValue\n }\n\n const nextValue = (\n indexOrNode: Descendant<Y, M> | null | number | Y,\n loop = true,\n props?: Partial<M>,\n ) => {\n const filtered = values(props)\n\n if (!filtered.length || indexOrNode == null) return undefined\n\n const currentIndex = isNumber(indexOrNode)\n ? filtered.findIndex((d) => d.index === indexOrNode)\n : filtered.findIndex((d) =>\n d.node.isSameNode(\n indexOrNode instanceof Node ? indexOrNode : indexOrNode.node,\n ),\n )\n\n if (currentIndex === -1) return undefined\n\n const nextIndex = getNextIndex(currentIndex, filtered.length, loop)\n\n return filtered[nextIndex]\n }\n\n const enabledNextValue = (\n indexOrNode: Descendant<Y, M> | null | number | Y,\n loop = true,\n props?: Partial<M>,\n ) => {\n if (!enabledCount(props)) return undefined\n\n let index = isNumber(indexOrNode) ? indexOrNode : indexOf(indexOrNode)\n let enabledValue = null\n let recurred = false\n\n while (enabledValue == null) {\n index++\n\n if (index >= count()) {\n if (!loop) return\n\n index = 0\n recurred = true\n }\n\n const descendant = value(index)\n\n enabledValue =\n descendant &&\n !runIfFn(descendant.disabled, descendant.node) &&\n isMatch<Y, M>(props)(descendant)\n ? descendant\n : null\n }\n\n if (recurred) enabledValue.recurred = recurred\n\n return enabledValue\n }\n\n return {\n active,\n count,\n destroy,\n enabledCount,\n enabledFirstValue,\n enabledIndexOf,\n enabledLastValue,\n enabledNextValue,\n enabledPrevValue,\n enabledValue,\n enabledValues,\n firstValue,\n indexOf,\n lastValue,\n nextValue,\n prevValue,\n register,\n unregister,\n value,\n values,\n }\n}\n\nexport type Descendants<Y extends HTMLElement, M = {}> = ReturnType<\n typeof descendantManager<Y, M>\n>\n\nexport type CreateDescendantRegister<Y extends HTMLElement, M = {}> = (\n props?: DescendantProps<Y, M>,\n) => RefCallback<Y>\n\n/**\n * `useDescendants` is a custom hook that manages descendants.\n *\n * @see https://yamada-ui.com/docs/hooks/use-descendants\n */\nexport const createDescendants = <\n Y extends HTMLElement = HTMLElement,\n M = {},\n>() => {\n const [DescendantsContext, useDescendantsContext] = createContext<\n Descendants<Y, M>\n >({\n name: \"DescendantsContext\",\n })\n\n const useDescendantRegister = (descendants?: Descendants<Y, M>) => {\n const ref = useRef<Y>(null)\n\n useSafeLayoutEffect(() => {\n return () => {\n if (ref.current) descendants?.unregister(ref.current)\n }\n }, [])\n\n return (props?: DescendantProps<Y, M>): RefCallback<Y> =>\n mergeRefs(ref, descendants?.register(props))\n }\n\n const useDescendants = () => {\n const descendants = useRef(descendantManager<Y, M>())\n\n useSafeLayoutEffect(() => {\n return () => descendants.current.destroy()\n })\n\n return descendants.current\n }\n\n const useDescendant = (props?: DescendantProps<Y, M>) => {\n const descendants = useDescendantsContext()\n const createRegister = useDescendantRegister(descendants)\n\n return {\n descendants,\n register: createRegister(props),\n }\n }\n\n return {\n DescendantsContext,\n useDescendant,\n useDescendantRegister,\n useDescendants,\n useDescendantsContext,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createContext","mergeRefs"],"sources":["../../../../src/hooks/use-descendants/index.ts"],"sourcesContent":["\"use client\"\n\nimport type { RefCallback } from \"react\"\nimport { useRef } from \"react\"\nimport {\n createContext,\n isNumber,\n isTruthyDataAttr,\n mergeRefs,\n runIfFn,\n useSafeLayoutEffect,\n} from \"../../utils\"\n\nconst sortNodes = (nodes: Node[]) =>\n nodes.sort((a, b) => {\n const compare = a.compareDocumentPosition(b)\n\n if (\n compare & Node.DOCUMENT_POSITION_FOLLOWING ||\n compare & Node.DOCUMENT_POSITION_CONTAINED_BY\n )\n return -1\n\n if (\n compare & Node.DOCUMENT_POSITION_PRECEDING ||\n compare & Node.DOCUMENT_POSITION_CONTAINS\n )\n return 1\n\n if (\n compare & Node.DOCUMENT_POSITION_DISCONNECTED ||\n compare & Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC\n ) {\n console.warn(\"Cannot sort the given nodes.\")\n return 0\n } else {\n return 0\n }\n })\n\nconst getNextIndex = (current: number, max: number, loop: boolean) => {\n let next = current + 1\n\n if (loop && next >= max) next = 0\n\n return next\n}\n\nconst getPrevIndex = (current: number, max: number, loop: boolean) => {\n let next = current - 1\n\n if (loop && next < 0) next = max\n\n return next\n}\n\nconst isMatch =\n <Y extends HTMLElement = HTMLElement, M = {}>(props?: Partial<M>) =>\n (descendant: Descendant<Y, M>) =>\n Object.entries(props ?? {}).every(\n ([key, value]) => descendant[key as keyof Descendant<Y, M>] === value,\n )\n\nexport type DescendantProps<Y extends HTMLElement = HTMLElement, M = {}> = M & {\n disabled?: ((node: Y) => boolean) | boolean\n}\n\nexport type Descendant<\n Y extends HTMLElement = HTMLElement,\n M = {},\n> = DescendantProps<Y, M> & {\n index: number\n node: Y\n recurred?: boolean\n}\n\nconst descendantManager = <Y extends HTMLElement = HTMLElement, M = {}>() => {\n const descendants = new Map<Y, Descendant<Y, M>>()\n\n const setIndexes = (next: Node[]) => {\n descendants.forEach((descendant) => {\n const index = next.indexOf(descendant.node)\n\n descendant.index = index\n descendant.node.dataset.index = descendant.index.toString()\n })\n }\n\n const set = (node: null | Y, props?: DescendantProps<Y, M>) => {\n if (!node) return\n\n if (descendants.has(node)) {\n const descendant = descendants.get(node)!\n\n descendants.set(node, {\n ...descendant,\n ...props,\n index: descendant.index,\n node: descendant.node,\n })\n } else {\n const keys = Array.from(descendants.keys()).concat(node)\n const sorted = sortNodes(keys)\n\n const descendant = { ...props, index: -1, node } as Descendant<Y, M>\n\n descendants.set(node, descendant)\n\n setIndexes(sorted)\n }\n }\n\n const destroy = () => descendants.clear()\n\n const register = (props?: DescendantProps<Y, M>): RefCallback<Y> => {\n return (node: null | Y) => set(node, props)\n }\n\n const unregister = (node?: null | Y) => {\n if (node == null) return\n\n descendants.delete(node)\n\n const sorted = sortNodes(Array.from(descendants.keys()))\n\n setIndexes(sorted)\n }\n\n const count = (props?: Partial<M>) => values(props).length\n\n const enabledCount = (props?: Partial<M>) => enabledValues(props).length\n\n const active = (\n target?: Descendant<Y, M> | null | Y,\n options?: FocusOptions,\n ) => {\n if (!target) return\n\n if (!(target instanceof Node)) target = target.node\n\n if (isTruthyDataAttr(target.dataset.activedescendant)) return\n\n const descendants = values()\n\n descendants.forEach(({ node }) => {\n delete node.dataset.activedescendant\n })\n\n target.dataset.activedescendant = \"\"\n\n if (options) target.focus(options)\n }\n\n const indexOf = (target?: Descendant<Y, M> | null | Y) => {\n if (!target) return -1\n\n if (target instanceof Node) return descendants.get(target)?.index ?? -1\n else return descendants.get(target.node)?.index ?? -1\n }\n\n const enabledIndexOf = (target?: Descendant<Y, M> | null | Y) => {\n if (!target) return -1\n\n if (target instanceof Node)\n return enabledValues().findIndex(({ node }) => node.isSameNode(target))\n else\n return enabledValues().findIndex(({ node }) =>\n node.isSameNode(target.node),\n )\n }\n\n const values = (props?: Partial<M>) =>\n Array.from(descendants.values())\n .filter(isMatch(props))\n .sort((a, b) => a.index - b.index)\n\n const enabledValues = (props?: Partial<M>) =>\n values(props).filter(({ disabled, node }) => !runIfFn(disabled, node))\n\n const value = (indexOrNode: null | number | Y) => {\n if (!count() || indexOrNode == null) return undefined\n\n return isNumber(indexOrNode)\n ? values()[indexOrNode]\n : descendants.get(indexOrNode)\n }\n\n const enabledValue = (indexOrNode: null | number | Y) => {\n if (!enabledCount() || indexOrNode == null) return undefined\n\n return enabledValues()[\n isNumber(indexOrNode) ? indexOrNode : enabledIndexOf(indexOrNode)\n ]\n }\n\n const firstValue = (props?: Partial<M>) => values(props).at(0)\n\n const enabledFirstValue = (props?: Partial<M>) => enabledValues(props).at(0)\n\n const lastValue = (props?: Partial<M>) => values(props).at(-1)\n\n const enabledLastValue = (props?: Partial<M>) => enabledValues(props).at(-1)\n\n const prevValue = (\n indexOrNode: Descendant<Y, M> | null | number | Y,\n loop = true,\n props?: Partial<M>,\n ) => {\n const filtered = values(props)\n\n if (!filtered.length || indexOrNode == null) return undefined\n\n const currentIndex = isNumber(indexOrNode)\n ? filtered.findIndex((d) => d.index === indexOrNode)\n : filtered.findIndex((d) =>\n d.node.isSameNode(\n indexOrNode instanceof Node ? indexOrNode : indexOrNode.node,\n ),\n )\n\n if (currentIndex === -1) return undefined\n\n const prevIndex = getPrevIndex(currentIndex, filtered.length - 1, loop)\n\n return filtered[prevIndex]\n }\n\n const enabledPrevValue = (\n indexOrNode: Descendant<Y, M> | null | number | Y,\n loop = true,\n props?: Partial<M>,\n ) => {\n if (!enabledCount(props)) return undefined\n\n let index = isNumber(indexOrNode) ? indexOrNode : indexOf(indexOrNode)\n let enabledValue = null\n let recurred = false\n\n while (enabledValue == null) {\n index--\n\n if (index < 0) {\n if (!loop) return\n\n index = count() - 1\n recurred = true\n }\n\n const descendant = value(index)\n\n enabledValue =\n descendant &&\n !runIfFn(descendant.disabled, descendant.node) &&\n isMatch<Y, M>(props)(descendant)\n ? descendant\n : null\n }\n\n if (recurred) enabledValue.recurred = recurred\n\n return enabledValue\n }\n\n const nextValue = (\n indexOrNode: Descendant<Y, M> | null | number | Y,\n loop = true,\n props?: Partial<M>,\n ) => {\n const filtered = values(props)\n\n if (!filtered.length || indexOrNode == null) return undefined\n\n const currentIndex = isNumber(indexOrNode)\n ? filtered.findIndex((d) => d.index === indexOrNode)\n : filtered.findIndex((d) =>\n d.node.isSameNode(\n indexOrNode instanceof Node ? indexOrNode : indexOrNode.node,\n ),\n )\n\n if (currentIndex === -1) return undefined\n\n const nextIndex = getNextIndex(currentIndex, filtered.length, loop)\n\n return filtered[nextIndex]\n }\n\n const enabledNextValue = (\n indexOrNode: Descendant<Y, M> | null | number | Y,\n loop = true,\n props?: Partial<M>,\n ) => {\n if (!enabledCount(props)) return undefined\n\n let index = isNumber(indexOrNode) ? indexOrNode : indexOf(indexOrNode)\n let enabledValue = null\n let recurred = false\n\n while (enabledValue == null) {\n index++\n\n if (index >= count()) {\n if (!loop) return\n\n index = 0\n recurred = true\n }\n\n const descendant = value(index)\n\n enabledValue =\n descendant &&\n !runIfFn(descendant.disabled, descendant.node) &&\n isMatch<Y, M>(props)(descendant)\n ? descendant\n : null\n }\n\n if (recurred) enabledValue.recurred = recurred\n\n return enabledValue\n }\n\n return {\n active,\n count,\n destroy,\n enabledCount,\n enabledFirstValue,\n enabledIndexOf,\n enabledLastValue,\n enabledNextValue,\n enabledPrevValue,\n enabledValue,\n enabledValues,\n firstValue,\n indexOf,\n lastValue,\n nextValue,\n prevValue,\n register,\n unregister,\n value,\n values,\n }\n}\n\nexport type Descendants<Y extends HTMLElement, M = {}> = ReturnType<\n typeof descendantManager<Y, M>\n>\n\nexport type CreateDescendantRegister<Y extends HTMLElement, M = {}> = (\n props?: DescendantProps<Y, M>,\n) => RefCallback<Y>\n\n/**\n * `useDescendants` is a custom hook that manages descendants.\n *\n * @see https://yamada-ui.com/docs/hooks/use-descendants\n */\nexport const createDescendants = <\n Y extends HTMLElement = HTMLElement,\n M = {},\n>() => {\n const [DescendantsContext, useDescendantsContext] = createContext<\n Descendants<Y, M>\n >({\n name: \"DescendantsContext\",\n })\n\n const useDescendantRegister = (descendants?: Descendants<Y, M>) => {\n const ref = useRef<Y>(null)\n\n useSafeLayoutEffect(() => {\n return () => {\n if (ref.current) descendants?.unregister(ref.current)\n }\n }, [])\n\n return (props?: DescendantProps<Y, M>): RefCallback<Y> =>\n mergeRefs(ref, descendants?.register(props))\n }\n\n const useDescendants = () => {\n const descendants = useRef(descendantManager<Y, M>())\n\n useSafeLayoutEffect(() => {\n return () => descendants.current.destroy()\n })\n\n return descendants.current\n }\n\n const useDescendant = (props?: DescendantProps<Y, M>) => {\n const descendants = useDescendantsContext()\n const createRegister = useDescendantRegister(descendants)\n\n return {\n descendants,\n register: createRegister(props),\n }\n }\n\n return {\n DescendantsContext,\n useDescendant,\n useDescendantRegister,\n useDescendants,\n useDescendantsContext,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["isRefObject"],"sources":["../../../../src/hooks/use-focus/index.ts"],"sourcesContent":["\"use client\"\n\nimport type { RefObject } from \"react\"\nimport { useCallback, useRef } from \"react\"\nimport {\n getActiveElement,\n getDocument,\n getFirstFocusableElement,\n isRefObject,\n isSafari,\n useUpdateEffect,\n} from \"../../utils\"\nimport { useEventListener } from \"../use-event-listener\"\n\nexport interface UseFocusOnShowProps {\n focusTarget?: HTMLElement | null | RefObject<HTMLElement | null>\n preventScroll?: boolean\n shouldFocus?: boolean\n visible?: boolean\n}\n\n/**\n * `useFocusOnShow` is a custom hook that focuses on the target element when it is shown.\n *\n * @see https://yamada-ui.com/docs/hooks/use-focus-on-show\n */\nexport const useFocusOnShow = <Y extends HTMLElement>(\n refOrEl: RefObject<null | Y> | Y,\n {\n focusTarget: focusRefOrEl,\n preventScroll,\n shouldFocus,\n visible,\n }: UseFocusOnShowProps = {\n preventScroll: true,\n shouldFocus: false,\n },\n) => {\n const trulyShouldFocus = shouldFocus && visible\n const focused = useRef(false)\n\n const getTarget = useCallback(() => {\n return isRefObject(refOrEl) ? refOrEl.current : refOrEl\n }, [refOrEl])\n\n const getFocusTarget = useCallback(() => {\n return isRefObject(focusRefOrEl) ? focusRefOrEl.current : focusRefOrEl\n }, [focusRefOrEl])\n\n const onFocus = useCallback(() => {\n const target = getTarget()\n\n if (!target || !trulyShouldFocus || focused.current) return\n if (target.contains(document.activeElement as HTMLElement)) return\n\n const focusTarget = getFocusTarget()\n\n if (focusTarget) {\n requestAnimationFrame(() => {\n focusTarget.focus({ preventScroll })\n\n focused.current = true\n })\n } else {\n const firstFocusable = getFirstFocusableElement(target)\n\n if (firstFocusable)
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["isRefObject"],"sources":["../../../../src/hooks/use-focus/index.ts"],"sourcesContent":["\"use client\"\n\nimport type { RefObject } from \"react\"\nimport { useCallback, useRef } from \"react\"\nimport {\n getActiveElement,\n getDocument,\n getFirstFocusableElement,\n isRefObject,\n isSafari,\n useUpdateEffect,\n} from \"../../utils\"\nimport { useEventListener } from \"../use-event-listener\"\n\nexport interface UseFocusOnShowProps {\n focusTarget?: HTMLElement | null | RefObject<HTMLElement | null>\n preventScroll?: boolean\n shouldFocus?: boolean\n visible?: boolean\n}\n\n/**\n * `useFocusOnShow` is a custom hook that focuses on the target element when it is shown.\n *\n * @see https://yamada-ui.com/docs/hooks/use-focus-on-show\n */\nexport const useFocusOnShow = <Y extends HTMLElement>(\n refOrEl: RefObject<null | Y> | Y,\n {\n focusTarget: focusRefOrEl,\n preventScroll,\n shouldFocus,\n visible,\n }: UseFocusOnShowProps = {\n preventScroll: true,\n shouldFocus: false,\n },\n) => {\n const trulyShouldFocus = shouldFocus && visible\n const focused = useRef(false)\n\n const getTarget = useCallback(() => {\n return isRefObject(refOrEl) ? refOrEl.current : refOrEl\n }, [refOrEl])\n\n const getFocusTarget = useCallback(() => {\n return isRefObject(focusRefOrEl) ? focusRefOrEl.current : focusRefOrEl\n }, [focusRefOrEl])\n\n const onFocus = useCallback(() => {\n const target = getTarget()\n\n if (!target || !trulyShouldFocus || focused.current) return\n if (target.contains(document.activeElement as HTMLElement)) return\n\n const focusTarget = getFocusTarget()\n\n if (focusTarget) {\n requestAnimationFrame(() => {\n focusTarget.focus({ preventScroll })\n\n focused.current = true\n })\n } else {\n const firstFocusable = getFirstFocusableElement(target)\n\n if (firstFocusable)\n requestAnimationFrame(() => {\n firstFocusable.focus({ preventScroll })\n\n focused.current = true\n })\n else\n requestAnimationFrame(() => {\n target.focus({ preventScroll })\n\n focused.current = true\n })\n }\n }, [getTarget, trulyShouldFocus, getFocusTarget, preventScroll])\n\n useUpdateEffect(() => {\n focused.current = !trulyShouldFocus\n }, [trulyShouldFocus])\n\n useUpdateEffect(() => {\n requestAnimationFrame(onFocus)\n }, [onFocus])\n\n useEventListener(getTarget, \"transitionend\", onFocus)\n}\n\nexport interface UseFocusOnMouseDownProps {\n ref: RefObject<HTMLElement | null>\n elements?: (HTMLElement | null | RefObject<HTMLElement | null>)[]\n enabled?: boolean\n}\n\n/**\n * `useFocusOnPointerDown` is a custom hook that focuses on the target element when it is clicked.\n *\n * @see https://yamada-ui.com/docs/hooks/use-focus-on-pointer-down\n */\nexport const useFocusOnPointerDown = ({\n ref,\n elements,\n enabled,\n}: UseFocusOnMouseDownProps) => {\n useEventListener(\n () => getDocument(ref.current),\n \"pointerdown\",\n (ev) => {\n if (!isSafari() || !enabled) return\n const target = ev.target as HTMLElement\n\n const els = elements ?? [ref]\n\n const validTarget = els.some((elOrRef) => {\n const el = isRefObject(elOrRef) ? elOrRef.current : elOrRef\n\n return el?.contains(target) || el === target\n })\n\n if (\n getActiveElement(getDocument(ref.current)) !== target &&\n validTarget\n ) {\n ev.preventDefault()\n\n target.focus()\n }\n },\n )\n}\n"],"mappings":";;;;;;;;;;;;;AA0BA,MAAa,kBACX,SACA,EACE,aAAa,cACb,eACA,aACA,YACuB;CACvB,eAAe;CACf,aAAa;AACf,MACG;CACH,MAAM,mBAAmB,eAAe;CACxC,MAAM,WAAA,GAAA,MAAA,OAAA,CAAiB,KAAK;CAE5B,MAAM,aAAA,GAAA,MAAA,YAAA,OAA8B;EAClC,OAAOA,YAAAA,YAAY,OAAO,IAAI,QAAQ,UAAU;CAClD,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,kBAAA,GAAA,MAAA,YAAA,OAAmC;EACvC,OAAOA,YAAAA,YAAY,YAAY,IAAI,aAAa,UAAU;CAC5D,GAAG,CAAC,YAAY,CAAC;CAEjB,MAAM,WAAA,GAAA,MAAA,YAAA,OAA4B;EAChC,MAAM,SAAS,UAAU;EAEzB,IAAI,CAAC,UAAU,CAAC,oBAAoB,QAAQ,SAAS;EACrD,IAAI,OAAO,SAAS,SAAS,aAA4B,GAAG;EAE5D,MAAM,cAAc,eAAe;EAEnC,IAAI,aACF,4BAA4B;GAC1B,YAAY,MAAM,EAAE,cAAc,CAAC;GAEnC,QAAQ,UAAU;EACpB,CAAC;OACI;GACL,MAAM,kBAAA,GAAA,oBAAA,cAAA,yBAAA,CAA0C,MAAM;GAEtD,IAAI,gBACF,4BAA4B;IAC1B,eAAe,MAAM,EAAE,cAAc,CAAC;IAEtC,QAAQ,UAAU;GACpB,CAAC;QAED,4BAA4B;IAC1B,OAAO,MAAM,EAAE,cAAc,CAAC;IAE9B,QAAQ,UAAU;GACpB,CAAC;EACL;CACF,GAAG;EAAC;EAAW;EAAkB;EAAgB;CAAa,CAAC;CAE/D,eAAA,sBAAsB;EACpB,QAAQ,UAAU,CAAC;CACrB,GAAG,CAAC,gBAAgB,CAAC;CAErB,eAAA,sBAAsB;EACpB,sBAAsB,OAAO;CAC/B,GAAG,CAAC,OAAO,CAAC;CAEZ,uCAAA,iBAAiB,WAAW,iBAAiB,OAAO;AACtD;;;;;;AAaA,MAAa,yBAAyB,EACpC,KACA,UACA,cAC8B;CAC9B,uCAAA,wBAAA,GAAA,oBAAA,cAAA,YAAA,CACoB,IAAI,OAAO,GAC7B,gBACC,OAAO;EACN,IAAI,EAAA,GAAA,oBAAA,cAAA,SAAA,CAAU,KAAK,CAAC,SAAS;EAC7B,MAAM,SAAS,GAAG;EAIlB,MAAM,eAFM,YAAY,CAAC,GAAG,EAAA,CAEJ,MAAM,YAAY;GACxC,MAAM,KAAKA,YAAAA,YAAY,OAAO,IAAI,QAAQ,UAAU;GAEpD,OAAO,IAAI,SAAS,MAAM,KAAK,OAAO;EACxC,CAAC;EAED,KAAA,GAAA,oBAAA,cAAA,iBAAA,EAAA,GAAA,oBAAA,cAAA,YAAA,CAC+B,IAAI,OAAO,CAAC,MAAM,UAC/C,aACA;GACA,GAAG,eAAe;GAElB,OAAO,MAAM;EACf;CACF,CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/hooks/use-local-storage/index.ts"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { isFunction } from \"../../utils\"\nimport { useWindowEvent } from \"../use-window-event\"\n\nexport type StorageType = \"localStorage\" | \"sessionStorage\"\n\nexport interface StorageProps<Y> {\n key: string\n defaultValue?: Y\n getInitialValueInEffect?: boolean\n deserialize?: (value: string | undefined) => Y\n serialize?: (value: Y) => string\n}\n\nconst serializeJSON = <Y>(value: Y, name: string) => {\n try {\n return JSON.stringify(value)\n } catch {\n throw new Error(`useLocalStorage ${name}: Failed to serialize the value`)\n }\n}\n\nconst deserializeJSON = (value: string | undefined) => {\n if (!value) return value\n\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport const createStorage = <Y>(type: StorageType, name: string) => {\n const eventName =\n type === \"localStorage\" ? \"local-storage\" : \"session-storage\"\n\n return ({\n key,\n defaultValue,\n deserialize = deserializeJSON,\n getInitialValueInEffect = true,\n serialize = (value: Y) => serializeJSON(value, name),\n }: StorageProps<Y>) => {\n const readStorageValue = useCallback(\n (skipStorage?: boolean): Y => {\n if (\n typeof window === \"undefined\" ||\n !(type in window) ||\n (window[type] as null | Storage | undefined) == null ||\n skipStorage\n )
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/hooks/use-local-storage/index.ts"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { isFunction } from \"../../utils\"\nimport { useWindowEvent } from \"../use-window-event\"\n\nexport type StorageType = \"localStorage\" | \"sessionStorage\"\n\nexport interface StorageProps<Y> {\n key: string\n defaultValue?: Y\n getInitialValueInEffect?: boolean\n deserialize?: (value: string | undefined) => Y\n serialize?: (value: Y) => string\n}\n\nconst serializeJSON = <Y>(value: Y, name: string) => {\n try {\n return JSON.stringify(value)\n } catch {\n throw new Error(`useLocalStorage ${name}: Failed to serialize the value`)\n }\n}\n\nconst deserializeJSON = (value: string | undefined) => {\n if (!value) return value\n\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport const createStorage = <Y>(type: StorageType, name: string) => {\n const eventName =\n type === \"localStorage\" ? \"local-storage\" : \"session-storage\"\n\n return ({\n key,\n defaultValue,\n deserialize = deserializeJSON,\n getInitialValueInEffect = true,\n serialize = (value: Y) => serializeJSON(value, name),\n }: StorageProps<Y>) => {\n const readStorageValue = useCallback(\n (skipStorage?: boolean): Y => {\n if (\n typeof window === \"undefined\" ||\n !(type in window) ||\n (window[type] as null | Storage | undefined) == null ||\n skipStorage\n )\n return (defaultValue ?? \"\") as Y\n\n const storageValue = window[type].getItem(key)\n\n return storageValue !== null\n ? deserialize(storageValue)\n : ((defaultValue ?? \"\") as Y)\n },\n [key, deserialize, defaultValue],\n )\n\n const [value, setValue] = useState<Y>(\n readStorageValue(getInitialValueInEffect),\n )\n\n const setStorageValue = useCallback(\n (valOrFn: ((prevState: Y) => Y) | Y) => {\n if (isFunction(valOrFn)) {\n setValue((current) => {\n const result = valOrFn(current)\n\n window[type].setItem(key, serialize(result))\n window.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, value: valOrFn(current) },\n }),\n )\n\n return result\n })\n } else {\n window[type].setItem(key, serialize(valOrFn))\n window.dispatchEvent(\n new CustomEvent(eventName, { detail: { key, value: valOrFn } }),\n )\n\n setValue(valOrFn)\n }\n },\n [key, serialize],\n )\n\n const removeStorageValue = useCallback(() => {\n window[type].removeItem(key)\n setValue(defaultValue as Y)\n }, [defaultValue, key])\n\n useWindowEvent(\"storage\", (ev) => {\n if (ev.storageArea === window[type] && ev.key === key)\n setValue(deserialize(ev.newValue ?? undefined))\n })\n\n useWindowEvent(eventName, (ev) => {\n if (ev.detail.key === key) setValue(ev.detail.value)\n })\n\n useEffect(() => {\n if (defaultValue !== undefined && value === undefined)\n setStorageValue(defaultValue)\n }, [defaultValue, value, setStorageValue])\n\n useEffect(() => {\n if (getInitialValueInEffect) setValue(readStorageValue())\n }, [getInitialValueInEffect, readStorageValue])\n\n return [\n value === undefined ? defaultValue : value,\n setStorageValue,\n removeStorageValue,\n ] as const\n }\n}\n\n/**\n * `useLocalStorage` is a custom hook for storing, updating, and retrieving values in local storage.\n *\n * @see https://yamada-ui.com/docs/hooks/use-local-storage\n */\nexport const useLocalStorage = <Y = string>(props: StorageProps<Y>) =>\n createStorage<Y>(\"localStorage\", \"use-local-storage\")(props)\n"],"mappings":";;;;;;AAgBA,MAAM,iBAAoB,OAAU,SAAiB;CACnD,IAAI;EACF,OAAO,KAAK,UAAU,KAAK;CAC7B,QAAQ;EACN,MAAM,IAAI,MAAM,mBAAmB,KAAK,gCAAgC;CAC1E;AACF;AAEA,MAAM,mBAAmB,UAA8B;CACrD,IAAI,CAAC,OAAO,OAAO;CAEnB,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;CACzB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,MAAa,iBAAoB,MAAmB,SAAiB;CACnE,MAAM,YACJ,SAAS,iBAAiB,kBAAkB;CAE9C,QAAQ,EACN,KACA,cACA,cAAc,iBACd,0BAA0B,MAC1B,aAAa,UAAa,cAAc,OAAO,IAAI,QAC9B;EACrB,MAAM,oBAAA,GAAA,MAAA,YAAA,EACH,gBAA6B;GAC5B,IACE,OAAO,WAAW,eAClB,EAAE,QAAQ,WACT,OAAO,SAAwC,QAChD,aAEA,OAAQ,gBAAgB;GAE1B,MAAM,eAAe,OAAO,KAAK,CAAC,QAAQ,GAAG;GAE7C,OAAO,iBAAiB,OACpB,YAAY,YAAY,IACtB,gBAAgB;EACxB,GACA;GAAC;GAAK;GAAa;EAAY,CACjC;EAEA,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CACZ,iBAAiB,uBAAuB,CAC1C;EAEA,MAAM,mBAAA,GAAA,MAAA,YAAA,EACH,YAAuC;GACtC,KAAA,GAAA,oBAAA,cAAA,WAAA,CAAe,OAAO,GACpB,UAAU,YAAY;IACpB,MAAM,SAAS,QAAQ,OAAO;IAE9B,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,MAAM,CAAC;IAC3C,OAAO,cACL,IAAI,YAAY,WAAW,EACzB,QAAQ;KAAE;KAAK,OAAO,QAAQ,OAAO;IAAE,EACzC,CAAC,CACH;IAEA,OAAO;GACT,CAAC;QACI;IACL,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,OAAO,CAAC;IAC5C,OAAO,cACL,IAAI,YAAY,WAAW,EAAE,QAAQ;KAAE;KAAK,OAAO;IAAQ,EAAE,CAAC,CAChE;IAEA,SAAS,OAAO;GAClB;EACF,GACA,CAAC,KAAK,SAAS,CACjB;EAEA,MAAM,sBAAA,GAAA,MAAA,YAAA,OAAuC;GAC3C,OAAO,KAAK,CAAC,WAAW,GAAG;GAC3B,SAAS,YAAiB;EAC5B,GAAG,CAAC,cAAc,GAAG,CAAC;EAEtB,qCAAA,eAAe,YAAY,OAAO;GAChC,IAAI,GAAG,gBAAgB,OAAO,SAAS,GAAG,QAAQ,KAChD,SAAS,YAAY,GAAG,YAAY,KAAA,CAAS,CAAC;EAClD,CAAC;EAED,qCAAA,eAAe,YAAY,OAAO;GAChC,IAAI,GAAG,OAAO,QAAQ,KAAK,SAAS,GAAG,OAAO,KAAK;EACrD,CAAC;EAED,CAAA,GAAA,MAAA,UAAA,OAAgB;GACd,IAAI,iBAAiB,KAAA,KAAa,UAAU,KAAA,GAC1C,gBAAgB,YAAY;EAChC,GAAG;GAAC;GAAc;GAAO;EAAe,CAAC;EAEzC,CAAA,GAAA,MAAA,UAAA,OAAgB;GACd,IAAI,yBAAyB,SAAS,iBAAiB,CAAC;EAC1D,GAAG,CAAC,yBAAyB,gBAAgB,CAAC;EAE9C,OAAO;GACL,UAAU,KAAA,IAAY,eAAe;GACrC;GACA;EACF;CACF;AACF;;;;;;AAOA,MAAa,mBAA+B,UAC1C,cAAiB,gBAAgB,mBAAmB,CAAC,CAAC,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/hooks/use-mounted/index.ts"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useRef, useState } from \"react\"\nimport { useSafeLayoutEffect } from \"../../utils\"\n\nexport interface UseMountedProps {\n delay?: number\n state?: boolean\n}\n\nexport function useMounted(props?: {\n delay?: number\n state?: false\n}): () => boolean\n\nexport function useMounted(props?: { delay?: number; state?: true }): boolean\n\nexport function useMounted({ delay = 0, state = false }: UseMountedProps = {}) {\n const mountedRef = useRef(false)\n const [mounted, setMounted] = useState(false)\n\n useSafeLayoutEffect(() => {\n mountedRef.current = true\n\n let timeoutId: NodeJS.Timeout | null = null\n\n if (state)
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/hooks/use-mounted/index.ts"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useRef, useState } from \"react\"\nimport { useSafeLayoutEffect } from \"../../utils\"\n\nexport interface UseMountedProps {\n delay?: number\n state?: boolean\n}\n\nexport function useMounted(props?: {\n delay?: number\n state?: false\n}): () => boolean\n\nexport function useMounted(props?: { delay?: number; state?: true }): boolean\n\nexport function useMounted({ delay = 0, state = false }: UseMountedProps = {}) {\n const mountedRef = useRef(false)\n const [mounted, setMounted] = useState(false)\n\n useSafeLayoutEffect(() => {\n mountedRef.current = true\n\n let timeoutId: NodeJS.Timeout | null = null\n\n if (state)\n if (delay > 0) timeoutId = setTimeout(() => setMounted(true), delay)\n else setMounted(true)\n\n return () => {\n mountedRef.current = false\n\n if (state) setMounted(false)\n\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [delay, state])\n\n if (state) return mounted\n else\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useCallback(() => mountedRef.current, [])\n}\n\nexport type UseMountedReturn = ReturnType<typeof useMounted>\n"],"mappings":";;;;;AAiBA,SAAgB,WAAW,EAAE,QAAQ,GAAG,QAAQ,UAA2B,CAAC,GAAG;CAC7E,MAAM,cAAA,GAAA,MAAA,OAAA,CAAoB,KAAK;CAC/B,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAuB,KAAK;CAE5C,eAAA,0BAA0B;EACxB,WAAW,UAAU;EAErB,IAAI,YAAmC;EAEvC,IAAI,OACF,IAAI,QAAQ,GAAG,YAAY,iBAAiB,WAAW,IAAI,GAAG,KAAK;OAC9D,WAAW,IAAI;EAEtB,aAAa;GACX,WAAW,UAAU;GAErB,IAAI,OAAO,WAAW,KAAK;GAE3B,IAAI,WAAW,aAAa,SAAS;EACvC;CACF,GAAG,CAAC,OAAO,KAAK,CAAC;CAEjB,IAAI,OAAO,OAAO;MAGhB,QAAA,GAAA,MAAA,YAAA,OAAyB,WAAW,SAAS,CAAC,CAAC;AACnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["useCallbackRef"],"sources":["../../../../src/hooks/use-outside-click/index.ts"],"sourcesContent":["\"use client\"\n\nimport type { RefObject } from \"react\"\nimport { useCallback, useEffect, useRef } from \"react\"\nimport { getDocument, isArray, useCallbackRef } from \"../../utils\"\n\nexport interface UseOutsideClickProps {\n ref: RefObject<HTMLElement | null> | RefObject<HTMLElement | null>[]\n enabled?: boolean\n handler?: (ev: Event) => void\n}\n\n/**\n * `useOutsideClick` is a custom hook that detects click events outside of an element.\n *\n * @see https://yamada-ui.com/docs/hooks/use-outside-click\n */\nexport const useOutsideClick = ({\n ref,\n enabled = true,\n handler,\n}: UseOutsideClickProps) => {\n const handlerRef = useCallbackRef(handler)\n\n const state = useRef({\n ignoreEmulatedMouseEvents: false,\n isPointerDown: false,\n })\n\n const onPointerDown = useCallback(\n (ev: MouseEvent | TouchEvent) => {\n if (isValidEvent(ev, ref)) state.current.isPointerDown = true\n },\n [ref],\n )\n\n const onMouseUp = useCallback(\n (ev: MouseEvent) => {\n if (state.current.ignoreEmulatedMouseEvents) {\n state.current.ignoreEmulatedMouseEvents = false\n\n return\n }\n\n if (state.current.isPointerDown && handler && isValidEvent(ev, ref)) {\n state.current.isPointerDown = false\n\n handlerRef(ev)\n }\n },\n [handler, handlerRef, ref],\n )\n\n const onTouchEnd = useCallback(\n (ev: TouchEvent) => {\n state.current.ignoreEmulatedMouseEvents = true\n\n if (state.current.isPointerDown && handler && isValidEvent(ev, ref)) {\n state.current.isPointerDown = false\n\n handlerRef(ev)\n }\n },\n [handler, handlerRef, ref],\n )\n\n useEffect(() => {\n if (!enabled) return\n\n const doc = getDocument(isArray(ref) ? ref[0]?.current : ref.current)\n\n doc.addEventListener(\"mousedown\", onPointerDown, true)\n doc.addEventListener(\"mouseup\", onMouseUp, true)\n doc.addEventListener(\"touchstart\", onPointerDown, true)\n doc.addEventListener(\"touchend\", onTouchEnd, true)\n\n return () => {\n doc.removeEventListener(\"mousedown\", onPointerDown, true)\n doc.removeEventListener(\"mouseup\", onMouseUp, true)\n doc.removeEventListener(\"touchstart\", onPointerDown, true)\n doc.removeEventListener(\"touchend\", onTouchEnd, true)\n }\n }, [\n handler,\n ref,\n handlerRef,\n state,\n enabled,\n onPointerDown,\n onMouseUp,\n onTouchEnd,\n ])\n}\n\nconst isValidEvent = (\n ev: MouseEvent | TouchEvent,\n ref: RefObject<HTMLElement | null> | RefObject<HTMLElement | null>[],\n) => {\n const target = ev.target as HTMLElement | null\n\n if (\"button\" in ev && ev.button > 0) return false\n\n if (target) if (!getDocument(target).contains(target)) return false\n\n if (isArray(ref))
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["useCallbackRef"],"sources":["../../../../src/hooks/use-outside-click/index.ts"],"sourcesContent":["\"use client\"\n\nimport type { RefObject } from \"react\"\nimport { useCallback, useEffect, useRef } from \"react\"\nimport { getDocument, isArray, useCallbackRef } from \"../../utils\"\n\nexport interface UseOutsideClickProps {\n ref: RefObject<HTMLElement | null> | RefObject<HTMLElement | null>[]\n enabled?: boolean\n handler?: (ev: Event) => void\n}\n\n/**\n * `useOutsideClick` is a custom hook that detects click events outside of an element.\n *\n * @see https://yamada-ui.com/docs/hooks/use-outside-click\n */\nexport const useOutsideClick = ({\n ref,\n enabled = true,\n handler,\n}: UseOutsideClickProps) => {\n const handlerRef = useCallbackRef(handler)\n\n const state = useRef({\n ignoreEmulatedMouseEvents: false,\n isPointerDown: false,\n })\n\n const onPointerDown = useCallback(\n (ev: MouseEvent | TouchEvent) => {\n if (isValidEvent(ev, ref)) state.current.isPointerDown = true\n },\n [ref],\n )\n\n const onMouseUp = useCallback(\n (ev: MouseEvent) => {\n if (state.current.ignoreEmulatedMouseEvents) {\n state.current.ignoreEmulatedMouseEvents = false\n\n return\n }\n\n if (state.current.isPointerDown && handler && isValidEvent(ev, ref)) {\n state.current.isPointerDown = false\n\n handlerRef(ev)\n }\n },\n [handler, handlerRef, ref],\n )\n\n const onTouchEnd = useCallback(\n (ev: TouchEvent) => {\n state.current.ignoreEmulatedMouseEvents = true\n\n if (state.current.isPointerDown && handler && isValidEvent(ev, ref)) {\n state.current.isPointerDown = false\n\n handlerRef(ev)\n }\n },\n [handler, handlerRef, ref],\n )\n\n useEffect(() => {\n if (!enabled) return\n\n const doc = getDocument(isArray(ref) ? ref[0]?.current : ref.current)\n\n doc.addEventListener(\"mousedown\", onPointerDown, true)\n doc.addEventListener(\"mouseup\", onMouseUp, true)\n doc.addEventListener(\"touchstart\", onPointerDown, true)\n doc.addEventListener(\"touchend\", onTouchEnd, true)\n\n return () => {\n doc.removeEventListener(\"mousedown\", onPointerDown, true)\n doc.removeEventListener(\"mouseup\", onMouseUp, true)\n doc.removeEventListener(\"touchstart\", onPointerDown, true)\n doc.removeEventListener(\"touchend\", onTouchEnd, true)\n }\n }, [\n handler,\n ref,\n handlerRef,\n state,\n enabled,\n onPointerDown,\n onMouseUp,\n onTouchEnd,\n ])\n}\n\nconst isValidEvent = (\n ev: MouseEvent | TouchEvent,\n ref: RefObject<HTMLElement | null> | RefObject<HTMLElement | null>[],\n) => {\n const target = ev.target as HTMLElement | null\n\n if (\"button\" in ev && ev.button > 0) return false\n\n if (target) if (!getDocument(target).contains(target)) return false\n\n if (isArray(ref)) return !ref.some((ref) => ref.current?.contains(target))\n else return !ref.current?.contains(target)\n}\n"],"mappings":";;;;;;;;;;;AAiBA,MAAa,mBAAmB,EAC9B,KACA,UAAU,MACV,cAC0B;CAC1B,MAAM,aAAaA,YAAAA,eAAe,OAAO;CAEzC,MAAM,SAAA,GAAA,MAAA,OAAA,CAAe;EACnB,2BAA2B;EAC3B,eAAe;CACjB,CAAC;CAED,MAAM,iBAAA,GAAA,MAAA,YAAA,EACH,OAAgC;EAC/B,IAAI,aAAa,IAAI,GAAG,GAAG,MAAM,QAAQ,gBAAgB;CAC3D,GACA,CAAC,GAAG,CACN;CAEA,MAAM,aAAA,GAAA,MAAA,YAAA,EACH,OAAmB;EAClB,IAAI,MAAM,QAAQ,2BAA2B;GAC3C,MAAM,QAAQ,4BAA4B;GAE1C;EACF;EAEA,IAAI,MAAM,QAAQ,iBAAiB,WAAW,aAAa,IAAI,GAAG,GAAG;GACnE,MAAM,QAAQ,gBAAgB;GAE9B,WAAW,EAAE;EACf;CACF,GACA;EAAC;EAAS;EAAY;CAAG,CAC3B;CAEA,MAAM,cAAA,GAAA,MAAA,YAAA,EACH,OAAmB;EAClB,MAAM,QAAQ,4BAA4B;EAE1C,IAAI,MAAM,QAAQ,iBAAiB,WAAW,aAAa,IAAI,GAAG,GAAG;GACnE,MAAM,QAAQ,gBAAgB;GAE9B,WAAW,EAAE;EACf;CACF,GACA;EAAC;EAAS;EAAY;CAAG,CAC3B;CAEA,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,SAAS;EAEd,MAAM,OAAA,GAAA,oBAAA,cAAA,YAAA,EAAA,GAAA,oBAAA,cAAA,QAAA,CAA0B,GAAG,IAAI,IAAI,EAAE,EAAE,UAAU,IAAI,OAAO;EAEpE,IAAI,iBAAiB,aAAa,eAAe,IAAI;EACrD,IAAI,iBAAiB,WAAW,WAAW,IAAI;EAC/C,IAAI,iBAAiB,cAAc,eAAe,IAAI;EACtD,IAAI,iBAAiB,YAAY,YAAY,IAAI;EAEjD,aAAa;GACX,IAAI,oBAAoB,aAAa,eAAe,IAAI;GACxD,IAAI,oBAAoB,WAAW,WAAW,IAAI;GAClD,IAAI,oBAAoB,cAAc,eAAe,IAAI;GACzD,IAAI,oBAAoB,YAAY,YAAY,IAAI;EACtD;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH;AAEA,MAAM,gBACJ,IACA,QACG;CACH,MAAM,SAAS,GAAG;CAElB,IAAI,YAAY,MAAM,GAAG,SAAS,GAAG,OAAO;CAE5C,IAAI;MAAY,EAAA,GAAA,oBAAA,cAAA,YAAA,CAAa,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,OAAO;CAAA;CAE9D,KAAA,GAAA,oBAAA,cAAA,QAAA,CAAY,GAAG,GAAG,OAAO,CAAC,IAAI,MAAM,QAAQ,IAAI,SAAS,SAAS,MAAM,CAAC;MACpE,OAAO,CAAC,IAAI,SAAS,SAAS,MAAM;AAC3C"}
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -5248,6 +5248,7 @@ var src_exports = /* @__PURE__ */ require_runtime.__exportAll({
|
|
|
5248
5248
|
varAttr: () => require_var.varAttr,
|
|
5249
5249
|
varToValue: () => require_utils.varToValue,
|
|
5250
5250
|
variableLengthProperties: () => require_styles.variableLengthProperties,
|
|
5251
|
+
vendorProperties: () => require_styles.vendorProperties,
|
|
5251
5252
|
visuallyHiddenAttributes: () => require_dom.visuallyHiddenAttributes,
|
|
5252
5253
|
visuallyHiddenStyle: () => require_visually_hidden_style.visuallyHiddenStyle,
|
|
5253
5254
|
wrapOrPassProps: () => require_children.wrapOrPassProps,
|
|
@@ -8629,6 +8630,7 @@ exports.vStackStyle = require_v_stack_style.vStackStyle;
|
|
|
8629
8630
|
exports.varAttr = require_var.varAttr;
|
|
8630
8631
|
exports.varToValue = require_utils.varToValue;
|
|
8631
8632
|
exports.variableLengthProperties = require_styles.variableLengthProperties;
|
|
8633
|
+
exports.vendorProperties = require_styles.vendorProperties;
|
|
8632
8634
|
exports.visuallyHiddenAttributes = require_dom.visuallyHiddenAttributes;
|
|
8633
8635
|
exports.visuallyHiddenStyle = require_visually_hidden_style.visuallyHiddenStyle;
|
|
8634
8636
|
exports.wrapOrPassProps = require_children.wrapOrPassProps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n-provider.cjs","names":["DEFAULT_LOCALE","INTL","IntlMessageFormat"],"sources":["../../../../src/providers/i18n-provider/i18n-provider.tsx"],"sourcesContent":["\"use client\"\n\nimport type { Formats, Options } from \"intl-messageformat\"\nimport type { FC, ReactNode } from \"react\"\nimport type { TextDirection } from \"../../core\"\nimport type { AnyString, Dict, Path, Value } from \"../../utils\"\nimport type { IcuArgs } from \"./icu.types\"\nimport type { DefaultIntlData } from \"./intl\"\nimport IntlMessageFormat from \"intl-messageformat\"\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\"\nimport { DEFAULT_DIRECTION, DEFAULT_LOCALE } from \"../../core\"\nimport {\n createdDom,\n getMemoizedObject as get,\n isEmptyObject,\n isRtl,\n isString,\n isUndefined,\n noop,\n useUpdateEffect,\n} from \"../../utils\"\nimport INTL from \"./intl\"\n\nexport interface Language {\n dir: TextDirection\n locale: string\n}\n\nconst DEFAULT_LANGUAGE: Language = {\n dir: DEFAULT_DIRECTION,\n locale: DEFAULT_LOCALE,\n}\n\nexport const LOCALES = Object.keys(INTL) as readonly Locale[]\n\nexport function getLanguage(locale?: string, dir?: TextDirection): Language {\n locale ??= createdDom() ? navigator.language : DEFAULT_LOCALE\n\n try {\n Intl.DateTimeFormat.supportedLocalesOf([locale])\n } catch (_err) {\n locale = DEFAULT_LOCALE\n }\n\n dir ??= isRtl(locale) ? \"rtl\" : \"ltr\"\n\n return { dir, locale }\n}\n\ntype IntlData = DefaultIntlData\ntype IntlKey = keyof IntlData\ntype IntlPath = Path<IntlData>\n\nexport type Locale = keyof typeof INTL\n\ntype Translation<Y extends object = IntlData, M extends string = IntlPath> = <\n D extends M,\n>(\n path: D,\n ...args: IcuArgs<Value<Y, D>> extends never\n ? [replaceValues?: IcuArgs<Value<Y, D>, IntlPath | M>]\n : [replaceValues: IcuArgs<Value<Y, D>, IntlPath | M>]\n) => string\n\ninterface I18nContext<\n Y extends object = IntlData,\n M extends string = IntlPath,\n> extends Language {\n t: Translation<Y, M>\n changeLanguage: (locale?: string, dir?: TextDirection) => void\n getTranslation: (key?: IntlKey) => Translation<Y, M>\n}\n\nexport const I18nContext = createContext<I18nContext>({\n ...DEFAULT_LANGUAGE,\n changeLanguage: noop,\n getTranslation: () => () => \"\",\n t: () => \"\",\n})\n\nexport interface I18nProviderProps {\n children?: ReactNode\n /**\n * The text direction to apply to the application.\n *\n * If not provided, the direction will be determined by the locale.\n */\n dir?: TextDirection\n /**\n * The formats to pass to the `intlMessageFormat` instance.\n */\n formats?: Formats\n /**\n * The internationalization messages to apply to the application.\n *\n * This prop expects a dictionary object where the keys are locale strings (e.g., \"en-US\").\n */\n intl?: Dict\n /**\n * The options to pass to the `intlMessageFormat` instance.\n */\n intlMessageFormatOptions?: Options\n /**\n * The locale to apply to the application.\n *\n * If not provided, the locale will be determined by the browser.\n */\n locale?: AnyString | Locale\n}\n\nexport const I18nProvider: FC<I18nProviderProps> = ({\n children,\n dir: forcedDir,\n formats,\n intl = INTL as Dict,\n intlMessageFormatOptions,\n locale: forcedLocale,\n}) => {\n const [language, setLanguage] = useState(getLanguage(forcedLocale, forcedDir))\n const controlled = !isUndefined(forcedLocale)\n const { locale } = language\n\n const messages = useMemo(() => intl[locale], [intl, locale])\n\n const changeSystemLanguage = useCallback(() => {\n setLanguage(getLanguage())\n }, [])\n\n const changeLanguage = useCallback((locale?: string, dir?: TextDirection) => {\n setLanguage(getLanguage(locale, dir))\n }, [])\n\n const getValue = useCallback(\n (path: number | string) => {\n const value = get<string | undefined>(messages, path)\n\n if (!isUndefined(value)) {\n return value\n } else {\n path = path.toString().replace(/^[^.]+\\./g, \"\")\n\n return get<string | undefined>(messages, path)\n }\n },\n [messages],\n )\n\n const getTranslation = useCallback(\n (key?: IntlKey) =>\n <Y extends IntlPath>(\n path: Y,\n replaceValues?: IcuArgs<Value<IntlData, Y>, IntlPath>,\n ) => {\n const value = getValue(key ? `${key}.${path}` : path) ?? path\n\n if (isUndefined(replaceValues)) return value\n\n try {\n const resolvedReplaceValues = Object.entries(replaceValues).reduce<{\n [key: string]: any\n }>((prev, [key, pathOrValue]) => {\n if (isString(pathOrValue)) {\n const resolvedPathOrValue = String(pathOrValue)\n const value =\n getValue(\n key ? `${key}.${resolvedPathOrValue}` : resolvedPathOrValue,\n ) ?? resolvedPathOrValue\n\n prev[key] = value\n } else {\n prev[key] = pathOrValue\n }\n\n return prev\n }, {})\n\n const message = new IntlMessageFormat(\n value,\n locale,\n formats,\n intlMessageFormatOptions,\n )\n\n return message.format(resolvedReplaceValues) as string\n } catch (e) {\n if (e instanceof Error) console.warn(e.message)\n\n return value\n }\n },\n [getValue, locale, formats, intlMessageFormatOptions],\n )\n\n const value = useMemo(() => {\n const rest = { changeLanguage, getTranslation, t: getTranslation() }\n\n return { ...language, ...rest }\n }, [changeLanguage, getTranslation, language])\n\n useEffect(() => {\n if (controlled) return\n\n window.addEventListener(\"languagechange\", changeSystemLanguage)\n\n return () => {\n window.removeEventListener(\"languagechange\", changeSystemLanguage)\n }\n }, [controlled, changeSystemLanguage])\n\n useUpdateEffect(() => {\n setLanguage(getLanguage(forcedLocale, forcedDir))\n }, [forcedLocale, forcedDir])\n\n return <I18nContext value={value}>{children}</I18nContext>\n}\n\nexport function useI18n(): I18nContext\n\nexport function useI18n<Y extends IntlKey>(\n key: Y,\n): I18nContext<IntlData[Y], Path<IntlData[Y]>>\n\nexport function useI18n<Y extends IntlKey>(key?: Y) {\n const context = useContext(I18nContext)\n\n const translation = useCallback(\n <M extends Path<IntlData[Y]>>(\n path: M,\n replaceValues?: IcuArgs<\n Value<IntlData[Y], M>,\n IntlPath | Path<IntlData[Y]>\n >,\n ) => context.getTranslation(key)(path as any, replaceValues as any),\n [key, context],\n )\n\n if (isEmptyObject(context))\n return {\n ...DEFAULT_LANGUAGE,\n changeLanguage: noop,\n t: () => \"\",\n }\n\n if (key)
|
|
1
|
+
{"version":3,"file":"i18n-provider.cjs","names":["DEFAULT_LOCALE","INTL","IntlMessageFormat"],"sources":["../../../../src/providers/i18n-provider/i18n-provider.tsx"],"sourcesContent":["\"use client\"\n\nimport type { Formats, Options } from \"intl-messageformat\"\nimport type { FC, ReactNode } from \"react\"\nimport type { TextDirection } from \"../../core\"\nimport type { AnyString, Dict, Path, Value } from \"../../utils\"\nimport type { IcuArgs } from \"./icu.types\"\nimport type { DefaultIntlData } from \"./intl\"\nimport IntlMessageFormat from \"intl-messageformat\"\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\"\nimport { DEFAULT_DIRECTION, DEFAULT_LOCALE } from \"../../core\"\nimport {\n createdDom,\n getMemoizedObject as get,\n isEmptyObject,\n isRtl,\n isString,\n isUndefined,\n noop,\n useUpdateEffect,\n} from \"../../utils\"\nimport INTL from \"./intl\"\n\nexport interface Language {\n dir: TextDirection\n locale: string\n}\n\nconst DEFAULT_LANGUAGE: Language = {\n dir: DEFAULT_DIRECTION,\n locale: DEFAULT_LOCALE,\n}\n\nexport const LOCALES = Object.keys(INTL) as readonly Locale[]\n\nexport function getLanguage(locale?: string, dir?: TextDirection): Language {\n locale ??= createdDom() ? navigator.language : DEFAULT_LOCALE\n\n try {\n Intl.DateTimeFormat.supportedLocalesOf([locale])\n } catch (_err) {\n locale = DEFAULT_LOCALE\n }\n\n dir ??= isRtl(locale) ? \"rtl\" : \"ltr\"\n\n return { dir, locale }\n}\n\ntype IntlData = DefaultIntlData\ntype IntlKey = keyof IntlData\ntype IntlPath = Path<IntlData>\n\nexport type Locale = keyof typeof INTL\n\ntype Translation<Y extends object = IntlData, M extends string = IntlPath> = <\n D extends M,\n>(\n path: D,\n ...args: IcuArgs<Value<Y, D>> extends never\n ? [replaceValues?: IcuArgs<Value<Y, D>, IntlPath | M>]\n : [replaceValues: IcuArgs<Value<Y, D>, IntlPath | M>]\n) => string\n\ninterface I18nContext<\n Y extends object = IntlData,\n M extends string = IntlPath,\n> extends Language {\n t: Translation<Y, M>\n changeLanguage: (locale?: string, dir?: TextDirection) => void\n getTranslation: (key?: IntlKey) => Translation<Y, M>\n}\n\nexport const I18nContext = createContext<I18nContext>({\n ...DEFAULT_LANGUAGE,\n changeLanguage: noop,\n getTranslation: () => () => \"\",\n t: () => \"\",\n})\n\nexport interface I18nProviderProps {\n children?: ReactNode\n /**\n * The text direction to apply to the application.\n *\n * If not provided, the direction will be determined by the locale.\n */\n dir?: TextDirection\n /**\n * The formats to pass to the `intlMessageFormat` instance.\n */\n formats?: Formats\n /**\n * The internationalization messages to apply to the application.\n *\n * This prop expects a dictionary object where the keys are locale strings (e.g., \"en-US\").\n */\n intl?: Dict\n /**\n * The options to pass to the `intlMessageFormat` instance.\n */\n intlMessageFormatOptions?: Options\n /**\n * The locale to apply to the application.\n *\n * If not provided, the locale will be determined by the browser.\n */\n locale?: AnyString | Locale\n}\n\nexport const I18nProvider: FC<I18nProviderProps> = ({\n children,\n dir: forcedDir,\n formats,\n intl = INTL as Dict,\n intlMessageFormatOptions,\n locale: forcedLocale,\n}) => {\n const [language, setLanguage] = useState(getLanguage(forcedLocale, forcedDir))\n const controlled = !isUndefined(forcedLocale)\n const { locale } = language\n\n const messages = useMemo(() => intl[locale], [intl, locale])\n\n const changeSystemLanguage = useCallback(() => {\n setLanguage(getLanguage())\n }, [])\n\n const changeLanguage = useCallback((locale?: string, dir?: TextDirection) => {\n setLanguage(getLanguage(locale, dir))\n }, [])\n\n const getValue = useCallback(\n (path: number | string) => {\n const value = get<string | undefined>(messages, path)\n\n if (!isUndefined(value)) {\n return value\n } else {\n path = path.toString().replace(/^[^.]+\\./g, \"\")\n\n return get<string | undefined>(messages, path)\n }\n },\n [messages],\n )\n\n const getTranslation = useCallback(\n (key?: IntlKey) =>\n <Y extends IntlPath>(\n path: Y,\n replaceValues?: IcuArgs<Value<IntlData, Y>, IntlPath>,\n ) => {\n const value = getValue(key ? `${key}.${path}` : path) ?? path\n\n if (isUndefined(replaceValues)) return value\n\n try {\n const resolvedReplaceValues = Object.entries(replaceValues).reduce<{\n [key: string]: any\n }>((prev, [key, pathOrValue]) => {\n if (isString(pathOrValue)) {\n const resolvedPathOrValue = String(pathOrValue)\n const value =\n getValue(\n key ? `${key}.${resolvedPathOrValue}` : resolvedPathOrValue,\n ) ?? resolvedPathOrValue\n\n prev[key] = value\n } else {\n prev[key] = pathOrValue\n }\n\n return prev\n }, {})\n\n const message = new IntlMessageFormat(\n value,\n locale,\n formats,\n intlMessageFormatOptions,\n )\n\n return message.format(resolvedReplaceValues) as string\n } catch (e) {\n if (e instanceof Error) console.warn(e.message)\n\n return value\n }\n },\n [getValue, locale, formats, intlMessageFormatOptions],\n )\n\n const value = useMemo(() => {\n const rest = { changeLanguage, getTranslation, t: getTranslation() }\n\n return { ...language, ...rest }\n }, [changeLanguage, getTranslation, language])\n\n useEffect(() => {\n if (controlled) return\n\n window.addEventListener(\"languagechange\", changeSystemLanguage)\n\n return () => {\n window.removeEventListener(\"languagechange\", changeSystemLanguage)\n }\n }, [controlled, changeSystemLanguage])\n\n useUpdateEffect(() => {\n setLanguage(getLanguage(forcedLocale, forcedDir))\n }, [forcedLocale, forcedDir])\n\n return <I18nContext value={value}>{children}</I18nContext>\n}\n\nexport function useI18n(): I18nContext\n\nexport function useI18n<Y extends IntlKey>(\n key: Y,\n): I18nContext<IntlData[Y], Path<IntlData[Y]>>\n\nexport function useI18n<Y extends IntlKey>(key?: Y) {\n const context = useContext(I18nContext)\n\n const translation = useCallback(\n <M extends Path<IntlData[Y]>>(\n path: M,\n replaceValues?: IcuArgs<\n Value<IntlData[Y], M>,\n IntlPath | Path<IntlData[Y]>\n >,\n ) => context.getTranslation(key)(path as any, replaceValues as any),\n [key, context],\n )\n\n if (isEmptyObject(context))\n return {\n ...DEFAULT_LANGUAGE,\n changeLanguage: noop,\n t: () => \"\",\n }\n\n if (key) return { ...context, t: translation }\n else return context\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"children.cjs","names":["React"],"sources":["../../../src/utils/children.tsx"],"sourcesContent":["import {\n isArray,\n isEmpty,\n isNumber,\n isString,\n isUndefined,\n} from \"@yamada-ui/utils\"\nimport * as React from \"react\"\n\nexport function getValidChildren(\n children: React.ReactNode,\n): React.ReactElement<any>[] {\n return React.Children.toArray(children).filter((child) =>\n React.isValidElement(child),\n )\n}\n\nexport function useValidChildren(children: React.ReactNode) {\n return React.useMemo(() => getValidChildren(children), [children])\n}\n\nexport function isValidElement(child: any): child is React.ReactNode {\n return React.isValidElement(child) || isString(child) || isNumber(child)\n}\n\nexport function isSomeDisplayName(a: any, b: any): boolean {\n if (isUndefined(a) || isUndefined(b)) return false\n\n if (isArray(a)) {\n if (a.includes(b)) return true\n if (!!b.displayName && a.includes(b.displayName)) return true\n if (!!b.name && a.includes(b.name)) return true\n } else {\n if (a === b) return true\n if (!!a.displayName && !!b.displayName && a.displayName === b.displayName)\n return true\n if (!!a.name && !!b.name && a.name === b.name) return true\n if (!!a.displayName && !!b.name && a.displayName === b.name) return true\n if (!!a.name && !!b.displayName && a.name === b.displayName) return true\n }\n\n return false\n}\n\nexport function isSomeElement(a: any, b: any): boolean {\n if (isUndefined(a) || isUndefined(b)) return false\n if (a === b) return true\n if (isSomeDisplayName(a, b)) return true\n\n a = a._payload?.value\n\n if (isUndefined(a)) return false\n if (isSomeDisplayName(a, b)) return true\n\n return false\n}\n\nexport function findChild<Y = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y> | undefined {\n const child = children.find((child) =>\n types.some((type) => isSomeElement(child.type, type)),\n )\n\n return child as React.ReactElement<Y> | undefined\n}\n\nexport function useFindChild<Y = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y> | undefined {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => findChild<Y>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport function findChildren<Y = any, M = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): [React.ReactElement<Y> | undefined, ...React.ReactElement<M>[]] {\n const child = findChild(children, ...types)\n\n if (child) {\n return children.sort((a, b) => {\n if (types.some((type) => isSomeElement(a.type, type))) {\n return -1\n } else if (types.some((type) => isSomeElement(b.type, type))) {\n return 1\n } else {\n return 0\n }\n }) as [React.ReactElement<Y> | undefined, ...React.ReactElement<M>[]]\n } else {\n return [undefined, ...(children as React.ReactElement<M>[])]\n }\n}\n\nexport function useFindChildren<Y = any, M = any>(\n children: React.ReactElement<M>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): [React.ReactElement<Y> | undefined, ...React.ReactElement<M>[]] {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => findChildren<Y, M>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport function includesChildren(\n children: React.ReactElement<any>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): boolean {\n return children.some((child) => {\n if (types.some((type) => isSomeElement(child.type, type))) return true\n\n const children = getValidChildren(child.props.children)\n\n return children.length ? includesChildren(children, ...types) : false\n })\n}\n\nexport function useIncludesChildren(\n children: React.ReactElement<any>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): boolean {\n return React.useMemo(\n () => includesChildren(children, ...types),\n [children, types],\n )\n}\n\nexport function omitChildren<Y = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y>[] {\n return children.filter((child) =>\n types.every((type) => !isSomeElement(child.type, type)),\n ) as React.ReactElement<Y>[]\n}\n\nexport function useOmitChildren<Y = any>(\n children: React.ReactElement<any>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y>[] {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => omitChildren<Y>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport function pickChildren<Y = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y>[] {\n return children.filter((child) =>\n types.some((type) => isSomeElement(child.type, type)),\n ) as React.ReactElement<Y>[]\n}\n\nexport function usePickChildren<Y = any>(\n children: React.ReactElement<any>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y>[] {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => pickChildren<Y>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport function splitChildren<Y = any, M = any>(\n children: React.ReactNode,\n ...types: (\n | (React.JSXElementConstructor<any> | string)[]\n | React.JSXElementConstructor<any>\n | string\n )[]\n): [\n React.ReactElement<M>[] | React.ReactNode,\n ...(React.ReactElement<Y>[] | undefined)[],\n] {\n const validChildren = getValidChildren(children)\n\n if (isEmpty(validChildren)) return [children]\n\n const pickedChildren = types.map((types) => {\n if (isArray(types)) {\n const pickedChildren = pickChildren(validChildren, ...types)\n\n return !isEmpty(pickedChildren) ? pickedChildren : undefined\n } else {\n const pickedChildren = pickChildren(validChildren, types)\n\n return !isEmpty(pickedChildren) ? pickedChildren : undefined\n }\n })\n\n const omittedChildren = omitChildren(validChildren, ...types.flat())\n\n return [omittedChildren, ...pickedChildren] as const\n}\n\nexport function useSplitChildren<Y = any, M = any>(\n children: React.ReactNode,\n ...types: (\n | (React.JSXElementConstructor<any> | string)[]\n | React.JSXElementConstructor<any>\n | string\n )[]\n): [\n React.ReactElement<M>[] | React.ReactNode,\n ...(React.ReactElement<Y>[] | undefined)[],\n] {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => splitChildren<Y, M>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport const wrapOrPassProps = <Y extends React.PropsWithChildren>(\n Component: React.FC<Y>,\n nodeOrProps: React.ReactNode | Y,\n additionalProps?: Y,\n) => {\n if (isUndefined(nodeOrProps)) {\n return null\n } else if (isValidElement(nodeOrProps)) {\n additionalProps ??= {} as Y\n additionalProps.children = nodeOrProps\n\n return <Component {...additionalProps} />\n } else {\n return <Component {...additionalProps} {...nodeOrProps} />\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"children.cjs","names":["React"],"sources":["../../../src/utils/children.tsx"],"sourcesContent":["import {\n isArray,\n isEmpty,\n isNumber,\n isString,\n isUndefined,\n} from \"@yamada-ui/utils\"\nimport * as React from \"react\"\n\nexport function getValidChildren(\n children: React.ReactNode,\n): React.ReactElement<any>[] {\n return React.Children.toArray(children).filter((child) =>\n React.isValidElement(child),\n )\n}\n\nexport function useValidChildren(children: React.ReactNode) {\n return React.useMemo(() => getValidChildren(children), [children])\n}\n\nexport function isValidElement(child: any): child is React.ReactNode {\n return React.isValidElement(child) || isString(child) || isNumber(child)\n}\n\nexport function isSomeDisplayName(a: any, b: any): boolean {\n if (isUndefined(a) || isUndefined(b)) return false\n\n if (isArray(a)) {\n if (a.includes(b)) return true\n if (!!b.displayName && a.includes(b.displayName)) return true\n if (!!b.name && a.includes(b.name)) return true\n } else {\n if (a === b) return true\n if (!!a.displayName && !!b.displayName && a.displayName === b.displayName)\n return true\n if (!!a.name && !!b.name && a.name === b.name) return true\n if (!!a.displayName && !!b.name && a.displayName === b.name) return true\n if (!!a.name && !!b.displayName && a.name === b.displayName) return true\n }\n\n return false\n}\n\nexport function isSomeElement(a: any, b: any): boolean {\n if (isUndefined(a) || isUndefined(b)) return false\n if (a === b) return true\n if (isSomeDisplayName(a, b)) return true\n\n a = a._payload?.value\n\n if (isUndefined(a)) return false\n if (isSomeDisplayName(a, b)) return true\n\n return false\n}\n\nexport function findChild<Y = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y> | undefined {\n const child = children.find((child) =>\n types.some((type) => isSomeElement(child.type, type)),\n )\n\n return child as React.ReactElement<Y> | undefined\n}\n\nexport function useFindChild<Y = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y> | undefined {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => findChild<Y>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport function findChildren<Y = any, M = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): [React.ReactElement<Y> | undefined, ...React.ReactElement<M>[]] {\n const child = findChild(children, ...types)\n\n if (child)\n return children.sort((a, b) => {\n if (types.some((type) => isSomeElement(a.type, type))) return -1\n else if (types.some((type) => isSomeElement(b.type, type))) return 1\n else return 0\n }) as [React.ReactElement<Y> | undefined, ...React.ReactElement<M>[]]\n else return [undefined, ...(children as React.ReactElement<M>[])]\n}\n\nexport function useFindChildren<Y = any, M = any>(\n children: React.ReactElement<M>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): [React.ReactElement<Y> | undefined, ...React.ReactElement<M>[]] {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => findChildren<Y, M>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport function includesChildren(\n children: React.ReactElement<any>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): boolean {\n return children.some((child) => {\n if (types.some((type) => isSomeElement(child.type, type))) return true\n\n const children = getValidChildren(child.props.children)\n\n return children.length ? includesChildren(children, ...types) : false\n })\n}\n\nexport function useIncludesChildren(\n children: React.ReactElement<any>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): boolean {\n return React.useMemo(\n () => includesChildren(children, ...types),\n [children, types],\n )\n}\n\nexport function omitChildren<Y = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y>[] {\n return children.filter((child) =>\n types.every((type) => !isSomeElement(child.type, type)),\n ) as React.ReactElement<Y>[]\n}\n\nexport function useOmitChildren<Y = any>(\n children: React.ReactElement<any>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y>[] {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => omitChildren<Y>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport function pickChildren<Y = any>(\n children: React.ReactElement[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y>[] {\n return children.filter((child) =>\n types.some((type) => isSomeElement(child.type, type)),\n ) as React.ReactElement<Y>[]\n}\n\nexport function usePickChildren<Y = any>(\n children: React.ReactElement<any>[],\n ...types: (React.JSXElementConstructor<any> | string)[]\n): React.ReactElement<Y>[] {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => pickChildren<Y>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport function splitChildren<Y = any, M = any>(\n children: React.ReactNode,\n ...types: (\n | (React.JSXElementConstructor<any> | string)[]\n | React.JSXElementConstructor<any>\n | string\n )[]\n): [\n React.ReactElement<M>[] | React.ReactNode,\n ...(React.ReactElement<Y>[] | undefined)[],\n] {\n const validChildren = getValidChildren(children)\n\n if (isEmpty(validChildren)) return [children]\n\n const pickedChildren = types.map((types) => {\n if (isArray(types)) {\n const pickedChildren = pickChildren(validChildren, ...types)\n\n return !isEmpty(pickedChildren) ? pickedChildren : undefined\n } else {\n const pickedChildren = pickChildren(validChildren, types)\n\n return !isEmpty(pickedChildren) ? pickedChildren : undefined\n }\n })\n\n const omittedChildren = omitChildren(validChildren, ...types.flat())\n\n return [omittedChildren, ...pickedChildren] as const\n}\n\nexport function useSplitChildren<Y = any, M = any>(\n children: React.ReactNode,\n ...types: (\n | (React.JSXElementConstructor<any> | string)[]\n | React.JSXElementConstructor<any>\n | string\n )[]\n): [\n React.ReactElement<M>[] | React.ReactNode,\n ...(React.ReactElement<Y>[] | undefined)[],\n] {\n const typesRef = React.useRef(types)\n\n return React.useMemo(\n () => splitChildren<Y, M>(children, ...typesRef.current),\n [children],\n )\n}\n\nexport const wrapOrPassProps = <Y extends React.PropsWithChildren>(\n Component: React.FC<Y>,\n nodeOrProps: React.ReactNode | Y,\n additionalProps?: Y,\n) => {\n if (isUndefined(nodeOrProps)) {\n return null\n } else if (isValidElement(nodeOrProps)) {\n additionalProps ??= {} as Y\n additionalProps.children = nodeOrProps\n\n return <Component {...additionalProps} />\n } else {\n return <Component {...additionalProps} {...nodeOrProps} />\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.cjs","names":["React"],"sources":["../../../src/utils/dom.ts"],"sourcesContent":["import type { AnyString } from \"@yamada-ui/utils\"\nimport * as React from \"react\"\n\ntype KeyboardNavigationKey =\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"ArrowUp\"\n | \"End\"\n | \"Home\"\n | \"PageDown\"\n | \"PageUp\"\n\ntype KeyboardControlKey =\n | \"Alt\"\n | \"Backspace\"\n | \"CapsLock\"\n | \"Control\"\n | \"Delete\"\n | \"Enter\"\n | \"Escape\"\n | \"Insert\"\n | \"Meta\"\n | \"NumLock\"\n | \"Pause\"\n | \"PrintScreen\"\n | \"ScrollLock\"\n | \"Shift\"\n | \"Space\"\n | \"Tab\"\n\ntype KeyboardFunctionKey = \"Fn\" | \"FnLock\" | `F${number}`\n\ntype KeyboardKey =\n | AnyString\n | KeyboardControlKey\n | KeyboardFunctionKey\n | KeyboardNavigationKey\n\nexport function runKeyAction<Y>(\n ev: React.KeyboardEvent<Y>,\n actions: { [key in KeyboardKey]?: React.KeyboardEventHandler<Y> },\n { preventDefault = true }: { preventDefault?: boolean } = {},\n) {\n if (ev.key === \" \") ev.key = ev.code\n const action = actions[ev.key]\n\n if (!action) return\n\n if (preventDefault) ev.preventDefault()\n\n action(ev)\n}\n\nexport function isComposing(\n ev: React.ChangeEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>,\n): boolean {\n if (\"keyCode\" in ev)
|
|
1
|
+
{"version":3,"file":"dom.cjs","names":["React"],"sources":["../../../src/utils/dom.ts"],"sourcesContent":["import type { AnyString } from \"@yamada-ui/utils\"\nimport * as React from \"react\"\n\ntype KeyboardNavigationKey =\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"ArrowUp\"\n | \"End\"\n | \"Home\"\n | \"PageDown\"\n | \"PageUp\"\n\ntype KeyboardControlKey =\n | \"Alt\"\n | \"Backspace\"\n | \"CapsLock\"\n | \"Control\"\n | \"Delete\"\n | \"Enter\"\n | \"Escape\"\n | \"Insert\"\n | \"Meta\"\n | \"NumLock\"\n | \"Pause\"\n | \"PrintScreen\"\n | \"ScrollLock\"\n | \"Shift\"\n | \"Space\"\n | \"Tab\"\n\ntype KeyboardFunctionKey = \"Fn\" | \"FnLock\" | `F${number}`\n\ntype KeyboardKey =\n | AnyString\n | KeyboardControlKey\n | KeyboardFunctionKey\n | KeyboardNavigationKey\n\nexport function runKeyAction<Y>(\n ev: React.KeyboardEvent<Y>,\n actions: { [key in KeyboardKey]?: React.KeyboardEventHandler<Y> },\n { preventDefault = true }: { preventDefault?: boolean } = {},\n) {\n if (ev.key === \" \") ev.key = ev.code\n const action = actions[ev.key]\n\n if (!action) return\n\n if (preventDefault) ev.preventDefault()\n\n action(ev)\n}\n\nexport function isComposing(\n ev: React.ChangeEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>,\n): boolean {\n if (\"keyCode\" in ev) return ev.nativeEvent.isComposing || ev.keyCode === 229\n else if (ev.nativeEvent instanceof InputEvent)\n return ev.nativeEvent.isComposing\n else return false\n}\n\nexport function useAttributeObserver(\n ref: React.RefObject<HTMLElement | null>,\n attributeFilter: string[],\n enabled: boolean,\n func: () => void,\n) {\n React.useEffect(() => {\n if (!ref.current || !enabled) return\n\n const ownerDocument = ref.current.ownerDocument.defaultView ?? window\n\n const observer = new ownerDocument.MutationObserver((changes) => {\n for (const { type, attributeName } of changes) {\n if (type !== \"attributes\") continue\n if (!attributeName) continue\n\n if (attributeFilter.includes(attributeName)) func()\n }\n })\n\n observer.observe(ref.current, { attributeFilter, attributes: true })\n\n return () => observer.disconnect()\n })\n}\n\nexport function getEventRelatedTarget(ev: React.FocusEvent | React.MouseEvent) {\n return (ev.relatedTarget ??\n ev.currentTarget.ownerDocument.activeElement) as HTMLElement | null\n}\n\nconst visuallyHiddenStyle = {\n border: \"0px\",\n clipPath: \"rect(0px 0px 0px 0px)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0px\",\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n} satisfies React.CSSProperties\n\nexport const visuallyHiddenAttributes = {\n style: visuallyHiddenStyle,\n \"aria-hidden\": true,\n tabIndex: -1,\n} satisfies React.HTMLAttributes<HTMLElement>\n\nexport function* useIds() {\n const id = React.useId()\n\n for (let i = 0; ; i++) yield `${id}-${i}`\n}\n"],"mappings":";;;;AAuCA,SAAgB,aACd,IACA,SACA,EAAE,iBAAiB,SAAuC,CAAC,GAC3D;CACA,IAAI,GAAG,QAAQ,KAAK,GAAG,MAAM,GAAG;CAChC,MAAM,SAAS,QAAQ,GAAG;CAE1B,IAAI,CAAC,QAAQ;CAEb,IAAI,gBAAgB,GAAG,eAAe;CAEtC,OAAO,EAAE;AACX;AAEA,SAAgB,YACd,IACS;CACT,IAAI,aAAa,IAAI,OAAO,GAAG,YAAY,eAAe,GAAG,YAAY;MACpE,IAAI,GAAG,uBAAuB,YACjC,OAAO,GAAG,YAAY;MACnB,OAAO;AACd;AAEA,SAAgB,qBACd,KACA,iBACA,SACA,MACA;CACA,MAAM,gBAAgB;EACpB,IAAI,CAAC,IAAI,WAAW,CAAC,SAAS;EAI9B,MAAM,WAAW,KAFK,IAAI,QAAQ,cAAc,eAAe,OAAA,CAE5B,kBAAkB,YAAY;GAC/D,KAAK,MAAM,EAAE,MAAM,mBAAmB,SAAS;IAC7C,IAAI,SAAS,cAAc;IAC3B,IAAI,CAAC,eAAe;IAEpB,IAAI,gBAAgB,SAAS,aAAa,GAAG,KAAK;GACpD;EACF,CAAC;EAED,SAAS,QAAQ,IAAI,SAAS;GAAE;GAAiB,YAAY;EAAK,CAAC;EAEnE,aAAa,SAAS,WAAW;CACnC,CAAC;AACH;AAEA,SAAgB,sBAAsB,IAAyC;CAC7E,OAAQ,GAAG,iBACT,GAAG,cAAc,cAAc;AACnC;AAcA,MAAa,2BAA2B;CACtC,OAAO;EAZP,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,SAAS;EACT,UAAU;EACV,YAAY;EACZ,OAAO;CAIA;CACP,eAAe;CACf,UAAU;AACZ;AAEA,UAAiB,SAAS;CACxB,MAAM,KAAKA,MAAM,MAAM;CAEvB,KAAK,IAAI,IAAI,IAAK,KAAK,MAAM,GAAG,GAAG,GAAG;AACxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.cjs","names":[],"sources":["../../../src/utils/store.ts"],"sourcesContent":["\"use client\"\n\nimport type { Path, Value } from \"@yamada-ui/utils\"\nimport {\n getMemoizedObject,\n isArray,\n isObject,\n isUndefined,\n runIfFn,\n toArray,\n} from \"@yamada-ui/utils\"\nimport { useSyncExternalStore } from \"react\"\n\nconst DEFAULT_IDENTIFIER = \"default\"\n\ninterface Subscribe {\n (listener: () => void): () => void\n}\n\ninterface Store<Y> {\n queue: Map<string, (() => void)[]>\n ref: { current: Y }\n get: () => Y\n set: (nextState: ((prevState: Y) => Y) | Y, key?: string | string[]) => void\n update: (key?: string | string[]) => void\n key?: string\n}\n\ntype IndexOrPath<Y> = Y extends any[]\n ? number\n : Y extends object\n ? Path<Y>\n : undefined\n\ntype ReturnArrayValue<Y extends any[], D> = D extends number\n ? undefined | Y[D]\n : Y\n\ntype ReturnObjectValue<Y extends object, D> = D extends string ? Value<Y, D> : Y\n\ntype ReturnValue<Y, D> = Y extends any[]\n ? ReturnArrayValue<Y, D>\n : Y extends object\n ? ReturnObjectValue<Y, D>\n : Y\n\ninterface UseStore<Y> {\n <D extends IndexOrPath<Y>>(path?: D, key?: string): ReturnValue<Y, D>\n}\n\ninterface CreateMethod<Y, M extends Function> {\n (store: Store<Y>): M\n}\n\ntype Methods<Y, M extends CustomMethods<Y>> = Omit<\n Store<Y>,\n \"key\" | \"update\"\n> & {\n [D in keyof M]: ReturnType<M[D]>\n} & { update: () => void }\n\ninterface CustomMethods<Y> {\n [key: string]: CreateMethod<Y, (...args: any[]) => Promise<void> | void>\n}\n\ninterface CreateStoreOptions<Y> {\n proxyHandler?: ProxyHandler<{ current: Y }>\n subscribe?: CreateMethod<Y, Subscribe>\n}\n\nexport function createStore<Y, M extends CustomMethods<Y>>(\n initialState: (() => Y) | Y,\n additionalMethods?: M,\n options: CreateStoreOptions<Y> = {},\n): [UseStore<Y>, Methods<Y, M>] {\n const queue = new Map<string, (() => void)[]>()\n const ref = new Proxy(\n { current: runIfFn(initialState) },\n { ...options.proxyHandler },\n )\n\n function get() {\n return ref.current\n }\n\n function executeQueue(key: string) {\n const listeners = queue.get(key) ?? []\n\n if (!listeners.length)\n console.warn(`createStore: ${key} is not subscribed.`)\n\n listeners.forEach((listener) => listener())\n }\n\n function update(key?: string | string[]) {\n if (!isUndefined(key))
|
|
1
|
+
{"version":3,"file":"store.cjs","names":[],"sources":["../../../src/utils/store.ts"],"sourcesContent":["\"use client\"\n\nimport type { Path, Value } from \"@yamada-ui/utils\"\nimport {\n getMemoizedObject,\n isArray,\n isObject,\n isUndefined,\n runIfFn,\n toArray,\n} from \"@yamada-ui/utils\"\nimport { useSyncExternalStore } from \"react\"\n\nconst DEFAULT_IDENTIFIER = \"default\"\n\ninterface Subscribe {\n (listener: () => void): () => void\n}\n\ninterface Store<Y> {\n queue: Map<string, (() => void)[]>\n ref: { current: Y }\n get: () => Y\n set: (nextState: ((prevState: Y) => Y) | Y, key?: string | string[]) => void\n update: (key?: string | string[]) => void\n key?: string\n}\n\ntype IndexOrPath<Y> = Y extends any[]\n ? number\n : Y extends object\n ? Path<Y>\n : undefined\n\ntype ReturnArrayValue<Y extends any[], D> = D extends number\n ? undefined | Y[D]\n : Y\n\ntype ReturnObjectValue<Y extends object, D> = D extends string ? Value<Y, D> : Y\n\ntype ReturnValue<Y, D> = Y extends any[]\n ? ReturnArrayValue<Y, D>\n : Y extends object\n ? ReturnObjectValue<Y, D>\n : Y\n\ninterface UseStore<Y> {\n <D extends IndexOrPath<Y>>(path?: D, key?: string): ReturnValue<Y, D>\n}\n\ninterface CreateMethod<Y, M extends Function> {\n (store: Store<Y>): M\n}\n\ntype Methods<Y, M extends CustomMethods<Y>> = Omit<\n Store<Y>,\n \"key\" | \"update\"\n> & {\n [D in keyof M]: ReturnType<M[D]>\n} & { update: () => void }\n\ninterface CustomMethods<Y> {\n [key: string]: CreateMethod<Y, (...args: any[]) => Promise<void> | void>\n}\n\ninterface CreateStoreOptions<Y> {\n proxyHandler?: ProxyHandler<{ current: Y }>\n subscribe?: CreateMethod<Y, Subscribe>\n}\n\nexport function createStore<Y, M extends CustomMethods<Y>>(\n initialState: (() => Y) | Y,\n additionalMethods?: M,\n options: CreateStoreOptions<Y> = {},\n): [UseStore<Y>, Methods<Y, M>] {\n const queue = new Map<string, (() => void)[]>()\n const ref = new Proxy(\n { current: runIfFn(initialState) },\n { ...options.proxyHandler },\n )\n\n function get() {\n return ref.current\n }\n\n function executeQueue(key: string) {\n const listeners = queue.get(key) ?? []\n\n if (!listeners.length)\n console.warn(`createStore: ${key} is not subscribed.`)\n\n listeners.forEach((listener) => listener())\n }\n\n function update(key?: string | string[]) {\n if (!isUndefined(key)) toArray(key).forEach(executeQueue)\n\n executeQueue(DEFAULT_IDENTIFIER)\n }\n\n function set(nextState: ((prevState: Y) => Y) | Y, key?: string | string[]) {\n ref.current = runIfFn(nextState, ref.current)\n\n update(key)\n }\n\n const methods = { ref, get, queue, set, update }\n\n function useStore<D extends IndexOrPath<Y>>(path?: D, key?: string) {\n const customSubscribe = options.subscribe?.({\n key,\n ...methods,\n })\n\n const subscribe = function (listener: () => void) {\n if (key) {\n const listeners = queue.get(key) ?? []\n\n if (listeners.length)\n console.warn(`createStore: ${key} is already subscribed.`)\n\n queue.set(key, [listener])\n } else {\n const listeners = queue.get(DEFAULT_IDENTIFIER) ?? []\n\n queue.set(DEFAULT_IDENTIFIER, [...listeners, listener])\n }\n\n return function () {\n if (key) {\n queue.delete(key)\n } else {\n const listeners = queue.get(DEFAULT_IDENTIFIER) ?? []\n\n queue.set(\n DEFAULT_IDENTIFIER,\n listeners.filter((fn) => fn !== listener),\n )\n }\n }\n }\n\n function getSnapshot<H extends ReturnValue<Y, D>>(): H {\n if (!isUndefined(path))\n if (isObject(ref.current)) return getMemoizedObject(ref.current, path)\n else if (isArray(ref.current))\n return ref.current[path as number] as unknown as H\n\n return ref.current as unknown as H\n }\n\n return useSyncExternalStore(\n customSubscribe ?? subscribe,\n getSnapshot,\n getSnapshot,\n )\n }\n\n const customMethods = Object.fromEntries(\n Object.entries(additionalMethods ?? {}).map(([key, value]) => [\n key,\n value(methods),\n ]),\n ) as { [D in keyof M]: ReturnType<M[D]> }\n\n return [useStore, { ...methods, ...customMethods }]\n}\n"],"mappings":";;;;AAaA,MAAM,qBAAqB;AAyD3B,SAAgB,YACd,cACA,mBACA,UAAiC,CAAC,GACJ;CAC9B,MAAM,wBAAQ,IAAI,IAA4B;CAC9C,MAAM,MAAM,IAAI,MACd,EAAE,UAAA,GAAA,iBAAA,QAAA,CAAiB,YAAY,EAAE,GACjC,EAAE,GAAG,QAAQ,aAAa,CAC5B;CAEA,SAAS,MAAM;EACb,OAAO,IAAI;CACb;CAEA,SAAS,aAAa,KAAa;EACjC,MAAM,YAAY,MAAM,IAAI,GAAG,KAAK,CAAC;EAErC,IAAI,CAAC,UAAU,QACb,QAAQ,KAAK,gBAAgB,IAAI,oBAAoB;EAEvD,UAAU,SAAS,aAAa,SAAS,CAAC;CAC5C;CAEA,SAAS,OAAO,KAAyB;EACvC,IAAI,EAAA,GAAA,iBAAA,YAAA,CAAa,GAAG,GAAG,CAAA,GAAA,iBAAA,QAAA,CAAQ,GAAG,CAAC,CAAC,QAAQ,YAAY;EAExD,aAAa,kBAAkB;CACjC;CAEA,SAAS,IAAI,WAAsC,KAAyB;EAC1E,IAAI,WAAA,GAAA,iBAAA,QAAA,CAAkB,WAAW,IAAI,OAAO;EAE5C,OAAO,GAAG;CACZ;CAEA,MAAM,UAAU;EAAE;EAAK;EAAK;EAAO;EAAK;CAAO;CAE/C,SAAS,SAAmC,MAAU,KAAc;EAClE,MAAM,kBAAkB,QAAQ,YAAY;GAC1C;GACA,GAAG;EACL,CAAC;EAED,MAAM,YAAY,SAAU,UAAsB;GAChD,IAAI,KAAK;IAGP,KAFkB,MAAM,IAAI,GAAG,KAAK,CAAC,EAAA,CAEvB,QACZ,QAAQ,KAAK,gBAAgB,IAAI,wBAAwB;IAE3D,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC;GAC3B,OAAO;IACL,MAAM,YAAY,MAAM,IAAI,kBAAkB,KAAK,CAAC;IAEpD,MAAM,IAAI,oBAAoB,CAAC,GAAG,WAAW,QAAQ,CAAC;GACxD;GAEA,OAAO,WAAY;IACjB,IAAI,KACF,MAAM,OAAO,GAAG;SACX;KACL,MAAM,YAAY,MAAM,IAAI,kBAAkB,KAAK,CAAC;KAEpD,MAAM,IACJ,oBACA,UAAU,QAAQ,OAAO,OAAO,QAAQ,CAC1C;IACF;GACF;EACF;EAEA,SAAS,cAA8C;GACrD,IAAI,EAAA,GAAA,iBAAA,YAAA,CAAa,IAAI;uCACN,IAAI,OAAO,GAAG,QAAA,GAAA,iBAAA,kBAAA,CAAyB,IAAI,SAAS,IAAI;SAChE,KAAA,GAAA,iBAAA,QAAA,CAAY,IAAI,OAAO,GAC1B,OAAO,IAAI,QAAQ;GAAA;GAEvB,OAAO,IAAI;EACb;EAEA,QAAA,GAAA,MAAA,qBAAA,CACE,mBAAmB,WACnB,aACA,WACF;CACF;CAEA,MAAM,gBAAgB,OAAO,YAC3B,OAAO,QAAQ,qBAAqB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAC5D,KACA,MAAM,OAAO,CACf,CAAC,CACH;CAEA,OAAO,CAAC,UAAU;EAAE,GAAG;EAAS,GAAG;CAAc,CAAC;AACpD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-accordion.js","names":["createContext"],"sources":["../../../../src/components/accordion/use-accordion.ts"],"sourcesContent":["\"use client\"\n\nimport type { KeyboardEvent } from \"react\"\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport { useCallback, useEffect, useId, useState } from \"react\"\nimport { mergeProps } from \"../../core\"\nimport { useControllableState } from \"../../hooks/use-controllable-state\"\nimport { createDescendants } from \"../../hooks/use-descendants\"\nimport {\n ariaAttr,\n createContext,\n cx,\n dataAttr,\n handlerAll,\n isArray,\n mergeRefs,\n runKeyAction,\n} from \"../../utils\"\n\nconst {\n DescendantsContext: AccordionDescendantsContext,\n useDescendant: useAccordionDescendant,\n useDescendants: useAccordionDescendants,\n} = createDescendants<HTMLButtonElement>()\n\nexport {\n AccordionDescendantsContext,\n useAccordionDescendant,\n useAccordionDescendants,\n}\n\ninterface AccordionContext extends Omit<\n UseAccordionReturn,\n \"descendants\" | \"getRootProps\"\n> {}\n\nconst [AccordionContext, useAccordionContext] = createContext<AccordionContext>(\n { name: \"AccordionContext\" },\n)\n\nexport { AccordionContext, useAccordionContext }\n\ninterface AccordionItemContext extends Omit<\n UseAccordionItemReturn,\n \"getItemProps\"\n> {}\n\nconst [AccordionItemContext, useAccordionItemContext] =\n createContext<AccordionItemContext>({\n name: \"AccordionItemContext\",\n })\n\nexport { AccordionItemContext, useAccordionItemContext }\n\nexport interface UseAccordionProps extends Omit<HTMLProps, \"onChange\"> {\n /**\n * The initial index(es) of the accordion item to expand.\n */\n defaultIndex?: number | number[]\n /**\n * The index(es) of the accordion item to expand.\n */\n index?: number | number[]\n /**\n * If `true`, multiple accordion items can be expanded at once.\n *\n * @default false\n */\n multiple?: boolean\n /**\n * If `true`, any expanded accordion item can be collapsed again.\n *\n * @default false\n */\n toggle?: boolean\n /**\n * The callback invoked when accordion items are expanded or collapsed.\n */\n onChange?: (index: number | number[]) => void\n}\n\nexport const useAccordion = ({\n defaultIndex: defaultIndexProp,\n index: indexProp,\n multiple,\n toggle,\n onChange,\n ...rest\n}: UseAccordionProps = {}) => {\n if (\n (indexProp || defaultIndexProp) != null &&\n !isArray(indexProp || defaultIndexProp) &&\n multiple\n ) {\n console.warn(\n `Accordion: If 'multiple' is passed, then 'index' or 'defaultIndex' must be an array.`,\n )\n }\n\n if (multiple && toggle) {\n console.warn(\n `Accordion: If 'multiple' is passed, 'toggle' will be ignored. Either remove 'toggle' or 'multiple' depending on whether you want multiple accordions visible or not`,\n )\n }\n\n const descendants = useAccordionDescendants()\n\n const [focusedIndex, setFocusedIndex] = useState<number>(-1)\n\n const [index, setIndex] = useControllableState({\n defaultValue: () =>\n multiple ? (defaultIndexProp ?? []) : (defaultIndexProp ?? -1),\n value: indexProp,\n onChange,\n })\n\n const getRootProps: PropGetter = useCallback(\n (props = {}) => mergeProps(rest, props)(),\n [rest],\n )\n\n useEffect(() => {\n return () => setFocusedIndex(-1)\n }, [])\n\n return {\n descendants,\n focusedIndex,\n index,\n multiple,\n setFocusedIndex,\n setIndex,\n toggle,\n getRootProps,\n }\n}\n\nexport type UseAccordionReturn = ReturnType<typeof useAccordion>\n\nexport interface UseAccordionItemProps extends HTMLProps {\n /**\n * The index of the accordion item.\n */\n index: number\n /**\n * If `true`, the accordion item will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n}\n\nexport const useAccordionItem = ({\n disabled,\n index,\n ...rest\n}: UseAccordionItemProps) => {\n const itemId = useId()\n const panelId = useId()\n const {\n index: selectedIndex,\n multiple,\n setFocusedIndex,\n setIndex,\n toggle,\n } = useAccordionContext()\n const { descendants, register } = useAccordionDescendant({ disabled })\n const open =\n index !== -1\n ? isArray(selectedIndex)\n ? selectedIndex.includes(index)\n : selectedIndex === index\n : false\n\n if (open && disabled)\n console.warn(`Accordion: Cannot open a disabled accordion item`)\n\n const onChange = useCallback(\n (open: boolean) => {\n if (index === -1) return\n\n if (multiple && isArray(selectedIndex)) {\n setIndex(\n open\n ? selectedIndex.concat(index)\n : selectedIndex.filter((i) => i !== index),\n )\n } else if (open) {\n setIndex(index)\n } else if (toggle) {\n setIndex(-1)\n }\n },\n [multiple, toggle, index, selectedIndex, setIndex],\n )\n\n const onFocus = useCallback(() => {\n setFocusedIndex(index)\n }, [setFocusedIndex, index])\n\n const onClick = useCallback(() => {\n onChange(!open)\n setFocusedIndex(index)\n descendants.value(index)?.node.focus()\n }, [index, setFocusedIndex, open, onChange, descendants])\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLButtonElement>) => {\n runKeyAction(ev, {\n ArrowDown: () => {\n const next = descendants.enabledNextValue(index)\n\n next?.node.focus()\n },\n ArrowUp: () => {\n const prev = descendants.enabledPrevValue(index)\n\n prev?.node.focus()\n },\n End: () => {\n const last = descendants.enabledLastValue()\n\n last?.node.focus()\n },\n Home: () => {\n const first = descendants.enabledFirstValue()\n\n first?.node.focus()\n },\n })\n },\n [descendants, index],\n )\n\n const getItemProps: PropGetter = useCallback(\n (props = {}) =>\n mergeProps({ \"data-expanded\": dataAttr(open) }, rest, props)(),\n [open, rest],\n )\n\n const getButtonProps: PropGetter<\"button\"> = useCallback(\n ({ ref, ...props } = {}) => ({\n id: itemId,\n type: \"button\",\n \"aria-controls\": panelId,\n \"aria-disabled\": ariaAttr((!multiple && !toggle && open) || disabled),\n \"aria-expanded\": open,\n tabIndex: 0,\n ...props,\n ref: mergeRefs(register, ref),\n disabled,\n onClick: handlerAll(props.onClick, onClick),\n onFocus: handlerAll(props.onFocus, onFocus),\n onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n }),\n [\n itemId,\n open,\n panelId,\n multiple,\n toggle,\n disabled,\n register,\n onClick,\n onFocus,\n onKeyDown,\n ],\n )\n\n const getPanelProps: PropGetter = useCallback(\n ({ \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n id: panelId,\n \"aria-labelledby\": cx(ariaLabelledby, itemId),\n role: \"region\",\n ...props,\n }),\n [itemId, panelId],\n )\n\n const getIconProps: PropGetter<\"svg\"> = useCallback(\n (props) => ({\n \"aria-disabled\": ariaAttr((!multiple && !toggle && open) || disabled),\n \"aria-expanded\": open,\n \"aria-hidden\": true,\n role: \"presentation\",\n ...props,\n }),\n [multiple, toggle, open, disabled],\n )\n\n return {\n disabled,\n open,\n getButtonProps,\n getIconProps,\n getItemProps,\n getPanelProps,\n }\n}\n\nexport type UseAccordionItemReturn = ReturnType<typeof useAccordionItem>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-accordion.js","names":["createContext"],"sources":["../../../../src/components/accordion/use-accordion.ts"],"sourcesContent":["\"use client\"\n\nimport type { KeyboardEvent } from \"react\"\nimport type { HTMLProps, PropGetter } from \"../../core\"\nimport { useCallback, useEffect, useId, useState } from \"react\"\nimport { mergeProps } from \"../../core\"\nimport { useControllableState } from \"../../hooks/use-controllable-state\"\nimport { createDescendants } from \"../../hooks/use-descendants\"\nimport {\n ariaAttr,\n createContext,\n cx,\n dataAttr,\n handlerAll,\n isArray,\n mergeRefs,\n runKeyAction,\n} from \"../../utils\"\n\nconst {\n DescendantsContext: AccordionDescendantsContext,\n useDescendant: useAccordionDescendant,\n useDescendants: useAccordionDescendants,\n} = createDescendants<HTMLButtonElement>()\n\nexport {\n AccordionDescendantsContext,\n useAccordionDescendant,\n useAccordionDescendants,\n}\n\ninterface AccordionContext extends Omit<\n UseAccordionReturn,\n \"descendants\" | \"getRootProps\"\n> {}\n\nconst [AccordionContext, useAccordionContext] = createContext<AccordionContext>(\n { name: \"AccordionContext\" },\n)\n\nexport { AccordionContext, useAccordionContext }\n\ninterface AccordionItemContext extends Omit<\n UseAccordionItemReturn,\n \"getItemProps\"\n> {}\n\nconst [AccordionItemContext, useAccordionItemContext] =\n createContext<AccordionItemContext>({\n name: \"AccordionItemContext\",\n })\n\nexport { AccordionItemContext, useAccordionItemContext }\n\nexport interface UseAccordionProps extends Omit<HTMLProps, \"onChange\"> {\n /**\n * The initial index(es) of the accordion item to expand.\n */\n defaultIndex?: number | number[]\n /**\n * The index(es) of the accordion item to expand.\n */\n index?: number | number[]\n /**\n * If `true`, multiple accordion items can be expanded at once.\n *\n * @default false\n */\n multiple?: boolean\n /**\n * If `true`, any expanded accordion item can be collapsed again.\n *\n * @default false\n */\n toggle?: boolean\n /**\n * The callback invoked when accordion items are expanded or collapsed.\n */\n onChange?: (index: number | number[]) => void\n}\n\nexport const useAccordion = ({\n defaultIndex: defaultIndexProp,\n index: indexProp,\n multiple,\n toggle,\n onChange,\n ...rest\n}: UseAccordionProps = {}) => {\n if (\n (indexProp || defaultIndexProp) != null &&\n !isArray(indexProp || defaultIndexProp) &&\n multiple\n )\n console.warn(\n `Accordion: If 'multiple' is passed, then 'index' or 'defaultIndex' must be an array.`,\n )\n\n if (multiple && toggle)\n console.warn(\n `Accordion: If 'multiple' is passed, 'toggle' will be ignored. Either remove 'toggle' or 'multiple' depending on whether you want multiple accordions visible or not`,\n )\n\n const descendants = useAccordionDescendants()\n\n const [focusedIndex, setFocusedIndex] = useState<number>(-1)\n\n const [index, setIndex] = useControllableState({\n defaultValue: () =>\n multiple ? (defaultIndexProp ?? []) : (defaultIndexProp ?? -1),\n value: indexProp,\n onChange,\n })\n\n const getRootProps: PropGetter = useCallback(\n (props = {}) => mergeProps(rest, props)(),\n [rest],\n )\n\n useEffect(() => {\n return () => setFocusedIndex(-1)\n }, [])\n\n return {\n descendants,\n focusedIndex,\n index,\n multiple,\n setFocusedIndex,\n setIndex,\n toggle,\n getRootProps,\n }\n}\n\nexport type UseAccordionReturn = ReturnType<typeof useAccordion>\n\nexport interface UseAccordionItemProps extends HTMLProps {\n /**\n * The index of the accordion item.\n */\n index: number\n /**\n * If `true`, the accordion item will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n}\n\nexport const useAccordionItem = ({\n disabled,\n index,\n ...rest\n}: UseAccordionItemProps) => {\n const itemId = useId()\n const panelId = useId()\n const {\n index: selectedIndex,\n multiple,\n setFocusedIndex,\n setIndex,\n toggle,\n } = useAccordionContext()\n const { descendants, register } = useAccordionDescendant({ disabled })\n const open =\n index !== -1\n ? isArray(selectedIndex)\n ? selectedIndex.includes(index)\n : selectedIndex === index\n : false\n\n if (open && disabled)\n console.warn(`Accordion: Cannot open a disabled accordion item`)\n\n const onChange = useCallback(\n (open: boolean) => {\n if (index === -1) return\n\n if (multiple && isArray(selectedIndex))\n setIndex(\n open\n ? selectedIndex.concat(index)\n : selectedIndex.filter((i) => i !== index),\n )\n else if (open) setIndex(index)\n else if (toggle) setIndex(-1)\n },\n [multiple, toggle, index, selectedIndex, setIndex],\n )\n\n const onFocus = useCallback(() => {\n setFocusedIndex(index)\n }, [setFocusedIndex, index])\n\n const onClick = useCallback(() => {\n onChange(!open)\n setFocusedIndex(index)\n descendants.value(index)?.node.focus()\n }, [index, setFocusedIndex, open, onChange, descendants])\n\n const onKeyDown = useCallback(\n (ev: KeyboardEvent<HTMLButtonElement>) => {\n runKeyAction(ev, {\n ArrowDown: () => {\n const next = descendants.enabledNextValue(index)\n\n next?.node.focus()\n },\n ArrowUp: () => {\n const prev = descendants.enabledPrevValue(index)\n\n prev?.node.focus()\n },\n End: () => {\n const last = descendants.enabledLastValue()\n\n last?.node.focus()\n },\n Home: () => {\n const first = descendants.enabledFirstValue()\n\n first?.node.focus()\n },\n })\n },\n [descendants, index],\n )\n\n const getItemProps: PropGetter = useCallback(\n (props = {}) =>\n mergeProps({ \"data-expanded\": dataAttr(open) }, rest, props)(),\n [open, rest],\n )\n\n const getButtonProps: PropGetter<\"button\"> = useCallback(\n ({ ref, ...props } = {}) => ({\n id: itemId,\n type: \"button\",\n \"aria-controls\": panelId,\n \"aria-disabled\": ariaAttr((!multiple && !toggle && open) || disabled),\n \"aria-expanded\": open,\n tabIndex: 0,\n ...props,\n ref: mergeRefs(register, ref),\n disabled,\n onClick: handlerAll(props.onClick, onClick),\n onFocus: handlerAll(props.onFocus, onFocus),\n onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n }),\n [\n itemId,\n open,\n panelId,\n multiple,\n toggle,\n disabled,\n register,\n onClick,\n onFocus,\n onKeyDown,\n ],\n )\n\n const getPanelProps: PropGetter = useCallback(\n ({ \"aria-labelledby\": ariaLabelledby, ...props } = {}) => ({\n id: panelId,\n \"aria-labelledby\": cx(ariaLabelledby, itemId),\n role: \"region\",\n ...props,\n }),\n [itemId, panelId],\n )\n\n const getIconProps: PropGetter<\"svg\"> = useCallback(\n (props) => ({\n \"aria-disabled\": ariaAttr((!multiple && !toggle && open) || disabled),\n \"aria-expanded\": open,\n \"aria-hidden\": true,\n role: \"presentation\",\n ...props,\n }),\n [multiple, toggle, open, disabled],\n )\n\n return {\n disabled,\n open,\n getButtonProps,\n getIconProps,\n getItemProps,\n getPanelProps,\n }\n}\n\nexport type UseAccordionItemReturn = ReturnType<typeof useAccordionItem>\n"],"mappings":"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"}
|