@gunkin/uiify 0.0.1-alpha → 0.0.3-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/dist/components/accordion/Accordion.d.ts +2 -2
- package/dist/components/accordion/Accordion.d.ts.map +1 -1
- package/dist/components/accordion/Accordion.js +1 -2
- package/dist/components/accordion/Accordion.js.map +1 -1
- package/dist/components/alert-modal/AlertModal.d.ts +1 -1
- package/dist/components/alert-modal/AlertModal.d.ts.map +1 -1
- package/dist/components/alert-modal/AlertModal.js +5 -8
- package/dist/components/alert-modal/AlertModal.js.map +1 -1
- package/dist/components/alert-modal/AlertModalParts.d.ts +4 -29
- package/dist/components/alert-modal/AlertModalParts.d.ts.map +1 -1
- package/dist/components/alert-modal/AlertModalParts.js +29 -36
- package/dist/components/alert-modal/AlertModalParts.js.map +1 -1
- package/dist/components/alert-modal/types.d.ts +0 -3
- package/dist/components/alert-modal/types.d.ts.map +1 -1
- package/dist/components/behavior.css +107 -49
- package/dist/components/behavior.css.map +1 -1
- package/dist/components/breadcrumb/Breadcrumb.js +1 -1
- package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/components/button/Button.d.ts.map +1 -1
- package/dist/components/button/Button.js +1 -0
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/candle-chart/CandleChart.d.ts.map +1 -1
- package/dist/components/candle-chart/CandleChart.js +39 -55
- package/dist/components/candle-chart/CandleChart.js.map +1 -1
- package/dist/components/candle-chart/client/CandleChartClient.js.map +1 -1
- package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
- package/dist/components/carousel/CarouselMarkup.js +26 -45
- package/dist/components/carousel/CarouselMarkup.js.map +1 -1
- package/dist/components/carousel/carousel-markup.d.ts +0 -1
- package/dist/components/carousel/carousel-markup.d.ts.map +1 -1
- package/dist/components/carousel/carousel-markup.js +0 -5
- package/dist/components/carousel/carousel-markup.js.map +1 -1
- package/dist/components/carousel/client/carousel-controller.js +2 -2
- package/dist/components/carousel/client/carousel-controller.js.map +1 -1
- package/dist/components/carousel/client/carousel-controls.d.ts.map +1 -1
- package/dist/components/carousel/client/carousel-controls.js +3 -5
- package/dist/components/carousel/client/carousel-controls.js.map +1 -1
- package/dist/components/carousel/client/carousel-drag.js +1 -1
- package/dist/components/carousel/client/carousel-drag.js.map +1 -1
- package/dist/components/carousel/client/carousel-observer.js +2 -2
- package/dist/components/carousel/client/carousel-observer.js.map +1 -1
- package/dist/components/carousel/fade/fade-controller.js +2 -2
- package/dist/components/carousel/fade/fade-controller.js.map +1 -1
- package/dist/components/carousel/fade/fade-swipe.js +1 -1
- package/dist/components/carousel/fade/fade-swipe.js.map +1 -1
- package/dist/components/carousel/index.d.ts +1 -1
- package/dist/components/carousel/index.d.ts.map +1 -1
- package/dist/components/carousel/index.js.map +1 -1
- package/dist/components/carousel/types.d.ts +0 -13
- package/dist/components/carousel/types.d.ts.map +1 -1
- package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/checkbox/Checkbox.js +3 -2
- package/dist/components/checkbox/Checkbox.js.map +1 -1
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.js +7 -1
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/combobox/types.d.ts +1 -0
- 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 +21 -4
- package/dist/components/context-menu/ContextMenu.js.map +1 -1
- package/dist/components/drawer/Drawer.d.ts.map +1 -1
- package/dist/components/drawer/Drawer.js +15 -0
- package/dist/components/drawer/Drawer.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 +28 -13
- package/dist/components/drawer/DrawerNative.js.map +1 -1
- package/dist/components/drawer/types.d.ts +0 -2
- 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 +2 -1
- package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.d.ts +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenuBar.js +12 -2
- package/dist/components/dropdown-menu/DropdownMenuBar.js.map +1 -1
- package/dist/components/dropdown-menu/types.d.ts +1 -0
- package/dist/components/dropdown-menu/types.d.ts.map +1 -1
- package/dist/components/enhance/listeners.js +1 -1
- package/dist/components/enhance/listeners.js.map +1 -1
- package/dist/components/enhance/sync.d.ts.map +1 -1
- package/dist/components/enhance/sync.js +7 -4
- package/dist/components/enhance/sync.js.map +1 -1
- package/dist/components/field/Field.d.ts.map +1 -1
- package/dist/components/field/Field.js +6 -0
- package/dist/components/field/Field.js.map +1 -1
- package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
- package/dist/components/file-upload/FileUpload.js +8 -2
- package/dist/components/file-upload/FileUpload.js.map +1 -1
- package/dist/components/file-upload/types.d.ts +1 -0
- package/dist/components/file-upload/types.d.ts.map +1 -1
- package/dist/components/hover-card/HoverCard.d.ts.map +1 -1
- package/dist/components/hover-card/HoverCard.js +2 -0
- package/dist/components/hover-card/HoverCard.js.map +1 -1
- package/dist/components/input/Input.d.ts.map +1 -1
- package/dist/components/input/Input.js +1 -0
- package/dist/components/input/Input.js.map +1 -1
- package/dist/components/internal/choice-family/ChoiceGroup.d.ts +1 -2
- package/dist/components/internal/choice-family/ChoiceGroup.d.ts.map +1 -1
- package/dist/components/internal/choice-family/ChoiceGroup.js +5 -6
- package/dist/components/internal/choice-family/ChoiceGroup.js.map +1 -1
- package/dist/components/internal/choice-family/types.d.ts +0 -4
- package/dist/components/internal/choice-family/types.d.ts.map +1 -1
- package/dist/components/line-chart/LineChart.d.ts.map +1 -1
- package/dist/components/line-chart/LineChart.js +30 -38
- package/dist/components/line-chart/LineChart.js.map +1 -1
- package/dist/components/line-chart/client/LineChartClient.js.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 +4 -6
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/components/modal/ModalParts.d.ts +3 -30
- package/dist/components/modal/ModalParts.d.ts.map +1 -1
- package/dist/components/modal/ModalParts.js +20 -17
- package/dist/components/modal/ModalParts.js.map +1 -1
- package/dist/components/modal/client/ModalClientContent.d.ts.map +1 -1
- package/dist/components/modal/client/ModalClientContent.js +5 -2
- package/dist/components/modal/client/ModalClientContent.js.map +1 -1
- package/dist/components/modal/types.d.ts +0 -2
- package/dist/components/modal/types.d.ts.map +1 -1
- package/dist/components/otp-input/OtpInput.d.ts.map +1 -1
- package/dist/components/otp-input/OtpInput.js +3 -0
- package/dist/components/otp-input/OtpInput.js.map +1 -1
- package/dist/components/popup/Popup.d.ts.map +1 -1
- package/dist/components/popup/Popup.js +8 -3
- package/dist/components/popup/Popup.js.map +1 -1
- package/dist/components/popup/PopupParts.d.ts +3 -26
- package/dist/components/popup/PopupParts.d.ts.map +1 -1
- package/dist/components/popup/PopupParts.js +27 -18
- package/dist/components/popup/PopupParts.js.map +1 -1
- package/dist/components/radio-group/RadioGroup.d.ts.map +1 -1
- package/dist/components/radio-group/RadioGroup.js +0 -1
- package/dist/components/radio-group/RadioGroup.js.map +1 -1
- package/dist/components/select/Select.d.ts.map +1 -1
- package/dist/components/select/Select.js +1 -0
- package/dist/components/select/Select.js.map +1 -1
- package/dist/components/slider/Slider.d.ts.map +1 -1
- package/dist/components/slider/Slider.js +1 -0
- package/dist/components/slider/Slider.js.map +1 -1
- package/dist/components/spinner/Spinner.d.ts.map +1 -1
- package/dist/components/spinner/Spinner.js +2 -2
- package/dist/components/spinner/Spinner.js.map +1 -1
- package/dist/components/spinner/types.d.ts +1 -1
- package/dist/components/spinner/types.d.ts.map +1 -1
- package/dist/components/stepper/Stepper.js +2 -2
- package/dist/components/stepper/Stepper.js.map +1 -1
- package/dist/components/switch/Switch.d.ts.map +1 -1
- package/dist/components/switch/Switch.js +1 -0
- package/dist/components/switch/Switch.js.map +1 -1
- package/dist/components/tabs/Tabs.d.ts.map +1 -1
- package/dist/components/tabs/Tabs.js +1 -3
- package/dist/components/tabs/Tabs.js.map +1 -1
- package/dist/components/tags-input/TagsInput.d.ts.map +1 -1
- package/dist/components/tags-input/TagsInput.js +6 -1
- package/dist/components/tags-input/TagsInput.js.map +1 -1
- package/dist/components/tags-input/types.d.ts +1 -0
- package/dist/components/tags-input/types.d.ts.map +1 -1
- package/dist/components/textarea/Textarea.d.ts.map +1 -1
- package/dist/components/textarea/Textarea.js +1 -0
- package/dist/components/textarea/Textarea.js.map +1 -1
- package/dist/components/toast/Toast.d.ts.map +1 -1
- package/dist/components/toast/Toast.js +2 -1
- 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 +4 -1
- package/dist/components/toast/ToastElements.js.map +1 -1
- package/dist/components/toggle/Toggle.d.ts.map +1 -1
- package/dist/components/toggle/Toggle.js +1 -0
- package/dist/components/toggle/Toggle.js.map +1 -1
- package/dist/components/toolbar/Toolbar.d.ts.map +1 -1
- package/dist/components/toolbar/Toolbar.js +5 -3
- package/dist/components/toolbar/Toolbar.js.map +1 -1
- package/dist/components/toolbar/ToolbarShell.d.ts.map +1 -1
- package/dist/components/toolbar/ToolbarShell.js +8 -5
- package/dist/components/toolbar/ToolbarShell.js.map +1 -1
- package/dist/components/tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/tooltip/Tooltip.js +2 -0
- package/dist/components/tooltip/Tooltip.js.map +1 -1
- package/dist/components/virtual-scroll/VirtualScroll.d.ts.map +1 -1
- package/dist/components/virtual-scroll/VirtualScroll.js +42 -46
- package/dist/components/virtual-scroll/VirtualScroll.js.map +1 -1
- package/dist/components/virtual-scroll/VirtualScrollRowShell.d.ts +1 -1
- package/dist/components/virtual-scroll/VirtualScrollRowShell.js +3 -3
- package/dist/components/virtual-scroll/VirtualScrollRowShell.js.map +1 -1
- package/dist/components/virtual-scroll/index.d.ts +1 -1
- package/dist/components/virtual-scroll/index.d.ts.map +1 -1
- package/dist/components/virtual-scroll/index.js.map +1 -1
- package/dist/components/virtual-scroll/types.d.ts +5 -0
- package/dist/components/virtual-scroll/types.d.ts.map +1 -1
- package/dist/components/virtual-scroll/types.js.map +1 -1
- package/dist/components/virtual-scroll/virtual-scroll-axis.d.ts +9 -0
- package/dist/components/virtual-scroll/virtual-scroll-axis.d.ts.map +1 -0
- package/dist/components/virtual-scroll/virtual-scroll-axis.js +18 -0
- package/dist/components/virtual-scroll/virtual-scroll-axis.js.map +1 -0
- package/dist/components/virtual-scroll/virtual-scroll-scroll-sync.js +2 -2
- package/dist/components/virtual-scroll/virtual-scroll-scroll-sync.js.map +1 -1
- package/dist/core/render-native-invoker.d.ts +6 -3
- package/dist/core/render-native-invoker.d.ts.map +1 -1
- package/dist/core/render-native-invoker.js +5 -3
- package/dist/core/render-native-invoker.js.map +1 -1
- package/dist/elements/choice/Choice.d.ts +2 -2
- package/dist/elements/choice/Choice.js +1 -1
- package/dist/elements/choice/Choice.js.map +1 -1
- package/dist/elements/choice/types.d.ts +1 -1
- package/dist/elements/choice/types.d.ts.map +1 -1
- package/dist/elements/dialog/Dialog.d.ts +3 -3
- package/dist/elements/dialog/Dialog.d.ts.map +1 -1
- package/dist/elements/dialog/Dialog.js +5 -3
- package/dist/elements/dialog/Dialog.js.map +1 -1
- package/dist/elements/popover/Popover.d.ts +6 -5
- package/dist/elements/popover/Popover.d.ts.map +1 -1
- package/dist/elements/popover/Popover.js +8 -4
- package/dist/elements/popover/Popover.js.map +1 -1
- package/dist/styles/index.css +1 -1
- package/dist/styles/tailwind.css +33 -35
- package/dist/styles/tokens.css +1 -1
- package/package.json +7 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/field/Field.tsx"],"sourcesContent":["import type { ElementType, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { getFieldIds } from \"./field-ids.js\";\nimport type {\n FieldRootProps,\n FieldControlProps,\n FieldLabelProps,\n FieldDescriptionProps,\n FieldErrorProps,\n} from \"./types.js\";\n\nexport function FieldRoot<TAs extends ElementType = \"div\">(\n props: FieldRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n id,\n invalid = false,\n required = false,\n disabled = false,\n // Accepted for API compatibility but not rendered — a bare `name` isn't\n // meaningful on the wrapper element itself, only on the actual control.\n name: _name,\n ...consumerProps\n } = props as FieldRootProps<ElementType>;\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n \"data-uiify-field\": \"\",\n id,\n },\n render,\n state: { disabled, invalid, required, id },\n });\n}\n\nexport function FieldLabel(props: FieldLabelProps): ReactElement | null {\n const {\n className,\n children,\n fieldId,\n disabled = false,\n required = false,\n ...consumerProps\n } = props;\n const { controlId, labelId } = getFieldIds(fieldId);\n\n return useRenderElement({\n defaultTag: \"label\",\n props: {\n ...consumerProps,\n id: labelId,\n htmlFor: controlId,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n ...(className ? { className } : {}),\n children,\n },\n state: { disabled, required },\n });\n}\n\nexport function FieldControl<TAs extends ElementType = \"div\">(\n props: FieldControlProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n fieldId,\n disabled = false,\n invalid = false,\n required = false,\n ...consumerProps\n } = props as FieldControlProps<ElementType>;\n const { controlId, descriptionId, errorId, labelId } = getFieldIds(fieldId);\n const describedBy = [descriptionId, invalid ? errorId : undefined].filter(Boolean).join(\" \");\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n id: controlId,\n \"aria-labelledby\": labelId,\n \"aria-describedby\": describedBy || undefined,\n \"aria-invalid\": invalid || undefined,\n \"aria-required\": required || undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n },\n render,\n state: { disabled, invalid, required },\n });\n}\n\nexport function FieldDescription(props: FieldDescriptionProps): ReactElement | null {\n const { className, children, fieldId, disabled = false, ...consumerProps } = props;\n const { descriptionId } = getFieldIds(fieldId);\n\n return useRenderElement({\n defaultTag: \"p\",\n props: {\n ...consumerProps,\n id: descriptionId,\n \"data-disabled\": disabled ? \"\" : undefined,\n ...(className ? { className } : {}),\n children,\n },\n state: { disabled },\n });\n}\n\nexport function FieldError(props: FieldErrorProps): ReactElement | null {\n const { className, children, fieldId, invalid = false, ...consumerProps } = props;\n const { errorId } = getFieldIds(fieldId);\n\n const element = useRenderElement({\n defaultTag: \"p\",\n props: {\n ...consumerProps,\n id: errorId,\n role: \"alert\",\n \"data-invalid\": \"\",\n ...(className ? { className } : {}),\n children,\n },\n state: { invalid },\n });\n\n if (!invalid) return null;\n\n return element;\n}\n\nexport const Field = {\n Root: FieldRoot,\n Label: FieldLabel,\n Control: FieldControl,\n Description: FieldDescription,\n Error: FieldError,\n};\n"],"mappings":"AACA,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AASrB,SAAS,UACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA;AAAA;AAAA,IAGX,MAAM;AAAA,IACN,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,iBAAiB,WAAW,KAAK;AAAA,MACjC,gBAAgB,UAAU,KAAK;AAAA,MAC/B,iBAAiB,WAAW,KAAK;AAAA,MACjC,oBAAoB;AAAA,MACpB;AAAA,IACF;AAAA,IACA;AAAA,IACA,OAAO,EAAE,UAAU,SAAS,UAAU,GAAG;AAAA,EAC3C,CAAC;AACH;AAEO,SAAS,WAAW,OAA6C;AACtE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,EAAE,WAAW,QAAQ,IAAI,YAAY,OAAO;AAElD,SAAO,iBAAiB;AAAA,IACtB,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,iBAAiB,WAAW,KAAK;AAAA,MACjC,iBAAiB,WAAW,KAAK;AAAA,MACjC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,IACA,OAAO,EAAE,UAAU,SAAS;AAAA,EAC9B,CAAC;AACH;AAEO,SAAS,aACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,EAAE,WAAW,eAAe,SAAS,QAAQ,IAAI,YAAY,OAAO;AAC1E,QAAM,cAAc,CAAC,eAAe,UAAU,UAAU,MAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;
|
|
1
|
+
{"version":3,"sources":["../../../src/components/field/Field.tsx"],"sourcesContent":["import type { ElementType, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { getFieldIds } from \"./field-ids.js\";\nimport type {\n FieldRootProps,\n FieldControlProps,\n FieldLabelProps,\n FieldDescriptionProps,\n FieldErrorProps,\n} from \"./types.js\";\n\nexport function FieldRoot<TAs extends ElementType = \"div\">(\n props: FieldRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n id,\n invalid = false,\n required = false,\n disabled = false,\n // Accepted for API compatibility but not rendered — a bare `name` isn't\n // meaningful on the wrapper element itself, only on the actual control.\n name: _name,\n ...consumerProps\n } = props as FieldRootProps<ElementType>;\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n \"data-uiify-field\": \"\",\n id,\n },\n render,\n state: { disabled, invalid, required, id },\n });\n}\n\nexport function FieldLabel(props: FieldLabelProps): ReactElement | null {\n const {\n className,\n children,\n fieldId,\n disabled = false,\n required = false,\n ...consumerProps\n } = props;\n const { controlId, labelId } = getFieldIds(fieldId);\n\n return useRenderElement({\n defaultTag: \"label\",\n props: {\n ...consumerProps,\n id: labelId,\n htmlFor: controlId,\n \"data-part\": \"label\",\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n ...(className ? { className } : {}),\n children,\n },\n state: { disabled, required },\n });\n}\n\nexport function FieldControl<TAs extends ElementType = \"div\">(\n props: FieldControlProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n fieldId,\n disabled = false,\n invalid = false,\n required = false,\n ...consumerProps\n } = props as FieldControlProps<ElementType>;\n const { controlId, descriptionId, errorId, labelId } = getFieldIds(fieldId);\n const describedBy = [descriptionId, invalid ? errorId : undefined].filter(Boolean).join(\" \");\n const controlIdentity =\n as === \"input\"\n ? { \"data-uiify-input\": \"\" }\n : as === \"textarea\"\n ? { \"data-uiify-textarea\": \"\" }\n : {};\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n ...controlIdentity,\n id: controlId,\n \"data-part\": \"control\",\n \"aria-labelledby\": labelId,\n \"aria-describedby\": describedBy || undefined,\n \"aria-invalid\": invalid || undefined,\n \"aria-required\": required || undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n \"data-required\": required ? \"\" : undefined,\n },\n render,\n state: { disabled, invalid, required },\n });\n}\n\nexport function FieldDescription(props: FieldDescriptionProps): ReactElement | null {\n const { className, children, fieldId, disabled = false, ...consumerProps } = props;\n const { descriptionId } = getFieldIds(fieldId);\n\n return useRenderElement({\n defaultTag: \"p\",\n props: {\n ...consumerProps,\n id: descriptionId,\n \"data-part\": \"description\",\n \"data-disabled\": disabled ? \"\" : undefined,\n ...(className ? { className } : {}),\n children,\n },\n state: { disabled },\n });\n}\n\nexport function FieldError(props: FieldErrorProps): ReactElement | null {\n const { className, children, fieldId, invalid = false, ...consumerProps } = props;\n const { errorId } = getFieldIds(fieldId);\n\n const element = useRenderElement({\n defaultTag: \"p\",\n props: {\n ...consumerProps,\n id: errorId,\n \"data-part\": \"error\",\n role: \"alert\",\n \"data-invalid\": \"\",\n ...(className ? { className } : {}),\n children,\n },\n state: { invalid },\n });\n\n if (!invalid) return null;\n\n return element;\n}\n\nexport const Field = {\n Root: FieldRoot,\n Label: FieldLabel,\n Control: FieldControl,\n Description: FieldDescription,\n Error: FieldError,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileUpload.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/FileUpload.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAa,YAAY,EAAkB,MAAM,OAAO,CAAC;AAMlF,OAAO,KAAK,EAGV,mBAAmB,EACnB,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,4BAA4B,EAC7B,MAAM,YAAY,CAAC;AAKpB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"FileUpload.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/FileUpload.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAa,YAAY,EAAkB,MAAM,OAAO,CAAC;AAMlF,OAAO,KAAK,EAGV,mBAAmB,EACnB,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,4BAA4B,EAC7B,MAAM,YAAY,CAAC;AAKpB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAgFpF;yBAhFe,oBAAoB;;;AAmFpC,eAAO,MAAM,cAAc,6BAAuB,CAAC;AAEnD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,6BAA6B,GAAG,YAAY,GAAG,IAAI,CAoC/F;AAED,wBAAgB,iBAAiB,CAAC,GAAG,SAAS,WAAW,GAAG,OAAO,EACjE,KAAK,EAAE,sBAAsB,CAAC,GAAG,CAAC,GACjC,YAAY,GAAG,IAAI,CAkCrB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAChE,KAAK,EAAE,uBAAuB,CAAC,GAAG,CAAC,GAClC,YAAY,GAAG,IAAI,CAgCrB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,GAAG,IAAI,CAOjF;AAED,wBAAgB,cAAc,CAAC,GAAG,SAAS,WAAW,GAAG,IAAI,EAC3D,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAC9B,YAAY,GAAG,IAAI,CAwBrB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,4BAA4B,GAAG,YAAY,GAAG,IAAI,CAgB7F;AAED,eAAO,MAAM,UAAU;;;;;;;;CAQtB,CAAC"}
|
|
@@ -10,6 +10,7 @@ const [FileUploadProvider, useFileUploadContext] = createPartContext("FileUpload
|
|
|
10
10
|
function FileUploadRootClient(props) {
|
|
11
11
|
const {
|
|
12
12
|
accept = [],
|
|
13
|
+
className,
|
|
13
14
|
children,
|
|
14
15
|
defaultValue = [],
|
|
15
16
|
disabled = false,
|
|
@@ -74,7 +75,7 @@ function FileUploadRootClient(props) {
|
|
|
74
75
|
}),
|
|
75
76
|
[accept, disabled, inputId, multiple, openPicker, processFiles, removeAt, store]
|
|
76
77
|
);
|
|
77
|
-
return /* @__PURE__ */ jsx(FileUploadProvider, { value: contextValue, children });
|
|
78
|
+
return /* @__PURE__ */ jsx("div", { className, "data-uiify-file-upload": "", children: /* @__PURE__ */ jsx(FileUploadProvider, { value: contextValue, children }) });
|
|
78
79
|
}
|
|
79
80
|
FileUploadRootClient.displayName = "FileUploadRootClient";
|
|
80
81
|
const FileUploadRoot = FileUploadRootClient;
|
|
@@ -87,6 +88,7 @@ function FileUploadHiddenInput(props) {
|
|
|
87
88
|
ref: hiddenInputRef,
|
|
88
89
|
id: inputId,
|
|
89
90
|
type: "file",
|
|
91
|
+
"data-part": "input",
|
|
90
92
|
tabIndex: -1,
|
|
91
93
|
accept: accept.length > 0 ? accept.join(",") : void 0,
|
|
92
94
|
multiple: multiple || void 0,
|
|
@@ -132,6 +134,7 @@ function FileUploadTrigger(props) {
|
|
|
132
134
|
props: {
|
|
133
135
|
...consumerProps,
|
|
134
136
|
...interactiveProps,
|
|
137
|
+
"data-part": "trigger",
|
|
135
138
|
...className ? { className } : {},
|
|
136
139
|
children
|
|
137
140
|
},
|
|
@@ -149,6 +152,7 @@ function FileUploadDropzone(props) {
|
|
|
149
152
|
props: {
|
|
150
153
|
...consumerProps,
|
|
151
154
|
role: "region",
|
|
155
|
+
"data-part": "dropzone",
|
|
152
156
|
"aria-label": "Drop files here",
|
|
153
157
|
"data-disabled": disabled ? "" : void 0,
|
|
154
158
|
onDragOver: composeEventHandlers(consumerOnDragOver, (event) => {
|
|
@@ -170,7 +174,7 @@ function FileUploadList(props) {
|
|
|
170
174
|
const { children, className } = props;
|
|
171
175
|
return useRenderElement({
|
|
172
176
|
defaultTag: "ul",
|
|
173
|
-
props: { role: "list", ...className ? { className } : {}, children },
|
|
177
|
+
props: { role: "list", "data-part": "list", ...className ? { className } : {}, children },
|
|
174
178
|
state: {}
|
|
175
179
|
});
|
|
176
180
|
}
|
|
@@ -185,6 +189,7 @@ function FileUploadItem(props) {
|
|
|
185
189
|
props: {
|
|
186
190
|
...consumerProps,
|
|
187
191
|
role: "listitem",
|
|
192
|
+
"data-part": "item",
|
|
188
193
|
"data-name": file?.name,
|
|
189
194
|
...className ? { className } : {},
|
|
190
195
|
children: children ?? file?.name
|
|
@@ -203,6 +208,7 @@ function FileUploadItemRemove(props) {
|
|
|
203
208
|
props: {
|
|
204
209
|
type: "button",
|
|
205
210
|
"aria-label": "Remove file",
|
|
211
|
+
"data-part": "remove",
|
|
206
212
|
disabled: disabled || void 0,
|
|
207
213
|
...className ? { className } : {},
|
|
208
214
|
onClick: () => removeAt(index)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/file-upload/FileUpload.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, useSyncExternalStore } from \"react\";\nimport type { ElementType, DragEvent, ReactElement, SyntheticEvent } from \"react\";\nimport { useControllableState, useId } from \"@gunkin/uiify/hooks\";\nimport { createPartContext } from \"@gunkin/uiify/core\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { createFileUploadStore, validateFiles } from \"./file-upload-store.js\";\nimport type {\n FileUploadStore,\n FileUploadContextValue,\n FileUploadRootProps,\n FileUploadHiddenInputOwnProps,\n FileUploadTriggerProps,\n FileUploadDropzoneProps,\n FileUploadListOwnProps,\n FileUploadItemProps,\n FileUploadItemRemoveOwnProps,\n} from \"./types.js\";\n\nconst [FileUploadProvider, useFileUploadContext] =\n createPartContext<FileUploadContextValue>(\"FileUpload\");\n\nexport function FileUploadRootClient(props: FileUploadRootProps): ReactElement | null {\n const {\n accept = [],\n children,\n defaultValue = [],\n disabled = false,\n maxFiles,\n maxSize,\n minSize,\n multiple = false,\n onChange,\n onReject,\n value: controlledValue,\n } = props;\n\n const inputId = useId();\n const hiddenInputRef = useRef<HTMLInputElement | null>(null);\n const [files, setFiles] = useControllableState<File[]>({\n defaultValue: [...defaultValue],\n ...(controlledValue !== undefined ? { value: [...controlledValue] } : {}),\n ...(onChange ? { onChange } : {}),\n });\n\n const storeRef = useRef<FileUploadStore | null>(null);\n storeRef.current ??= createFileUploadStore(files);\n const store = storeRef.current;\n\n const processFiles = useCallback(\n (list: FileList | readonly File[]) => {\n if (disabled) return;\n const incoming = Array.from(list);\n const { accepted, rejected } = validateFiles(incoming, {\n accept,\n multiple,\n ...(maxFiles !== undefined ? { maxFiles } : {}),\n ...(maxSize !== undefined ? { maxSize } : {}),\n ...(minSize !== undefined ? { minSize } : {}),\n });\n if (rejected.length > 0) onReject?.(rejected);\n if (accepted.length === 0) return;\n const next = multiple ? [...store.getFiles(), ...accepted] : accepted;\n store.setFiles(next);\n setFiles(next);\n },\n [accept, disabled, maxFiles, maxSize, minSize, multiple, onReject, setFiles, store],\n );\n\n const openPicker = useCallback(() => {\n hiddenInputRef.current?.click();\n }, []);\n\n const removeAt = useCallback(\n (index: number) => {\n store.removeAt(index);\n setFiles(store.getFiles());\n },\n [setFiles, store],\n );\n\n const contextValue = useMemo(\n () => ({\n accept,\n disabled,\n hiddenInputRef,\n inputId,\n multiple,\n openPicker,\n processFiles,\n removeAt,\n store,\n }),\n [accept, disabled, inputId, multiple, openPicker, processFiles, removeAt, store],\n );\n\n return <FileUploadProvider value={contextValue}>{children}</FileUploadProvider>;\n}\nFileUploadRootClient.displayName = \"FileUploadRootClient\";\n\nexport const FileUploadRoot = FileUploadRootClient;\n\nexport function FileUploadHiddenInput(props: FileUploadHiddenInputOwnProps): ReactElement | null {\n const { className } = props;\n const { accept, disabled, hiddenInputRef, inputId, multiple, processFiles } =\n useFileUploadContext(\"HiddenInput\");\n\n return useRenderElement({\n defaultTag: \"input\",\n props: {\n ref: hiddenInputRef,\n id: inputId,\n type: \"file\",\n tabIndex: -1,\n accept: accept.length > 0 ? accept.join(\",\") : undefined,\n multiple: multiple || undefined,\n style: {\n border: 0,\n clip: \"rect(0 0 0 0)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: 0,\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n },\n disabled: disabled || undefined,\n ...(className ? { className } : {}),\n onChange(event: SyntheticEvent<HTMLInputElement>) {\n const list = event.currentTarget.files;\n if (list) processFiles(list);\n event.currentTarget.value = \"\";\n },\n },\n state: { disabled },\n });\n}\n\nexport function FileUploadTrigger<TAs extends ElementType = \"label\">(\n props: FileUploadTriggerProps<TAs>,\n): ReactElement | null {\n const { as, render, className, children, ...consumerProps } =\n props as FileUploadTriggerProps<ElementType>;\n const { disabled, inputId, openPicker } = useFileUploadContext(\"Trigger\");\n const tag = typeof as === \"string\" ? as : undefined;\n const { onClick: consumerOnClick } = consumerProps as {\n onClick?: (event: SyntheticEvent<HTMLElement>) => void;\n };\n const interactiveProps =\n tag === \"button\"\n ? {\n type: \"button\" as const,\n \"aria-controls\": inputId,\n disabled: disabled || undefined,\n onClick: composeEventHandlers(consumerOnClick, openPicker),\n }\n : {\n htmlFor: inputId,\n \"aria-controls\": inputId,\n };\n\n return useRenderElement({\n as,\n defaultTag: \"label\",\n props: {\n ...consumerProps,\n ...interactiveProps,\n ...(className ? { className } : {}),\n children,\n },\n render,\n state: { disabled },\n });\n}\n\nexport function FileUploadDropzone<TAs extends ElementType = \"div\">(\n props: FileUploadDropzoneProps<TAs>,\n): ReactElement | null {\n const { as, render, className, children, ...consumerProps } =\n props as FileUploadDropzoneProps<\"div\">;\n const { disabled, processFiles } = useFileUploadContext(\"Dropzone\");\n const { onDragOver: consumerOnDragOver, onDrop: consumerOnDrop } = consumerProps as {\n onDragOver?: (event: DragEvent<HTMLElement>) => void;\n onDrop?: (event: DragEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n role: \"region\",\n \"aria-label\": \"Drop files here\",\n \"data-disabled\": disabled ? \"\" : undefined,\n onDragOver: composeEventHandlers(consumerOnDragOver, (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n }),\n onDrop: composeEventHandlers(consumerOnDrop, (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n if (disabled) return;\n processFiles(event.dataTransfer.files);\n }),\n ...(className ? { className } : {}),\n children,\n },\n render,\n state: { disabled },\n });\n}\n\nexport function FileUploadList(props: FileUploadListOwnProps): ReactElement | null {\n const { children, className } = props;\n return useRenderElement({\n defaultTag: \"ul\",\n props: { role: \"list\", ...(className ? { className } : {}), children },\n state: {},\n });\n}\n\nexport function FileUploadItem<TAs extends ElementType = \"li\">(\n props: FileUploadItemProps<TAs>,\n): ReactElement | null {\n const { as, render, children, className, index, ...consumerProps } =\n props as FileUploadItemProps<\"li\">;\n const { store } = useFileUploadContext(\"Item\");\n const files = useSyncExternalStore(store.subscribe, store.getFiles, store.getFiles);\n const file = files[index];\n\n const element = useRenderElement({\n as,\n defaultTag: \"li\",\n props: {\n ...consumerProps,\n role: \"listitem\",\n \"data-name\": file?.name,\n ...(className ? { className } : {}),\n children: children ?? file?.name,\n },\n render,\n state: { index },\n });\n\n if (!file) return null;\n return element;\n}\n\nexport function FileUploadItemRemove(props: FileUploadItemRemoveOwnProps): ReactElement | null {\n const { className, index } = props;\n const { disabled, removeAt } = useFileUploadContext(\"ItemRemove\");\n\n return useRenderElement({\n defaultTag: \"button\",\n props: {\n type: \"button\",\n \"aria-label\": \"Remove file\",\n disabled: disabled || undefined,\n ...(className ? { className } : {}),\n onClick: () => removeAt(index),\n },\n state: { disabled },\n });\n}\n\nexport const FileUpload = {\n Dropzone: FileUploadDropzone,\n HiddenInput: FileUploadHiddenInput,\n Item: FileUploadItem,\n ItemRemove: FileUploadItemRemove,\n List: FileUploadList,\n Root: FileUploadRoot,\n Trigger: FileUploadTrigger,\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/file-upload/FileUpload.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, useSyncExternalStore } from \"react\";\nimport type { ElementType, DragEvent, ReactElement, SyntheticEvent } from \"react\";\nimport { useControllableState, useId } from \"@gunkin/uiify/hooks\";\nimport { createPartContext } from \"@gunkin/uiify/core\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { createFileUploadStore, validateFiles } from \"./file-upload-store.js\";\nimport type {\n FileUploadStore,\n FileUploadContextValue,\n FileUploadRootProps,\n FileUploadHiddenInputOwnProps,\n FileUploadTriggerProps,\n FileUploadDropzoneProps,\n FileUploadListOwnProps,\n FileUploadItemProps,\n FileUploadItemRemoveOwnProps,\n} from \"./types.js\";\n\nconst [FileUploadProvider, useFileUploadContext] =\n createPartContext<FileUploadContextValue>(\"FileUpload\");\n\nexport function FileUploadRootClient(props: FileUploadRootProps): ReactElement | null {\n const {\n accept = [],\n className,\n children,\n defaultValue = [],\n disabled = false,\n maxFiles,\n maxSize,\n minSize,\n multiple = false,\n onChange,\n onReject,\n value: controlledValue,\n } = props;\n\n const inputId = useId();\n const hiddenInputRef = useRef<HTMLInputElement | null>(null);\n const [files, setFiles] = useControllableState<File[]>({\n defaultValue: [...defaultValue],\n ...(controlledValue !== undefined ? { value: [...controlledValue] } : {}),\n ...(onChange ? { onChange } : {}),\n });\n\n const storeRef = useRef<FileUploadStore | null>(null);\n storeRef.current ??= createFileUploadStore(files);\n const store = storeRef.current;\n\n const processFiles = useCallback(\n (list: FileList | readonly File[]) => {\n if (disabled) return;\n const incoming = Array.from(list);\n const { accepted, rejected } = validateFiles(incoming, {\n accept,\n multiple,\n ...(maxFiles !== undefined ? { maxFiles } : {}),\n ...(maxSize !== undefined ? { maxSize } : {}),\n ...(minSize !== undefined ? { minSize } : {}),\n });\n if (rejected.length > 0) onReject?.(rejected);\n if (accepted.length === 0) return;\n const next = multiple ? [...store.getFiles(), ...accepted] : accepted;\n store.setFiles(next);\n setFiles(next);\n },\n [accept, disabled, maxFiles, maxSize, minSize, multiple, onReject, setFiles, store],\n );\n\n const openPicker = useCallback(() => {\n hiddenInputRef.current?.click();\n }, []);\n\n const removeAt = useCallback(\n (index: number) => {\n store.removeAt(index);\n setFiles(store.getFiles());\n },\n [setFiles, store],\n );\n\n const contextValue = useMemo(\n () => ({\n accept,\n disabled,\n hiddenInputRef,\n inputId,\n multiple,\n openPicker,\n processFiles,\n removeAt,\n store,\n }),\n [accept, disabled, inputId, multiple, openPicker, processFiles, removeAt, store],\n );\n\n return (\n <div className={className} data-uiify-file-upload=\"\">\n <FileUploadProvider value={contextValue}>{children}</FileUploadProvider>\n </div>\n );\n}\nFileUploadRootClient.displayName = \"FileUploadRootClient\";\n\nexport const FileUploadRoot = FileUploadRootClient;\n\nexport function FileUploadHiddenInput(props: FileUploadHiddenInputOwnProps): ReactElement | null {\n const { className } = props;\n const { accept, disabled, hiddenInputRef, inputId, multiple, processFiles } =\n useFileUploadContext(\"HiddenInput\");\n\n return useRenderElement({\n defaultTag: \"input\",\n props: {\n ref: hiddenInputRef,\n id: inputId,\n type: \"file\",\n \"data-part\": \"input\",\n tabIndex: -1,\n accept: accept.length > 0 ? accept.join(\",\") : undefined,\n multiple: multiple || undefined,\n style: {\n border: 0,\n clip: \"rect(0 0 0 0)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: 0,\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n },\n disabled: disabled || undefined,\n ...(className ? { className } : {}),\n onChange(event: SyntheticEvent<HTMLInputElement>) {\n const list = event.currentTarget.files;\n if (list) processFiles(list);\n event.currentTarget.value = \"\";\n },\n },\n state: { disabled },\n });\n}\n\nexport function FileUploadTrigger<TAs extends ElementType = \"label\">(\n props: FileUploadTriggerProps<TAs>,\n): ReactElement | null {\n const { as, render, className, children, ...consumerProps } =\n props as FileUploadTriggerProps<ElementType>;\n const { disabled, inputId, openPicker } = useFileUploadContext(\"Trigger\");\n const tag = typeof as === \"string\" ? as : undefined;\n const { onClick: consumerOnClick } = consumerProps as {\n onClick?: (event: SyntheticEvent<HTMLElement>) => void;\n };\n const interactiveProps =\n tag === \"button\"\n ? {\n type: \"button\" as const,\n \"aria-controls\": inputId,\n disabled: disabled || undefined,\n onClick: composeEventHandlers(consumerOnClick, openPicker),\n }\n : {\n htmlFor: inputId,\n \"aria-controls\": inputId,\n };\n\n return useRenderElement({\n as,\n defaultTag: \"label\",\n props: {\n ...consumerProps,\n ...interactiveProps,\n \"data-part\": \"trigger\",\n ...(className ? { className } : {}),\n children,\n },\n render,\n state: { disabled },\n });\n}\n\nexport function FileUploadDropzone<TAs extends ElementType = \"div\">(\n props: FileUploadDropzoneProps<TAs>,\n): ReactElement | null {\n const { as, render, className, children, ...consumerProps } =\n props as FileUploadDropzoneProps<\"div\">;\n const { disabled, processFiles } = useFileUploadContext(\"Dropzone\");\n const { onDragOver: consumerOnDragOver, onDrop: consumerOnDrop } = consumerProps as {\n onDragOver?: (event: DragEvent<HTMLElement>) => void;\n onDrop?: (event: DragEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n role: \"region\",\n \"data-part\": \"dropzone\",\n \"aria-label\": \"Drop files here\",\n \"data-disabled\": disabled ? \"\" : undefined,\n onDragOver: composeEventHandlers(consumerOnDragOver, (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n }),\n onDrop: composeEventHandlers(consumerOnDrop, (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n if (disabled) return;\n processFiles(event.dataTransfer.files);\n }),\n ...(className ? { className } : {}),\n children,\n },\n render,\n state: { disabled },\n });\n}\n\nexport function FileUploadList(props: FileUploadListOwnProps): ReactElement | null {\n const { children, className } = props;\n return useRenderElement({\n defaultTag: \"ul\",\n props: { role: \"list\", \"data-part\": \"list\", ...(className ? { className } : {}), children },\n state: {},\n });\n}\n\nexport function FileUploadItem<TAs extends ElementType = \"li\">(\n props: FileUploadItemProps<TAs>,\n): ReactElement | null {\n const { as, render, children, className, index, ...consumerProps } =\n props as FileUploadItemProps<\"li\">;\n const { store } = useFileUploadContext(\"Item\");\n const files = useSyncExternalStore(store.subscribe, store.getFiles, store.getFiles);\n const file = files[index];\n\n const element = useRenderElement({\n as,\n defaultTag: \"li\",\n props: {\n ...consumerProps,\n role: \"listitem\",\n \"data-part\": \"item\",\n \"data-name\": file?.name,\n ...(className ? { className } : {}),\n children: children ?? file?.name,\n },\n render,\n state: { index },\n });\n\n if (!file) return null;\n return element;\n}\n\nexport function FileUploadItemRemove(props: FileUploadItemRemoveOwnProps): ReactElement | null {\n const { className, index } = props;\n const { disabled, removeAt } = useFileUploadContext(\"ItemRemove\");\n\n return useRenderElement({\n defaultTag: \"button\",\n props: {\n type: \"button\",\n \"aria-label\": \"Remove file\",\n \"data-part\": \"remove\",\n disabled: disabled || undefined,\n ...(className ? { className } : {}),\n onClick: () => removeAt(index),\n },\n state: { disabled },\n });\n}\n\nexport const FileUpload = {\n Dropzone: FileUploadDropzone,\n HiddenInput: FileUploadHiddenInput,\n Item: FileUploadItem,\n ItemRemove: FileUploadItemRemove,\n List: FileUploadList,\n Root: FileUploadRoot,\n Trigger: FileUploadTrigger,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -31,6 +31,7 @@ export interface FileUploadContextValue {
|
|
|
31
31
|
readonly store: FileUploadStore;
|
|
32
32
|
}
|
|
33
33
|
export interface FileUploadRootOwnProps {
|
|
34
|
+
readonly className?: string;
|
|
34
35
|
readonly accept?: readonly string[];
|
|
35
36
|
readonly defaultValue?: readonly File[];
|
|
36
37
|
readonly disabled?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/file-upload/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HoverCard.d.ts","sourceRoot":"","sources":["../../../src/components/hover-card/HoverCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,WAAW,EAA4B,YAAY,EAAE,MAAM,OAAO,CAAC;AAehG,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAenG,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CA+B5E;yBA/Be,aAAa;;;AAkC7B,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACjE,KAAK,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAChC,YAAY,GAAG,IAAI,CAkDrB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC9D,KAAK,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAChC,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"HoverCard.d.ts","sourceRoot":"","sources":["../../../src/components/hover-card/HoverCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,WAAW,EAA4B,YAAY,EAAE,MAAM,OAAO,CAAC;AAehG,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAenG,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CA+B5E;yBA/Be,aAAa;;;AAkC7B,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACjE,KAAK,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAChC,YAAY,GAAG,IAAI,CAkDrB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC9D,KAAK,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAChC,YAAY,GAAG,IAAI,CA8ErB;AAED,eAAO,MAAM,SAAS;;;;CAIrB,CAAC"}
|
|
@@ -135,6 +135,8 @@ function HoverCardContent(props) {
|
|
|
135
135
|
popover: "manual",
|
|
136
136
|
// The consumer's own non-empty `id` wins; otherwise the context-generated id is used.
|
|
137
137
|
id: resolvedId,
|
|
138
|
+
"data-part": "content",
|
|
139
|
+
"data-uiify-hover-card": "",
|
|
138
140
|
"data-state": open ? "open" : "closed",
|
|
139
141
|
...className ? { className } : {},
|
|
140
142
|
onPointerEnter: composeEventHandlers(consumerOnPointerEnter, () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/hover-card/HoverCard.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRef } from \"react\";\nimport type { CSSProperties, ElementType, FocusEvent, PointerEvent, ReactElement } from \"react\";\nimport { useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport {\n createAnchorPositionerProps,\n createAnchorTriggerProps,\n anchorNameForId,\n} from \"@gunkin/uiify/core/anchor-position\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport {\n createPartContext,\n splitRef,\n useHoverOverlay,\n type HoverIntentStore,\n} from \"@gunkin/uiify/core\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { HoverCardContentProps, HoverCardRootProps, HoverCardTriggerProps } from \"./types.js\";\n\ninterface HoverCardClientContextValue {\n readonly anchorId: string;\n readonly closeCard: () => void;\n readonly contentId: string;\n readonly intent: HoverIntentStore;\n readonly open: boolean;\n readonly openCard: (immediate?: boolean) => void;\n readonly setContentId: (id: string) => void;\n}\n\nconst [HoverCardProvider, useHoverCardContext] =\n createPartContext<HoverCardClientContextValue>(\"HoverCard\");\n\nexport function HoverCardRoot(props: HoverCardRootProps): ReactElement | null {\n const {\n children,\n closeDelay = 300,\n defaultOpen = false,\n id,\n onOpenChange,\n open,\n openDelay = 700,\n } = props;\n const overlay = useHoverOverlay({\n closeDelay,\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(id !== undefined ? { id } : {}),\n idPrefix: \"uiify-hover-card\",\n ...(onOpenChange ? { onOpenChange } : {}),\n ...(open !== undefined ? { open } : {}),\n openDelay,\n });\n\n const contextValue: HoverCardClientContextValue = {\n anchorId: overlay.anchorId,\n closeCard: overlay.closeOverlay,\n contentId: overlay.contentId,\n intent: overlay.intent,\n open: overlay.open,\n openCard: overlay.openOverlay,\n setContentId: overlay.setContentId,\n };\n\n return <HoverCardProvider value={contextValue}>{children}</HoverCardProvider>;\n}\nHoverCardRoot.displayName = \"HoverCardRoot\";\n\nexport function HoverCardTrigger<TAs extends ElementType = \"button\">(\n props: HoverCardTriggerProps<TAs>,\n): ReactElement | null {\n const { as, render, className, ...consumerProps } = props as HoverCardTriggerProps<\"button\">;\n const { anchorId, closeCard, contentId, intent, open, openCard } = useHoverCardContext(\"Trigger\");\n const nativeButton = !as || as === \"button\";\n const consumerStyle = (consumerProps as { style?: CSSProperties }).style;\n const {\n onBlur: consumerOnBlur,\n onFocus: consumerOnFocus,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = consumerProps as {\n onBlur?: (event: FocusEvent<HTMLElement>) => void;\n onFocus?: (event: FocusEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n ...createAnchorTriggerProps(anchorNameForId(anchorId)),\n ...(consumerStyle ? { style: consumerStyle } : {}),\n \"aria-controls\": contentId,\n \"aria-expanded\": open,\n ...(nativeButton ? { type: \"button\" } : {}),\n ...(className ? { className } : {}),\n onBlur: composeEventHandlers(consumerOnBlur, (event: FocusEvent<HTMLElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) closeCard();\n }),\n onFocus: composeEventHandlers(consumerOnFocus, () => {\n openCard(true);\n }),\n onPointerEnter: composeEventHandlers(\n consumerOnPointerEnter,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") openCard(false);\n },\n ),\n onPointerLeave: composeEventHandlers(\n consumerOnPointerLeave,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") intent.scheduleClose(() => closeCard());\n },\n ),\n },\n render,\n state: { open, positioning: \"native\" as const },\n });\n}\n\nexport function HoverCardContent<TAs extends ElementType = \"div\">(\n props: HoverCardContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"center\",\n as,\n render,\n className,\n side = \"bottom\",\n ...consumerProps\n } = props as HoverCardContentProps<\"div\">;\n const { anchorId, closeCard, contentId, intent, open, setContentId } =\n useHoverCardContext(\"Content\");\n const [consumerRef, domProps] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const popupRef = useRef<HTMLElement | null>(null);\n const mergedRef = useMergedRefs(popupRef, consumerRef);\n const consumerDomProps = domProps as { id?: string; style?: CSSProperties };\n const resolvedId =\n typeof consumerDomProps.id === \"string\" && consumerDomProps.id.length > 0\n ? consumerDomProps.id\n : contentId;\n const consumerStyle = consumerDomProps.style;\n\n useIsomorphicLayoutEffect(() => {\n setContentId(resolvedId);\n }, [resolvedId, setContentId]);\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 popup = popupRef.current;\n if (!popup) return;\n try {\n if (open && !popup.matches(\":popover-open\")) popup.showPopover();\n if (!open && popup.matches(\":popover-open\")) popup.hidePopover();\n } catch {\n // The node may have disconnected between render and layout effect.\n }\n }, [open]);\n\n const { onPointerEnter: consumerOnPointerEnter, onPointerLeave: consumerOnPointerLeave } =\n domProps as {\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...domProps,\n ...createAnchorPositionerProps({\n align,\n anchorName: anchorNameForId(anchorId),\n side,\n }),\n ...(consumerStyle ? { style: consumerStyle } : {}),\n ref: mergedRef,\n popover: \"manual\",\n // The consumer's own non-empty `id` wins; otherwise the context-generated id is used.\n id: resolvedId,\n \"data-state\": open ? \"open\" : \"closed\",\n ...(className ? { className } : {}),\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, () => {\n intent.clearCloseTimer();\n }),\n onPointerLeave: composeEventHandlers(\n consumerOnPointerLeave,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") intent.scheduleClose(() => closeCard());\n },\n ),\n },\n render,\n state: { open, positioning: \"native\" as const },\n });\n}\n\nexport const HoverCard = {\n Content: HoverCardContent,\n Root: HoverCardRoot,\n Trigger: HoverCardTrigger,\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/hover-card/HoverCard.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRef } from \"react\";\nimport type { CSSProperties, ElementType, FocusEvent, PointerEvent, ReactElement } from \"react\";\nimport { useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport {\n createAnchorPositionerProps,\n createAnchorTriggerProps,\n anchorNameForId,\n} from \"@gunkin/uiify/core/anchor-position\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport {\n createPartContext,\n splitRef,\n useHoverOverlay,\n type HoverIntentStore,\n} from \"@gunkin/uiify/core\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { HoverCardContentProps, HoverCardRootProps, HoverCardTriggerProps } from \"./types.js\";\n\ninterface HoverCardClientContextValue {\n readonly anchorId: string;\n readonly closeCard: () => void;\n readonly contentId: string;\n readonly intent: HoverIntentStore;\n readonly open: boolean;\n readonly openCard: (immediate?: boolean) => void;\n readonly setContentId: (id: string) => void;\n}\n\nconst [HoverCardProvider, useHoverCardContext] =\n createPartContext<HoverCardClientContextValue>(\"HoverCard\");\n\nexport function HoverCardRoot(props: HoverCardRootProps): ReactElement | null {\n const {\n children,\n closeDelay = 300,\n defaultOpen = false,\n id,\n onOpenChange,\n open,\n openDelay = 700,\n } = props;\n const overlay = useHoverOverlay({\n closeDelay,\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(id !== undefined ? { id } : {}),\n idPrefix: \"uiify-hover-card\",\n ...(onOpenChange ? { onOpenChange } : {}),\n ...(open !== undefined ? { open } : {}),\n openDelay,\n });\n\n const contextValue: HoverCardClientContextValue = {\n anchorId: overlay.anchorId,\n closeCard: overlay.closeOverlay,\n contentId: overlay.contentId,\n intent: overlay.intent,\n open: overlay.open,\n openCard: overlay.openOverlay,\n setContentId: overlay.setContentId,\n };\n\n return <HoverCardProvider value={contextValue}>{children}</HoverCardProvider>;\n}\nHoverCardRoot.displayName = \"HoverCardRoot\";\n\nexport function HoverCardTrigger<TAs extends ElementType = \"button\">(\n props: HoverCardTriggerProps<TAs>,\n): ReactElement | null {\n const { as, render, className, ...consumerProps } = props as HoverCardTriggerProps<\"button\">;\n const { anchorId, closeCard, contentId, intent, open, openCard } = useHoverCardContext(\"Trigger\");\n const nativeButton = !as || as === \"button\";\n const consumerStyle = (consumerProps as { style?: CSSProperties }).style;\n const {\n onBlur: consumerOnBlur,\n onFocus: consumerOnFocus,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = consumerProps as {\n onBlur?: (event: FocusEvent<HTMLElement>) => void;\n onFocus?: (event: FocusEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n ...createAnchorTriggerProps(anchorNameForId(anchorId)),\n ...(consumerStyle ? { style: consumerStyle } : {}),\n \"aria-controls\": contentId,\n \"aria-expanded\": open,\n ...(nativeButton ? { type: \"button\" } : {}),\n ...(className ? { className } : {}),\n onBlur: composeEventHandlers(consumerOnBlur, (event: FocusEvent<HTMLElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) closeCard();\n }),\n onFocus: composeEventHandlers(consumerOnFocus, () => {\n openCard(true);\n }),\n onPointerEnter: composeEventHandlers(\n consumerOnPointerEnter,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") openCard(false);\n },\n ),\n onPointerLeave: composeEventHandlers(\n consumerOnPointerLeave,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") intent.scheduleClose(() => closeCard());\n },\n ),\n },\n render,\n state: { open, positioning: \"native\" as const },\n });\n}\n\nexport function HoverCardContent<TAs extends ElementType = \"div\">(\n props: HoverCardContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"center\",\n as,\n render,\n className,\n side = \"bottom\",\n ...consumerProps\n } = props as HoverCardContentProps<\"div\">;\n const { anchorId, closeCard, contentId, intent, open, setContentId } =\n useHoverCardContext(\"Content\");\n const [consumerRef, domProps] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const popupRef = useRef<HTMLElement | null>(null);\n const mergedRef = useMergedRefs(popupRef, consumerRef);\n const consumerDomProps = domProps as { id?: string; style?: CSSProperties };\n const resolvedId =\n typeof consumerDomProps.id === \"string\" && consumerDomProps.id.length > 0\n ? consumerDomProps.id\n : contentId;\n const consumerStyle = consumerDomProps.style;\n\n useIsomorphicLayoutEffect(() => {\n setContentId(resolvedId);\n }, [resolvedId, setContentId]);\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 popup = popupRef.current;\n if (!popup) return;\n try {\n if (open && !popup.matches(\":popover-open\")) popup.showPopover();\n if (!open && popup.matches(\":popover-open\")) popup.hidePopover();\n } catch {\n // The node may have disconnected between render and layout effect.\n }\n }, [open]);\n\n const { onPointerEnter: consumerOnPointerEnter, onPointerLeave: consumerOnPointerLeave } =\n domProps as {\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...domProps,\n ...createAnchorPositionerProps({\n align,\n anchorName: anchorNameForId(anchorId),\n side,\n }),\n ...(consumerStyle ? { style: consumerStyle } : {}),\n ref: mergedRef,\n popover: \"manual\",\n // The consumer's own non-empty `id` wins; otherwise the context-generated id is used.\n id: resolvedId,\n \"data-part\": \"content\",\n \"data-uiify-hover-card\": \"\",\n \"data-state\": open ? \"open\" : \"closed\",\n ...(className ? { className } : {}),\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, () => {\n intent.clearCloseTimer();\n }),\n onPointerLeave: composeEventHandlers(\n consumerOnPointerLeave,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") intent.scheduleClose(() => closeCard());\n },\n ),\n },\n render,\n state: { open, positioning: \"native\" as const },\n });\n}\n\nexport const HoverCard = {\n Content: HoverCardContent,\n Root: HoverCardRoot,\n Trigger: HoverCardTrigger,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,OAAO,CAAC;AAGvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,KAAK,CAAC,GAAG,SAAS,WAAW,GAAG,OAAO,EACrD,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GACrB,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAkB,MAAM,OAAO,CAAC;AAGvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,KAAK,CAAC,GAAG,SAAS,WAAW,GAAG,OAAO,EACrD,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GACrB,YAAY,GAAG,IAAI,CA2CrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/input/Input.tsx"],"sourcesContent":["import type { ElementType, ReactElement, SyntheticEvent } from \"react\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { InputProps } from \"./types.js\";\n\nexport function Input<TAs extends ElementType = \"input\">(\n props: InputProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n value,\n defaultValue,\n onValueChange,\n disabled = false,\n readOnly = false,\n invalid = false,\n ...consumerProps\n } = props as InputProps<\"input\">;\n\n const isControlled = value !== undefined;\n\n const handleChange = (event: SyntheticEvent<HTMLInputElement>): void => {\n onValueChange?.(event.currentTarget.value);\n };\n\n const consumerOnChange = (\n consumerProps as Record<string, unknown> & {\n onChange?: (event: SyntheticEvent<HTMLInputElement>) => void;\n }\n ).onChange;\n\n return useRenderElement({\n as,\n defaultTag: \"input\",\n props: {\n ...consumerProps,\n \"aria-invalid\": invalid || undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-readonly\": readOnly ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n disabled: disabled || undefined,\n readOnly: readOnly || undefined,\n onChange: composeEventHandlers(consumerOnChange, handleChange),\n ...(isControlled ? { value } : defaultValue !== undefined ? { defaultValue } : {}),\n },\n render,\n state: { disabled, readOnly, invalid },\n });\n}\n"],"mappings":"AACA,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AAG1B,SAAS,MACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,eAAe,UAAU;AAE/B,QAAM,eAAe,CAAC,UAAkD;AACtE,oBAAgB,MAAM,cAAc,KAAK;AAAA,EAC3C;AAEA,QAAM,mBACJ,cAGA;AAEF,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB,WAAW;AAAA,MAC3B,iBAAiB,WAAW,KAAK;AAAA,MACjC,iBAAiB,WAAW,KAAK;AAAA,MACjC,gBAAgB,UAAU,KAAK;AAAA,MAC/B,UAAU,YAAY;AAAA,MACtB,UAAU,YAAY;AAAA,MACtB,UAAU,qBAAqB,kBAAkB,YAAY;AAAA,MAC7D,GAAI,eAAe,EAAE,MAAM,IAAI,iBAAiB,SAAY,EAAE,aAAa,IAAI,CAAC;AAAA,IAClF;AAAA,IACA;AAAA,IACA,OAAO,EAAE,UAAU,UAAU,QAAQ;AAAA,EACvC,CAAC;AACH;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/input/Input.tsx"],"sourcesContent":["import type { ElementType, ReactElement, SyntheticEvent } from \"react\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { InputProps } from \"./types.js\";\n\nexport function Input<TAs extends ElementType = \"input\">(\n props: InputProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n value,\n defaultValue,\n onValueChange,\n disabled = false,\n readOnly = false,\n invalid = false,\n ...consumerProps\n } = props as InputProps<\"input\">;\n\n const isControlled = value !== undefined;\n\n const handleChange = (event: SyntheticEvent<HTMLInputElement>): void => {\n onValueChange?.(event.currentTarget.value);\n };\n\n const consumerOnChange = (\n consumerProps as Record<string, unknown> & {\n onChange?: (event: SyntheticEvent<HTMLInputElement>) => void;\n }\n ).onChange;\n\n return useRenderElement({\n as,\n defaultTag: \"input\",\n props: {\n ...consumerProps,\n \"data-uiify-input\": \"\",\n \"aria-invalid\": invalid || undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-readonly\": readOnly ? \"\" : undefined,\n \"data-invalid\": invalid ? \"\" : undefined,\n disabled: disabled || undefined,\n readOnly: readOnly || undefined,\n onChange: composeEventHandlers(consumerOnChange, handleChange),\n ...(isControlled ? { value } : defaultValue !== undefined ? { defaultValue } : {}),\n },\n render,\n state: { disabled, readOnly, invalid },\n });\n}\n"],"mappings":"AACA,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AAG1B,SAAS,MACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,eAAe,UAAU;AAE/B,QAAM,eAAe,CAAC,UAAkD;AACtE,oBAAgB,MAAM,cAAc,KAAK;AAAA,EAC3C;AAEA,QAAM,mBACJ,cAGA;AAEF,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,oBAAoB;AAAA,MACpB,gBAAgB,WAAW;AAAA,MAC3B,iBAAiB,WAAW,KAAK;AAAA,MACjC,iBAAiB,WAAW,KAAK;AAAA,MACjC,gBAAgB,UAAU,KAAK;AAAA,MAC/B,UAAU,YAAY;AAAA,MACtB,UAAU,YAAY;AAAA,MACtB,UAAU,qBAAqB,kBAAkB,YAAY;AAAA,MAC7D,GAAI,eAAe,EAAE,MAAM,IAAI,iBAAiB,SAAY,EAAE,aAAa,IAAI,CAAC;AAAA,IAClF;AAAA,IACA;AAAA,IACA,OAAO,EAAE,UAAU,UAAU,QAAQ;AAAA,EACvC,CAAC;AACH;","names":[]}
|
|
@@ -3,8 +3,7 @@ import type { ChoiceGroupProps, ChoiceItem } from "./types.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* Built on `@gunkin/uiify/elements/choice`: this component
|
|
5
5
|
* stays the ergonomic, items-array API six components share, now implemented as a thin map
|
|
6
|
-
* from `items` onto `Choice.Item`
|
|
7
|
-
* into the element's explicit `inputProps`/`labelProps`/`panelProps` escape hatches.
|
|
6
|
+
* from `items` onto `Choice.Item` with canonical `data-part` anatomy.
|
|
8
7
|
*/
|
|
9
8
|
export declare function ChoiceGroup<TItem extends ChoiceItem>(props: ChoiceGroupProps<TItem>): ReactElement;
|
|
10
9
|
export declare namespace ChoiceGroup {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChoiceGroup.d.ts","sourceRoot":"","sources":["../../../../src/components/internal/choice-family/ChoiceGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE/D
|
|
1
|
+
{"version":3,"file":"ChoiceGroup.d.ts","sourceRoot":"","sources":["../../../../src/components/internal/choice-family/ChoiceGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,SAAS,UAAU,EAClD,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAC7B,YAAY,CA8Dd;yBAhEe,WAAW"}
|
|
@@ -18,8 +18,6 @@ function ChoiceGroup(props) {
|
|
|
18
18
|
className,
|
|
19
19
|
itemPart = "item",
|
|
20
20
|
labelPart = false,
|
|
21
|
-
withInputAttribute = false,
|
|
22
|
-
withTriggerAttribute = false,
|
|
23
21
|
rootAttributes,
|
|
24
22
|
itemWrapperAttributes,
|
|
25
23
|
itemInputClassName,
|
|
@@ -51,16 +49,17 @@ function ChoiceGroup(props) {
|
|
|
51
49
|
groupId: id,
|
|
52
50
|
inputProps: {
|
|
53
51
|
className: itemInputClassName?.(item),
|
|
54
|
-
|
|
52
|
+
"data-part": "control",
|
|
53
|
+
...kind === "single" ? { "data-uiify-radio": "" } : {}
|
|
55
54
|
},
|
|
56
55
|
key: item.value,
|
|
57
56
|
kind,
|
|
58
57
|
label: renderLabel ? renderLabel(item) : item.label,
|
|
59
|
-
labelPart,
|
|
60
|
-
labelProps:
|
|
58
|
+
labelPart: false,
|
|
59
|
+
labelProps: { "data-part": labelPart ? "trigger" : "label" },
|
|
61
60
|
name: groupName,
|
|
62
61
|
...onItemChange ? { onChange: () => onItemChange(item) } : {},
|
|
63
|
-
panelProps: {
|
|
62
|
+
panelProps: { "data-part": "panel" },
|
|
64
63
|
part: itemPart,
|
|
65
64
|
value: item.value
|
|
66
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/internal/choice-family/ChoiceGroup.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport {\n ChoiceGroup as ElementChoiceGroup,\n ChoiceItem as ElementChoiceItem,\n} from \"../../../elements/choice/index.js\";\nimport { getChoiceGroupName } from \"./ids.js\";\nimport type { ChoiceGroupProps, ChoiceItem } from \"./types.js\";\n\n/**\n * Built on `@gunkin/uiify/elements/choice`: this component\n * stays the ergonomic, items-array API six components share, now implemented as a thin map\n * from `items` onto `Choice.Item`
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/internal/choice-family/ChoiceGroup.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport {\n ChoiceGroup as ElementChoiceGroup,\n ChoiceItem as ElementChoiceItem,\n} from \"../../../elements/choice/index.js\";\nimport { getChoiceGroupName } from \"./ids.js\";\nimport type { ChoiceGroupProps, ChoiceItem } from \"./types.js\";\n\n/**\n * Built on `@gunkin/uiify/elements/choice`: this component\n * stays the ergonomic, items-array API six components share, now implemented as a thin map\n * from `items` onto `Choice.Item` with canonical `data-part` anatomy.\n */\nexport function ChoiceGroup<TItem extends ChoiceItem>(\n props: ChoiceGroupProps<TItem>,\n): ReactElement {\n const {\n id,\n items,\n namespace,\n kind,\n isChecked,\n isControlled = false,\n name,\n orientation,\n className,\n itemPart = \"item\",\n labelPart = false,\n rootAttributes,\n itemWrapperAttributes,\n itemInputClassName,\n onItemChange,\n renderPanel,\n renderLabel,\n append,\n } = props;\n const groupName = name ?? getChoiceGroupName(id, kind);\n\n return (\n <ElementChoiceGroup\n {...{ [`data-uiify-${namespace}`]: \"\" }}\n {...rootAttributes}\n className={className}\n id={id}\n kind={kind}\n orientation={orientation}\n >\n {items.map((item) => {\n const panel = renderPanel ? renderPanel(item) : undefined;\n return (\n <ElementChoiceItem\n {...itemWrapperAttributes?.(item)}\n {...(panel === undefined ? {} : { panel })}\n {...(isControlled ? { checked: isChecked(item) } : { defaultChecked: isChecked(item) })}\n disabled={item.disabled ?? false}\n groupId={id}\n inputProps={{\n className: itemInputClassName?.(item),\n \"data-part\": \"control\",\n ...(kind === \"single\" ? { \"data-uiify-radio\": \"\" } : {}),\n }}\n key={item.value}\n kind={kind}\n label={renderLabel ? renderLabel(item) : item.label}\n labelPart={false}\n labelProps={{ \"data-part\": labelPart ? \"trigger\" : \"label\" }}\n name={groupName}\n {...(onItemChange ? { onChange: () => onItemChange(item) } : {})}\n panelProps={{ \"data-part\": \"panel\" }}\n part={itemPart}\n value={item.value}\n />\n );\n })}\n {append ? <div data-part=\"append\">{append}</div> : null}\n </ElementChoiceGroup>\n );\n}\nChoiceGroup.displayName = \"ChoiceGroup\";\n"],"mappings":"AAuCI,SAmCY,KAnCZ;AAWM;AAjDV;AAAA,EACE,eAAe;AAAA,EACf,cAAc;AAAA,OACT;AACP,SAAS,0BAA0B;AAQ5B,SAAS,YACd,OACc;AACd,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,YAAY,QAAQ,mBAAmB,IAAI,IAAI;AAErD,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG,EAAE,CAAC,cAAc,SAAS,EAAE,GAAG,GAAG;AAAA,MACrC,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA,cAAM,IAAI,CAAC,SAAS;AACnB,gBAAM,QAAQ,cAAc,YAAY,IAAI,IAAI;AAChD,iBACE;AAAA,YAAC;AAAA;AAAA,cACE,GAAG,wBAAwB,IAAI;AAAA,cAC/B,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,cACvC,GAAI,eAAe,EAAE,SAAS,UAAU,IAAI,EAAE,IAAI,EAAE,gBAAgB,UAAU,IAAI,EAAE;AAAA,cACrF,UAAU,KAAK,YAAY;AAAA,cAC3B,SAAS;AAAA,cACT,YAAY;AAAA,gBACV,WAAW,qBAAqB,IAAI;AAAA,gBACpC,aAAa;AAAA,gBACb,GAAI,SAAS,WAAW,EAAE,oBAAoB,GAAG,IAAI,CAAC;AAAA,cACxD;AAAA,cACA,KAAK,KAAK;AAAA,cACV;AAAA,cACA,OAAO,cAAc,YAAY,IAAI,IAAI,KAAK;AAAA,cAC9C,WAAW;AAAA,cACX,YAAY,EAAE,aAAa,YAAY,YAAY,QAAQ;AAAA,cAC3D,MAAM;AAAA,cACL,GAAI,eAAe,EAAE,UAAU,MAAM,aAAa,IAAI,EAAE,IAAI,CAAC;AAAA,cAC9D,YAAY,EAAE,aAAa,QAAQ;AAAA,cACnC,MAAM;AAAA,cACN,OAAO,KAAK;AAAA;AAAA,UACd;AAAA,QAEJ,CAAC;AAAA,QACA,SAAS,oBAAC,SAAI,aAAU,UAAU,kBAAO,IAAS;AAAA;AAAA;AAAA,EACrD;AAEJ;AACA,YAAY,cAAc;","names":[]}
|
|
@@ -26,10 +26,6 @@ export interface ChoiceGroupProps<TItem extends ChoiceItem = ChoiceItem> {
|
|
|
26
26
|
readonly itemPart?: string;
|
|
27
27
|
/** Adds `data-part="label"` to the label. */
|
|
28
28
|
readonly labelPart?: boolean;
|
|
29
|
-
/** Adds `data-uiify-<namespace>-input` to the input. */
|
|
30
|
-
readonly withInputAttribute?: boolean;
|
|
31
|
-
/** Adds `data-uiify-<namespace>-trigger` to the label. */
|
|
32
|
-
readonly withTriggerAttribute?: boolean;
|
|
33
29
|
/** Extra attributes spread onto the root, e.g. `data-full-width`, `aria-label`. */
|
|
34
30
|
readonly rootAttributes?: Record<string, string | undefined>;
|
|
35
31
|
/** Extra attributes spread onto each item's wrapper div, e.g. Stepper's `data-complete`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/internal/choice-family/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE1D;+EAC+E;AAC/E,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEpD,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/internal/choice-family/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE1D;+EAC+E;AAC/E,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEpD,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7D,4FAA4F;IAC5F,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACrF,mFAAmF;IACnF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,CAAC;IAClE;8EAC0E;IAC1E,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9C,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC;IAClD,sFAAsF;IACtF,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC;IAClD,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineChart.d.ts","sourceRoot":"","sources":["../../../src/components/line-chart/LineChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA+B,YAAY,EAAE,MAAM,OAAO,CAAC;AAcpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,SAAS,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EAC1D,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,GACzB,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"LineChart.d.ts","sourceRoot":"","sources":["../../../src/components/line-chart/LineChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA+B,YAAY,EAAE,MAAM,OAAO,CAAC;AAcpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,SAAS,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EAC1D,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,GACzB,YAAY,GAAG,IAAI,CAiKrB;yBAnKe,SAAS"}
|
|
@@ -57,7 +57,7 @@ function LineChart(props) {
|
|
|
57
57
|
children: interactive ? /* @__PURE__ */ jsx(
|
|
58
58
|
"button",
|
|
59
59
|
{
|
|
60
|
-
|
|
60
|
+
"data-part": "point-hit",
|
|
61
61
|
type: "button",
|
|
62
62
|
"aria-label": `Point ${String(point.time)}`,
|
|
63
63
|
"aria-pressed": isSelected,
|
|
@@ -81,17 +81,17 @@ function LineChart(props) {
|
|
|
81
81
|
"data-interactive": interactive ? "" : void 0,
|
|
82
82
|
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
83
83
|
/* @__PURE__ */ jsx("figcaption", { children: label }),
|
|
84
|
-
interactive && readoutPoint ? /* @__PURE__ */ jsxs("div", {
|
|
85
|
-
/* @__PURE__ */ jsx("span", {
|
|
84
|
+
interactive && readoutPoint ? /* @__PURE__ */ jsxs("div", { "data-part": "readout", "aria-live": "polite", children: [
|
|
85
|
+
/* @__PURE__ */ jsx("span", { "data-part": "readout-time", children: String(readoutPoint.time) }),
|
|
86
86
|
/* @__PURE__ */ jsx("span", { children: readoutPoint.value })
|
|
87
87
|
] }) : null,
|
|
88
|
-
/* @__PURE__ */ jsxs("div", {
|
|
89
|
-
/* @__PURE__ */ jsx("div", {
|
|
90
|
-
/* @__PURE__ */ jsxs("div", {
|
|
88
|
+
/* @__PURE__ */ jsxs("div", { "data-part": "plot", "aria-hidden": interactive ? void 0 : true, children: [
|
|
89
|
+
/* @__PURE__ */ jsx("div", { "data-part": "scroll-viewport", children: /* @__PURE__ */ jsxs("div", { "data-part": "canvas", children: [
|
|
90
|
+
/* @__PURE__ */ jsxs("div", { "data-part": "viewport", children: [
|
|
91
91
|
/* @__PURE__ */ jsx(
|
|
92
92
|
"ol",
|
|
93
93
|
{
|
|
94
|
-
|
|
94
|
+
"data-part": "points",
|
|
95
95
|
"aria-label": `${label} points`,
|
|
96
96
|
style: pointsStyle(data.length),
|
|
97
97
|
children: points
|
|
@@ -100,41 +100,33 @@ function LineChart(props) {
|
|
|
100
100
|
interactive && crosshairPoint && activePointIndex !== void 0 ? /* @__PURE__ */ jsx(
|
|
101
101
|
"div",
|
|
102
102
|
{
|
|
103
|
-
|
|
103
|
+
"data-part": "crosshair",
|
|
104
104
|
"aria-hidden": "true",
|
|
105
105
|
style: crosshairStyle(activePointIndex, data.length, cursorY),
|
|
106
|
-
children: /* @__PURE__ */ jsx("span", {
|
|
106
|
+
children: /* @__PURE__ */ jsx("span", { "data-part": "crosshair-marker", children: "+" })
|
|
107
107
|
}
|
|
108
108
|
) : null
|
|
109
109
|
] }),
|
|
110
|
-
/* @__PURE__ */ jsx("div", {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
className: "line-chart__crosshair-time",
|
|
129
|
-
style: crosshairStyle(activePointIndex, data.length, void 0),
|
|
130
|
-
children: String(crosshairPoint.time)
|
|
131
|
-
}
|
|
132
|
-
) : null
|
|
133
|
-
]
|
|
134
|
-
}
|
|
135
|
-
) })
|
|
110
|
+
/* @__PURE__ */ jsx("div", { "data-part": "time-viewport", children: /* @__PURE__ */ jsxs("ol", { "data-part": "time-axis", "data-axis": "time", "aria-label": `${label} dates`, children: [
|
|
111
|
+
timeLabels.map((axisLabel, index) => /* @__PURE__ */ jsx(
|
|
112
|
+
"li",
|
|
113
|
+
{
|
|
114
|
+
style: axisStyle("x", axisLabel.position),
|
|
115
|
+
children: axisLabel.label
|
|
116
|
+
},
|
|
117
|
+
`${axisLabel.position}-${index}`
|
|
118
|
+
)),
|
|
119
|
+
interactive && crosshairPoint && activePointIndex !== void 0 ? /* @__PURE__ */ jsx(
|
|
120
|
+
"li",
|
|
121
|
+
{
|
|
122
|
+
"data-part": "crosshair-time",
|
|
123
|
+
style: crosshairStyle(activePointIndex, data.length, void 0),
|
|
124
|
+
children: String(crosshairPoint.time)
|
|
125
|
+
}
|
|
126
|
+
) : null
|
|
127
|
+
] }) })
|
|
136
128
|
] }) }),
|
|
137
|
-
/* @__PURE__ */ jsxs("ol", {
|
|
129
|
+
/* @__PURE__ */ jsxs("ol", { "data-part": "value-axis", "data-axis": "value", "aria-label": `${label} values`, children: [
|
|
138
130
|
valueLabels.map((axisLabel, index) => /* @__PURE__ */ jsx(
|
|
139
131
|
"li",
|
|
140
132
|
{
|
|
@@ -143,10 +135,10 @@ function LineChart(props) {
|
|
|
143
135
|
},
|
|
144
136
|
`${axisLabel.position}-${index}`
|
|
145
137
|
)),
|
|
146
|
-
interactive && crosshairPoint && activePointIndex !== void 0 ? /* @__PURE__ */ jsx("li", {
|
|
138
|
+
interactive && crosshairPoint && activePointIndex !== void 0 ? /* @__PURE__ */ jsx("li", { "data-part": "crosshair-value", style: cursorStyle(cursorY), children: crosshairPoint.value }) : null
|
|
147
139
|
] })
|
|
148
140
|
] }),
|
|
149
|
-
/* @__PURE__ */ jsxs("table", {
|
|
141
|
+
/* @__PURE__ */ jsxs("table", { "data-part": "data", "aria-label": `${label} data`, children: [
|
|
150
142
|
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
151
143
|
/* @__PURE__ */ jsx("th", { scope: "col", children: "Time" }),
|
|
152
144
|
/* @__PURE__ */ jsx("th", { scope: "col", children: "Value" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/line-chart/LineChart.tsx"],"sourcesContent":["import type { ElementType, KeyboardEvent, PointerEvent, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport {\n axisLabelsFor,\n axisStyle,\n crosshairStyle,\n cursorStyle,\n geometryFor,\n getValueBounds,\n monthLabelsFor,\n pointStyle,\n pointsStyle,\n valueLabelsFor,\n} from \"./line-chart-geometry.js\";\nimport type { LineChartProps } from \"./types.js\";\n\nexport function LineChart<TAs extends ElementType = \"figure\">(\n props: LineChartProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n data,\n xAxis,\n yAxis,\n \"aria-label\": ariaLabel,\n activePointIndex,\n cursorY,\n interactive = false,\n onPointClick,\n onPointPointerLeave,\n onPointPointerMove,\n selectedPointIndex,\n ...consumerProps\n } = props as LineChartProps<\"figure\">;\n const { min, max } = getValueBounds(data);\n const label = ariaLabel ?? \"Line chart\";\n const timeLabels = axisLabelsFor(xAxis, monthLabelsFor(data));\n const valueLabels = axisLabelsFor(yAxis, valueLabelsFor(min, max));\n const readoutIndex =\n activePointIndex ?? selectedPointIndex ?? (data.length > 0 ? data.length - 1 : undefined);\n const readoutPoint = readoutIndex === undefined ? undefined : data[readoutIndex];\n const crosshairPoint = activePointIndex === undefined ? undefined : data[activePointIndex];\n const points = data.map((point, index) => {\n const geometry = geometryFor(point, data[index - 1], index, data.length, min, max);\n const isActive = activePointIndex === index;\n const isSelected = selectedPointIndex === index;\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onPointClick?.(index);\n };\n\n return (\n <li\n key={`${point.time}-${index}`}\n aria-hidden={interactive ? undefined : true}\n data-crosshair-active={interactive && isActive ? \"\" : undefined}\n data-point-selected={interactive && isSelected ? \"\" : undefined}\n data-time={String(point.time)}\n data-trend={geometry.trend}\n style={pointStyle(geometry, isActive ? cursorY : undefined)}\n >\n {interactive ? (\n <button\n className=\"line-chart__point-hit\"\n type=\"button\"\n aria-label={`Point ${String(point.time)}`}\n aria-pressed={isSelected}\n onClick={() => onPointClick?.(index)}\n onKeyDown={handleKeyDown}\n onPointerLeave={onPointPointerLeave}\n onPointerMove={(event: PointerEvent<HTMLButtonElement>) =>\n onPointPointerMove?.({ index, offsetY: event.nativeEvent.offsetY })\n }\n />\n ) : null}\n </li>\n );\n });\n\n return useRenderElement({\n as,\n defaultTag: \"figure\",\n props: {\n ...consumerProps,\n \"aria-label\": label,\n \"data-uiify-line-chart\": \"\",\n \"data-interactive\": interactive ? \"\" : undefined,\n children: (\n <>\n <figcaption>{label}</figcaption>\n {interactive && readoutPoint ? (\n <div className=\"line-chart__readout\" aria-live=\"polite\">\n <span className=\"line-chart__readout-time\">{String(readoutPoint.time)}</span>\n <span>{readoutPoint.value}</span>\n </div>\n ) : null}\n <div className=\"line-chart__plot\" aria-hidden={interactive ? undefined : true}>\n <div className=\"line-chart__scroll-viewport\">\n <div className=\"line-chart__canvas\">\n <div className=\"line-chart__viewport\">\n <ol\n className=\"line-chart__points\"\n aria-label={`${label} points`}\n style={pointsStyle(data.length)}\n >\n {points}\n </ol>\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <div\n className=\"line-chart__crosshair\"\n aria-hidden=\"true\"\n style={crosshairStyle(activePointIndex, data.length, cursorY)}\n >\n <span className=\"line-chart__crosshair-marker\">+</span>\n </div>\n ) : null}\n </div>\n <div className=\"line-chart__time-viewport\">\n <ol\n className=\"line-chart__time-axis\"\n data-axis=\"time\"\n aria-label={`${label} dates`}\n >\n {timeLabels.map((axisLabel, index) => (\n <li\n key={`${axisLabel.position}-${index}`}\n style={axisStyle(\"x\", axisLabel.position)}\n >\n {axisLabel.label}\n </li>\n ))}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <li\n className=\"line-chart__crosshair-time\"\n style={crosshairStyle(activePointIndex, data.length, undefined)}\n >\n {String(crosshairPoint.time)}\n </li>\n ) : null}\n </ol>\n </div>\n </div>\n </div>\n <ol className=\"line-chart__value-axis\" data-axis=\"value\" aria-label={`${label} values`}>\n {valueLabels.map((axisLabel, index) => (\n <li\n key={`${axisLabel.position}-${index}`}\n style={axisStyle(\"y\", axisLabel.position)}\n >\n {axisLabel.label}\n </li>\n ))}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <li className=\"line-chart__crosshair-value\" style={cursorStyle(cursorY)}>\n {crosshairPoint.value}\n </li>\n ) : null}\n </ol>\n </div>\n <table className=\"line-chart__data\" aria-label={`${label} data`}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Value</th>\n </tr>\n </thead>\n <tbody>\n {data.map((point, index) => (\n <tr key={`${point.time}-${index}`}>\n <th scope=\"row\">{String(point.time)}</th>\n <td>{point.value}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n ),\n },\n render,\n state: {},\n });\n}\nLineChart.displayName = \"LineChart\";\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/line-chart/LineChart.tsx"],"sourcesContent":["import type { ElementType, KeyboardEvent, PointerEvent, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport {\n axisLabelsFor,\n axisStyle,\n crosshairStyle,\n cursorStyle,\n geometryFor,\n getValueBounds,\n monthLabelsFor,\n pointStyle,\n pointsStyle,\n valueLabelsFor,\n} from \"./line-chart-geometry.js\";\nimport type { LineChartProps } from \"./types.js\";\n\nexport function LineChart<TAs extends ElementType = \"figure\">(\n props: LineChartProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n data,\n xAxis,\n yAxis,\n \"aria-label\": ariaLabel,\n activePointIndex,\n cursorY,\n interactive = false,\n onPointClick,\n onPointPointerLeave,\n onPointPointerMove,\n selectedPointIndex,\n ...consumerProps\n } = props as LineChartProps<\"figure\">;\n const { min, max } = getValueBounds(data);\n const label = ariaLabel ?? \"Line chart\";\n const timeLabels = axisLabelsFor(xAxis, monthLabelsFor(data));\n const valueLabels = axisLabelsFor(yAxis, valueLabelsFor(min, max));\n const readoutIndex =\n activePointIndex ?? selectedPointIndex ?? (data.length > 0 ? data.length - 1 : undefined);\n const readoutPoint = readoutIndex === undefined ? undefined : data[readoutIndex];\n const crosshairPoint = activePointIndex === undefined ? undefined : data[activePointIndex];\n const points = data.map((point, index) => {\n const geometry = geometryFor(point, data[index - 1], index, data.length, min, max);\n const isActive = activePointIndex === index;\n const isSelected = selectedPointIndex === index;\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onPointClick?.(index);\n };\n\n return (\n <li\n key={`${point.time}-${index}`}\n aria-hidden={interactive ? undefined : true}\n data-crosshair-active={interactive && isActive ? \"\" : undefined}\n data-point-selected={interactive && isSelected ? \"\" : undefined}\n data-time={String(point.time)}\n data-trend={geometry.trend}\n style={pointStyle(geometry, isActive ? cursorY : undefined)}\n >\n {interactive ? (\n <button\n data-part=\"point-hit\"\n type=\"button\"\n aria-label={`Point ${String(point.time)}`}\n aria-pressed={isSelected}\n onClick={() => onPointClick?.(index)}\n onKeyDown={handleKeyDown}\n onPointerLeave={onPointPointerLeave}\n onPointerMove={(event: PointerEvent<HTMLButtonElement>) =>\n onPointPointerMove?.({ index, offsetY: event.nativeEvent.offsetY })\n }\n />\n ) : null}\n </li>\n );\n });\n\n return useRenderElement({\n as,\n defaultTag: \"figure\",\n props: {\n ...consumerProps,\n \"aria-label\": label,\n \"data-uiify-line-chart\": \"\",\n \"data-interactive\": interactive ? \"\" : undefined,\n children: (\n <>\n <figcaption>{label}</figcaption>\n {interactive && readoutPoint ? (\n <div data-part=\"readout\" aria-live=\"polite\">\n <span data-part=\"readout-time\">{String(readoutPoint.time)}</span>\n <span>{readoutPoint.value}</span>\n </div>\n ) : null}\n <div data-part=\"plot\" aria-hidden={interactive ? undefined : true}>\n <div data-part=\"scroll-viewport\">\n <div data-part=\"canvas\">\n <div data-part=\"viewport\">\n <ol\n data-part=\"points\"\n aria-label={`${label} points`}\n style={pointsStyle(data.length)}\n >\n {points}\n </ol>\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <div\n data-part=\"crosshair\"\n aria-hidden=\"true\"\n style={crosshairStyle(activePointIndex, data.length, cursorY)}\n >\n <span data-part=\"crosshair-marker\">+</span>\n </div>\n ) : null}\n </div>\n <div data-part=\"time-viewport\">\n <ol data-part=\"time-axis\" data-axis=\"time\" aria-label={`${label} dates`}>\n {timeLabels.map((axisLabel, index) => (\n <li\n key={`${axisLabel.position}-${index}`}\n style={axisStyle(\"x\", axisLabel.position)}\n >\n {axisLabel.label}\n </li>\n ))}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <li\n data-part=\"crosshair-time\"\n style={crosshairStyle(activePointIndex, data.length, undefined)}\n >\n {String(crosshairPoint.time)}\n </li>\n ) : null}\n </ol>\n </div>\n </div>\n </div>\n <ol data-part=\"value-axis\" data-axis=\"value\" aria-label={`${label} values`}>\n {valueLabels.map((axisLabel, index) => (\n <li\n key={`${axisLabel.position}-${index}`}\n style={axisStyle(\"y\", axisLabel.position)}\n >\n {axisLabel.label}\n </li>\n ))}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <li data-part=\"crosshair-value\" style={cursorStyle(cursorY)}>\n {crosshairPoint.value}\n </li>\n ) : null}\n </ol>\n </div>\n <table data-part=\"data\" aria-label={`${label} data`}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Value</th>\n </tr>\n </thead>\n <tbody>\n {data.map((point, index) => (\n <tr key={`${point.time}-${index}`}>\n <th scope=\"row\">{String(point.time)}</th>\n <td>{point.value}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n ),\n },\n render,\n state: {},\n });\n}\nLineChart.displayName = \"LineChart\";\n"],"mappings":"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","names":[]}
|