@gunkin/uiify 0.0.17-alpha → 0.0.20-alpha
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/agents/components.md +1 -1
- package/agents/index.md +1 -0
- package/agents/reference/components/breadcrumb.md +11 -1
- package/agents/reference/components/button.md +4 -4
- package/agents/reference/components/candle-chart.md +20 -1
- package/agents/reference/components/carousel.md +3 -2
- package/agents/reference/components/combobox.md +2 -1
- package/agents/reference/components/drawer.md +8 -1
- package/agents/reference/components/dropdown-menu.md +1 -1
- package/agents/reference/components/file-upload.md +12 -1
- package/agents/reference/components/line-chart.md +1 -0
- package/agents/reference/components/modal.md +8 -1
- package/agents/reference/components/number-field.md +14 -3
- package/agents/reference/components/pagination.md +22 -1
- package/agents/reference/components/slider.md +9 -1
- package/agents/reference/components/spinner.md +8 -1
- package/agents/reference/components/toast.md +14 -1
- package/dist/components/behavior.css +9 -9
- package/dist/components/behavior.css.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.js +21 -4
- package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/breadcrumb/index.d.ts +1 -1
- package/dist/components/breadcrumb/index.d.ts.map +1 -1
- package/dist/components/breadcrumb/index.js.map +1 -1
- package/dist/components/breadcrumb/types.d.ts +7 -0
- package/dist/components/breadcrumb/types.d.ts.map +1 -1
- package/dist/components/button/types.d.ts +4 -0
- package/dist/components/button/types.d.ts.map +1 -1
- package/dist/components/candle-chart/CandleChart.d.ts +1 -1
- package/dist/components/candle-chart/CandleChart.d.ts.map +1 -1
- package/dist/components/candle-chart/CandleChart.js +81 -46
- package/dist/components/candle-chart/CandleChart.js.map +1 -1
- package/dist/components/candle-chart/client/CandleChartClient.d.ts.map +1 -1
- package/dist/components/candle-chart/client/CandleChartClient.js +5 -0
- package/dist/components/candle-chart/client/CandleChartClient.js.map +1 -1
- package/dist/components/candle-chart/index.d.ts +1 -1
- package/dist/components/candle-chart/index.d.ts.map +1 -1
- package/dist/components/candle-chart/index.js.map +1 -1
- package/dist/components/candle-chart/types.d.ts +17 -0
- package/dist/components/candle-chart/types.d.ts.map +1 -1
- package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
- package/dist/components/carousel/CarouselMarkup.js +20 -3
- package/dist/components/carousel/CarouselMarkup.js.map +1 -1
- package/dist/components/carousel/carousel-markup.js +2 -2
- package/dist/components/carousel/carousel-markup.js.map +1 -1
- package/dist/components/carousel/types.d.ts +3 -2
- package/dist/components/carousel/types.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.js +37 -23
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/combobox/combobox-store.d.ts.map +1 -1
- package/dist/components/combobox/combobox-store.js +5 -2
- package/dist/components/combobox/combobox-store.js.map +1 -1
- package/dist/components/combobox/types.d.ts +2 -3
- package/dist/components/combobox/types.d.ts.map +1 -1
- package/dist/components/context-menu/ContextMenu.d.ts.map +1 -1
- package/dist/components/context-menu/ContextMenu.js +25 -5
- package/dist/components/context-menu/ContextMenu.js.map +1 -1
- package/dist/components/drawer/DrawerNative.d.ts +1 -1
- package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
- package/dist/components/drawer/DrawerNative.js +5 -2
- package/dist/components/drawer/DrawerNative.js.map +1 -1
- package/dist/components/drawer/index.d.ts +1 -1
- package/dist/components/drawer/index.d.ts.map +1 -1
- package/dist/components/drawer/index.js.map +1 -1
- package/dist/components/drawer/types.d.ts +4 -0
- package/dist/components/drawer/types.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenu.js +31 -15
- package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.js +7 -5
- package/dist/components/dropdown-menu/DropdownMenuBar.js.map +1 -1
- package/dist/components/dropdown-menu/types.d.ts +1 -1
- package/dist/components/dropdown-menu/types.d.ts.map +1 -1
- package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
- package/dist/components/file-upload/FileUpload.js +11 -4
- package/dist/components/file-upload/FileUpload.js.map +1 -1
- package/dist/components/file-upload/FileUploadRoot.d.ts +1 -1
- package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -1
- package/dist/components/file-upload/FileUploadRoot.js +9 -0
- package/dist/components/file-upload/FileUploadRoot.js.map +1 -1
- package/dist/components/file-upload/index.d.ts +1 -1
- package/dist/components/file-upload/index.d.ts.map +1 -1
- package/dist/components/file-upload/index.js.map +1 -1
- package/dist/components/file-upload/types.d.ts +8 -0
- package/dist/components/file-upload/types.d.ts.map +1 -1
- package/dist/components/line-chart/LineChart.d.ts.map +1 -1
- package/dist/components/line-chart/LineChart.js +3 -2
- package/dist/components/line-chart/LineChart.js.map +1 -1
- package/dist/components/line-chart/line-chart-geometry.d.ts +2 -2
- package/dist/components/line-chart/line-chart-geometry.d.ts.map +1 -1
- package/dist/components/line-chart/line-chart-geometry.js +6 -6
- package/dist/components/line-chart/line-chart-geometry.js.map +1 -1
- package/dist/components/line-chart/types.d.ts +2 -0
- package/dist/components/line-chart/types.d.ts.map +1 -1
- package/dist/components/modal/Modal.d.ts +1 -1
- package/dist/components/modal/Modal.d.ts.map +1 -1
- package/dist/components/modal/Modal.js +5 -2
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/components/modal/index.d.ts +1 -1
- package/dist/components/modal/index.d.ts.map +1 -1
- package/dist/components/modal/index.js.map +1 -1
- package/dist/components/modal/types.d.ts +4 -0
- package/dist/components/modal/types.d.ts.map +1 -1
- package/dist/components/number-field/NumberField.d.ts +1 -1
- package/dist/components/number-field/NumberField.d.ts.map +1 -1
- package/dist/components/number-field/NumberField.js +25 -5
- package/dist/components/number-field/NumberField.js.map +1 -1
- package/dist/components/number-field/format.d.ts +1 -1
- package/dist/components/number-field/format.d.ts.map +1 -1
- package/dist/components/number-field/format.js +32 -7
- package/dist/components/number-field/format.js.map +1 -1
- package/dist/components/number-field/index.d.ts +1 -1
- package/dist/components/number-field/index.d.ts.map +1 -1
- package/dist/components/number-field/index.js.map +1 -1
- package/dist/components/number-field/types.d.ts +11 -2
- package/dist/components/number-field/types.d.ts.map +1 -1
- package/dist/components/otp-input/OtpInput.d.ts.map +1 -1
- package/dist/components/otp-input/OtpInput.js +2 -0
- package/dist/components/otp-input/OtpInput.js.map +1 -1
- package/dist/components/pagination/Pagination.d.ts.map +1 -1
- package/dist/components/pagination/Pagination.js +93 -29
- package/dist/components/pagination/Pagination.js.map +1 -1
- package/dist/components/pagination/PaginationShell.d.ts +2 -1
- package/dist/components/pagination/PaginationShell.d.ts.map +1 -1
- package/dist/components/pagination/PaginationShell.js +44 -9
- package/dist/components/pagination/PaginationShell.js.map +1 -1
- package/dist/components/pagination/index.d.ts +1 -1
- package/dist/components/pagination/index.d.ts.map +1 -1
- package/dist/components/pagination/index.js.map +1 -1
- package/dist/components/pagination/types.d.ts +18 -0
- package/dist/components/pagination/types.d.ts.map +1 -1
- package/dist/components/slider/client/SliderClient.d.ts.map +1 -1
- package/dist/components/slider/client/SliderClient.js +11 -2
- package/dist/components/slider/client/SliderClient.js.map +1 -1
- package/dist/components/slider/index.d.ts +1 -1
- package/dist/components/slider/index.d.ts.map +1 -1
- package/dist/components/slider/index.js.map +1 -1
- package/dist/components/slider/types.d.ts +5 -0
- package/dist/components/slider/types.d.ts.map +1 -1
- package/dist/components/spinner/Spinner.d.ts.map +1 -1
- package/dist/components/spinner/Spinner.js +6 -3
- package/dist/components/spinner/Spinner.js.map +1 -1
- package/dist/components/spinner/index.d.ts +1 -1
- package/dist/components/spinner/index.d.ts.map +1 -1
- package/dist/components/spinner/index.js.map +1 -1
- package/dist/components/spinner/types.d.ts +4 -0
- package/dist/components/spinner/types.d.ts.map +1 -1
- package/dist/components/tags-input/TagsInput.d.ts.map +1 -1
- package/dist/components/tags-input/TagsInput.js +2 -0
- package/dist/components/tags-input/TagsInput.js.map +1 -1
- package/dist/components/toast/Toast.d.ts +1 -1
- package/dist/components/toast/Toast.d.ts.map +1 -1
- package/dist/components/toast/Toast.js +33 -29
- package/dist/components/toast/Toast.js.map +1 -1
- package/dist/components/toast/ToastElements.d.ts.map +1 -1
- package/dist/components/toast/ToastElements.js +24 -12
- package/dist/components/toast/ToastElements.js.map +1 -1
- package/dist/components/toast/index.d.ts +1 -1
- package/dist/components/toast/index.d.ts.map +1 -1
- package/dist/components/toast/index.js.map +1 -1
- package/dist/components/toast/types.d.ts +10 -0
- package/dist/components/toast/types.d.ts.map +1 -1
- package/dist/components/toolbar/Toolbar.d.ts +2 -2
- package/dist/components/toolbar/Toolbar.d.ts.map +1 -1
- package/dist/components/toolbar/Toolbar.js +8 -4
- package/dist/components/toolbar/Toolbar.js.map +1 -1
- package/dist/core/direction.d.ts +2 -0
- package/dist/core/direction.d.ts.map +1 -1
- package/dist/core/direction.js +8 -3
- package/dist/core/direction.js.map +1 -1
- package/dist/core/dismissable-layer-registry.d.ts.map +1 -1
- package/dist/core/dismissable-layer-registry.js +3 -1
- package/dist/core/dismissable-layer-registry.js.map +1 -1
- package/dist/core/format-label.d.ts +2 -0
- package/dist/core/format-label.d.ts.map +1 -0
- package/dist/core/format-label.js +13 -0
- package/dist/core/format-label.js.map +1 -0
- package/dist/core/ime.d.ts +16 -0
- package/dist/core/ime.d.ts.map +1 -0
- package/dist/core/ime.js +7 -0
- package/dist/core/ime.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/roving-focus-store.d.ts +3 -2
- package/dist/core/roving-focus-store.d.ts.map +1 -1
- package/dist/core/roving-focus-store.js +5 -3
- package/dist/core/roving-focus-store.js.map +1 -1
- package/dist/core/roving-focus.d.ts.map +1 -1
- package/dist/core/roving-focus.js +10 -5
- package/dist/core/roving-focus.js.map +1 -1
- package/dist/core/text-direction.d.ts +7 -0
- package/dist/core/text-direction.d.ts.map +1 -0
- package/dist/core/text-direction.js +7 -0
- package/dist/core/text-direction.js.map +1 -0
- package/dist/styles/index.css +1 -1
- package/package.json +2 -1
- package/skills/uiify/SKILL.md +58 -33
- package/skills/uiify/references/compositions/card-rhythm.md +0 -2
- package/skills/uiify/references/compositions/destructive-confirmation.md +1 -3
- package/skills/uiify/references/compositions/form-grouping.md +0 -2
- package/skills/uiify/references/compositions/hero-actions.md +3 -5
- package/skills/uiify/references/compositions/page-frame.md +0 -2
- package/skills/uiify/references/compositions/pricing-actions.md +0 -2
- package/skills/uiify/references/compositions/save-feedback.md +1 -3
- package/skills/uiify/references/compositions/table-controls.md +1 -3
- package/skills/uiify/references/elements/accordion.md +38 -0
- package/skills/uiify/references/elements/alert-modal.md +32 -5
- package/skills/uiify/references/elements/avatar.md +31 -2
- package/skills/uiify/references/elements/badge.md +32 -3
- package/skills/uiify/references/elements/bar-chart.md +39 -7
- package/skills/uiify/references/elements/breadcrumb.md +38 -0
- package/skills/uiify/references/elements/button.md +38 -3
- package/skills/uiify/references/elements/candle-chart.md +40 -0
- package/skills/uiify/references/elements/card.md +38 -1
- package/skills/uiify/references/elements/carousel.md +40 -0
- package/skills/uiify/references/elements/checkbox.md +39 -0
- package/skills/uiify/references/elements/code-block.md +31 -2
- package/skills/uiify/references/elements/collapsible.md +38 -0
- package/skills/uiify/references/elements/color-picker.md +39 -0
- package/skills/uiify/references/elements/combobox.md +37 -0
- package/skills/uiify/references/elements/command-palette.md +33 -12
- package/skills/uiify/references/elements/context-menu.md +38 -0
- package/skills/uiify/references/elements/cookie-banner.md +30 -2
- package/skills/uiify/references/elements/date-picker.md +33 -9
- package/skills/uiify/references/elements/divider.md +30 -2
- package/skills/uiify/references/elements/drawer.md +38 -0
- package/skills/uiify/references/elements/dropdown-menu.md +38 -0
- package/skills/uiify/references/elements/empty-state.md +30 -2
- package/skills/uiify/references/elements/feature-grid.md +41 -1
- package/skills/uiify/references/elements/field.md +33 -3
- package/skills/uiify/references/elements/file-upload.md +40 -0
- package/skills/uiify/references/elements/footer.md +35 -4
- package/skills/uiify/references/elements/form.md +31 -4
- package/skills/uiify/references/elements/header.md +31 -3
- package/skills/uiify/references/elements/hero.md +43 -3
- package/skills/uiify/references/elements/hover-card.md +38 -0
- package/skills/uiify/references/elements/image-gallery.md +36 -4
- package/skills/uiify/references/elements/inline-alert.md +30 -2
- package/skills/uiify/references/elements/input.md +31 -4
- package/skills/uiify/references/elements/line-chart.md +38 -0
- package/skills/uiify/references/elements/logo-wall.md +31 -2
- package/skills/uiify/references/elements/modal.md +38 -0
- package/skills/uiify/references/elements/number-field.md +41 -0
- package/skills/uiify/references/elements/otp-input.md +39 -0
- package/skills/uiify/references/elements/pagination.md +33 -4
- package/skills/uiify/references/elements/password-input.md +33 -9
- package/skills/uiify/references/elements/popup.md +38 -0
- package/skills/uiify/references/elements/pricing-table.md +55 -2
- package/skills/uiify/references/elements/progress-bar.md +32 -4
- package/skills/uiify/references/elements/radio-group.md +39 -0
- package/skills/uiify/references/elements/rating.md +39 -0
- package/skills/uiify/references/elements/search-input.md +35 -4
- package/skills/uiify/references/elements/segmented-control.md +39 -0
- package/skills/uiify/references/elements/select.md +29 -1
- package/skills/uiify/references/elements/sidebar.md +33 -10
- package/skills/uiify/references/elements/skeleton.md +38 -0
- package/skills/uiify/references/elements/slider.md +39 -0
- package/skills/uiify/references/elements/spinner.md +38 -0
- package/skills/uiify/references/elements/stats-bar.md +30 -2
- package/skills/uiify/references/elements/stepper.md +32 -9
- package/skills/uiify/references/elements/switch.md +31 -4
- package/skills/uiify/references/elements/table-of-contents.md +39 -0
- package/skills/uiify/references/elements/table.md +32 -3
- package/skills/uiify/references/elements/tabs.md +38 -0
- package/skills/uiify/references/elements/tags-input.md +39 -0
- package/skills/uiify/references/elements/testimonial.md +35 -4
- package/skills/uiify/references/elements/textarea.md +30 -3
- package/skills/uiify/references/elements/timeline.md +31 -3
- package/skills/uiify/references/elements/toast.md +27 -1
- package/skills/uiify/references/elements/toggle-group.md +39 -0
- package/skills/uiify/references/elements/toggle.md +39 -0
- package/skills/uiify/references/elements/toolbar.md +39 -0
- package/skills/uiify/references/elements/tooltip.md +38 -0
- package/skills/uiify/references/elements/virtual-scroll.md +39 -0
- package/skills/uiify/references/examples/alert-confirmation.md +34 -0
- package/skills/uiify/references/examples/field-validation.md +37 -0
- package/skills/uiify/references/examples/select-basic.md +35 -0
- package/skills/uiify/references/examples/table-controls.md +40 -0
- package/skills/uiify/references/guides/assets.md +14 -0
- package/skills/uiify/references/guides/content.md +11 -0
- package/skills/uiify/references/guides/hierarchy.md +14 -0
- package/skills/uiify/references/guides/i18n.md +21 -0
- package/skills/uiify/references/guides/reference.md +9 -0
- package/skills/uiify/references/guides/states.md +12 -0
- package/skills/uiify/references/guides/surface.md +27 -0
- package/skills/uiify/scripts/lint.mjs +1 -1
- package/skills/uiify/scripts/static.mjs +150 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/tags-input/TagsInput.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Children,\n isValidElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport type { ElementType, KeyboardEvent, ReactElement, SyntheticEvent } from \"react\";\nimport { useControllableState, useId, useIsomorphicLayoutEffect } from \"@gunkin/uiify/hooks\";\nimport { createPartContext } from \"@gunkin/uiify/core\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { RovingFocusItem, RovingFocusRoot } from \"@gunkin/uiify/core/roving-focus\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { createTagsInputStore, splitTags } from \"./tags-input-store.js\";\nimport type {\n TagsInputStore,\n TagsInputContextValue,\n TagsInputRootProps,\n TagsInputInputProps,\n TagsInputListOwnProps,\n TagsInputTagProps,\n TagsInputTagRemoveOwnProps,\n} from \"./types.js\";\n\nconst [TagsInputProvider, useTagsInputContext] =\n createPartContext<TagsInputContextValue>(\"TagsInput\");\n\nexport function TagsInputRoot(props: TagsInputRootProps): ReactElement | null {\n const {\n addOnPaste = true,\n allowDuplicates = false,\n children,\n className,\n defaultValue = [],\n delimiters = [\",\"],\n disabled = false,\n maxTags,\n onValueChange,\n validate,\n value: controlledValue,\n } = props;\n\n const listId = useId();\n const inputId = useId();\n const [inputValue, setInputValue] = useState(\"\");\n const [tags, setTags] = useControllableState<string[]>({\n defaultValue: [...defaultValue],\n ...(controlledValue !== undefined ? { value: [...controlledValue] } : {}),\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n\n const storeRef = useRef<TagsInputStore | null>(null);\n storeRef.current ??= createTagsInputStore(tags, {\n allowDuplicates,\n ...(maxTags !== undefined ? { maxTags } : {}),\n ...(validate ? { validate } : {}),\n });\n const store = storeRef.current;\n\n useIsomorphicLayoutEffect(() => {\n store.setTags(tags);\n store.updateOptions({\n allowDuplicates,\n ...(maxTags !== undefined ? { maxTags } : {}),\n ...(validate ? { validate } : {}),\n });\n }, [allowDuplicates, maxTags, store, tags, validate]);\n\n const addTag = useCallback(\n (tag: string) => {\n if (disabled) return;\n if (store.addTag(tag)) {\n setTags(store.getTags());\n setInputValue(\"\");\n }\n },\n [disabled, setTags, store],\n );\n\n const removeAt = useCallback(\n (index: number) => {\n if (disabled) return;\n store.removeAt(index);\n setTags(store.getTags());\n },\n [disabled, setTags, store],\n );\n\n const contextValue = useMemo(\n () => ({\n addOnPaste,\n addTag,\n delimiters,\n disabled,\n inputId,\n inputValue,\n listId,\n removeAt,\n setInputValue,\n store,\n }),\n [\n addOnPaste,\n addTag,\n delimiters,\n disabled,\n inputId,\n inputValue,\n listId,\n removeAt,\n setInputValue,\n store,\n ],\n );\n\n return (\n <TagsInputProvider value={contextValue}>\n <div className={className} data-disabled={disabled ? \"\" : undefined} data-uiify-tags-input=\"\">\n {children}\n </div>\n </TagsInputProvider>\n );\n}\nTagsInputRoot.displayName = \"TagsInputRoot\";\n\nexport function TagsInputInput<TAs extends ElementType = \"input\">(\n props: TagsInputInputProps<TAs>,\n): ReactElement | null {\n const { as, render, className, placeholder, ...consumerProps } =\n props as TagsInputInputProps<\"input\">;\n const {\n addOnPaste,\n addTag,\n delimiters,\n disabled,\n inputId,\n inputValue,\n listId,\n removeAt,\n setInputValue,\n store,\n } = useTagsInputContext(\"Input\");\n const tags = useSyncExternalStore(store.subscribe, store.getTags, store.getTags);\n const {\n onChange: consumerOnChange,\n onKeyDown: consumerOnKeyDown,\n onPaste: consumerOnPaste,\n } = consumerProps as {\n onChange?: (event: SyntheticEvent<HTMLInputElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLInputElement>) => void;\n onPaste?: (event: React.ClipboardEvent<HTMLInputElement>) => void;\n };\n\n const commitInput = () => {\n if (inputValue.trim()) addTag(inputValue);\n };\n\n const handleChange = (event: SyntheticEvent<HTMLInputElement>) => {\n setInputValue(event.currentTarget.value);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\" || delimiters.includes(event.key)) {\n event.preventDefault();\n commitInput();\n } else if (event.key === \"Backspace\" && !inputValue && tags.length > 0) {\n event.preventDefault();\n removeAt(tags.length - 1);\n }\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n if (!addOnPaste) return;\n const text = event.clipboardData.getData(\"text\");\n const splitChars = [...delimiters, \"\\n\", \"\\t\"];\n if (!splitChars.some((delimiter) => text.includes(delimiter))) return;\n event.preventDefault();\n const parts = splitTags(text, splitChars);\n for (const part of parts) addTag(part);\n };\n\n return useRenderElement({\n as,\n defaultTag: \"input\",\n props: {\n ...consumerProps,\n id: inputId,\n type: \"text\",\n role: \"combobox\",\n \"aria-controls\": listId,\n \"aria-expanded\": false,\n disabled: disabled || undefined,\n \"data-part\": \"input\",\n value: inputValue,\n placeholder,\n ...(className ? { className } : {}),\n onChange: composeEventHandlers(consumerOnChange, handleChange),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n onPaste: composeEventHandlers(consumerOnPaste, handlePaste),\n },\n render,\n state: { disabled },\n });\n}\n\nexport function TagsInputList(props: TagsInputListOwnProps): ReactElement | null {\n const { children, className } = props;\n const { listId, store } = useTagsInputContext(\"List\");\n const tags = useSyncExternalStore(store.subscribe, store.getTags, store.getTags);\n\n return (\n <RovingFocusRoot\n as=\"ul\"\n id={listId}\n orientation=\"horizontal\"\n {...(className ? { className } : {})}\n data-part=\"list\"\n >\n {tags.map((tag, index) => (\n <li data-index={index} data-value={tag} key={`${tag}-${index}`}>\n {tag}\n </li>\n ))}\n {/* A <ul> may only contain <li>, so a non-<li> child (typically TagsInput.Input)\n needs one too — leaving it bare made the list malformed, a serious axe\n violation. TagsInputTag already renders its own <li>; wrapping it again\n would nest <li> inside <li>, an invalid, hydration-breaking tree. */}\n {Children.map(children, (child) =>\n isValidElement(child) && child.type === TagsInputTag ? (\n child\n ) : (\n <li data-part=\"input-slot\">{child}</li>\n ),\n )}\n </RovingFocusRoot>\n );\n}\nTagsInputList.displayName = \"TagsInputList\";\n\nexport function TagsInputTag<TAs extends ElementType = \"li\">(\n props: TagsInputTagProps<TAs>,\n): ReactElement | null {\n const { as, render, children, className, index, value, ...consumerProps } =\n props as TagsInputTagProps<\"li\">;\n const { disabled, removeAt } = useTagsInputContext(\"Tag\");\n const { onKeyDown: consumerOnKeyDown } = consumerProps as {\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Backspace\" || event.key === \"Delete\") {\n event.preventDefault();\n removeAt(index);\n }\n };\n\n const tagProps = {\n ...consumerProps,\n role: \"listitem\",\n \"data-part\": \"tag\",\n \"data-value\": value,\n ...(className ? { className } : {}),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n children,\n };\n\n if (render) {\n return (\n <RovingFocusItem\n disabled={disabled}\n render={(renderProps, state) => render(renderProps, { current: state.current })}\n textValue={value}\n {...(tagProps as object)}\n />\n );\n }\n\n return (\n <RovingFocusItem\n as={as ?? \"li\"}\n disabled={disabled}\n textValue={value}\n {...(tagProps as object)}\n />\n );\n}\nTagsInputTag.displayName = \"TagsInputTag\";\n\nexport function TagsInputTagRemove(props: TagsInputTagRemoveOwnProps): ReactElement | null {\n const { className, index } = props;\n const { disabled, removeAt } = useTagsInputContext(\"TagRemove\");\n\n return useRenderElement({\n defaultTag: \"button\",\n props: {\n type: \"button\",\n \"aria-label\": \"Remove tag\",\n \"data-part\": \"tag-remove\",\n disabled: disabled || undefined,\n ...(className ? { className } : {}),\n onClick: () => removeAt(index),\n },\n state: { disabled },\n });\n}\n\nexport const TagsInput = {\n Input: TagsInputInput,\n List: TagsInputList,\n Root: TagsInputRoot,\n Tag: TagsInputTag,\n TagRemove: TagsInputTagRemove,\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/tags-input/TagsInput.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Children,\n isValidElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport type { ElementType, KeyboardEvent, ReactElement, SyntheticEvent } from \"react\";\nimport { useControllableState, useId, useIsomorphicLayoutEffect } from \"@gunkin/uiify/hooks\";\nimport { createPartContext } from \"@gunkin/uiify/core\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { isComposingKeyEvent } from \"@gunkin/uiify/core/ime\";\nimport { RovingFocusItem, RovingFocusRoot } from \"@gunkin/uiify/core/roving-focus\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { createTagsInputStore, splitTags } from \"./tags-input-store.js\";\nimport type {\n TagsInputStore,\n TagsInputContextValue,\n TagsInputRootProps,\n TagsInputInputProps,\n TagsInputListOwnProps,\n TagsInputTagProps,\n TagsInputTagRemoveOwnProps,\n} from \"./types.js\";\n\nconst [TagsInputProvider, useTagsInputContext] =\n createPartContext<TagsInputContextValue>(\"TagsInput\");\n\nexport function TagsInputRoot(props: TagsInputRootProps): ReactElement | null {\n const {\n addOnPaste = true,\n allowDuplicates = false,\n children,\n className,\n defaultValue = [],\n delimiters = [\",\"],\n disabled = false,\n maxTags,\n onValueChange,\n validate,\n value: controlledValue,\n } = props;\n\n const listId = useId();\n const inputId = useId();\n const [inputValue, setInputValue] = useState(\"\");\n const [tags, setTags] = useControllableState<string[]>({\n defaultValue: [...defaultValue],\n ...(controlledValue !== undefined ? { value: [...controlledValue] } : {}),\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n\n const storeRef = useRef<TagsInputStore | null>(null);\n storeRef.current ??= createTagsInputStore(tags, {\n allowDuplicates,\n ...(maxTags !== undefined ? { maxTags } : {}),\n ...(validate ? { validate } : {}),\n });\n const store = storeRef.current;\n\n useIsomorphicLayoutEffect(() => {\n store.setTags(tags);\n store.updateOptions({\n allowDuplicates,\n ...(maxTags !== undefined ? { maxTags } : {}),\n ...(validate ? { validate } : {}),\n });\n }, [allowDuplicates, maxTags, store, tags, validate]);\n\n const addTag = useCallback(\n (tag: string) => {\n if (disabled) return;\n if (store.addTag(tag)) {\n setTags(store.getTags());\n setInputValue(\"\");\n }\n },\n [disabled, setTags, store],\n );\n\n const removeAt = useCallback(\n (index: number) => {\n if (disabled) return;\n store.removeAt(index);\n setTags(store.getTags());\n },\n [disabled, setTags, store],\n );\n\n const contextValue = useMemo(\n () => ({\n addOnPaste,\n addTag,\n delimiters,\n disabled,\n inputId,\n inputValue,\n listId,\n removeAt,\n setInputValue,\n store,\n }),\n [\n addOnPaste,\n addTag,\n delimiters,\n disabled,\n inputId,\n inputValue,\n listId,\n removeAt,\n setInputValue,\n store,\n ],\n );\n\n return (\n <TagsInputProvider value={contextValue}>\n <div className={className} data-disabled={disabled ? \"\" : undefined} data-uiify-tags-input=\"\">\n {children}\n </div>\n </TagsInputProvider>\n );\n}\nTagsInputRoot.displayName = \"TagsInputRoot\";\n\nexport function TagsInputInput<TAs extends ElementType = \"input\">(\n props: TagsInputInputProps<TAs>,\n): ReactElement | null {\n const { as, render, className, placeholder, ...consumerProps } =\n props as TagsInputInputProps<\"input\">;\n const {\n addOnPaste,\n addTag,\n delimiters,\n disabled,\n inputId,\n inputValue,\n listId,\n removeAt,\n setInputValue,\n store,\n } = useTagsInputContext(\"Input\");\n const tags = useSyncExternalStore(store.subscribe, store.getTags, store.getTags);\n const {\n onChange: consumerOnChange,\n onKeyDown: consumerOnKeyDown,\n onPaste: consumerOnPaste,\n } = consumerProps as {\n onChange?: (event: SyntheticEvent<HTMLInputElement>) => void;\n onKeyDown?: (event: KeyboardEvent<HTMLInputElement>) => void;\n onPaste?: (event: React.ClipboardEvent<HTMLInputElement>) => void;\n };\n\n const commitInput = () => {\n if (inputValue.trim()) addTag(inputValue);\n };\n\n const handleChange = (event: SyntheticEvent<HTMLInputElement>) => {\n setInputValue(event.currentTarget.value);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (isComposingKeyEvent(event)) return;\n if (event.key === \"Enter\" || delimiters.includes(event.key)) {\n event.preventDefault();\n commitInput();\n } else if (event.key === \"Backspace\" && !inputValue && tags.length > 0) {\n event.preventDefault();\n removeAt(tags.length - 1);\n }\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n if (!addOnPaste) return;\n const text = event.clipboardData.getData(\"text\");\n const splitChars = [...delimiters, \"\\n\", \"\\t\"];\n if (!splitChars.some((delimiter) => text.includes(delimiter))) return;\n event.preventDefault();\n const parts = splitTags(text, splitChars);\n for (const part of parts) addTag(part);\n };\n\n return useRenderElement({\n as,\n defaultTag: \"input\",\n props: {\n ...consumerProps,\n id: inputId,\n type: \"text\",\n role: \"combobox\",\n \"aria-controls\": listId,\n \"aria-expanded\": false,\n disabled: disabled || undefined,\n \"data-part\": \"input\",\n value: inputValue,\n placeholder,\n ...(className ? { className } : {}),\n onChange: composeEventHandlers(consumerOnChange, handleChange),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n onPaste: composeEventHandlers(consumerOnPaste, handlePaste),\n },\n render,\n state: { disabled },\n });\n}\n\nexport function TagsInputList(props: TagsInputListOwnProps): ReactElement | null {\n const { children, className } = props;\n const { listId, store } = useTagsInputContext(\"List\");\n const tags = useSyncExternalStore(store.subscribe, store.getTags, store.getTags);\n\n return (\n <RovingFocusRoot\n as=\"ul\"\n id={listId}\n orientation=\"horizontal\"\n {...(className ? { className } : {})}\n data-part=\"list\"\n >\n {tags.map((tag, index) => (\n <li data-index={index} data-value={tag} key={`${tag}-${index}`}>\n {tag}\n </li>\n ))}\n {/* A <ul> may only contain <li>, so a non-<li> child (typically TagsInput.Input)\n needs one too — leaving it bare made the list malformed, a serious axe\n violation. TagsInputTag already renders its own <li>; wrapping it again\n would nest <li> inside <li>, an invalid, hydration-breaking tree. */}\n {Children.map(children, (child) =>\n isValidElement(child) && child.type === TagsInputTag ? (\n child\n ) : (\n <li data-part=\"input-slot\">{child}</li>\n ),\n )}\n </RovingFocusRoot>\n );\n}\nTagsInputList.displayName = \"TagsInputList\";\n\nexport function TagsInputTag<TAs extends ElementType = \"li\">(\n props: TagsInputTagProps<TAs>,\n): ReactElement | null {\n const { as, render, children, className, index, value, ...consumerProps } =\n props as TagsInputTagProps<\"li\">;\n const { disabled, removeAt } = useTagsInputContext(\"Tag\");\n const { onKeyDown: consumerOnKeyDown } = consumerProps as {\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"Backspace\" || event.key === \"Delete\") {\n event.preventDefault();\n removeAt(index);\n }\n };\n\n const tagProps = {\n ...consumerProps,\n role: \"listitem\",\n \"data-part\": \"tag\",\n \"data-value\": value,\n ...(className ? { className } : {}),\n onKeyDown: composeEventHandlers(consumerOnKeyDown, handleKeyDown),\n children,\n };\n\n if (render) {\n return (\n <RovingFocusItem\n disabled={disabled}\n render={(renderProps, state) => render(renderProps, { current: state.current })}\n textValue={value}\n {...(tagProps as object)}\n />\n );\n }\n\n return (\n <RovingFocusItem\n as={as ?? \"li\"}\n disabled={disabled}\n textValue={value}\n {...(tagProps as object)}\n />\n );\n}\nTagsInputTag.displayName = \"TagsInputTag\";\n\nexport function TagsInputTagRemove(props: TagsInputTagRemoveOwnProps): ReactElement | null {\n const { className, index } = props;\n const { disabled, removeAt } = useTagsInputContext(\"TagRemove\");\n\n return useRenderElement({\n defaultTag: \"button\",\n props: {\n type: \"button\",\n \"aria-label\": \"Remove tag\",\n \"data-part\": \"tag-remove\",\n disabled: disabled || undefined,\n ...(className ? { className } : {}),\n onClick: () => removeAt(index),\n },\n state: { disabled },\n });\n}\n\nexport const TagsInput = {\n Input: TagsInputInput,\n List: TagsInputList,\n Root: TagsInputRoot,\n Tag: TagsInputTag,\n TagRemove: TagsInputTagRemove,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ReactElement } from "react";
|
|
2
2
|
import { ToastDescription, ToastTitle } from "./ToastElements.js";
|
|
3
3
|
import type { ToastInput, ToastProviderOwnProps, ToastViewportOwnProps, ToastRootOwnProps, ToastActionProps, ToastCloseProps } from "./types.js";
|
|
4
|
-
export type { ToastActionProps, ToastCloseProps, ToastDescriptionOwnProps, ToastInput, ToastPriority, ToastProviderOwnProps, ToastRecord, ToastRootOwnProps, ToastStore, ToastTitleOwnProps, ToastViewportOwnProps, } from "./types.js";
|
|
4
|
+
export type { ToastActionProps, ToastCloseProps, ToastDescriptionOwnProps, ToastInput, ToastLabels, ToastPriority, ToastProviderOwnProps, ToastRecord, ToastRootOwnProps, ToastStore, ToastTitleOwnProps, ToastViewportOwnProps, } from "./types.js";
|
|
5
5
|
export { ToastDescription, ToastTitle };
|
|
6
6
|
export declare function ToastProvider(props: ToastProviderOwnProps): ReactElement | null;
|
|
7
7
|
export declare namespace ToastProvider {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../../src/components/toast/Toast.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAA2C,YAAY,EAAE,MAAM,OAAO,CAAC;AAKnF,OAAO,EAGL,gBAAgB,EAChB,UAAU,EAEX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,UAAU,EAGV,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../../src/components/toast/Toast.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAA2C,YAAY,EAAE,MAAM,OAAO,CAAC;AAKnF,OAAO,EAGL,gBAAgB,EAChB,UAAU,EAEX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,UAAU,EAGV,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,UAAU,EACV,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAgBpB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;AAExC,wBAAgB,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CAqC/E;yBArCe,aAAa;;;AAwC7B,wBAAgB,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CA8C/E;yBA9Ce,aAAa;;;AAiD7B,wBAAgB,SAAS,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,GAAG,IAAI,CA8DvE;yBA9De,SAAS;;;AAiEzB,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CAExE;yBAFe,WAAW;;;AAK3B,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAEtE;yBAFe,UAAU;;;AAK1B,wBAAgB,QAAQ;;iBAIP,UAAU;EAI1B;AAED,eAAO,MAAM,KAAK;;;;;;;;CAQjB,CAAC"}
|
|
@@ -22,14 +22,19 @@ import {
|
|
|
22
22
|
ToastTitle,
|
|
23
23
|
ToastViewport as ToastViewportElement
|
|
24
24
|
} from "./ToastElements.js";
|
|
25
|
-
const
|
|
25
|
+
const DEFAULT_TOAST_LABELS = {
|
|
26
|
+
region: "Notifications",
|
|
27
|
+
notification: "Notification",
|
|
28
|
+
close: "Close"
|
|
29
|
+
};
|
|
26
30
|
const TOAST_TRANSITION = "uiify-toast";
|
|
27
31
|
const [ToastStoreProvider, useToastStoreContext] = createPartContext(
|
|
28
32
|
"Toast",
|
|
29
33
|
"Provider"
|
|
30
34
|
);
|
|
31
35
|
function ToastProvider(props) {
|
|
32
|
-
const { children, limit = 3 } = props;
|
|
36
|
+
const { children, limit = 3, labels } = props;
|
|
37
|
+
const resolvedLabels = useMemo(() => ({ ...DEFAULT_TOAST_LABELS, ...labels }), [labels]);
|
|
33
38
|
const storeRef = useRef(null);
|
|
34
39
|
storeRef.current ??= createToastStore({ limit });
|
|
35
40
|
const store = storeRef.current;
|
|
@@ -47,8 +52,8 @@ function ToastProvider(props) {
|
|
|
47
52
|
() => ""
|
|
48
53
|
);
|
|
49
54
|
const contextValue = useMemo(
|
|
50
|
-
() => ({ dismiss, pause, resume, store }),
|
|
51
|
-
[dismiss, pause, resume, store]
|
|
55
|
+
() => ({ dismiss, pause, resume, store, labels: resolvedLabels }),
|
|
56
|
+
[dismiss, pause, resume, store, resolvedLabels]
|
|
52
57
|
);
|
|
53
58
|
return /* @__PURE__ */ jsxs(ToastStoreProvider, { value: contextValue, children: [
|
|
54
59
|
children,
|
|
@@ -70,6 +75,8 @@ function ToastViewport(props) {
|
|
|
70
75
|
return unsubscribe;
|
|
71
76
|
}, [store]);
|
|
72
77
|
const [consumerRef, domProps] = splitRef(props);
|
|
78
|
+
const { labels } = useToastStoreContext("Viewport");
|
|
79
|
+
const resolvedLabels = { ...labels, ...props.labels };
|
|
73
80
|
const viewportRef = useRef(null);
|
|
74
81
|
const mergedRef = useMergedRefs(viewportRef, consumerRef);
|
|
75
82
|
const hasToasts = toasts.length > 0;
|
|
@@ -82,19 +89,21 @@ function ToastViewport(props) {
|
|
|
82
89
|
} catch {
|
|
83
90
|
}
|
|
84
91
|
}, [hasToasts]);
|
|
85
|
-
return /* @__PURE__ */ jsx(ToastViewportElement, { ...domProps, popover: "manual", ref: mergedRef, children: toasts.map((toast) => /* @__PURE__ */ jsx(ViewTransition, { default: TOAST_TRANSITION, children: /* @__PURE__ */ jsx(ToastRoot, { toast }) }, toast.id)) });
|
|
92
|
+
return /* @__PURE__ */ jsx(ToastViewportElement, { ...domProps, labels: resolvedLabels, popover: "manual", ref: mergedRef, children: toasts.map((toast) => /* @__PURE__ */ jsx(ViewTransition, { default: TOAST_TRANSITION, children: /* @__PURE__ */ jsx(ToastRoot, { toast }) }, toast.id)) });
|
|
86
93
|
}
|
|
87
94
|
ToastViewport.displayName = "ToastViewport";
|
|
88
95
|
function ToastRoot(props) {
|
|
89
|
-
const { toast } = props;
|
|
90
|
-
const { dismiss, pause, resume } = useToastStoreContext("Root");
|
|
91
|
-
const
|
|
92
|
-
const
|
|
93
|
-
const
|
|
96
|
+
const { toast, labels: labelOverrides } = props;
|
|
97
|
+
const { dismiss, pause, resume, labels: providerLabels } = useToastStoreContext("Root");
|
|
98
|
+
const labels = { ...providerLabels, ...labelOverrides };
|
|
99
|
+
const swipeRef = useRef(null);
|
|
100
|
+
const endSwipe = (event) => {
|
|
101
|
+
if (swipeRef.current?.pointerId === event.pointerId) swipeRef.current = null;
|
|
102
|
+
};
|
|
94
103
|
return /* @__PURE__ */ jsxs(
|
|
95
104
|
"div",
|
|
96
105
|
{
|
|
97
|
-
"aria-label": typeof toast.title === "string" ? toast.title :
|
|
106
|
+
"aria-label": typeof toast.title === "string" ? toast.title : labels.notification,
|
|
98
107
|
"data-state": "open",
|
|
99
108
|
"data-part": "item",
|
|
100
109
|
"data-uiify-toast": "",
|
|
@@ -102,7 +111,7 @@ function ToastRoot(props) {
|
|
|
102
111
|
tabIndex: 0,
|
|
103
112
|
onFocus: () => pause(toast.id),
|
|
104
113
|
onBlur: (event) => {
|
|
105
|
-
if (!event.currentTarget.
|
|
114
|
+
if (!event.currentTarget.matches(":hover, :focus-within")) resume(toast.id);
|
|
106
115
|
},
|
|
107
116
|
onKeyDown: (event) => {
|
|
108
117
|
if (event.key === "Escape") {
|
|
@@ -111,27 +120,22 @@ function ToastRoot(props) {
|
|
|
111
120
|
}
|
|
112
121
|
},
|
|
113
122
|
onPointerEnter: () => pause(toast.id),
|
|
114
|
-
onPointerLeave: () =>
|
|
115
|
-
|
|
116
|
-
swipingRef.current = false;
|
|
123
|
+
onPointerLeave: (event) => {
|
|
124
|
+
if (!event.currentTarget.matches(":focus-within")) resume(toast.id);
|
|
117
125
|
},
|
|
126
|
+
onPointerCancel: endSwipe,
|
|
118
127
|
onPointerDown: (event) => {
|
|
119
|
-
|
|
120
|
-
startYRef.current = event.clientY;
|
|
121
|
-
swipingRef.current = true;
|
|
128
|
+
if (!swipeRef.current && event.isPrimary) swipeRef.current = event;
|
|
122
129
|
},
|
|
123
130
|
onPointerMove: (event) => {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
onPointerUp: () => {
|
|
133
|
-
swipingRef.current = false;
|
|
131
|
+
const swipe = swipeRef.current;
|
|
132
|
+
if (swipe?.pointerId !== event.pointerId) return;
|
|
133
|
+
const deltaX = event.clientX - swipe.clientX;
|
|
134
|
+
const deltaY = event.clientY - swipe.clientY;
|
|
135
|
+
if (Math.abs(deltaX) <= 80 || Math.abs(deltaX) <= Math.abs(deltaY)) return;
|
|
136
|
+
dismiss(toast.id);
|
|
134
137
|
},
|
|
138
|
+
onPointerUp: endSwipe,
|
|
135
139
|
children: [
|
|
136
140
|
toast.title ? /* @__PURE__ */ jsx(ToastTitle, { children: toast.title }) : null,
|
|
137
141
|
toast.description ? /* @__PURE__ */ jsx(ToastDescription, { children: toast.description }) : null,
|
|
@@ -145,7 +149,7 @@ function ToastRoot(props) {
|
|
|
145
149
|
children: toast.action.label
|
|
146
150
|
}
|
|
147
151
|
) : null,
|
|
148
|
-
/* @__PURE__ */ jsx(ToastClose, { onClick: () => dismiss(toast.id) })
|
|
152
|
+
/* @__PURE__ */ jsx(ToastClose, { labels, onClick: () => dismiss(toast.id) })
|
|
149
153
|
]
|
|
150
154
|
}
|
|
151
155
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/toast/Toast.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n addTransitionType,\n startTransition,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n ViewTransition,\n} from \"react\";\nimport type { FocusEvent, KeyboardEvent, PointerEvent, ReactElement } from \"react\";\nimport { useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport { createPartContext, splitRef } from \"@gunkin/uiify/core\";\nimport { VisuallyHidden } from \"@gunkin/uiify/core/visually-hidden\";\nimport { createToastStore } from \"./toast-store.js\";\nimport {\n ToastAction as ToastActionElement,\n ToastClose as ToastCloseElement,\n ToastDescription,\n ToastTitle,\n ToastViewport as ToastViewportElement,\n} from \"./ToastElements.js\";\nimport type {\n ToastInput,\n ToastStore,\n ToastContextValue,\n ToastProviderOwnProps,\n ToastViewportOwnProps,\n ToastRootOwnProps,\n ToastActionProps,\n ToastCloseProps,\n} from \"./types.js\";\n\nexport type {\n ToastActionProps,\n ToastCloseProps,\n ToastDescriptionOwnProps,\n ToastInput,\n ToastPriority,\n ToastProviderOwnProps,\n ToastRecord,\n ToastRootOwnProps,\n ToastStore,\n ToastTitleOwnProps,\n ToastViewportOwnProps,\n} from \"./types.js\";\n\nconst SWIPE_DISMISS_THRESHOLD = 80;\n\n/** Transition type and view-transition-class shared with behavior.css and styles/toast.css. */\nconst TOAST_TRANSITION = \"uiify-toast\";\n\nconst [ToastStoreProvider, useToastStoreContext] = createPartContext<ToastContextValue>(\n \"Toast\",\n \"Provider\",\n);\n\nexport { ToastDescription, ToastTitle };\n\nexport function ToastProvider(props: ToastProviderOwnProps): ReactElement | null {\n const { children, limit = 3 } = props;\n const storeRef = useRef<ToastStore | null>(null);\n storeRef.current ??= createToastStore({ limit });\n const store = storeRef.current;\n\n const dismiss = useCallback((id: string) => store.dismiss(id), [store]);\n const pause = useCallback((id: string) => store.pause(id), [store]);\n const resume = useCallback((id: string) => store.resume(id), [store]);\n\n const announcement = useSyncExternalStore(\n store.subscribe,\n () => store.getAnnouncement(),\n () => \"\",\n );\n const assertiveAnnouncement = useSyncExternalStore(\n store.subscribe,\n () => store.getAssertiveAnnouncement(),\n () => \"\",\n );\n const contextValue = useMemo(\n () => ({ dismiss, pause, resume, store }),\n [dismiss, pause, resume, store],\n );\n\n return (\n <ToastStoreProvider value={contextValue}>\n {children}\n <VisuallyHidden aria-atomic=\"true\" aria-live=\"polite\">\n {announcement}\n </VisuallyHidden>\n <VisuallyHidden aria-atomic=\"true\" aria-live=\"assertive\">\n {assertiveAnnouncement}\n </VisuallyHidden>\n </ToastStoreProvider>\n );\n}\nToastProvider.displayName = \"ToastProvider\";\n\nexport function ToastViewport(props: ToastViewportOwnProps): ReactElement | null {\n const { store } = useToastStoreContext(\"Viewport\");\n // Not useSyncExternalStore: a store read there always commits synchronously, and\n // <ViewTransition> only animates commits made inside a Transition.\n const [toasts, setToasts] = useState(store.getServerSnapshot);\n useEffect(() => {\n const sync = () =>\n startTransition(() => {\n addTransitionType(TOAST_TRANSITION);\n setToasts(store.getSnapshot());\n });\n const unsubscribe = store.subscribe(sync);\n sync();\n return unsubscribe;\n }, [store]);\n const [consumerRef, domProps] = splitRef<HTMLElement, ToastViewportOwnProps>(props);\n const viewportRef = useRef<HTMLElement | null>(null);\n const mergedRef = useMergedRefs(viewportRef, consumerRef);\n const hasToasts = toasts.length > 0;\n\n // Same technique as core/use-popover.ts: guard with .matches(\":popover-open\")\n // so a StrictMode double-invoke or an unrelated re-run doesn't call\n // showPopover/hidePopover on a popover already in that state (both throw).\n // try/catch covers the node having disconnected between render and effect.\n useIsomorphicLayoutEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n try {\n if (hasToasts && !viewport.matches(\":popover-open\")) viewport.showPopover();\n if (!hasToasts && viewport.matches(\":popover-open\")) viewport.hidePopover();\n } catch {\n // The node may have disconnected between render and layout effect.\n }\n }, [hasToasts]);\n\n return (\n <ToastViewportElement {...domProps} popover=\"manual\" ref={mergedRef}>\n {toasts.map((toast) => (\n <ViewTransition default={TOAST_TRANSITION} key={toast.id}>\n <ToastRoot toast={toast} />\n </ViewTransition>\n ))}\n </ToastViewportElement>\n );\n}\nToastViewport.displayName = \"ToastViewport\";\n\nexport function ToastRoot(props: ToastRootOwnProps): ReactElement | null {\n const { toast } = props;\n const { dismiss, pause, resume } = useToastStoreContext(\"Root\");\n const startXRef = useRef(0);\n const startYRef = useRef(0);\n const swipingRef = useRef(false);\n\n /* oxlint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex, jsx-a11y/prefer-tag-over-role -- pause/swipe on toast card */\n return (\n <div\n aria-label={typeof toast.title === \"string\" ? toast.title : \"Notification\"}\n data-state=\"open\"\n data-part=\"item\"\n data-uiify-toast=\"\"\n role=\"group\"\n tabIndex={0}\n onFocus={() => pause(toast.id)}\n onBlur={(event: FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) resume(toast.id);\n }}\n onKeyDown={(event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n dismiss(toast.id);\n }\n }}\n onPointerEnter={() => pause(toast.id)}\n onPointerLeave={() => resume(toast.id)}\n onPointerCancel={() => {\n swipingRef.current = false;\n }}\n onPointerDown={(event: PointerEvent<HTMLDivElement>) => {\n startXRef.current = event.clientX;\n startYRef.current = event.clientY;\n swipingRef.current = true;\n }}\n onPointerMove={(event: PointerEvent<HTMLDivElement>) => {\n if (!swipingRef.current) return;\n const deltaX = event.clientX - startXRef.current;\n const deltaY = event.clientY - startYRef.current;\n if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > SWIPE_DISMISS_THRESHOLD) {\n swipingRef.current = false;\n dismiss(toast.id);\n }\n }}\n onPointerUp={() => {\n swipingRef.current = false;\n }}\n >\n {toast.title ? <ToastTitle>{toast.title}</ToastTitle> : null}\n {toast.description ? <ToastDescription>{toast.description}</ToastDescription> : null}\n {toast.action ? (\n <ToastAction\n onClick={() => {\n toast.action?.onClick();\n dismiss(toast.id);\n }}\n >\n {toast.action.label}\n </ToastAction>\n ) : null}\n <ToastClose onClick={() => dismiss(toast.id)} />\n </div>\n );\n /* oxlint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex, jsx-a11y/prefer-tag-over-role */\n}\nToastRoot.displayName = \"ToastRoot\";\n\nexport function ToastAction(props: ToastActionProps): ReactElement | null {\n return <ToastActionElement {...props} />;\n}\nToastAction.displayName = \"ToastAction\";\n\nexport function ToastClose(props: ToastCloseProps): ReactElement | null {\n return <ToastCloseElement {...props} />;\n}\nToastClose.displayName = \"ToastClose\";\n\nexport function useToast() {\n const { dismiss, store } = useToastStoreContext(\"useToast\");\n return {\n dismiss,\n toast(input: ToastInput) {\n return store.enqueue(input);\n },\n };\n}\n\nexport const Toast = {\n Action: ToastAction,\n Close: ToastClose,\n Description: ToastDescription,\n Provider: ToastProvider,\n Root: ToastRoot,\n Title: ToastTitle,\n Viewport: ToastViewport,\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/toast/Toast.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n addTransitionType,\n startTransition,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n ViewTransition,\n} from \"react\";\nimport type { FocusEvent, KeyboardEvent, PointerEvent, ReactElement } from \"react\";\nimport { useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport { createPartContext, splitRef } from \"@gunkin/uiify/core\";\nimport { VisuallyHidden } from \"@gunkin/uiify/core/visually-hidden\";\nimport { createToastStore } from \"./toast-store.js\";\nimport {\n ToastAction as ToastActionElement,\n ToastClose as ToastCloseElement,\n ToastDescription,\n ToastTitle,\n ToastViewport as ToastViewportElement,\n} from \"./ToastElements.js\";\nimport type {\n ToastInput,\n ToastStore,\n ToastContextValue,\n ToastProviderOwnProps,\n ToastViewportOwnProps,\n ToastRootOwnProps,\n ToastActionProps,\n ToastCloseProps,\n ToastLabels,\n} from \"./types.js\";\n\nexport type {\n ToastActionProps,\n ToastCloseProps,\n ToastDescriptionOwnProps,\n ToastInput,\n ToastLabels,\n ToastPriority,\n ToastProviderOwnProps,\n ToastRecord,\n ToastRootOwnProps,\n ToastStore,\n ToastTitleOwnProps,\n ToastViewportOwnProps,\n} from \"./types.js\";\n\nconst DEFAULT_TOAST_LABELS: ToastLabels = {\n region: \"Notifications\",\n notification: \"Notification\",\n close: \"Close\",\n};\n\n/** Transition type and view-transition-class shared with behavior.css and styles/toast.css. */\nconst TOAST_TRANSITION = \"uiify-toast\";\n\nconst [ToastStoreProvider, useToastStoreContext] = createPartContext<ToastContextValue>(\n \"Toast\",\n \"Provider\",\n);\n\nexport { ToastDescription, ToastTitle };\n\nexport function ToastProvider(props: ToastProviderOwnProps): ReactElement | null {\n const { children, limit = 3, labels } = props;\n const resolvedLabels = useMemo(() => ({ ...DEFAULT_TOAST_LABELS, ...labels }), [labels]);\n const storeRef = useRef<ToastStore | null>(null);\n storeRef.current ??= createToastStore({ limit });\n const store = storeRef.current;\n\n const dismiss = useCallback((id: string) => store.dismiss(id), [store]);\n const pause = useCallback((id: string) => store.pause(id), [store]);\n const resume = useCallback((id: string) => store.resume(id), [store]);\n\n const announcement = useSyncExternalStore(\n store.subscribe,\n () => store.getAnnouncement(),\n () => \"\",\n );\n const assertiveAnnouncement = useSyncExternalStore(\n store.subscribe,\n () => store.getAssertiveAnnouncement(),\n () => \"\",\n );\n const contextValue = useMemo(\n () => ({ dismiss, pause, resume, store, labels: resolvedLabels }),\n [dismiss, pause, resume, store, resolvedLabels],\n );\n\n return (\n <ToastStoreProvider value={contextValue}>\n {children}\n <VisuallyHidden aria-atomic=\"true\" aria-live=\"polite\">\n {announcement}\n </VisuallyHidden>\n <VisuallyHidden aria-atomic=\"true\" aria-live=\"assertive\">\n {assertiveAnnouncement}\n </VisuallyHidden>\n </ToastStoreProvider>\n );\n}\nToastProvider.displayName = \"ToastProvider\";\n\nexport function ToastViewport(props: ToastViewportOwnProps): ReactElement | null {\n const { store } = useToastStoreContext(\"Viewport\");\n // Not useSyncExternalStore: a store read there always commits synchronously, and\n // <ViewTransition> only animates commits made inside a Transition.\n const [toasts, setToasts] = useState(store.getServerSnapshot);\n useEffect(() => {\n const sync = () =>\n startTransition(() => {\n addTransitionType(TOAST_TRANSITION);\n setToasts(store.getSnapshot());\n });\n const unsubscribe = store.subscribe(sync);\n sync();\n return unsubscribe;\n }, [store]);\n const [consumerRef, domProps] = splitRef<HTMLElement, ToastViewportOwnProps>(props);\n const { labels } = useToastStoreContext(\"Viewport\");\n const resolvedLabels = { ...labels, ...props.labels };\n const viewportRef = useRef<HTMLElement | null>(null);\n const mergedRef = useMergedRefs(viewportRef, consumerRef);\n const hasToasts = toasts.length > 0;\n\n // Same technique as core/use-popover.ts: guard with .matches(\":popover-open\")\n // so a StrictMode double-invoke or an unrelated re-run doesn't call\n // showPopover/hidePopover on a popover already in that state (both throw).\n // try/catch covers the node having disconnected between render and effect.\n useIsomorphicLayoutEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n try {\n if (hasToasts && !viewport.matches(\":popover-open\")) viewport.showPopover();\n if (!hasToasts && viewport.matches(\":popover-open\")) viewport.hidePopover();\n } catch {\n // The node may have disconnected between render and layout effect.\n }\n }, [hasToasts]);\n\n return (\n <ToastViewportElement {...domProps} labels={resolvedLabels} popover=\"manual\" ref={mergedRef}>\n {toasts.map((toast) => (\n <ViewTransition default={TOAST_TRANSITION} key={toast.id}>\n <ToastRoot toast={toast} />\n </ViewTransition>\n ))}\n </ToastViewportElement>\n );\n}\nToastViewport.displayName = \"ToastViewport\";\n\nexport function ToastRoot(props: ToastRootOwnProps): ReactElement | null {\n const { toast, labels: labelOverrides } = props;\n const { dismiss, pause, resume, labels: providerLabels } = useToastStoreContext(\"Root\");\n const labels = { ...providerLabels, ...labelOverrides };\n const swipeRef = useRef<PointerEvent<HTMLDivElement> | null>(null);\n const endSwipe = (event: PointerEvent<HTMLDivElement>) => {\n if (swipeRef.current?.pointerId === event.pointerId) swipeRef.current = null;\n };\n\n /* oxlint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex, jsx-a11y/prefer-tag-over-role -- pause/swipe on toast card */\n return (\n <div\n aria-label={typeof toast.title === \"string\" ? toast.title : labels.notification}\n data-state=\"open\"\n data-part=\"item\"\n data-uiify-toast=\"\"\n role=\"group\"\n tabIndex={0}\n onFocus={() => pause(toast.id)}\n onBlur={(event: FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.matches(\":hover, :focus-within\")) resume(toast.id);\n }}\n onKeyDown={(event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n dismiss(toast.id);\n }\n }}\n onPointerEnter={() => pause(toast.id)}\n onPointerLeave={(event: PointerEvent<HTMLDivElement>) => {\n if (!event.currentTarget.matches(\":focus-within\")) resume(toast.id);\n }}\n onPointerCancel={endSwipe}\n onPointerDown={(event: PointerEvent<HTMLDivElement>) => {\n if (!swipeRef.current && event.isPrimary) swipeRef.current = event;\n }}\n onPointerMove={(event: PointerEvent<HTMLDivElement>) => {\n const swipe = swipeRef.current;\n if (swipe?.pointerId !== event.pointerId) return;\n const deltaX = event.clientX - swipe.clientX;\n const deltaY = event.clientY - swipe.clientY;\n if (Math.abs(deltaX) <= 80 || Math.abs(deltaX) <= Math.abs(deltaY)) return;\n dismiss(toast.id);\n }}\n onPointerUp={endSwipe}\n >\n {toast.title ? <ToastTitle>{toast.title}</ToastTitle> : null}\n {toast.description ? <ToastDescription>{toast.description}</ToastDescription> : null}\n {toast.action ? (\n <ToastAction\n onClick={() => {\n toast.action?.onClick();\n dismiss(toast.id);\n }}\n >\n {toast.action.label}\n </ToastAction>\n ) : null}\n <ToastClose labels={labels} onClick={() => dismiss(toast.id)} />\n </div>\n );\n /* oxlint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex, jsx-a11y/prefer-tag-over-role */\n}\nToastRoot.displayName = \"ToastRoot\";\n\nexport function ToastAction(props: ToastActionProps): ReactElement | null {\n return <ToastActionElement {...props} />;\n}\nToastAction.displayName = \"ToastAction\";\n\nexport function ToastClose(props: ToastCloseProps): ReactElement | null {\n return <ToastCloseElement {...props} />;\n}\nToastClose.displayName = \"ToastClose\";\n\nexport function useToast() {\n const { dismiss, store } = useToastStoreContext(\"useToast\");\n return {\n dismiss,\n toast(input: ToastInput) {\n return store.enqueue(input);\n },\n };\n}\n\nexport const Toast = {\n Action: ToastAction,\n Close: ToastClose,\n Description: ToastDescription,\n Provider: ToastProvider,\n Root: ToastRoot,\n Title: ToastTitle,\n Viewport: ToastViewport,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToastElements.d.ts","sourceRoot":"","sources":["../../../src/components/toast/ToastElements.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"ToastElements.d.ts","sourceRoot":"","sources":["../../../src/components/toast/ToastElements.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAQpB,wBAAgB,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CAE/E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CAiB/E;yBAjBe,aAAa;;;AAoB7B,wBAAgB,SAAS,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,GAAG,IAAI,CAiBvE;yBAjBe,SAAS;;;AAoBzB,wBAAgB,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CAWzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,GAAG,YAAY,GAAG,IAAI,CAWrF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CAcxE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAiBtE;AAED,eAAO,MAAM,KAAK;;;;;;;;CAQjB,CAAC"}
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useRenderElement } from "@gunkin/uiify/core/render";
|
|
3
|
+
const DEFAULT_TOAST_LABELS = {
|
|
4
|
+
region: "Notifications",
|
|
5
|
+
notification: "Notification",
|
|
6
|
+
close: "Close"
|
|
7
|
+
};
|
|
3
8
|
function ToastProvider(props) {
|
|
4
9
|
return props.children ?? null;
|
|
5
10
|
}
|
|
6
11
|
function ToastViewport(props) {
|
|
7
|
-
const { children, className, "aria-label": ariaLabel
|
|
12
|
+
const { children, className, "aria-label": ariaLabel, labels, popover, ref } = props;
|
|
13
|
+
const resolvedLabels = { ...DEFAULT_TOAST_LABELS, ...labels };
|
|
8
14
|
return /* @__PURE__ */ jsx(
|
|
9
15
|
"section",
|
|
10
16
|
{
|
|
11
|
-
"aria-label": ariaLabel,
|
|
17
|
+
"aria-label": ariaLabel ?? resolvedLabels.region,
|
|
12
18
|
"data-part": "viewport",
|
|
13
19
|
"data-testid": "toast-viewport",
|
|
14
20
|
"data-uiify-toast": "",
|
|
@@ -21,11 +27,12 @@ function ToastViewport(props) {
|
|
|
21
27
|
}
|
|
22
28
|
ToastViewport.displayName = "ToastViewport";
|
|
23
29
|
function ToastRoot(props) {
|
|
24
|
-
const { toast } = props;
|
|
30
|
+
const { toast, labels } = props;
|
|
31
|
+
const resolvedLabels = { ...DEFAULT_TOAST_LABELS, ...labels };
|
|
25
32
|
return /* @__PURE__ */ jsxs(
|
|
26
33
|
"fieldset",
|
|
27
34
|
{
|
|
28
|
-
"aria-label": typeof toast.title === "string" ? toast.title :
|
|
35
|
+
"aria-label": typeof toast.title === "string" ? toast.title : resolvedLabels.notification,
|
|
29
36
|
"data-part": "item",
|
|
30
37
|
"data-state": "open",
|
|
31
38
|
"data-uiify-toast": "",
|
|
@@ -33,7 +40,7 @@ function ToastRoot(props) {
|
|
|
33
40
|
toast.title ? /* @__PURE__ */ jsx(ToastTitle, { children: toast.title }) : null,
|
|
34
41
|
toast.description ? /* @__PURE__ */ jsx(ToastDescription, { children: toast.description }) : null,
|
|
35
42
|
toast.action ? /* @__PURE__ */ jsx(ToastAction, { children: toast.action.label }) : null,
|
|
36
|
-
/* @__PURE__ */ jsx(ToastClose, {})
|
|
43
|
+
/* @__PURE__ */ jsx(ToastClose, { labels: resolvedLabels })
|
|
37
44
|
]
|
|
38
45
|
}
|
|
39
46
|
);
|
|
@@ -44,7 +51,8 @@ function ToastTitle(props) {
|
|
|
44
51
|
return useRenderElement({
|
|
45
52
|
defaultTag: "div",
|
|
46
53
|
props: {
|
|
47
|
-
|
|
54
|
+
"data-part": "title",
|
|
55
|
+
className,
|
|
48
56
|
children
|
|
49
57
|
},
|
|
50
58
|
state: {}
|
|
@@ -55,7 +63,8 @@ function ToastDescription(props) {
|
|
|
55
63
|
return useRenderElement({
|
|
56
64
|
defaultTag: "div",
|
|
57
65
|
props: {
|
|
58
|
-
|
|
66
|
+
"data-part": "description",
|
|
67
|
+
className,
|
|
59
68
|
children
|
|
60
69
|
},
|
|
61
70
|
state: {}
|
|
@@ -68,7 +77,8 @@ function ToastAction(props) {
|
|
|
68
77
|
props: {
|
|
69
78
|
...consumerProps,
|
|
70
79
|
type: "button",
|
|
71
|
-
|
|
80
|
+
"data-part": "action",
|
|
81
|
+
className,
|
|
72
82
|
onClick,
|
|
73
83
|
children
|
|
74
84
|
},
|
|
@@ -76,16 +86,18 @@ function ToastAction(props) {
|
|
|
76
86
|
});
|
|
77
87
|
}
|
|
78
88
|
function ToastClose(props) {
|
|
79
|
-
const { children
|
|
89
|
+
const { children, className, labels, onClick, ...consumerProps } = props;
|
|
90
|
+
const resolvedChildren = children ?? labels?.close ?? DEFAULT_TOAST_LABELS.close;
|
|
80
91
|
return useRenderElement({
|
|
81
92
|
defaultTag: "button",
|
|
82
93
|
props: {
|
|
83
94
|
...consumerProps,
|
|
84
95
|
type: "button",
|
|
85
|
-
"aria-label": typeof
|
|
86
|
-
|
|
96
|
+
"aria-label": typeof resolvedChildren === "string" ? resolvedChildren : DEFAULT_TOAST_LABELS.close,
|
|
97
|
+
"data-part": "close",
|
|
98
|
+
className,
|
|
87
99
|
onClick,
|
|
88
|
-
children
|
|
100
|
+
children: resolvedChildren
|
|
89
101
|
},
|
|
90
102
|
state: {}
|
|
91
103
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/toast/ToastElements.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type {\n ToastProviderOwnProps,\n ToastViewportOwnProps,\n ToastRootOwnProps,\n ToastTitleOwnProps,\n ToastDescriptionOwnProps,\n ToastActionProps,\n ToastCloseProps,\n} from \"./types.js\";\n\nexport function ToastProvider(props: ToastProviderOwnProps): ReactElement | null {\n return (props.children ?? null) as ReactElement | null;\n}\n\nexport function ToastViewport(props: ToastViewportOwnProps): ReactElement | null {\n const { children, className, \"aria-label\": ariaLabel
|
|
1
|
+
{"version":3,"sources":["../../../src/components/toast/ToastElements.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type {\n ToastProviderOwnProps,\n ToastViewportOwnProps,\n ToastRootOwnProps,\n ToastTitleOwnProps,\n ToastDescriptionOwnProps,\n ToastActionProps,\n ToastCloseProps,\n ToastLabels,\n} from \"./types.js\";\n\nconst DEFAULT_TOAST_LABELS: ToastLabels = {\n region: \"Notifications\",\n notification: \"Notification\",\n close: \"Close\",\n};\n\nexport function ToastProvider(props: ToastProviderOwnProps): ReactElement | null {\n return (props.children ?? null) as ReactElement | null;\n}\n\nexport function ToastViewport(props: ToastViewportOwnProps): ReactElement | null {\n const { children, className, \"aria-label\": ariaLabel, labels, popover, ref } = props;\n const resolvedLabels = { ...DEFAULT_TOAST_LABELS, ...labels };\n\n return (\n <section\n aria-label={ariaLabel ?? resolvedLabels.region}\n data-part=\"viewport\"\n data-testid=\"toast-viewport\"\n data-uiify-toast=\"\"\n ref={ref}\n {...(popover ? { popover } : {})}\n {...(className ? { className } : {})}\n >\n {children}\n </section>\n );\n}\nToastViewport.displayName = \"ToastViewport\";\n\nexport function ToastRoot(props: ToastRootOwnProps): ReactElement | null {\n const { toast, labels } = props;\n const resolvedLabels = { ...DEFAULT_TOAST_LABELS, ...labels };\n\n return (\n <fieldset\n aria-label={typeof toast.title === \"string\" ? toast.title : resolvedLabels.notification}\n data-part=\"item\"\n data-state=\"open\"\n data-uiify-toast=\"\"\n >\n {toast.title ? <ToastTitle>{toast.title}</ToastTitle> : null}\n {toast.description ? <ToastDescription>{toast.description}</ToastDescription> : null}\n {toast.action ? <ToastAction>{toast.action.label}</ToastAction> : null}\n <ToastClose labels={resolvedLabels} />\n </fieldset>\n );\n}\nToastRoot.displayName = \"ToastRoot\";\n\nexport function ToastTitle(props: ToastTitleOwnProps): ReactElement | null {\n const { children, className } = props;\n return useRenderElement({\n defaultTag: \"div\",\n props: {\n \"data-part\": \"title\",\n className,\n children,\n },\n state: {},\n });\n}\n\nexport function ToastDescription(props: ToastDescriptionOwnProps): ReactElement | null {\n const { children, className } = props;\n return useRenderElement({\n defaultTag: \"div\",\n props: {\n \"data-part\": \"description\",\n className,\n children,\n },\n state: {},\n });\n}\n\nexport function ToastAction(props: ToastActionProps): ReactElement | null {\n const { children, className, onClick, ...consumerProps } = props;\n return useRenderElement({\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n type: \"button\",\n \"data-part\": \"action\",\n className,\n onClick,\n children,\n },\n state: {},\n });\n}\n\nexport function ToastClose(props: ToastCloseProps): ReactElement | null {\n const { children, className, labels, onClick, ...consumerProps } = props;\n const resolvedChildren = children ?? labels?.close ?? DEFAULT_TOAST_LABELS.close;\n return useRenderElement({\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n type: \"button\",\n \"aria-label\":\n typeof resolvedChildren === \"string\" ? resolvedChildren : DEFAULT_TOAST_LABELS.close,\n \"data-part\": \"close\",\n className,\n onClick,\n children: resolvedChildren,\n },\n state: {},\n });\n}\n\nexport const Toast = {\n Action: ToastAction,\n Close: ToastClose,\n Description: ToastDescription,\n Provider: ToastProvider,\n Root: ToastRoot,\n Title: ToastTitle,\n Viewport: ToastViewport,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { Toast, ToastAction, ToastClose, ToastDescription, ToastProvider, ToastRoot, ToastTitle, ToastViewport, useToast, } from "./Toast.js";
|
|
2
|
-
export type { ToastActionOwnProps, ToastActionProps, ToastCloseOwnProps, ToastCloseProps, ToastDescriptionOwnProps, ToastProviderOwnProps, ToastRootOwnProps, ToastTitleOwnProps, ToastViewportOwnProps, } from "./types.js";
|
|
2
|
+
export type { ToastActionOwnProps, ToastActionProps, ToastCloseOwnProps, ToastCloseProps, ToastLabels, ToastDescriptionOwnProps, ToastProviderOwnProps, ToastRootOwnProps, ToastTitleOwnProps, ToastViewportOwnProps, } from "./types.js";
|
|
3
3
|
export type { ToastInput, ToastPriority, ToastRecord, ToastStore } from "./types.js";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/toast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,UAAU,EACV,aAAa,EACb,QAAQ,GACT,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/toast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,UAAU,EACV,aAAa,EACb,QAAQ,GACT,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/toast/index.ts"],"sourcesContent":["export {\n Toast,\n ToastAction,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastRoot,\n ToastTitle,\n ToastViewport,\n useToast,\n} from \"./Toast.js\";\nexport type {\n ToastActionOwnProps,\n ToastActionProps,\n ToastCloseOwnProps,\n ToastCloseProps,\n ToastDescriptionOwnProps,\n ToastProviderOwnProps,\n ToastRootOwnProps,\n ToastTitleOwnProps,\n ToastViewportOwnProps,\n} from \"./types.js\";\nexport type { ToastInput, ToastPriority, ToastRecord, ToastStore } from \"./types.js\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/toast/index.ts"],"sourcesContent":["export {\n Toast,\n ToastAction,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastRoot,\n ToastTitle,\n ToastViewport,\n useToast,\n} from \"./Toast.js\";\nexport type {\n ToastActionOwnProps,\n ToastActionProps,\n ToastCloseOwnProps,\n ToastCloseProps,\n ToastLabels,\n ToastDescriptionOwnProps,\n ToastProviderOwnProps,\n ToastRootOwnProps,\n ToastTitleOwnProps,\n ToastViewportOwnProps,\n} from \"./types.js\";\nexport type { ToastInput, ToastPriority, ToastRecord, ToastStore } from \"./types.js\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { MouseEvent, ReactNode, Ref } from "react";
|
|
2
2
|
export type ToastPriority = "polite" | "assertive";
|
|
3
|
+
export interface ToastLabels {
|
|
4
|
+
readonly region: string;
|
|
5
|
+
readonly notification: string;
|
|
6
|
+
readonly close: string;
|
|
7
|
+
}
|
|
3
8
|
export interface ToastAction {
|
|
4
9
|
readonly label: ReactNode;
|
|
5
10
|
readonly onClick: () => void;
|
|
@@ -44,15 +49,18 @@ export interface ToastContextValue {
|
|
|
44
49
|
readonly pause: (id: string) => void;
|
|
45
50
|
readonly resume: (id: string) => void;
|
|
46
51
|
readonly store: ToastStore;
|
|
52
|
+
readonly labels: ToastLabels;
|
|
47
53
|
}
|
|
48
54
|
export interface ToastProviderOwnProps {
|
|
49
55
|
readonly children?: ReactNode;
|
|
56
|
+
readonly labels?: Partial<ToastLabels>;
|
|
50
57
|
readonly limit?: number;
|
|
51
58
|
}
|
|
52
59
|
export interface ToastViewportOwnProps {
|
|
53
60
|
readonly "aria-label"?: string;
|
|
54
61
|
readonly children?: ReactNode;
|
|
55
62
|
readonly className?: string;
|
|
63
|
+
readonly labels?: Partial<ToastLabels>;
|
|
56
64
|
/**
|
|
57
65
|
* Set by the live client viewport (@gunkin/uiify/components/toast/Toast.js) to
|
|
58
66
|
* `"manual"` so the queue's rendered surface sits in the top layer. The
|
|
@@ -64,6 +72,7 @@ export interface ToastViewportOwnProps {
|
|
|
64
72
|
readonly ref?: Ref<HTMLElement>;
|
|
65
73
|
}
|
|
66
74
|
export interface ToastRootOwnProps {
|
|
75
|
+
readonly labels?: Partial<ToastLabels>;
|
|
67
76
|
readonly toast: ToastRecord;
|
|
68
77
|
}
|
|
69
78
|
export interface ToastTitleOwnProps {
|
|
@@ -84,6 +93,7 @@ export interface ToastActionProps extends ToastActionOwnProps {
|
|
|
84
93
|
export interface ToastCloseOwnProps {
|
|
85
94
|
readonly children?: ReactNode;
|
|
86
95
|
readonly className?: string;
|
|
96
|
+
readonly labels?: Partial<ToastLabels>;
|
|
87
97
|
}
|
|
88
98
|
export interface ToastCloseProps extends ToastCloseOwnProps {
|
|
89
99
|
readonly onClick?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/toast/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,MAAM,CAAC;IACvC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,MAAM,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,SAAS,WAAW,EAAE,CAAC;IACnD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,SAAS,WAAW,EAAE,CAAC;IACzD,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/toast/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { HTMLAttributes, ReactElement, ReactNode } from "react";
|
|
2
|
-
import type
|
|
2
|
+
import { type Direction } from "@gunkin/uiify/core/direction";
|
|
3
3
|
import type { RovingFocusOrientation } from "@gunkin/uiify/core/roving-focus";
|
|
4
4
|
import type { ToolbarButtonProps, ToolbarLinkProps, ToolbarSeparatorProps, ToolbarToggleGroupProps } from "./types.js";
|
|
5
5
|
interface ToolbarRootClientProps extends HTMLAttributes<HTMLDivElement> {
|
|
@@ -8,7 +8,7 @@ interface ToolbarRootClientProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
8
8
|
readonly loop?: boolean;
|
|
9
9
|
readonly orientation?: RovingFocusOrientation;
|
|
10
10
|
}
|
|
11
|
-
export declare function ToolbarRootClient({ children, className, dir, loop, orientation, ...consumerProps }: ToolbarRootClientProps): ReactElement;
|
|
11
|
+
export declare function ToolbarRootClient({ children, className, dir: localDir, loop, orientation, ...consumerProps }: ToolbarRootClientProps): ReactElement;
|
|
12
12
|
export declare namespace ToolbarRootClient {
|
|
13
13
|
var displayName: string;
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/toolbar/Toolbar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/toolbar/Toolbar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEpF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAQ9E,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,UAAU,sBAAuB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAqCD,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,SAAS,EACT,GAAG,EAAE,QAAQ,EACb,IAAW,EACX,WAA0B,EAC1B,GAAG,aAAa,EACjB,EAAE,sBAAsB,GAAG,YAAY,CAkFvC;yBAzFe,iBAAiB;;;AA4FjC,eAAO,MAAM,WAAW,0BAAoB,CAAC;AAE7C,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CAE5E;yBAFe,aAAa;;;AAK7B,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CAExE;yBAFe,WAAW;;;AAK3B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CAElF;yBAFe,gBAAgB;;;AAKhC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,YAAY,GAAG,IAAI,CAEtF;yBAFe,kBAAkB;;;AAKlC,eAAO,MAAM,OAAO;;;;;;CAMnB,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useRef } from "react";
|
|
4
|
+
import { useDirectionOverride } from "@gunkin/uiify/core/direction";
|
|
5
|
+
import { resolveDirection } from "@gunkin/uiify/core/text-direction";
|
|
4
6
|
import {
|
|
5
7
|
ToolbarButton as ServerToolbarButton,
|
|
6
8
|
ToolbarLink as ServerToolbarLink,
|
|
@@ -33,11 +35,12 @@ function moveIndex(currentIndex, offset, length, loop) {
|
|
|
33
35
|
function ToolbarRootClient({
|
|
34
36
|
children,
|
|
35
37
|
className,
|
|
36
|
-
dir,
|
|
38
|
+
dir: localDir,
|
|
37
39
|
loop = true,
|
|
38
40
|
orientation = "horizontal",
|
|
39
41
|
...consumerProps
|
|
40
42
|
}) {
|
|
43
|
+
const dir = useDirectionOverride(localDir);
|
|
41
44
|
const rootRef = useRef(null);
|
|
42
45
|
const currentRef = useRef(null);
|
|
43
46
|
useEffect(() => {
|
|
@@ -66,11 +69,12 @@ function ToolbarRootClient({
|
|
|
66
69
|
let nextIndex = null;
|
|
67
70
|
if (event.key === "Home") nextIndex = 0;
|
|
68
71
|
if (event.key === "End") nextIndex = enabled.length - 1;
|
|
72
|
+
const rtl = resolveDirection(item, dir) === "rtl";
|
|
69
73
|
if (orientation !== "vertical" && event.key === "ArrowRight") {
|
|
70
|
-
nextIndex = moveIndex(currentIndex,
|
|
74
|
+
nextIndex = moveIndex(currentIndex, rtl ? -1 : 1, enabled.length, loop);
|
|
71
75
|
}
|
|
72
76
|
if (orientation !== "vertical" && event.key === "ArrowLeft") {
|
|
73
|
-
nextIndex = moveIndex(currentIndex,
|
|
77
|
+
nextIndex = moveIndex(currentIndex, rtl ? 1 : -1, enabled.length, loop);
|
|
74
78
|
}
|
|
75
79
|
if (orientation !== "horizontal" && event.key === "ArrowDown") {
|
|
76
80
|
nextIndex = moveIndex(currentIndex, 1, enabled.length, loop);
|
|
@@ -100,7 +104,7 @@ function ToolbarRootClient({
|
|
|
100
104
|
"data-orientation": orientation,
|
|
101
105
|
"data-part": "root",
|
|
102
106
|
"data-uiify-toolbar": "",
|
|
103
|
-
dir,
|
|
107
|
+
...dir ? { dir } : {},
|
|
104
108
|
ref: rootRef,
|
|
105
109
|
role: "toolbar",
|
|
106
110
|
children
|