@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
|
@@ -126,7 +126,7 @@ function BreadcrumbSeparator(props) {
|
|
|
126
126
|
}
|
|
127
127
|
function BreadcrumbEllipsis({ hiddenItems, separator }) {
|
|
128
128
|
return /* @__PURE__ */ jsxs(BreadcrumbItem, { children: [
|
|
129
|
-
/* @__PURE__ */ jsxs(DetailsRoot, { "data-uiify-breadcrumb
|
|
129
|
+
/* @__PURE__ */ jsxs(DetailsRoot, { "data-part": "ellipsis", "data-uiify-breadcrumb": "", children: [
|
|
130
130
|
/* @__PURE__ */ jsx(DetailsSummary, { "aria-label": "Show collapsed breadcrumbs", children: "\u2026" }),
|
|
131
131
|
/* @__PURE__ */ jsx(DetailsContent, { as: "ol", children: hiddenItems.map((item) => /* @__PURE__ */ jsx(
|
|
132
132
|
BreadcrumbLink,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import type { ElementType, ReactElement, ReactNode } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { DetailsContent, DetailsRoot, DetailsSummary } from \"../../elements/details/index.js\";\nimport { collapseBreadcrumbItems } from \"./breadcrumb-collapse.js\";\nimport type {\n BreadcrumbRootProps,\n BreadcrumbListProps,\n BreadcrumbItemProps,\n BreadcrumbItemData,\n BreadcrumbLinkProps,\n BreadcrumbSeparatorProps,\n BreadcrumbEllipsisProps,\n} from \"./types.js\";\n\nexport function BreadcrumbRoot<TAs extends ElementType = \"nav\">(\n props: BreadcrumbRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n \"aria-label\": ariaLabel = \"Breadcrumb\",\n ...consumerProps\n } = props as BreadcrumbRootProps<\"nav\">;\n\n return useRenderElement({\n as,\n defaultTag: \"nav\",\n props: { ...consumerProps, \"aria-label\": ariaLabel },\n render,\n state: {},\n });\n}\n\nfunction renderDataItem(item: BreadcrumbItemData, separator: ReactNode): ReactElement {\n return (\n <BreadcrumbItem key={item.key}>\n <BreadcrumbLink\n {...(item.current !== undefined ? { current: item.current } : {})}\n {...(item.href !== undefined ? { href: item.href } : {})}\n >\n {item.label}\n </BreadcrumbLink>\n {separator}\n </BreadcrumbItem>\n );\n}\n\nexport function BreadcrumbList<TAs extends ElementType = \"ol\">(\n props: BreadcrumbListProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n items,\n itemsAfterCollapse = 1,\n itemsBeforeCollapse = 1,\n maxItems,\n separator,\n ...consumerProps\n } = props as BreadcrumbListProps<\"ol\">;\n\n if (maxItems !== undefined && items === undefined) {\n throw new Error(\n \"Breadcrumb.List: maxItems requires the data-driven `items` prop — collapsing can't \" +\n \"safely introspect `children` (a .map() through a wrapper component hides real \" +\n \"elements from child traversal until React actually renders them).\",\n );\n }\n\n let content: ReactNode = children;\n if (items !== undefined) {\n const collapsed =\n maxItems === undefined\n ? undefined\n : collapseBreadcrumbItems(items, maxItems, itemsBeforeCollapse, itemsAfterCollapse);\n\n content = collapsed\n ? [\n ...collapsed.before.map((item) => renderDataItem(item, separator)),\n <BreadcrumbEllipsis\n hiddenItems={collapsed.hidden}\n key=\"ellipsis\"\n separator={separator}\n />,\n ...collapsed.after.map((item, index) =>\n renderDataItem(item, index === collapsed.after.length - 1 ? null : separator),\n ),\n ]\n : items.map((item, index) =>\n renderDataItem(item, index === items.length - 1 ? null : separator),\n );\n }\n\n return useRenderElement({\n as,\n defaultTag: \"ol\",\n props: { ...consumerProps, children: content },\n render,\n state: {},\n });\n}\nBreadcrumbList.displayName = \"BreadcrumbList\";\n\nexport function BreadcrumbItem<TAs extends ElementType = \"li\">(\n props: BreadcrumbItemProps<TAs>,\n): ReactElement | null {\n const { as, render, children, ...consumerProps } = props as BreadcrumbItemProps<\"li\">;\n\n return useRenderElement({\n as,\n defaultTag: \"li\",\n props: { ...consumerProps, children },\n render,\n state: {},\n });\n}\n\nexport function BreadcrumbLink<TAs extends ElementType = \"a\">(\n props: BreadcrumbLinkProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n current = false,\n href,\n ...consumerProps\n } = props as BreadcrumbLinkProps<\"a\">;\n\n return useRenderElement({\n as,\n defaultTag: \"a\",\n props: {\n ...consumerProps,\n \"aria-current\": current ? \"page\" : undefined,\n \"data-current\": current ? \"\" : undefined,\n href,\n children,\n },\n render,\n state: { current },\n });\n}\n\nexport function BreadcrumbSeparator<TAs extends ElementType = \"span\">(\n props: BreadcrumbSeparatorProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children = \"/\",\n ...consumerProps\n } = props as BreadcrumbSeparatorProps<\"span\">;\n\n return useRenderElement({\n as,\n defaultTag: \"span\",\n props: { ...consumerProps, \"aria-hidden\": true, children },\n render,\n state: {},\n });\n}\n\n/**\n * Built on `@gunkin/uiify/elements/details`: `Details.Summary`/`Details.Content` are used without a\n * `part` (this trigger and panel carry no `data-part`, unlike Accordion/Collapsible's), and\n * `Details.Content` renders as `<ol>` via `as` instead of the default `<div>`.\n */\nfunction BreadcrumbEllipsis({ hiddenItems, separator }: BreadcrumbEllipsisProps): ReactElement {\n return (\n <BreadcrumbItem>\n <DetailsRoot data-uiify-breadcrumb
|
|
1
|
+
{"version":3,"sources":["../../../src/components/breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import type { ElementType, ReactElement, ReactNode } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { DetailsContent, DetailsRoot, DetailsSummary } from \"../../elements/details/index.js\";\nimport { collapseBreadcrumbItems } from \"./breadcrumb-collapse.js\";\nimport type {\n BreadcrumbRootProps,\n BreadcrumbListProps,\n BreadcrumbItemProps,\n BreadcrumbItemData,\n BreadcrumbLinkProps,\n BreadcrumbSeparatorProps,\n BreadcrumbEllipsisProps,\n} from \"./types.js\";\n\nexport function BreadcrumbRoot<TAs extends ElementType = \"nav\">(\n props: BreadcrumbRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n \"aria-label\": ariaLabel = \"Breadcrumb\",\n ...consumerProps\n } = props as BreadcrumbRootProps<\"nav\">;\n\n return useRenderElement({\n as,\n defaultTag: \"nav\",\n props: { ...consumerProps, \"aria-label\": ariaLabel },\n render,\n state: {},\n });\n}\n\nfunction renderDataItem(item: BreadcrumbItemData, separator: ReactNode): ReactElement {\n return (\n <BreadcrumbItem key={item.key}>\n <BreadcrumbLink\n {...(item.current !== undefined ? { current: item.current } : {})}\n {...(item.href !== undefined ? { href: item.href } : {})}\n >\n {item.label}\n </BreadcrumbLink>\n {separator}\n </BreadcrumbItem>\n );\n}\n\nexport function BreadcrumbList<TAs extends ElementType = \"ol\">(\n props: BreadcrumbListProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n items,\n itemsAfterCollapse = 1,\n itemsBeforeCollapse = 1,\n maxItems,\n separator,\n ...consumerProps\n } = props as BreadcrumbListProps<\"ol\">;\n\n if (maxItems !== undefined && items === undefined) {\n throw new Error(\n \"Breadcrumb.List: maxItems requires the data-driven `items` prop — collapsing can't \" +\n \"safely introspect `children` (a .map() through a wrapper component hides real \" +\n \"elements from child traversal until React actually renders them).\",\n );\n }\n\n let content: ReactNode = children;\n if (items !== undefined) {\n const collapsed =\n maxItems === undefined\n ? undefined\n : collapseBreadcrumbItems(items, maxItems, itemsBeforeCollapse, itemsAfterCollapse);\n\n content = collapsed\n ? [\n ...collapsed.before.map((item) => renderDataItem(item, separator)),\n <BreadcrumbEllipsis\n hiddenItems={collapsed.hidden}\n key=\"ellipsis\"\n separator={separator}\n />,\n ...collapsed.after.map((item, index) =>\n renderDataItem(item, index === collapsed.after.length - 1 ? null : separator),\n ),\n ]\n : items.map((item, index) =>\n renderDataItem(item, index === items.length - 1 ? null : separator),\n );\n }\n\n return useRenderElement({\n as,\n defaultTag: \"ol\",\n props: { ...consumerProps, children: content },\n render,\n state: {},\n });\n}\nBreadcrumbList.displayName = \"BreadcrumbList\";\n\nexport function BreadcrumbItem<TAs extends ElementType = \"li\">(\n props: BreadcrumbItemProps<TAs>,\n): ReactElement | null {\n const { as, render, children, ...consumerProps } = props as BreadcrumbItemProps<\"li\">;\n\n return useRenderElement({\n as,\n defaultTag: \"li\",\n props: { ...consumerProps, children },\n render,\n state: {},\n });\n}\n\nexport function BreadcrumbLink<TAs extends ElementType = \"a\">(\n props: BreadcrumbLinkProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children,\n current = false,\n href,\n ...consumerProps\n } = props as BreadcrumbLinkProps<\"a\">;\n\n return useRenderElement({\n as,\n defaultTag: \"a\",\n props: {\n ...consumerProps,\n \"aria-current\": current ? \"page\" : undefined,\n \"data-current\": current ? \"\" : undefined,\n href,\n children,\n },\n render,\n state: { current },\n });\n}\n\nexport function BreadcrumbSeparator<TAs extends ElementType = \"span\">(\n props: BreadcrumbSeparatorProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n children = \"/\",\n ...consumerProps\n } = props as BreadcrumbSeparatorProps<\"span\">;\n\n return useRenderElement({\n as,\n defaultTag: \"span\",\n props: { ...consumerProps, \"aria-hidden\": true, children },\n render,\n state: {},\n });\n}\n\n/**\n * Built on `@gunkin/uiify/elements/details`: `Details.Summary`/`Details.Content` are used without a\n * `part` (this trigger and panel carry no `data-part`, unlike Accordion/Collapsible's), and\n * `Details.Content` renders as `<ol>` via `as` instead of the default `<div>`.\n */\nfunction BreadcrumbEllipsis({ hiddenItems, separator }: BreadcrumbEllipsisProps): ReactElement {\n return (\n <BreadcrumbItem>\n <DetailsRoot data-part=\"ellipsis\" data-uiify-breadcrumb=\"\">\n <DetailsSummary aria-label=\"Show collapsed breadcrumbs\">…</DetailsSummary>\n <DetailsContent as=\"ol\">\n {hiddenItems.map((item) => (\n <BreadcrumbLink\n key={item.key}\n {...(item.current !== undefined ? { current: item.current } : {})}\n {...(item.href !== undefined ? { href: item.href } : {})}\n >\n {item.label}\n </BreadcrumbLink>\n ))}\n </DetailsContent>\n </DetailsRoot>\n {separator}\n </BreadcrumbItem>\n );\n}\nBreadcrumbEllipsis.displayName = \"BreadcrumbEllipsis\";\n\nexport function BreadcrumbEllipsisPart(): ReactElement {\n return (\n <BreadcrumbItem>\n <span aria-hidden=\"true\">…</span>\n </BreadcrumbItem>\n );\n}\nBreadcrumbEllipsisPart.displayName = \"BreadcrumbEllipsisPart\";\n\nexport const Breadcrumb = {\n Ellipsis: BreadcrumbEllipsisPart,\n Item: BreadcrumbItem,\n Link: BreadcrumbLink,\n List: BreadcrumbList,\n Root: BreadcrumbRoot,\n Separator: BreadcrumbSeparator,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9C,wBAAgB,MAAM,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACvD,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,GACtB,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9C,wBAAgB,MAAM,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACvD,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,GACtB,YAAY,GAAG,IAAI,CA2BrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/button/Button.tsx"],"sourcesContent":["import type { ElementType, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { ButtonProps } from \"./types.js\";\n\nfunction isNativeButton(as: ElementType | undefined): boolean {\n return as === undefined || as === \"button\";\n}\n\nexport function Button<TAs extends ElementType = \"button\">(\n props: ButtonProps<TAs>,\n): ReactElement | null {\n const { as, render, disabled = false, type, ...consumerProps } = props as ButtonProps<\"button\">;\n\n const nativeButton = isNativeButton(as);\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n ...(nativeButton\n ? { type: type ?? \"button\", ...(disabled ? { disabled: true } : {}) }\n : disabled\n ? {\n \"aria-disabled\": true,\n tabIndex: -1,\n onClick: (event: { preventDefault: () => void }) => {\n event.preventDefault();\n },\n }\n : {}),\n ...(disabled ? { \"data-disabled\": \"\" } : {}),\n },\n render,\n state: { disabled },\n });\n}\n"],"mappings":"AACA,SAAS,wBAAwB;AAGjC,SAAS,eAAe,IAAsC;AAC5D,SAAO,OAAO,UAAa,OAAO;AACpC;AAEO,SAAS,OACd,OACqB;AACrB,QAAM,EAAE,IAAI,QAAQ,WAAW,OAAO,MAAM,GAAG,cAAc,IAAI;AAEjE,QAAM,eAAe,eAAe,EAAE;AAEtC,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAI,eACA,EAAE,MAAM,QAAQ,UAAU,GAAI,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC,EAAG,IAClE,WACE;AAAA,QACE,iBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,SAAS,CAAC,UAA0C;AAClD,gBAAM,eAAe;AAAA,QACvB;AAAA,MACF,IACA,CAAC;AAAA,MACP,GAAI,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,OAAO,EAAE,SAAS;AAAA,EACpB,CAAC;AACH;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/button/Button.tsx"],"sourcesContent":["import type { ElementType, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { ButtonProps } from \"./types.js\";\n\nfunction isNativeButton(as: ElementType | undefined): boolean {\n return as === undefined || as === \"button\";\n}\n\nexport function Button<TAs extends ElementType = \"button\">(\n props: ButtonProps<TAs>,\n): ReactElement | null {\n const { as, render, disabled = false, type, ...consumerProps } = props as ButtonProps<\"button\">;\n\n const nativeButton = isNativeButton(as);\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n \"data-uiify-button\": \"\",\n ...(nativeButton\n ? { type: type ?? \"button\", ...(disabled ? { disabled: true } : {}) }\n : disabled\n ? {\n \"aria-disabled\": true,\n tabIndex: -1,\n onClick: (event: { preventDefault: () => void }) => {\n event.preventDefault();\n },\n }\n : {}),\n ...(disabled ? { \"data-disabled\": \"\" } : {}),\n },\n render,\n state: { disabled },\n });\n}\n"],"mappings":"AACA,SAAS,wBAAwB;AAGjC,SAAS,eAAe,IAAsC;AAC5D,SAAO,OAAO,UAAa,OAAO;AACpC;AAEO,SAAS,OACd,OACqB;AACrB,QAAM,EAAE,IAAI,QAAQ,WAAW,OAAO,MAAM,GAAG,cAAc,IAAI;AAEjE,QAAM,eAAe,eAAe,EAAE;AAEtC,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,qBAAqB;AAAA,MACrB,GAAI,eACA,EAAE,MAAM,QAAQ,UAAU,GAAI,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC,EAAG,IAClE,WACE;AAAA,QACE,iBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,SAAS,CAAC,UAA0C;AAClD,gBAAM,eAAe;AAAA,QACvB;AAAA,MACF,IACA,CAAC;AAAA,MACP,GAAI,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,OAAO,EAAE,SAAS;AAAA,EACpB,CAAC;AACH;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CandleChart.d.ts","sourceRoot":"","sources":["../../../src/components/candle-chart/CandleChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EAGX,YAAY,EAEb,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAyC,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuL1F,wBAAgB,WAAW,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EAC5D,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAC3B,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"CandleChart.d.ts","sourceRoot":"","sources":["../../../src/components/candle-chart/CandleChart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EAGX,YAAY,EAEb,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAyC,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuL1F,wBAAgB,WAAW,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EAC5D,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAC3B,YAAY,GAAG,IAAI,CAqKrB;yBAvKe,WAAW"}
|
|
@@ -154,7 +154,7 @@ function CandleChart(props) {
|
|
|
154
154
|
children: interactive ? /* @__PURE__ */ jsx(
|
|
155
155
|
"button",
|
|
156
156
|
{
|
|
157
|
-
|
|
157
|
+
"data-part": "candle-hit",
|
|
158
158
|
type: "button",
|
|
159
159
|
"aria-label": `Candle ${String(candle.time)}`,
|
|
160
160
|
"aria-pressed": isSelected,
|
|
@@ -178,8 +178,8 @@ function CandleChart(props) {
|
|
|
178
178
|
"data-interactive": interactive ? "" : void 0,
|
|
179
179
|
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
180
180
|
/* @__PURE__ */ jsx("figcaption", { children: label }),
|
|
181
|
-
interactive && readoutCandle ? /* @__PURE__ */ jsxs("div", {
|
|
182
|
-
/* @__PURE__ */ jsx("span", {
|
|
181
|
+
interactive && readoutCandle ? /* @__PURE__ */ jsxs("div", { "data-part": "readout", "aria-live": "polite", children: [
|
|
182
|
+
/* @__PURE__ */ jsx("span", { "data-part": "readout-time", children: String(readoutCandle.time) }),
|
|
183
183
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
184
184
|
"O ",
|
|
185
185
|
readoutCandle.open
|
|
@@ -197,68 +197,52 @@ function CandleChart(props) {
|
|
|
197
197
|
readoutCandle.close
|
|
198
198
|
] })
|
|
199
199
|
] }) : null,
|
|
200
|
-
/* @__PURE__ */ jsxs("div", {
|
|
201
|
-
/* @__PURE__ */ jsx("div", {
|
|
202
|
-
/* @__PURE__ */ jsxs("div", {
|
|
203
|
-
/* @__PURE__ */ jsx("ol", {
|
|
200
|
+
/* @__PURE__ */ jsxs("div", { "data-part": "plot", "aria-hidden": interactive ? void 0 : true, children: [
|
|
201
|
+
/* @__PURE__ */ jsx("div", { "data-part": "scroll-viewport", children: /* @__PURE__ */ jsxs("div", { "data-part": "canvas", children: [
|
|
202
|
+
/* @__PURE__ */ jsxs("div", { "data-part": "viewport", children: [
|
|
203
|
+
/* @__PURE__ */ jsx("ol", { "data-part": "candles", "aria-label": `${label} candles`, children: candles }),
|
|
204
204
|
interactive && crosshairCandle && activeCandleIndex !== void 0 ? /* @__PURE__ */ jsx(
|
|
205
205
|
"div",
|
|
206
206
|
{
|
|
207
|
-
|
|
207
|
+
"data-part": "crosshair",
|
|
208
208
|
"aria-hidden": "true",
|
|
209
209
|
style: crosshairStyle(activeCandleIndex, data.length, cursorY),
|
|
210
|
-
children: /* @__PURE__ */ jsx("span", {
|
|
210
|
+
children: /* @__PURE__ */ jsx("span", { "data-part": "crosshair-marker", children: "+" })
|
|
211
211
|
}
|
|
212
212
|
) : null
|
|
213
213
|
] }),
|
|
214
|
-
/* @__PURE__ */ jsx("div", {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
)
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
className: "candle-chart__crosshair-time",
|
|
233
|
-
style: crosshairStyle(activeCandleIndex, data.length, void 0),
|
|
234
|
-
children: String(crosshairCandle.time)
|
|
235
|
-
}
|
|
236
|
-
) : null
|
|
237
|
-
]
|
|
238
|
-
}
|
|
239
|
-
) })
|
|
214
|
+
/* @__PURE__ */ jsx("div", { "data-part": "time-viewport", children: /* @__PURE__ */ jsxs("ol", { "data-part": "time-axis", "data-axis": "time", "aria-label": `${label} months`, children: [
|
|
215
|
+
monthLabels.map((axisLabel, index) => /* @__PURE__ */ jsx(
|
|
216
|
+
"li",
|
|
217
|
+
{
|
|
218
|
+
style: axisStyle("x", axisLabel.position),
|
|
219
|
+
children: axisLabel.label
|
|
220
|
+
},
|
|
221
|
+
`${axisLabel.position}-${index}`
|
|
222
|
+
)),
|
|
223
|
+
interactive && crosshairCandle && activeCandleIndex !== void 0 ? /* @__PURE__ */ jsx(
|
|
224
|
+
"li",
|
|
225
|
+
{
|
|
226
|
+
"data-part": "crosshair-time",
|
|
227
|
+
style: crosshairStyle(activeCandleIndex, data.length, void 0),
|
|
228
|
+
children: String(crosshairCandle.time)
|
|
229
|
+
}
|
|
230
|
+
) : null
|
|
231
|
+
] }) })
|
|
240
232
|
] }) }),
|
|
241
|
-
/* @__PURE__ */ jsxs(
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
children: axisLabel.label
|
|
253
|
-
},
|
|
254
|
-
`${axisLabel.position}-${index}`
|
|
255
|
-
)),
|
|
256
|
-
interactive && crosshairCandle && activeCandleIndex !== void 0 ? /* @__PURE__ */ jsx("li", { className: "candle-chart__crosshair-price", style: cursorStyle(cursorY), children: crosshairCandle.close }) : null
|
|
257
|
-
]
|
|
258
|
-
}
|
|
259
|
-
)
|
|
233
|
+
/* @__PURE__ */ jsxs("ol", { "data-part": "price-axis", "data-axis": "price", "aria-label": `${label} prices`, children: [
|
|
234
|
+
priceLabels.map((axisLabel, index) => /* @__PURE__ */ jsx(
|
|
235
|
+
"li",
|
|
236
|
+
{
|
|
237
|
+
style: axisStyle("y", axisLabel.position),
|
|
238
|
+
children: axisLabel.label
|
|
239
|
+
},
|
|
240
|
+
`${axisLabel.position}-${index}`
|
|
241
|
+
)),
|
|
242
|
+
interactive && crosshairCandle && activeCandleIndex !== void 0 ? /* @__PURE__ */ jsx("li", { "data-part": "crosshair-price", style: cursorStyle(cursorY), children: crosshairCandle.close }) : null
|
|
243
|
+
] })
|
|
260
244
|
] }),
|
|
261
|
-
/* @__PURE__ */ jsxs("table", {
|
|
245
|
+
/* @__PURE__ */ jsxs("table", { "data-part": "data", "aria-label": `${label} data`, children: [
|
|
262
246
|
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
263
247
|
/* @__PURE__ */ jsx("th", { scope: "col", children: "Time" }),
|
|
264
248
|
/* @__PURE__ */ jsx("th", { scope: "col", children: "Open" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/candle-chart/CandleChart.tsx"],"sourcesContent":["import type {\n CSSProperties,\n ElementType,\n KeyboardEvent,\n PointerEvent,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { CandleChartAxisLabel, CandleChartData, CandleChartProps } from \"./types.js\";\n\ninterface CandleStyle extends CSSProperties {\n \"--candle-body-height\": string;\n \"--candle-body-top\": string;\n \"--candle-slot\": string;\n \"--candle-wick-height\": string;\n \"--candle-wick-top\": string;\n \"--candle-x\": string;\n \"--candle-cursor-y\"?: string;\n}\n\ninterface CrosshairStyle extends CSSProperties {\n \"--candle-crosshair-x\": string;\n \"--candle-cursor-y\"?: string;\n}\n\ninterface CursorStyle extends CSSProperties {\n \"--candle-cursor-y\"?: string;\n}\n\ninterface AxisStyle extends CSSProperties {\n \"--candle-axis-x\"?: string;\n \"--candle-axis-y\"?: string;\n}\n\ntype CandleDirection = \"down\" | \"flat\" | \"up\";\n\ninterface CandleGeometry {\n readonly bodyHeight: string;\n readonly bodyTop: string;\n readonly direction: CandleDirection;\n readonly slot: string;\n readonly wickHeight: string;\n readonly wickTop: string;\n readonly x: string;\n}\n\nfunction percent(value: number): string {\n const rounded = Math.round(value * 10000) / 10000;\n return `${rounded}%`;\n}\n\nfunction valueToPercent(value: number, min: number, range: number): number {\n if (range === 0) return 50;\n return Math.min(100, Math.max(0, ((min + range - value) / range) * 100));\n}\n\nfunction directionFor(candle: CandleChartData): CandleDirection {\n if (candle.close > candle.open) return \"up\";\n if (candle.close < candle.open) return \"down\";\n return \"flat\";\n}\n\nfunction getPriceBounds(data: readonly CandleChartData[]): { max: number; min: number } {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n for (const candle of data) {\n min = Math.min(min, candle.low);\n max = Math.max(max, candle.high);\n }\n\n if (data.length === 0) return { max: 1, min: 0 };\n return { max, min };\n}\n\ninterface AxisLabel {\n readonly label: ReactNode;\n readonly position: number;\n}\n\nfunction monthKey(time: string | number): string {\n const date = new Date(time);\n if (Number.isNaN(date.getTime())) return String(time);\n return `${date.getUTCFullYear()}-${date.getUTCMonth()}`;\n}\n\nfunction monthLabel(time: string | number): string {\n const date = new Date(time);\n if (Number.isNaN(date.getTime())) return String(time);\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n timeZone: \"UTC\",\n year: \"2-digit\",\n }).format(date);\n}\n\nfunction monthLabelsFor(data: readonly CandleChartData[]): AxisLabel[] {\n const labels: AxisLabel[] = [];\n const seen = new Set<string>();\n\n data.forEach((candle, index) => {\n const key = monthKey(candle.time);\n if (seen.has(key)) return;\n seen.add(key);\n labels.push({\n label: monthLabel(candle.time),\n position: (index / Math.max(data.length, 1)) * 100,\n });\n });\n\n return labels;\n}\n\nfunction priceLabelsFor(min: number, max: number): AxisLabel[] {\n const tickCount = 6;\n const range = max - min;\n\n return Array.from({ length: tickCount }, (_, index) => {\n const ratio = index / (tickCount - 1);\n const value = max - range * ratio;\n return {\n label: new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 2 }).format(value),\n position: ratio * 100,\n };\n });\n}\n\nfunction geometryFor(\n candle: CandleChartData,\n index: number,\n count: number,\n min: number,\n max: number,\n): CandleGeometry {\n const range = max - min;\n const open = valueToPercent(candle.open, min, range);\n const close = valueToPercent(candle.close, min, range);\n const high = valueToPercent(candle.high, min, range);\n const low = valueToPercent(candle.low, min, range);\n\n return {\n bodyHeight: percent(Math.abs(close - open)),\n bodyTop: percent(Math.min(open, close)),\n direction: directionFor(candle),\n slot: percent(100 / count),\n wickHeight: percent(Math.max(0, low - high)),\n wickTop: percent(high),\n x: percent((index / count) * 100),\n };\n}\n\nfunction candleStyle(geometry: CandleGeometry, cursorY: number | undefined): CandleStyle {\n return {\n \"--candle-body-height\": geometry.bodyHeight,\n \"--candle-body-top\": geometry.bodyTop,\n \"--candle-slot\": geometry.slot,\n \"--candle-wick-height\": geometry.wickHeight,\n \"--candle-wick-top\": geometry.wickTop,\n \"--candle-x\": geometry.x,\n ...(cursorY === undefined ? {} : { \"--candle-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\nfunction crosshairStyle(index: number, count: number, cursorY: number | undefined): CrosshairStyle {\n return {\n \"--candle-crosshair-x\": percent(((index + 0.5) / Math.max(count, 1)) * 100),\n ...(cursorY === undefined ? {} : { \"--candle-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\nfunction cursorStyle(cursorY: number | undefined): CursorStyle {\n return cursorY === undefined ? {} : { \"--candle-cursor-y\": `${Math.max(0, cursorY)}px` };\n}\n\nfunction clampAxisPosition(position: number): number {\n return Math.min(100, Math.max(0, position));\n}\n\nfunction axisStyle(axis: \"x\" | \"y\", position: number): AxisStyle {\n const value = percent(clampAxisPosition(position));\n if (axis === \"x\") return { \"--candle-axis-x\": value };\n return { \"--candle-axis-y\": value };\n}\n\nfunction axisLabelsFor(\n overrides: readonly CandleChartAxisLabel[] | undefined,\n fallback: readonly AxisLabel[],\n): readonly AxisLabel[] {\n return overrides ?? fallback;\n}\n\nexport function CandleChart<TAs extends ElementType = \"figure\">(\n props: CandleChartProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n data,\n xAxis,\n yAxis,\n \"aria-label\": ariaLabel,\n activeCandleIndex,\n cursorY,\n interactive = false,\n onCandleClick,\n onCandlePointerLeave,\n onCandlePointerMove,\n selectedCandleIndex,\n ...consumerProps\n } = props as CandleChartProps<\"figure\">;\n const { min, max } = getPriceBounds(data);\n const label = ariaLabel ?? \"Candlestick chart\";\n const monthLabels = axisLabelsFor(xAxis, monthLabelsFor(data));\n const priceLabels = axisLabelsFor(yAxis, priceLabelsFor(min, max));\n const readoutIndex =\n activeCandleIndex ?? selectedCandleIndex ?? (data.length > 0 ? data.length - 1 : undefined);\n const readoutCandle = readoutIndex === undefined ? undefined : data[readoutIndex];\n const crosshairCandle = activeCandleIndex === undefined ? undefined : data[activeCandleIndex];\n const candles = data.map((candle, index) => {\n const geometry = geometryFor(candle, index, data.length, min, max);\n const isActive = activeCandleIndex === index;\n const isSelected = selectedCandleIndex === index;\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onCandleClick?.(index);\n };\n\n return (\n <li\n key={`${candle.time}-${index}`}\n aria-hidden={interactive ? undefined : true}\n data-direction={geometry.direction}\n data-crosshair-active={interactive && isActive ? \"\" : undefined}\n data-time={String(candle.time)}\n style={candleStyle(geometry, isActive ? cursorY : undefined)}\n >\n {interactive ? (\n <button\n className=\"candle-chart__candle-hit\"\n type=\"button\"\n aria-label={`Candle ${String(candle.time)}`}\n aria-pressed={isSelected}\n onClick={() => onCandleClick?.(index)}\n onKeyDown={handleKeyDown}\n onPointerLeave={onCandlePointerLeave}\n onPointerMove={(event: PointerEvent<HTMLButtonElement>) =>\n onCandlePointerMove?.({ 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-candle-chart\": \"\",\n \"data-interactive\": interactive ? \"\" : undefined,\n children: (\n <>\n <figcaption>{label}</figcaption>\n {interactive && readoutCandle ? (\n <div className=\"candle-chart__readout\" aria-live=\"polite\">\n <span className=\"candle-chart__readout-time\">{String(readoutCandle.time)}</span>\n <span>O {readoutCandle.open}</span>\n <span>H {readoutCandle.high}</span>\n <span>L {readoutCandle.low}</span>\n <span>C {readoutCandle.close}</span>\n </div>\n ) : null}\n <div className=\"candle-chart__plot\" aria-hidden={interactive ? undefined : true}>\n <div className=\"candle-chart__scroll-viewport\">\n <div className=\"candle-chart__canvas\">\n <div className=\"candle-chart__viewport\">\n <ol className=\"candle-chart__candles\" aria-label={`${label} candles`}>\n {candles}\n </ol>\n {interactive && crosshairCandle && activeCandleIndex !== undefined ? (\n <div\n className=\"candle-chart__crosshair\"\n aria-hidden=\"true\"\n style={crosshairStyle(activeCandleIndex, data.length, cursorY)}\n >\n <span className=\"candle-chart__crosshair-marker\">+</span>\n </div>\n ) : null}\n </div>\n <div className=\"candle-chart__time-viewport\">\n <ol\n className=\"candle-chart__time-axis\"\n data-axis=\"time\"\n aria-label={`${label} months`}\n >\n {monthLabels.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 && crosshairCandle && activeCandleIndex !== undefined ? (\n <li\n className=\"candle-chart__crosshair-time\"\n style={crosshairStyle(activeCandleIndex, data.length, undefined)}\n >\n {String(crosshairCandle.time)}\n </li>\n ) : null}\n </ol>\n </div>\n </div>\n </div>\n <ol\n className=\"candle-chart__price-axis\"\n data-axis=\"price\"\n aria-label={`${label} prices`}\n >\n {priceLabels.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 && crosshairCandle && activeCandleIndex !== undefined ? (\n <li className=\"candle-chart__crosshair-price\" style={cursorStyle(cursorY)}>\n {crosshairCandle.close}\n </li>\n ) : null}\n </ol>\n </div>\n <table className=\"candle-chart__data\" aria-label={`${label} data`}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Open</th>\n <th scope=\"col\">High</th>\n <th scope=\"col\">Low</th>\n <th scope=\"col\">Close</th>\n </tr>\n </thead>\n <tbody>\n {data.map((candle, index) => (\n <tr key={`${candle.time}-${index}`}>\n <th scope=\"row\">{String(candle.time)}</th>\n <td>{candle.open}</td>\n <td>{candle.high}</td>\n <td>{candle.low}</td>\n <td>{candle.close}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n ),\n },\n render,\n state: {},\n });\n}\nCandleChart.displayName = \"CandleChart\";\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/candle-chart/CandleChart.tsx"],"sourcesContent":["import type {\n CSSProperties,\n ElementType,\n KeyboardEvent,\n PointerEvent,\n ReactElement,\n ReactNode,\n} from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { CandleChartAxisLabel, CandleChartData, CandleChartProps } from \"./types.js\";\n\ninterface CandleStyle extends CSSProperties {\n \"--candle-body-height\": string;\n \"--candle-body-top\": string;\n \"--candle-slot\": string;\n \"--candle-wick-height\": string;\n \"--candle-wick-top\": string;\n \"--candle-x\": string;\n \"--candle-cursor-y\"?: string;\n}\n\ninterface CrosshairStyle extends CSSProperties {\n \"--candle-crosshair-x\": string;\n \"--candle-cursor-y\"?: string;\n}\n\ninterface CursorStyle extends CSSProperties {\n \"--candle-cursor-y\"?: string;\n}\n\ninterface AxisStyle extends CSSProperties {\n \"--candle-axis-x\"?: string;\n \"--candle-axis-y\"?: string;\n}\n\ntype CandleDirection = \"down\" | \"flat\" | \"up\";\n\ninterface CandleGeometry {\n readonly bodyHeight: string;\n readonly bodyTop: string;\n readonly direction: CandleDirection;\n readonly slot: string;\n readonly wickHeight: string;\n readonly wickTop: string;\n readonly x: string;\n}\n\nfunction percent(value: number): string {\n const rounded = Math.round(value * 10000) / 10000;\n return `${rounded}%`;\n}\n\nfunction valueToPercent(value: number, min: number, range: number): number {\n if (range === 0) return 50;\n return Math.min(100, Math.max(0, ((min + range - value) / range) * 100));\n}\n\nfunction directionFor(candle: CandleChartData): CandleDirection {\n if (candle.close > candle.open) return \"up\";\n if (candle.close < candle.open) return \"down\";\n return \"flat\";\n}\n\nfunction getPriceBounds(data: readonly CandleChartData[]): { max: number; min: number } {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n for (const candle of data) {\n min = Math.min(min, candle.low);\n max = Math.max(max, candle.high);\n }\n\n if (data.length === 0) return { max: 1, min: 0 };\n return { max, min };\n}\n\ninterface AxisLabel {\n readonly label: ReactNode;\n readonly position: number;\n}\n\nfunction monthKey(time: string | number): string {\n const date = new Date(time);\n if (Number.isNaN(date.getTime())) return String(time);\n return `${date.getUTCFullYear()}-${date.getUTCMonth()}`;\n}\n\nfunction monthLabel(time: string | number): string {\n const date = new Date(time);\n if (Number.isNaN(date.getTime())) return String(time);\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n timeZone: \"UTC\",\n year: \"2-digit\",\n }).format(date);\n}\n\nfunction monthLabelsFor(data: readonly CandleChartData[]): AxisLabel[] {\n const labels: AxisLabel[] = [];\n const seen = new Set<string>();\n\n data.forEach((candle, index) => {\n const key = monthKey(candle.time);\n if (seen.has(key)) return;\n seen.add(key);\n labels.push({\n label: monthLabel(candle.time),\n position: (index / Math.max(data.length, 1)) * 100,\n });\n });\n\n return labels;\n}\n\nfunction priceLabelsFor(min: number, max: number): AxisLabel[] {\n const tickCount = 6;\n const range = max - min;\n\n return Array.from({ length: tickCount }, (_, index) => {\n const ratio = index / (tickCount - 1);\n const value = max - range * ratio;\n return {\n label: new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 2 }).format(value),\n position: ratio * 100,\n };\n });\n}\n\nfunction geometryFor(\n candle: CandleChartData,\n index: number,\n count: number,\n min: number,\n max: number,\n): CandleGeometry {\n const range = max - min;\n const open = valueToPercent(candle.open, min, range);\n const close = valueToPercent(candle.close, min, range);\n const high = valueToPercent(candle.high, min, range);\n const low = valueToPercent(candle.low, min, range);\n\n return {\n bodyHeight: percent(Math.abs(close - open)),\n bodyTop: percent(Math.min(open, close)),\n direction: directionFor(candle),\n slot: percent(100 / count),\n wickHeight: percent(Math.max(0, low - high)),\n wickTop: percent(high),\n x: percent((index / count) * 100),\n };\n}\n\nfunction candleStyle(geometry: CandleGeometry, cursorY: number | undefined): CandleStyle {\n return {\n \"--candle-body-height\": geometry.bodyHeight,\n \"--candle-body-top\": geometry.bodyTop,\n \"--candle-slot\": geometry.slot,\n \"--candle-wick-height\": geometry.wickHeight,\n \"--candle-wick-top\": geometry.wickTop,\n \"--candle-x\": geometry.x,\n ...(cursorY === undefined ? {} : { \"--candle-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\nfunction crosshairStyle(index: number, count: number, cursorY: number | undefined): CrosshairStyle {\n return {\n \"--candle-crosshair-x\": percent(((index + 0.5) / Math.max(count, 1)) * 100),\n ...(cursorY === undefined ? {} : { \"--candle-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\nfunction cursorStyle(cursorY: number | undefined): CursorStyle {\n return cursorY === undefined ? {} : { \"--candle-cursor-y\": `${Math.max(0, cursorY)}px` };\n}\n\nfunction clampAxisPosition(position: number): number {\n return Math.min(100, Math.max(0, position));\n}\n\nfunction axisStyle(axis: \"x\" | \"y\", position: number): AxisStyle {\n const value = percent(clampAxisPosition(position));\n if (axis === \"x\") return { \"--candle-axis-x\": value };\n return { \"--candle-axis-y\": value };\n}\n\nfunction axisLabelsFor(\n overrides: readonly CandleChartAxisLabel[] | undefined,\n fallback: readonly AxisLabel[],\n): readonly AxisLabel[] {\n return overrides ?? fallback;\n}\n\nexport function CandleChart<TAs extends ElementType = \"figure\">(\n props: CandleChartProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n data,\n xAxis,\n yAxis,\n \"aria-label\": ariaLabel,\n activeCandleIndex,\n cursorY,\n interactive = false,\n onCandleClick,\n onCandlePointerLeave,\n onCandlePointerMove,\n selectedCandleIndex,\n ...consumerProps\n } = props as CandleChartProps<\"figure\">;\n const { min, max } = getPriceBounds(data);\n const label = ariaLabel ?? \"Candlestick chart\";\n const monthLabels = axisLabelsFor(xAxis, monthLabelsFor(data));\n const priceLabels = axisLabelsFor(yAxis, priceLabelsFor(min, max));\n const readoutIndex =\n activeCandleIndex ?? selectedCandleIndex ?? (data.length > 0 ? data.length - 1 : undefined);\n const readoutCandle = readoutIndex === undefined ? undefined : data[readoutIndex];\n const crosshairCandle = activeCandleIndex === undefined ? undefined : data[activeCandleIndex];\n const candles = data.map((candle, index) => {\n const geometry = geometryFor(candle, index, data.length, min, max);\n const isActive = activeCandleIndex === index;\n const isSelected = selectedCandleIndex === index;\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onCandleClick?.(index);\n };\n\n return (\n <li\n key={`${candle.time}-${index}`}\n aria-hidden={interactive ? undefined : true}\n data-direction={geometry.direction}\n data-crosshair-active={interactive && isActive ? \"\" : undefined}\n data-time={String(candle.time)}\n style={candleStyle(geometry, isActive ? cursorY : undefined)}\n >\n {interactive ? (\n <button\n data-part=\"candle-hit\"\n type=\"button\"\n aria-label={`Candle ${String(candle.time)}`}\n aria-pressed={isSelected}\n onClick={() => onCandleClick?.(index)}\n onKeyDown={handleKeyDown}\n onPointerLeave={onCandlePointerLeave}\n onPointerMove={(event: PointerEvent<HTMLButtonElement>) =>\n onCandlePointerMove?.({ 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-candle-chart\": \"\",\n \"data-interactive\": interactive ? \"\" : undefined,\n children: (\n <>\n <figcaption>{label}</figcaption>\n {interactive && readoutCandle ? (\n <div data-part=\"readout\" aria-live=\"polite\">\n <span data-part=\"readout-time\">{String(readoutCandle.time)}</span>\n <span>O {readoutCandle.open}</span>\n <span>H {readoutCandle.high}</span>\n <span>L {readoutCandle.low}</span>\n <span>C {readoutCandle.close}</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 data-part=\"candles\" aria-label={`${label} candles`}>\n {candles}\n </ol>\n {interactive && crosshairCandle && activeCandleIndex !== undefined ? (\n <div\n data-part=\"crosshair\"\n aria-hidden=\"true\"\n style={crosshairStyle(activeCandleIndex, 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} months`}>\n {monthLabels.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 && crosshairCandle && activeCandleIndex !== undefined ? (\n <li\n data-part=\"crosshair-time\"\n style={crosshairStyle(activeCandleIndex, data.length, undefined)}\n >\n {String(crosshairCandle.time)}\n </li>\n ) : null}\n </ol>\n </div>\n </div>\n </div>\n <ol data-part=\"price-axis\" data-axis=\"price\" aria-label={`${label} prices`}>\n {priceLabels.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 && crosshairCandle && activeCandleIndex !== undefined ? (\n <li data-part=\"crosshair-price\" style={cursorStyle(cursorY)}>\n {crosshairCandle.close}\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\">Open</th>\n <th scope=\"col\">High</th>\n <th scope=\"col\">Low</th>\n <th scope=\"col\">Close</th>\n </tr>\n </thead>\n <tbody>\n {data.map((candle, index) => (\n <tr key={`${candle.time}-${index}`}>\n <th scope=\"row\">{String(candle.time)}</th>\n <td>{candle.open}</td>\n <td>{candle.high}</td>\n <td>{candle.low}</td>\n <td>{candle.close}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n ),\n },\n render,\n state: {},\n });\n}\nCandleChart.displayName = \"CandleChart\";\n"],"mappings":"AA+OU,SA0BF,UA1BE,KA+BI,YA/BJ;AAvOV,SAAS,wBAAwB;AAuCjC,SAAS,QAAQ,OAAuB;AACtC,QAAM,UAAU,KAAK,MAAM,QAAQ,GAAK,IAAI;AAC5C,SAAO,GAAG,OAAO;AACnB;AAEA,SAAS,eAAe,OAAe,KAAa,OAAuB;AACzE,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,IAAK,MAAM,QAAQ,SAAS,QAAS,GAAG,CAAC;AACzE;AAEA,SAAS,aAAa,QAA0C;AAC9D,MAAI,OAAO,QAAQ,OAAO,KAAM,QAAO;AACvC,MAAI,OAAO,QAAQ,OAAO,KAAM,QAAO;AACvC,SAAO;AACT;AAEA,SAAS,eAAe,MAAgE;AACtF,MAAI,MAAM,OAAO;AACjB,MAAI,MAAM,OAAO;AAEjB,aAAW,UAAU,MAAM;AACzB,UAAM,KAAK,IAAI,KAAK,OAAO,GAAG;AAC9B,UAAM,KAAK,IAAI,KAAK,OAAO,IAAI;AAAA,EACjC;AAEA,MAAI,KAAK,WAAW,EAAG,QAAO,EAAE,KAAK,GAAG,KAAK,EAAE;AAC/C,SAAO,EAAE,KAAK,IAAI;AACpB;AAOA,SAAS,SAAS,MAA+B;AAC/C,QAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO,OAAO,IAAI;AACpD,SAAO,GAAG,KAAK,eAAe,CAAC,IAAI,KAAK,YAAY,CAAC;AACvD;AAEA,SAAS,WAAW,MAA+B;AACjD,QAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO,OAAO,IAAI;AACpD,SAAO,IAAI,KAAK,eAAe,SAAS;AAAA,IACtC,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC,EAAE,OAAO,IAAI;AAChB;AAEA,SAAS,eAAe,MAA+C;AACrE,QAAM,SAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAE7B,OAAK,QAAQ,CAAC,QAAQ,UAAU;AAC9B,UAAM,MAAM,SAAS,OAAO,IAAI;AAChC,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,WAAO,KAAK;AAAA,MACV,OAAO,WAAW,OAAO,IAAI;AAAA,MAC7B,UAAW,QAAQ,KAAK,IAAI,KAAK,QAAQ,CAAC,IAAK;AAAA,IACjD,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;AAEA,SAAS,eAAe,KAAa,KAA0B;AAC7D,QAAM,YAAY;AAClB,QAAM,QAAQ,MAAM;AAEpB,SAAO,MAAM,KAAK,EAAE,QAAQ,UAAU,GAAG,CAAC,GAAG,UAAU;AACrD,UAAM,QAAQ,SAAS,YAAY;AACnC,UAAM,QAAQ,MAAM,QAAQ;AAC5B,WAAO;AAAA,MACL,OAAO,IAAI,KAAK,aAAa,SAAS,EAAE,uBAAuB,EAAE,CAAC,EAAE,OAAO,KAAK;AAAA,MAChF,UAAU,QAAQ;AAAA,IACpB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,YACP,QACA,OACA,OACA,KACA,KACgB;AAChB,QAAM,QAAQ,MAAM;AACpB,QAAM,OAAO,eAAe,OAAO,MAAM,KAAK,KAAK;AACnD,QAAM,QAAQ,eAAe,OAAO,OAAO,KAAK,KAAK;AACrD,QAAM,OAAO,eAAe,OAAO,MAAM,KAAK,KAAK;AACnD,QAAM,MAAM,eAAe,OAAO,KAAK,KAAK,KAAK;AAEjD,SAAO;AAAA,IACL,YAAY,QAAQ,KAAK,IAAI,QAAQ,IAAI,CAAC;AAAA,IAC1C,SAAS,QAAQ,KAAK,IAAI,MAAM,KAAK,CAAC;AAAA,IACtC,WAAW,aAAa,MAAM;AAAA,IAC9B,MAAM,QAAQ,MAAM,KAAK;AAAA,IACzB,YAAY,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;AAAA,IAC3C,SAAS,QAAQ,IAAI;AAAA,IACrB,GAAG,QAAS,QAAQ,QAAS,GAAG;AAAA,EAClC;AACF;AAEA,SAAS,YAAY,UAA0B,SAA0C;AACvF,SAAO;AAAA,IACL,wBAAwB,SAAS;AAAA,IACjC,qBAAqB,SAAS;AAAA,IAC9B,iBAAiB,SAAS;AAAA,IAC1B,wBAAwB,SAAS;AAAA,IACjC,qBAAqB,SAAS;AAAA,IAC9B,cAAc,SAAS;AAAA,IACvB,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,qBAAqB,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,KAAK;AAAA,EACtF;AACF;AAEA,SAAS,eAAe,OAAe,OAAe,SAA6C;AACjG,SAAO;AAAA,IACL,wBAAwB,SAAU,QAAQ,OAAO,KAAK,IAAI,OAAO,CAAC,IAAK,GAAG;AAAA,IAC1E,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,qBAAqB,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,KAAK;AAAA,EACtF;AACF;AAEA,SAAS,YAAY,SAA0C;AAC7D,SAAO,YAAY,SAAY,CAAC,IAAI,EAAE,qBAAqB,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,KAAK;AACzF;AAEA,SAAS,kBAAkB,UAA0B;AACnD,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC5C;AAEA,SAAS,UAAU,MAAiB,UAA6B;AAC/D,QAAM,QAAQ,QAAQ,kBAAkB,QAAQ,CAAC;AACjD,MAAI,SAAS,IAAK,QAAO,EAAE,mBAAmB,MAAM;AACpD,SAAO,EAAE,mBAAmB,MAAM;AACpC;AAEA,SAAS,cACP,WACA,UACsB;AACtB,SAAO,aAAa;AACtB;AAEO,SAAS,YACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,EAAE,KAAK,IAAI,IAAI,eAAe,IAAI;AACxC,QAAM,QAAQ,aAAa;AAC3B,QAAM,cAAc,cAAc,OAAO,eAAe,IAAI,CAAC;AAC7D,QAAM,cAAc,cAAc,OAAO,eAAe,KAAK,GAAG,CAAC;AACjE,QAAM,eACJ,qBAAqB,wBAAwB,KAAK,SAAS,IAAI,KAAK,SAAS,IAAI;AACnF,QAAM,gBAAgB,iBAAiB,SAAY,SAAY,KAAK,YAAY;AAChF,QAAM,kBAAkB,sBAAsB,SAAY,SAAY,KAAK,iBAAiB;AAC5F,QAAM,UAAU,KAAK,IAAI,CAAC,QAAQ,UAAU;AAC1C,UAAM,WAAW,YAAY,QAAQ,OAAO,KAAK,QAAQ,KAAK,GAAG;AACjE,UAAM,WAAW,sBAAsB;AACvC,UAAM,aAAa,wBAAwB;AAC3C,UAAM,gBAAgB,CAAC,UAA4C;AACjE,UAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,IAAK;AAChD,YAAM,eAAe;AACrB,sBAAgB,KAAK;AAAA,IACvB;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,eAAa,cAAc,SAAY;AAAA,QACvC,kBAAgB,SAAS;AAAA,QACzB,yBAAuB,eAAe,WAAW,KAAK;AAAA,QACtD,aAAW,OAAO,OAAO,IAAI;AAAA,QAC7B,OAAO,YAAY,UAAU,WAAW,UAAU,MAAS;AAAA,QAE1D,wBACC;AAAA,UAAC;AAAA;AAAA,YACC,aAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAY,UAAU,OAAO,OAAO,IAAI,CAAC;AAAA,YACzC,gBAAc;AAAA,YACd,SAAS,MAAM,gBAAgB,KAAK;AAAA,YACpC,WAAW;AAAA,YACX,gBAAgB;AAAA,YAChB,eAAe,CAAC,UACd,sBAAsB,EAAE,OAAO,SAAS,MAAM,YAAY,QAAQ,CAAC;AAAA;AAAA,QAEvE,IACE;AAAA;AAAA,MApBC,GAAG,OAAO,IAAI,IAAI,KAAK;AAAA,IAqB9B;AAAA,EAEJ,CAAC;AAED,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,GAAG;AAAA,MACH,cAAc;AAAA,MACd,2BAA2B;AAAA,MAC3B,oBAAoB,cAAc,KAAK;AAAA,MACvC,UACE,iCACE;AAAA,4BAAC,gBAAY,iBAAM;AAAA,QAClB,eAAe,gBACd,qBAAC,SAAI,aAAU,WAAU,aAAU,UACjC;AAAA,8BAAC,UAAK,aAAU,gBAAgB,iBAAO,cAAc,IAAI,GAAE;AAAA,UAC3D,qBAAC,UAAK;AAAA;AAAA,YAAG,cAAc;AAAA,aAAK;AAAA,UAC5B,qBAAC,UAAK;AAAA;AAAA,YAAG,cAAc;AAAA,aAAK;AAAA,UAC5B,qBAAC,UAAK;AAAA;AAAA,YAAG,cAAc;AAAA,aAAI;AAAA,UAC3B,qBAAC,UAAK;AAAA;AAAA,YAAG,cAAc;AAAA,aAAM;AAAA,WAC/B,IACE;AAAA,QACJ,qBAAC,SAAI,aAAU,QAAO,eAAa,cAAc,SAAY,MAC3D;AAAA,8BAAC,SAAI,aAAU,mBACb,+BAAC,SAAI,aAAU,UACb;AAAA,iCAAC,SAAI,aAAU,YACb;AAAA,kCAAC,QAAG,aAAU,WAAU,cAAY,GAAG,KAAK,YACzC,mBACH;AAAA,cACC,eAAe,mBAAmB,sBAAsB,SACvD;AAAA,gBAAC;AAAA;AAAA,kBACC,aAAU;AAAA,kBACV,eAAY;AAAA,kBACZ,OAAO,eAAe,mBAAmB,KAAK,QAAQ,OAAO;AAAA,kBAE7D,8BAAC,UAAK,aAAU,oBAAmB,eAAC;AAAA;AAAA,cACtC,IACE;AAAA,eACN;AAAA,YACA,oBAAC,SAAI,aAAU,iBACb,+BAAC,QAAG,aAAU,aAAY,aAAU,QAAO,cAAY,GAAG,KAAK,WAC5D;AAAA,0BAAY,IAAI,CAAC,WAAW,UAC3B;AAAA,gBAAC;AAAA;AAAA,kBAEC,OAAO,UAAU,KAAK,UAAU,QAAQ;AAAA,kBAEvC,oBAAU;AAAA;AAAA,gBAHN,GAAG,UAAU,QAAQ,IAAI,KAAK;AAAA,cAIrC,CACD;AAAA,cACA,eAAe,mBAAmB,sBAAsB,SACvD;AAAA,gBAAC;AAAA;AAAA,kBACC,aAAU;AAAA,kBACV,OAAO,eAAe,mBAAmB,KAAK,QAAQ,MAAS;AAAA,kBAE9D,iBAAO,gBAAgB,IAAI;AAAA;AAAA,cAC9B,IACE;AAAA,eACN,GACF;AAAA,aACF,GACF;AAAA,UACA,qBAAC,QAAG,aAAU,cAAa,aAAU,SAAQ,cAAY,GAAG,KAAK,WAC9D;AAAA,wBAAY,IAAI,CAAC,WAAW,UAC3B;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAO,UAAU,KAAK,UAAU,QAAQ;AAAA,gBAEvC,oBAAU;AAAA;AAAA,cAHN,GAAG,UAAU,QAAQ,IAAI,KAAK;AAAA,YAIrC,CACD;AAAA,YACA,eAAe,mBAAmB,sBAAsB,SACvD,oBAAC,QAAG,aAAU,mBAAkB,OAAO,YAAY,OAAO,GACvD,0BAAgB,OACnB,IACE;AAAA,aACN;AAAA,WACF;AAAA,QACA,qBAAC,WAAM,aAAU,QAAO,cAAY,GAAG,KAAK,SAC1C;AAAA,8BAAC,WACC,+BAAC,QACC;AAAA,gCAAC,QAAG,OAAM,OAAM,kBAAI;AAAA,YACpB,oBAAC,QAAG,OAAM,OAAM,kBAAI;AAAA,YACpB,oBAAC,QAAG,OAAM,OAAM,kBAAI;AAAA,YACpB,oBAAC,QAAG,OAAM,OAAM,iBAAG;AAAA,YACnB,oBAAC,QAAG,OAAM,OAAM,mBAAK;AAAA,aACvB,GACF;AAAA,UACA,oBAAC,WACE,eAAK,IAAI,CAAC,QAAQ,UACjB,qBAAC,QACC;AAAA,gCAAC,QAAG,OAAM,OAAO,iBAAO,OAAO,IAAI,GAAE;AAAA,YACrC,oBAAC,QAAI,iBAAO,MAAK;AAAA,YACjB,oBAAC,QAAI,iBAAO,MAAK;AAAA,YACjB,oBAAC,QAAI,iBAAO,KAAI;AAAA,YAChB,oBAAC,QAAI,iBAAO,OAAM;AAAA,eALX,GAAG,OAAO,IAAI,IAAI,KAAK,EAMhC,CACD,GACH;AAAA,WACF;AAAA,SACF;AAAA,IAEJ;AAAA,IACA;AAAA,IACA,OAAO,CAAC;AAAA,EACV,CAAC;AACH;AACA,YAAY,cAAc;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/candle-chart/client/CandleChartClient.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useState } from \"react\";\nimport type { CSSProperties, ElementType, ReactElement, Ref } from \"react\";\nimport { CandleChart } from \"../CandleChart.js\";\nimport type { CandleChartPointerPosition, CandleChartProps } from \"../types.js\";\nimport { useChartViewport } from \"../../../hooks/use-chart-viewport.js\";\nimport { useMergedRefs } from \"../../../hooks/use-merged-refs.js\";\n\ninterface InteractiveCandleStyle extends CSSProperties {\n \"--candle-scale\": string;\n}\n\ninterface CursorState extends CandleChartPointerPosition {}\n\n/**\n *
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/candle-chart/client/CandleChartClient.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useState } from \"react\";\nimport type { CSSProperties, ElementType, ReactElement, Ref } from \"react\";\nimport { CandleChart } from \"../CandleChart.js\";\nimport type { CandleChartPointerPosition, CandleChartProps } from \"../types.js\";\nimport { useChartViewport } from \"../../../hooks/use-chart-viewport.js\";\nimport { useMergedRefs } from \"../../../hooks/use-merged-refs.js\";\n\ninterface InteractiveCandleStyle extends CSSProperties {\n \"--candle-scale\": string;\n}\n\ninterface CursorState extends CandleChartPointerPosition {}\n\n/**\n * `[data-part=\"plot\"]`'s fixed price-axis column (4.5rem) plus its grid gap\n * (0.75rem) — see candle-chart.css. `useChartViewport` measures the whole\n * `<figure>`, but candles only ever get the width left over after this\n * column, so it must be subtracted before sizing `minItemWidth`.\n */\nconst Y_AXIS_COLUMN_WIDTH = 72 + 12;\n\nexport function CandleChartClient<TAs extends ElementType = \"figure\">(\n props: CandleChartProps<TAs>,\n): ReactElement | null {\n const {\n data,\n ref: consumerRef,\n style: consumerStyle,\n onCandleClick: consumerOnCandleClick,\n onCandlePointerLeave: consumerOnCandlePointerLeave,\n onCandlePointerMove: consumerOnCandlePointerMove,\n ...consumerProps\n } = props as CandleChartProps<\"figure\"> & {\n ref?: Ref<HTMLElement>;\n style?: CSSProperties;\n };\n const viewport = useChartViewport({\n itemCount: data.length,\n measuredWidthOffset: Y_AXIS_COLUMN_WIDTH,\n minItemWidth: 24,\n });\n const [cursor, setCursor] = useState<CursorState | null>(null);\n const [selectedCandleIndex, setSelectedCandleIndex] = useState<number | undefined>();\n const chartRef = useMergedRefs<HTMLElement>(viewport.ref, consumerRef);\n const handleCandleClick = useCallback(\n (index: number) => {\n setSelectedCandleIndex(index);\n consumerOnCandleClick?.(index);\n },\n [consumerOnCandleClick],\n );\n const handleCandlePointerLeave = useCallback(() => {\n setCursor(null);\n consumerOnCandlePointerLeave?.();\n }, [consumerOnCandlePointerLeave]);\n const handleCandlePointerMove = useCallback(\n (position: CandleChartPointerPosition) => {\n setCursor(position);\n consumerOnCandlePointerMove?.(position);\n },\n [consumerOnCandlePointerMove],\n );\n const style: InteractiveCandleStyle = {\n ...consumerStyle,\n \"--candle-scale\": String(viewport.scale),\n };\n\n const chartProps = {\n ...consumerProps,\n data,\n activeCandleIndex: cursor?.index,\n cursorY: cursor?.offsetY,\n interactive: true,\n onCandleClick: handleCandleClick,\n onCandlePointerLeave: handleCandlePointerLeave,\n onCandlePointerMove: handleCandlePointerMove,\n ref: chartRef,\n selectedCandleIndex,\n style,\n } as CandleChartProps<\"figure\">;\n\n return <CandleChart {...chartProps} />;\n}\nCandleChartClient.displayName = \"CandleChartClient\";\n"],"mappings":";AAmFS;AAjFT,SAAS,aAAa,gBAAgB;AAEtC,SAAS,mBAAmB;AAE5B,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAc9B,MAAM,sBAAsB,KAAK;AAE1B,SAAS,kBACd,OACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA,KAAK;AAAA,IACL,OAAO;AAAA,IACP,eAAe;AAAA,IACf,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,GAAG;AAAA,EACL,IAAI;AAIJ,QAAM,WAAW,iBAAiB;AAAA,IAChC,WAAW,KAAK;AAAA,IAChB,qBAAqB;AAAA,IACrB,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA6B,IAAI;AAC7D,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAA6B;AACnF,QAAM,WAAW,cAA2B,SAAS,KAAK,WAAW;AACrE,QAAM,oBAAoB;AAAA,IACxB,CAAC,UAAkB;AACjB,6BAAuB,KAAK;AAC5B,8BAAwB,KAAK;AAAA,IAC/B;AAAA,IACA,CAAC,qBAAqB;AAAA,EACxB;AACA,QAAM,2BAA2B,YAAY,MAAM;AACjD,cAAU,IAAI;AACd,mCAA+B;AAAA,EACjC,GAAG,CAAC,4BAA4B,CAAC;AACjC,QAAM,0BAA0B;AAAA,IAC9B,CAAC,aAAyC;AACxC,gBAAU,QAAQ;AAClB,oCAA8B,QAAQ;AAAA,IACxC;AAAA,IACA,CAAC,2BAA2B;AAAA,EAC9B;AACA,QAAM,QAAgC;AAAA,IACpC,GAAG;AAAA,IACH,kBAAkB,OAAO,SAAS,KAAK;AAAA,EACzC;AAEA,QAAM,aAAa;AAAA,IACjB,GAAG;AAAA,IACH;AAAA,IACA,mBAAmB,QAAQ;AAAA,IAC3B,SAAS,QAAQ;AAAA,IACjB,aAAa;AAAA,IACb,eAAe;AAAA,IACf,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,KAAK;AAAA,IACL;AAAA,IACA;AAAA,EACF;AAEA,SAAO,oBAAC,eAAa,GAAG,YAAY;AACtC;AACA,kBAAkB,cAAc;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CarouselMarkup.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/CarouselMarkup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CarouselMarkup.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/CarouselMarkup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EAAE,OAAO,EACb,OAAO,EACP,YAAY,GACb,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAsI3C;yBA1Ie,cAAc"}
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
carouselFragment,
|
|
4
|
-
carouselSlideId,
|
|
5
|
-
joinClassNames,
|
|
6
|
-
normalizeCarouselProps
|
|
7
|
-
} from "./carousel-markup.js";
|
|
2
|
+
import { carouselFragment, carouselSlideId, normalizeCarouselProps } from "./carousel-markup.js";
|
|
8
3
|
function CarouselMarkup({
|
|
9
4
|
base: rawBase,
|
|
10
5
|
rootRef,
|
|
11
6
|
presentation
|
|
12
7
|
}) {
|
|
13
8
|
const base = normalizeCarouselProps(rawBase);
|
|
14
|
-
const { items,
|
|
9
|
+
const { items, labels } = base;
|
|
15
10
|
const hasControls = items.length > 1;
|
|
16
11
|
if (items.length === 0) return null;
|
|
17
12
|
const enhanced = presentation?.snapshot.ready === true;
|
|
@@ -39,8 +34,7 @@ function CarouselMarkup({
|
|
|
39
34
|
"button",
|
|
40
35
|
{
|
|
41
36
|
type: "button",
|
|
42
|
-
|
|
43
|
-
"data-uiify-carousel-controls": "",
|
|
37
|
+
"data-part": "controls",
|
|
44
38
|
"data-carousel-action": "rotation",
|
|
45
39
|
hidden: !enhanced,
|
|
46
40
|
children: presentation.autoplay.requested ? labels.stop : labels.start
|
|
@@ -53,8 +47,7 @@ function CarouselMarkup({
|
|
|
53
47
|
tabIndex: 0,
|
|
54
48
|
role: "group",
|
|
55
49
|
"aria-label": base["aria-label"],
|
|
56
|
-
|
|
57
|
-
"data-uiify-carousel-viewport": "",
|
|
50
|
+
"data-part": "viewport",
|
|
58
51
|
children: items.map((item, index) => {
|
|
59
52
|
const slideId = carouselSlideId(base.id, item.id);
|
|
60
53
|
return /* @__PURE__ */ jsx(
|
|
@@ -64,12 +57,12 @@ function CarouselMarkup({
|
|
|
64
57
|
role: "group",
|
|
65
58
|
"aria-roledescription": "slide",
|
|
66
59
|
"aria-label": `${item.label}, ${index + 1} ${labels.of} ${items.length}`,
|
|
67
|
-
className:
|
|
68
|
-
"data-
|
|
60
|
+
className: item.className,
|
|
61
|
+
"data-part": "slide",
|
|
69
62
|
"data-carousel-index": index,
|
|
70
63
|
...enhanced ? { "data-state": index === presentedIndex ? "active" : "inactive" } : {},
|
|
71
64
|
...fade && index !== presentedIndex ? { inert: true, "aria-hidden": true } : {},
|
|
72
|
-
children: /* @__PURE__ */ jsx("div", {
|
|
65
|
+
children: /* @__PURE__ */ jsx("div", { "data-part": "slide-content", children: item.children })
|
|
73
66
|
},
|
|
74
67
|
item.id
|
|
75
68
|
);
|
|
@@ -80,47 +73,36 @@ function CarouselMarkup({
|
|
|
80
73
|
"button",
|
|
81
74
|
{
|
|
82
75
|
type: "button",
|
|
83
|
-
className: joinClassNames(classNames?.controls, classNames?.previous),
|
|
84
76
|
"aria-label": labels.previous,
|
|
85
|
-
"data-
|
|
77
|
+
"data-part": "controls",
|
|
86
78
|
"data-carousel-action": "previous",
|
|
87
79
|
hidden: !enhanced,
|
|
88
80
|
disabled: enhanced ? presentation.snapshot.atStart : void 0,
|
|
89
81
|
children: base.icons?.previous
|
|
90
82
|
}
|
|
91
83
|
) : null,
|
|
92
|
-
base.pagination && hasControls ? /* @__PURE__ */ jsx(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
"data-uiify-carousel-dot": "",
|
|
109
|
-
"data-carousel-index": itemIndex,
|
|
110
|
-
children: itemIndex + 1
|
|
111
|
-
},
|
|
112
|
-
item.id
|
|
113
|
-
);
|
|
114
|
-
})
|
|
115
|
-
}
|
|
116
|
-
) : null,
|
|
84
|
+
base.pagination && hasControls ? /* @__PURE__ */ jsx("nav", { "aria-label": labels.navigation, "data-part": "dots", children: dotIndices.map((itemIndex) => {
|
|
85
|
+
const item = items[itemIndex];
|
|
86
|
+
if (!item) return null;
|
|
87
|
+
return /* @__PURE__ */ jsx(
|
|
88
|
+
"a",
|
|
89
|
+
{
|
|
90
|
+
href: carouselFragment(carouselSlideId(base.id, item.id)),
|
|
91
|
+
"aria-label": `${labels.goTo} ${item.label}`,
|
|
92
|
+
"aria-current": showActiveDot && itemIndex === activeIndex ? "true" : void 0,
|
|
93
|
+
"data-part": "dot",
|
|
94
|
+
"data-carousel-index": itemIndex,
|
|
95
|
+
children: itemIndex + 1
|
|
96
|
+
},
|
|
97
|
+
item.id
|
|
98
|
+
);
|
|
99
|
+
}) }) : null,
|
|
117
100
|
presentation && hasControls && base.navigation ? /* @__PURE__ */ jsx(
|
|
118
101
|
"button",
|
|
119
102
|
{
|
|
120
103
|
type: "button",
|
|
121
|
-
className: joinClassNames(classNames?.controls, classNames?.next),
|
|
122
104
|
"aria-label": labels.next,
|
|
123
|
-
"data-
|
|
105
|
+
"data-part": "controls",
|
|
124
106
|
"data-carousel-action": "next",
|
|
125
107
|
hidden: !enhanced,
|
|
126
108
|
disabled: enhanced ? presentation.snapshot.atEnd : void 0,
|
|
@@ -130,10 +112,9 @@ function CarouselMarkup({
|
|
|
130
112
|
presentation ? /* @__PURE__ */ jsx(
|
|
131
113
|
"div",
|
|
132
114
|
{
|
|
133
|
-
className: classNames?.status,
|
|
134
115
|
"aria-live": presentation.autoplay?.playing ? "off" : "polite",
|
|
135
116
|
"aria-atomic": "true",
|
|
136
|
-
"data-
|
|
117
|
+
"data-part": "status",
|
|
137
118
|
children: enhanced && activeIndex !== void 0 ? `${items[activeIndex]?.label ?? ""}, ${activeIndex + 1} ${labels.of} ${items.length}` : null
|
|
138
119
|
}
|
|
139
120
|
) : null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/carousel/CarouselMarkup.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/components/carousel/CarouselMarkup.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport { carouselFragment, carouselSlideId, normalizeCarouselProps } from \"./carousel-markup.js\";\nimport type { CarouselMarkupProps } from \"./types.js\";\n\nexport function CarouselMarkup({\n base: rawBase,\n rootRef,\n presentation,\n}: CarouselMarkupProps): ReactElement | null {\n const base = normalizeCarouselProps(rawBase);\n const { items, labels } = base;\n const hasControls = items.length > 1;\n\n if (items.length === 0) return null;\n\n const enhanced = presentation?.snapshot.ready === true;\n // Pagination claims a current slide as soon as the client has mounted, even before\n // the controller reports `ready` — SSR/pre-hydration markup still claims nothing.\n const showActiveDot = enhanced || presentation?.mounted === true;\n const activeIndex = presentation?.snapshot.index;\n const fade = enhanced && presentation.mode === \"fade\";\n const presentedIndex = fade ? (presentation.snapshot.requestedIndex ?? activeIndex) : activeIndex;\n const dotIndices =\n enhanced && !presentation.preserveFallbackFocus\n ? presentation.snapshot.pages.map((page) => page.index)\n : items.map((_, index) => index);\n\n return (\n <section\n ref={rootRef}\n id={base.id}\n aria-label={base[\"aria-label\"]}\n aria-roledescription=\"carousel\"\n data-uiify-carousel=\"\"\n data-axis={base.axis}\n {...(presentation ? { \"data-mode\": presentation.mode } : {})}\n {...(enhanced ? { \"data-enhanced\": \"\" } : {})}\n {...(base.dir ? { dir: base.dir } : {})}\n {...(base.className ? { className: base.className } : {})}\n {...(base.style ? { style: base.style } : {})}\n >\n {presentation && hasControls && presentation.autoplay ? (\n <button\n type=\"button\"\n data-part=\"controls\"\n data-carousel-action=\"rotation\"\n hidden={!enhanced}\n >\n {presentation.autoplay.requested ? labels.stop : labels.start}\n </button>\n ) : null}\n\n <div\n id={`${base.id}--viewport`}\n tabIndex={0}\n role=\"group\"\n aria-label={base[\"aria-label\"]}\n data-part=\"viewport\"\n >\n {items.map((item, index) => {\n const slideId = carouselSlideId(base.id, item.id);\n return (\n <div\n key={item.id}\n id={slideId}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${item.label}, ${index + 1} ${labels.of} ${items.length}`}\n className={item.className}\n data-part=\"slide\"\n data-carousel-index={index}\n {...(enhanced\n ? { \"data-state\": index === presentedIndex ? \"active\" : \"inactive\" }\n : {})}\n {...(fade && index !== presentedIndex ? { inert: true, \"aria-hidden\": true } : {})}\n >\n <div data-part=\"slide-content\">{item.children}</div>\n </div>\n );\n })}\n </div>\n\n {presentation && hasControls && base.navigation ? (\n <button\n type=\"button\"\n aria-label={labels.previous}\n data-part=\"controls\"\n data-carousel-action=\"previous\"\n hidden={!enhanced}\n disabled={enhanced ? presentation.snapshot.atStart : undefined}\n >\n {base.icons?.previous}\n </button>\n ) : null}\n\n {base.pagination && hasControls ? (\n <nav aria-label={labels.navigation} data-part=\"dots\">\n {dotIndices.map((itemIndex) => {\n const item = items[itemIndex];\n if (!item) return null;\n return (\n <a\n key={item.id}\n href={carouselFragment(carouselSlideId(base.id, item.id))}\n aria-label={`${labels.goTo} ${item.label}`}\n aria-current={showActiveDot && itemIndex === activeIndex ? \"true\" : undefined}\n data-part=\"dot\"\n data-carousel-index={itemIndex}\n >\n {itemIndex + 1}\n </a>\n );\n })}\n </nav>\n ) : null}\n\n {presentation && hasControls && base.navigation ? (\n <button\n type=\"button\"\n aria-label={labels.next}\n data-part=\"controls\"\n data-carousel-action=\"next\"\n hidden={!enhanced}\n disabled={enhanced ? presentation.snapshot.atEnd : undefined}\n >\n {base.icons?.next}\n </button>\n ) : null}\n\n {presentation ? (\n <div\n aria-live={presentation.autoplay?.playing ? \"off\" : \"polite\"}\n aria-atomic=\"true\"\n data-part=\"status\"\n >\n {enhanced && activeIndex !== undefined\n ? `${items[activeIndex]?.label ?? \"\"}, ${activeIndex + 1} ${labels.of} ${items.length}`\n : null}\n </div>\n ) : null}\n </section>\n );\n}\nCarouselMarkup.displayName = \"CarouselMarkup\";\n"],"mappings":"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","names":[]}
|
|
@@ -8,5 +8,4 @@ export interface NormalizedCarouselProps extends CarouselProps {
|
|
|
8
8
|
export declare function normalizeCarouselProps(props: CarouselProps): NormalizedCarouselProps;
|
|
9
9
|
export declare function carouselSlideId(carouselId: string, itemId: string): string;
|
|
10
10
|
export declare function carouselFragment(id: string): string;
|
|
11
|
-
export declare function joinClassNames(...values: readonly (string | undefined)[]): string | undefined;
|
|
12
11
|
//# sourceMappingURL=carousel-markup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carousel-markup.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/carousel-markup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhE,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAqBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,uBAAuB,CAmBpF;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD
|
|
1
|
+
{"version":3,"file":"carousel-markup.d.ts","sourceRoot":"","sources":["../../../src/components/carousel/carousel-markup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhE,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAqBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,uBAAuB,CAmBpF;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
|
@@ -40,14 +40,9 @@ function carouselSlideId(carouselId, itemId) {
|
|
|
40
40
|
function carouselFragment(id) {
|
|
41
41
|
return `#${encodeURIComponent(id)}`;
|
|
42
42
|
}
|
|
43
|
-
function joinClassNames(...values) {
|
|
44
|
-
const value = values.filter(Boolean).join(" ");
|
|
45
|
-
return value || void 0;
|
|
46
|
-
}
|
|
47
43
|
export {
|
|
48
44
|
carouselFragment,
|
|
49
45
|
carouselSlideId,
|
|
50
|
-
joinClassNames,
|
|
51
46
|
normalizeCarouselProps
|
|
52
47
|
};
|
|
53
48
|
//# sourceMappingURL=carousel-markup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/carousel/carousel-markup.ts"],"sourcesContent":["import type { CarouselLabels, CarouselProps } from \"./types.js\";\n\nconst ASCII_WHITESPACE = /[\\t\\n\\f\\r ]/u;\n\nexport interface NormalizedCarouselProps extends CarouselProps {\n readonly axis: NonNullable<CarouselProps[\"axis\"]>;\n readonly navigation: boolean;\n readonly pagination: boolean;\n readonly labels: CarouselLabels;\n}\n\nconst defaultLabels: CarouselLabels = {\n previous: \"Previous slide\",\n next: \"Next slide\",\n goTo: \"Go to\",\n navigation: \"Choose slide\",\n start: \"Start slide rotation\",\n stop: \"Stop slide rotation\",\n of: \"of\",\n};\n\nfunction validateId(id: string, subject: string): void {\n if (id.length === 0) {\n throw new TypeError(`${subject} id must not be empty`);\n }\n if (ASCII_WHITESPACE.test(id)) {\n throw new TypeError(`${subject} id must not contain ASCII whitespace`);\n }\n}\n\nexport function normalizeCarouselProps(props: CarouselProps): NormalizedCarouselProps {\n validateId(props.id, \"Carousel\");\n\n const itemIds = new Set<string>();\n for (const item of props.items) {\n validateId(item.id, \"Carousel item\");\n if (itemIds.has(item.id)) {\n throw new TypeError(`Carousel item id must be unique; duplicate id: ${item.id}`);\n }\n itemIds.add(item.id);\n }\n\n return {\n ...props,\n axis: props.axis ?? \"inline\",\n navigation: props.navigation ?? true,\n pagination: props.pagination ?? true,\n labels: { ...defaultLabels, ...props.labels },\n };\n}\n\nexport function carouselSlideId(carouselId: string, itemId: string): string {\n return `${carouselId}--slide-${itemId}`;\n}\n\nexport function carouselFragment(id: string): string {\n return `#${encodeURIComponent(id)}`;\n}\n
|
|
1
|
+
{"version":3,"sources":["../../../src/components/carousel/carousel-markup.ts"],"sourcesContent":["import type { CarouselLabels, CarouselProps } from \"./types.js\";\n\nconst ASCII_WHITESPACE = /[\\t\\n\\f\\r ]/u;\n\nexport interface NormalizedCarouselProps extends CarouselProps {\n readonly axis: NonNullable<CarouselProps[\"axis\"]>;\n readonly navigation: boolean;\n readonly pagination: boolean;\n readonly labels: CarouselLabels;\n}\n\nconst defaultLabels: CarouselLabels = {\n previous: \"Previous slide\",\n next: \"Next slide\",\n goTo: \"Go to\",\n navigation: \"Choose slide\",\n start: \"Start slide rotation\",\n stop: \"Stop slide rotation\",\n of: \"of\",\n};\n\nfunction validateId(id: string, subject: string): void {\n if (id.length === 0) {\n throw new TypeError(`${subject} id must not be empty`);\n }\n if (ASCII_WHITESPACE.test(id)) {\n throw new TypeError(`${subject} id must not contain ASCII whitespace`);\n }\n}\n\nexport function normalizeCarouselProps(props: CarouselProps): NormalizedCarouselProps {\n validateId(props.id, \"Carousel\");\n\n const itemIds = new Set<string>();\n for (const item of props.items) {\n validateId(item.id, \"Carousel item\");\n if (itemIds.has(item.id)) {\n throw new TypeError(`Carousel item id must be unique; duplicate id: ${item.id}`);\n }\n itemIds.add(item.id);\n }\n\n return {\n ...props,\n axis: props.axis ?? \"inline\",\n navigation: props.navigation ?? true,\n pagination: props.pagination ?? true,\n labels: { ...defaultLabels, ...props.labels },\n };\n}\n\nexport function carouselSlideId(carouselId: string, itemId: string): string {\n return `${carouselId}--slide-${itemId}`;\n}\n\nexport function carouselFragment(id: string): string {\n return `#${encodeURIComponent(id)}`;\n}\n"],"mappings":"AAEA,MAAM,mBAAmB;AASzB,MAAM,gBAAgC;AAAA,EACpC,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,IAAI;AACN;AAEA,SAAS,WAAW,IAAY,SAAuB;AACrD,MAAI,GAAG,WAAW,GAAG;AACnB,UAAM,IAAI,UAAU,GAAG,OAAO,uBAAuB;AAAA,EACvD;AACA,MAAI,iBAAiB,KAAK,EAAE,GAAG;AAC7B,UAAM,IAAI,UAAU,GAAG,OAAO,uCAAuC;AAAA,EACvE;AACF;AAEO,SAAS,uBAAuB,OAA+C;AACpF,aAAW,MAAM,IAAI,UAAU;AAE/B,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,QAAQ,MAAM,OAAO;AAC9B,eAAW,KAAK,IAAI,eAAe;AACnC,QAAI,QAAQ,IAAI,KAAK,EAAE,GAAG;AACxB,YAAM,IAAI,UAAU,kDAAkD,KAAK,EAAE,EAAE;AAAA,IACjF;AACA,YAAQ,IAAI,KAAK,EAAE;AAAA,EACrB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,MAAM,QAAQ;AAAA,IACpB,YAAY,MAAM,cAAc;AAAA,IAChC,YAAY,MAAM,cAAc;AAAA,IAChC,QAAQ,EAAE,GAAG,eAAe,GAAG,MAAM,OAAO;AAAA,EAC9C;AACF;AAEO,SAAS,gBAAgB,YAAoB,QAAwB;AAC1E,SAAO,GAAG,UAAU,WAAW,MAAM;AACvC;AAEO,SAAS,iBAAiB,IAAoB;AACnD,SAAO,IAAI,mBAAmB,EAAE,CAAC;AACnC;","names":[]}
|
|
@@ -2,7 +2,7 @@ import { createCarouselPages, findCarouselPage } from "../carousel-pages.js";
|
|
|
2
2
|
import { attachCarouselCommands } from "../commands.js";
|
|
3
3
|
import { observeCarousel } from "./carousel-observer.js";
|
|
4
4
|
function createCarouselController(root, initialOptions) {
|
|
5
|
-
const viewport = root.querySelector(
|
|
5
|
+
const viewport = root.querySelector(':scope > [data-part="viewport"]');
|
|
6
6
|
if (!viewport) throw new Error("Carousel viewport is missing");
|
|
7
7
|
const observer = observeCarousel(root);
|
|
8
8
|
const listeners = /* @__PURE__ */ new Set();
|
|
@@ -28,7 +28,7 @@ function createCarouselController(root, initialOptions) {
|
|
|
28
28
|
let touch = false;
|
|
29
29
|
let touchActive = false;
|
|
30
30
|
const resizedSlides = /* @__PURE__ */ new Set();
|
|
31
|
-
const slides = () => Array.from(viewport.children).filter((node) => node.
|
|
31
|
+
const slides = () => Array.from(viewport.children).filter((node) => node.getAttribute("data-part") === "slide");
|
|
32
32
|
function publish(next) {
|
|
33
33
|
if (JSON.stringify(snapshot) === JSON.stringify(next)) return;
|
|
34
34
|
snapshot = next;
|