@tosui/react 0.1.0 → 0.1.2
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.map +1 -1
- package/dist/components/Accordion/Accordion.js +109 -0
- package/dist/components/Accordion/Accordion.js.map +1 -0
- package/dist/components/Accordion/accordion.module.css +36 -0
- package/dist/components/Accordion/accordion.module.css.js +27 -0
- package/dist/components/Accordion/accordion.module.css.js.map +1 -0
- package/dist/components/Alert/Alert.js +109 -0
- package/dist/components/Alert/Alert.js.map +1 -0
- package/dist/components/Alert/alert.module.css +27 -0
- package/dist/components/Alert/alert.module.css.js +24 -0
- package/dist/components/Alert/alert.module.css.js.map +1 -0
- package/dist/components/Avatar/Avatar.d.ts.map +1 -1
- package/dist/components/Avatar/Avatar.js +72 -0
- package/dist/components/Avatar/Avatar.js.map +1 -0
- package/dist/components/Avatar/avatar.module.css +14 -0
- package/dist/components/Avatar/avatar.module.css.js +15 -0
- package/dist/components/Avatar/avatar.module.css.js.map +1 -0
- package/dist/components/Badge/Badge.js +66 -0
- package/dist/components/Badge/Badge.js.map +1 -0
- package/dist/components/Badge/badge.module.css +3 -0
- package/dist/components/Badge/badge.module.css.js +9 -0
- package/dist/components/Badge/badge.module.css.js.map +1 -0
- package/dist/components/Box/Box.js +217 -0
- package/dist/components/Box/Box.js.map +1 -0
- package/dist/components/Box/borders/borders.js +91 -0
- package/dist/components/Box/borders/borders.js.map +1 -0
- package/dist/components/Box/borders/borders.module.css +49 -0
- package/dist/components/Box/borders/borders.module.css.js +46 -0
- package/dist/components/Box/borders/borders.module.css.js.map +1 -0
- package/dist/components/Box/colors/colors.js +45 -0
- package/dist/components/Box/colors/colors.js.map +1 -0
- package/dist/components/Box/colors/colors.module.css +113 -0
- package/dist/components/Box/colors/colors.module.css.js +114 -0
- package/dist/components/Box/colors/colors.module.css.js.map +1 -0
- package/dist/components/Box/display/display.js +52 -0
- package/dist/components/Box/display/display.js.map +1 -0
- package/dist/components/Box/display/display.module.css +375 -0
- package/dist/components/Box/display/display.module.css.js +318 -0
- package/dist/components/Box/display/display.module.css.js.map +1 -0
- package/dist/components/Box/flexbox/flexbox.js +139 -0
- package/dist/components/Box/flexbox/flexbox.js.map +1 -0
- package/dist/components/Box/flexbox/flexbox.module.css +65 -0
- package/dist/components/Box/flexbox/flexbox.module.css.js +62 -0
- package/dist/components/Box/flexbox/flexbox.module.css.js.map +1 -0
- package/dist/components/Box/grid/grid.js +49 -0
- package/dist/components/Box/grid/grid.js.map +1 -0
- package/dist/components/Box/grid/grid.module.css +19 -0
- package/dist/components/Box/grid/grid.module.css.js +20 -0
- package/dist/components/Box/grid/grid.module.css.js.map +1 -0
- package/dist/components/Box/inset/inset.js +96 -0
- package/dist/components/Box/inset/inset.js.map +1 -0
- package/dist/components/Box/inset/inset.module.css +187 -0
- package/dist/components/Box/inset/inset.module.css.js +174 -0
- package/dist/components/Box/inset/inset.module.css.js.map +1 -0
- package/dist/components/Box/interactions/interactions.js +45 -0
- package/dist/components/Box/interactions/interactions.js.map +1 -0
- package/dist/components/Box/interactions/interactions.module.css +43 -0
- package/dist/components/Box/interactions/interactions.module.css.js +44 -0
- package/dist/components/Box/interactions/interactions.module.css.js.map +1 -0
- package/dist/components/Box/margin/margin.js +96 -0
- package/dist/components/Box/margin/margin.js.map +1 -0
- package/dist/components/Box/margin/margin.module.css +187 -0
- package/dist/components/Box/margin/margin.module.css.js +174 -0
- package/dist/components/Box/margin/margin.module.css.js.map +1 -0
- package/dist/components/Box/opacity/opacity.js +52 -0
- package/dist/components/Box/opacity/opacity.js.map +1 -0
- package/dist/components/Box/opacity/opacity.module.css +51 -0
- package/dist/components/Box/opacity/opacity.module.css.js +174 -0
- package/dist/components/Box/opacity/opacity.module.css.js.map +1 -0
- package/dist/components/Box/overflow/overflow.js +69 -0
- package/dist/components/Box/overflow/overflow.js.map +1 -0
- package/dist/components/Box/overflow/overflow.module.css +155 -0
- package/dist/components/Box/overflow/overflow.module.css.js +510 -0
- package/dist/components/Box/overflow/overflow.module.css.js.map +1 -0
- package/dist/components/Box/padding/padding.js +96 -0
- package/dist/components/Box/padding/padding.js.map +1 -0
- package/dist/components/Box/padding/padding.module.css +187 -0
- package/dist/components/Box/padding/padding.module.css.js +174 -0
- package/dist/components/Box/padding/padding.module.css.js.map +1 -0
- package/dist/components/Box/position/position.js +52 -0
- package/dist/components/Box/position/position.js.map +1 -0
- package/dist/components/Box/position/position.module.css +234 -0
- package/dist/components/Box/position/position.module.css.js +214 -0
- package/dist/components/Box/position/position.module.css.js.map +1 -0
- package/dist/components/Box/reset/reset.js +6 -0
- package/dist/components/Box/reset/reset.js.map +1 -0
- package/dist/components/Box/reset/reset.module.css +23 -0
- package/dist/components/Box/reset/reset.module.css.js +9 -0
- package/dist/components/Box/reset/reset.module.css.js.map +1 -0
- package/dist/components/Box/roundness/roundness.js +92 -0
- package/dist/components/Box/roundness/roundness.js.map +1 -0
- package/dist/components/Box/roundness/roundness.module.css +47 -0
- package/dist/components/Box/roundness/roundness.module.css.js +46 -0
- package/dist/components/Box/roundness/roundness.module.css.js.map +1 -0
- package/dist/components/Box/shadows/shadows.js +52 -0
- package/dist/components/Box/shadows/shadows.js.map +1 -0
- package/dist/components/Box/shadows/shadows.module.css +51 -0
- package/dist/components/Box/shadows/shadows.module.css.js +174 -0
- package/dist/components/Box/shadows/shadows.module.css.js.map +1 -0
- package/dist/components/Box/shared/constants.js +21 -0
- package/dist/components/Box/shared/constants.js.map +1 -0
- package/dist/components/Box/shared/spacing.js +10 -0
- package/dist/components/Box/shared/spacing.js.map +1 -0
- package/dist/components/Box/sizing/sizing.js +75 -0
- package/dist/components/Box/sizing/sizing.js.map +1 -0
- package/dist/components/Box/sizing/sizing.module.css +281 -0
- package/dist/components/Box/sizing/sizing.module.css.js +258 -0
- package/dist/components/Box/sizing/sizing.module.css.js.map +1 -0
- package/dist/components/Box/text/text.js +45 -0
- package/dist/components/Box/text/text.js.map +1 -0
- package/dist/components/Box/text/text.module.css +29 -0
- package/dist/components/Box/text/text.module.css.js +30 -0
- package/dist/components/Box/text/text.module.css.js.map +1 -0
- package/dist/components/Box/typography/typography.js +27 -0
- package/dist/components/Box/typography/typography.js.map +1 -0
- package/dist/components/Box/typography/typography.module.css +26 -0
- package/dist/components/Box/typography/typography.module.css.js +25 -0
- package/dist/components/Box/typography/typography.module.css.js.map +1 -0
- package/dist/components/Box/zIndex/zIndex.js +52 -0
- package/dist/components/Box/zIndex/zIndex.js.map +1 -0
- package/dist/components/Box/zIndex/zIndex.module.css +90 -0
- package/dist/components/Box/zIndex/zIndex.module.css.js +300 -0
- package/dist/components/Box/zIndex/zIndex.module.css.js.map +1 -0
- package/dist/components/Breadcrumb/Breadcrumb.js +78 -0
- package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/components/Breadcrumb/breadcrumb.module.css +25 -0
- package/dist/components/Breadcrumb/breadcrumb.module.css.js +21 -0
- package/dist/components/Breadcrumb/breadcrumb.module.css.js.map +1 -0
- package/dist/components/Button/Button.js +129 -0
- package/dist/components/Button/Button.js.map +1 -0
- package/dist/components/Button/button.module.css +17 -0
- package/dist/components/Button/button.module.css.js +18 -0
- package/dist/components/Button/button.module.css.js.map +1 -0
- package/dist/components/Card/Card.js +60 -0
- package/dist/components/Card/Card.js.map +1 -0
- package/dist/components/Card/card.module.css +16 -0
- package/dist/components/Card/card.module.css.js +18 -0
- package/dist/components/Card/card.module.css.js.map +1 -0
- package/dist/components/Checkbox/Checkbox.js +74 -0
- package/dist/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/components/Checkbox/checkbox.module.css +65 -0
- package/dist/components/Checkbox/checkbox.module.css.js +15 -0
- package/dist/components/Checkbox/checkbox.module.css.js.map +1 -0
- package/dist/components/Code/Code.js +32 -0
- package/dist/components/Code/Code.js.map +1 -0
- package/dist/components/Container/Container.js +44 -0
- package/dist/components/Container/Container.js.map +1 -0
- package/dist/components/Divider/Divider.js +48 -0
- package/dist/components/Divider/Divider.js.map +1 -0
- package/dist/components/Flex/Flex.js +48 -0
- package/dist/components/Flex/Flex.js.map +1 -0
- package/dist/components/FormField/FormField.js +52 -0
- package/dist/components/FormField/FormField.js.map +1 -0
- package/dist/components/Grid/Grid.js +41 -0
- package/dist/components/Grid/Grid.js.map +1 -0
- package/dist/components/HStack/HStack.js +17 -0
- package/dist/components/HStack/HStack.js.map +1 -0
- package/dist/components/Heading/Heading.js +42 -0
- package/dist/components/Heading/Heading.js.map +1 -0
- package/dist/components/IconButton/IconButton.js +93 -0
- package/dist/components/IconButton/IconButton.js.map +1 -0
- package/dist/components/IconButton/iconbutton.module.css +18 -0
- package/dist/components/IconButton/iconbutton.module.css.js +18 -0
- package/dist/components/IconButton/iconbutton.module.css.js.map +1 -0
- package/dist/components/Image/Image.d.ts.map +1 -1
- package/dist/components/Image/Image.js +101 -0
- package/dist/components/Image/Image.js.map +1 -0
- package/dist/components/Image/image.module.css +44 -0
- package/dist/components/Image/image.module.css.js +36 -0
- package/dist/components/Image/image.module.css.js.map +1 -0
- package/dist/components/Input/Input.js +57 -0
- package/dist/components/Input/Input.js.map +1 -0
- package/dist/components/Input/input.module.css +29 -0
- package/dist/components/Input/input.module.css.js +12 -0
- package/dist/components/Input/input.module.css.js.map +1 -0
- package/dist/components/Label/Label.js +36 -0
- package/dist/components/Label/Label.js.map +1 -0
- package/dist/components/Link/Link.js +38 -0
- package/dist/components/Link/Link.js.map +1 -0
- package/dist/components/Link/link.module.css +28 -0
- package/dist/components/Link/link.module.css.js +16 -0
- package/dist/components/Link/link.module.css.js.map +1 -0
- package/dist/components/List/List.js +51 -0
- package/dist/components/List/List.js.map +1 -0
- package/dist/components/List/list.module.css +45 -0
- package/dist/components/List/list.module.css.js +24 -0
- package/dist/components/List/list.module.css.js.map +1 -0
- package/dist/components/Menu/Menu.d.ts.map +1 -1
- package/dist/components/Menu/Menu.js +143 -0
- package/dist/components/Menu/Menu.js.map +1 -0
- package/dist/components/Menu/menu.module.css +24 -0
- package/dist/components/Menu/menu.module.css.js +18 -0
- package/dist/components/Menu/menu.module.css.js.map +1 -0
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +130 -0
- package/dist/components/Modal/Modal.js.map +1 -0
- package/dist/components/Modal/modal.module.css +26 -0
- package/dist/components/Modal/modal.module.css.js +21 -0
- package/dist/components/Modal/modal.module.css.js.map +1 -0
- package/dist/components/Pagination/Pagination.js +125 -0
- package/dist/components/Pagination/Pagination.js.map +1 -0
- package/dist/components/Pagination/pagination.module.css +3 -0
- package/dist/components/Pagination/pagination.module.css.js +9 -0
- package/dist/components/Pagination/pagination.module.css.js.map +1 -0
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/Popover.js +144 -0
- package/dist/components/Popover/Popover.js.map +1 -0
- package/dist/components/Popover/popover.module.css +11 -0
- package/dist/components/Popover/popover.module.css.js +15 -0
- package/dist/components/Popover/popover.module.css.js.map +1 -0
- package/dist/components/Progress/Progress.js +54 -0
- package/dist/components/Progress/Progress.js.map +1 -0
- package/dist/components/Progress/progress.module.css +24 -0
- package/dist/components/Progress/progress.module.css.js +15 -0
- package/dist/components/Progress/progress.module.css.js.map +1 -0
- package/dist/components/Radio/Radio.js +70 -0
- package/dist/components/Radio/Radio.js.map +1 -0
- package/dist/components/Radio/radio.module.css +48 -0
- package/dist/components/Radio/radio.module.css.js +12 -0
- package/dist/components/Radio/radio.module.css.js.map +1 -0
- package/dist/components/Select/Select.js +57 -0
- package/dist/components/Select/Select.js.map +1 -0
- package/dist/components/Select/select.module.css +43 -0
- package/dist/components/Select/select.module.css.js +12 -0
- package/dist/components/Select/select.module.css.js.map +1 -0
- package/dist/components/Skeleton/Skeleton.js +37 -0
- package/dist/components/Skeleton/Skeleton.js.map +1 -0
- package/dist/components/Skeleton/skeleton.module.css +26 -0
- package/dist/components/Skeleton/skeleton.module.css.js +9 -0
- package/dist/components/Skeleton/skeleton.module.css.js.map +1 -0
- package/dist/components/Spacer/Spacer.js +16 -0
- package/dist/components/Spacer/Spacer.js.map +1 -0
- package/dist/components/Spinner/Spinner.js +41 -0
- package/dist/components/Spinner/Spinner.js.map +1 -0
- package/dist/components/Spinner/spinner.module.css +21 -0
- package/dist/components/Spinner/spinner.module.css.js +9 -0
- package/dist/components/Spinner/spinner.module.css.js.map +1 -0
- package/dist/components/Stack/Stack.js +35 -0
- package/dist/components/Stack/Stack.js.map +1 -0
- package/dist/components/Switch/Switch.js +83 -0
- package/dist/components/Switch/Switch.js.map +1 -0
- package/dist/components/Switch/switch.module.css +48 -0
- package/dist/components/Switch/switch.module.css.js +15 -0
- package/dist/components/Switch/switch.module.css.js.map +1 -0
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs/Tabs.js +87 -0
- package/dist/components/Tabs/Tabs.js.map +1 -0
- package/dist/components/Tabs/tabs.module.css +55 -0
- package/dist/components/Tabs/tabs.module.css.js +27 -0
- package/dist/components/Tabs/tabs.module.css.js.map +1 -0
- package/dist/components/Text/Text.d.ts.map +1 -1
- package/dist/components/Text/Text.js +40 -0
- package/dist/components/Text/Text.js.map +1 -0
- package/dist/components/Text/text.module.css +9 -0
- package/dist/components/Text/text.module.css.js +12 -0
- package/dist/components/Text/text.module.css.js.map +1 -0
- package/dist/components/Textarea/Textarea.js +70 -0
- package/dist/components/Textarea/Textarea.js.map +1 -0
- package/dist/components/Textarea/textarea.module.css +46 -0
- package/dist/components/Textarea/textarea.module.css.js +24 -0
- package/dist/components/Textarea/textarea.module.css.js.map +1 -0
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +135 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/components/Tooltip/tooltip.module.css +4 -0
- package/dist/components/Tooltip/tooltip.module.css.js +9 -0
- package/dist/components/Tooltip/tooltip.module.css.js.map +1 -0
- package/dist/components/VStack/VStack.js +17 -0
- package/dist/components/VStack/VStack.js.map +1 -0
- package/dist/fonts.css +23 -1
- package/dist/index.css +3320 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +99 -5521
- package/dist/index.js.map +1 -1
- package/dist/styles/styles.css +353 -0
- package/package.json +8 -4
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import clsx from "clsx";
|
|
3
|
+
import { Box } from "../Box/Box.js";
|
|
4
|
+
import { Button } from "../Button/Button.js";
|
|
5
|
+
import { HStack } from "../HStack/HStack.js";
|
|
6
|
+
import styles from "./pagination.module.css.js";
|
|
7
|
+
function range(start, end) {
|
|
8
|
+
return Array.from({ length: end - start + 1 }, (_, i) => start + i);
|
|
9
|
+
}
|
|
10
|
+
function getPaginationRange(page, totalPages, siblings) {
|
|
11
|
+
const totalNumbers = siblings * 2 + 3;
|
|
12
|
+
if (totalPages <= totalNumbers + 2) {
|
|
13
|
+
return range(1, totalPages);
|
|
14
|
+
}
|
|
15
|
+
const leftSiblingIndex = Math.max(page - siblings, 1);
|
|
16
|
+
const rightSiblingIndex = Math.min(page + siblings, totalPages);
|
|
17
|
+
const showLeftEllipsis = leftSiblingIndex > 2;
|
|
18
|
+
const showRightEllipsis = rightSiblingIndex < totalPages - 1;
|
|
19
|
+
if (!showLeftEllipsis && showRightEllipsis) {
|
|
20
|
+
const leftRange = range(1, 3 + siblings * 2);
|
|
21
|
+
return [...leftRange, "ellipsis", totalPages];
|
|
22
|
+
}
|
|
23
|
+
if (showLeftEllipsis && !showRightEllipsis) {
|
|
24
|
+
const rightRange = range(totalPages - (2 + siblings * 2), totalPages);
|
|
25
|
+
return [1, "ellipsis", ...rightRange];
|
|
26
|
+
}
|
|
27
|
+
const middleRange = range(leftSiblingIndex, rightSiblingIndex);
|
|
28
|
+
return [1, "ellipsis", ...middleRange, "ellipsis", totalPages];
|
|
29
|
+
}
|
|
30
|
+
function Pagination({
|
|
31
|
+
page,
|
|
32
|
+
totalPages,
|
|
33
|
+
onPageChange,
|
|
34
|
+
siblings = 1,
|
|
35
|
+
showEdges = true,
|
|
36
|
+
className
|
|
37
|
+
}) {
|
|
38
|
+
const pages = getPaginationRange(page, totalPages, siblings);
|
|
39
|
+
const canGoPrev = page > 1;
|
|
40
|
+
const canGoNext = page < totalPages;
|
|
41
|
+
return /* @__PURE__ */ jsx(
|
|
42
|
+
Box,
|
|
43
|
+
{
|
|
44
|
+
as: "nav",
|
|
45
|
+
"aria-label": "Pagination",
|
|
46
|
+
className: clsx(styles.pagination, className),
|
|
47
|
+
children: /* @__PURE__ */ jsxs(HStack, { gap: 1, children: [
|
|
48
|
+
showEdges && /* @__PURE__ */ jsx(
|
|
49
|
+
Button,
|
|
50
|
+
{
|
|
51
|
+
variant: "ghost",
|
|
52
|
+
size: "sm",
|
|
53
|
+
disabled: !canGoPrev,
|
|
54
|
+
onClick: () => onPageChange(1),
|
|
55
|
+
"aria-label": "First page",
|
|
56
|
+
children: "««"
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
/* @__PURE__ */ jsx(
|
|
60
|
+
Button,
|
|
61
|
+
{
|
|
62
|
+
variant: "ghost",
|
|
63
|
+
size: "sm",
|
|
64
|
+
disabled: !canGoPrev,
|
|
65
|
+
onClick: () => onPageChange(page - 1),
|
|
66
|
+
"aria-label": "Previous page",
|
|
67
|
+
children: "«"
|
|
68
|
+
}
|
|
69
|
+
),
|
|
70
|
+
pages.map(
|
|
71
|
+
(p, index) => p === "ellipsis" ? /* @__PURE__ */ jsx(
|
|
72
|
+
Box,
|
|
73
|
+
{
|
|
74
|
+
display: "flex",
|
|
75
|
+
alignItems: "center",
|
|
76
|
+
justifyContent: "center",
|
|
77
|
+
px: 2,
|
|
78
|
+
color: "foreground-muted",
|
|
79
|
+
fontSize: "sm",
|
|
80
|
+
children: "…"
|
|
81
|
+
},
|
|
82
|
+
`ellipsis-${index}`
|
|
83
|
+
) : /* @__PURE__ */ jsx(
|
|
84
|
+
Button,
|
|
85
|
+
{
|
|
86
|
+
variant: p === page ? "solid" : "ghost",
|
|
87
|
+
size: "sm",
|
|
88
|
+
onClick: () => onPageChange(p),
|
|
89
|
+
"aria-label": `Page ${p}`,
|
|
90
|
+
"aria-current": p === page ? "page" : void 0,
|
|
91
|
+
children: p
|
|
92
|
+
},
|
|
93
|
+
p
|
|
94
|
+
)
|
|
95
|
+
),
|
|
96
|
+
/* @__PURE__ */ jsx(
|
|
97
|
+
Button,
|
|
98
|
+
{
|
|
99
|
+
variant: "ghost",
|
|
100
|
+
size: "sm",
|
|
101
|
+
disabled: !canGoNext,
|
|
102
|
+
onClick: () => onPageChange(page + 1),
|
|
103
|
+
"aria-label": "Next page",
|
|
104
|
+
children: "»"
|
|
105
|
+
}
|
|
106
|
+
),
|
|
107
|
+
showEdges && /* @__PURE__ */ jsx(
|
|
108
|
+
Button,
|
|
109
|
+
{
|
|
110
|
+
variant: "ghost",
|
|
111
|
+
size: "sm",
|
|
112
|
+
disabled: !canGoNext,
|
|
113
|
+
onClick: () => onPageChange(totalPages),
|
|
114
|
+
"aria-label": "Last page",
|
|
115
|
+
children: "»»"
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
] })
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
export {
|
|
123
|
+
Pagination
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=Pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { Box } from \"@/components/Box/Box\";\nimport { Button } from \"@/components/Button\";\nimport { HStack } from \"@/components/HStack\";\nimport styles from \"./pagination.module.css\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PaginationProps = {\n /** Current page (1-indexed) */\n page: number;\n /** Total number of pages */\n totalPages: number;\n /** Callback when page changes */\n onPageChange: (page: number) => void;\n /** Number of sibling pages to show */\n siblings?: number;\n /** Show first/last page buttons */\n showEdges?: boolean;\n /** Additional class name */\n className?: string;\n};\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction range(start: number, end: number): number[] {\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n}\n\nfunction getPaginationRange(\n page: number,\n totalPages: number,\n siblings: number\n): (number | \"ellipsis\")[] {\n const totalNumbers = siblings * 2 + 3; // siblings on each side + current + 2 edges\n\n if (totalPages <= totalNumbers + 2) {\n return range(1, totalPages);\n }\n\n const leftSiblingIndex = Math.max(page - siblings, 1);\n const rightSiblingIndex = Math.min(page + siblings, totalPages);\n\n const showLeftEllipsis = leftSiblingIndex > 2;\n const showRightEllipsis = rightSiblingIndex < totalPages - 1;\n\n if (!showLeftEllipsis && showRightEllipsis) {\n const leftRange = range(1, 3 + siblings * 2);\n return [...leftRange, \"ellipsis\", totalPages];\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n const rightRange = range(totalPages - (2 + siblings * 2), totalPages);\n return [1, \"ellipsis\", ...rightRange];\n }\n\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\n return [1, \"ellipsis\", ...middleRange, \"ellipsis\", totalPages];\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Pagination - Page navigation component\n *\n * A pagination component that provides:\n * - Current page indicator\n * - Previous/next buttons\n * - Optional first/last page buttons\n * - Ellipsis for large page ranges\n * - Sibling page configuration\n */\nexport function Pagination({\n page,\n totalPages,\n onPageChange,\n siblings = 1,\n showEdges = true,\n className,\n}: PaginationProps) {\n const pages = getPaginationRange(page, totalPages, siblings);\n\n const canGoPrev = page > 1;\n const canGoNext = page < totalPages;\n\n return (\n <Box\n as=\"nav\"\n aria-label=\"Pagination\"\n className={clsx(styles.pagination, className)}\n >\n <HStack gap={1}>\n {showEdges && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={!canGoPrev}\n onClick={() => onPageChange(1)}\n aria-label=\"First page\"\n >\n ««\n </Button>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={!canGoPrev}\n onClick={() => onPageChange(page - 1)}\n aria-label=\"Previous page\"\n >\n «\n </Button>\n\n {pages.map((p, index) =>\n p === \"ellipsis\" ? (\n <Box\n key={`ellipsis-${index}`}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n px={2}\n color=\"foreground-muted\"\n fontSize=\"sm\"\n >\n …\n </Box>\n ) : (\n <Button\n key={p}\n variant={p === page ? \"solid\" : \"ghost\"}\n size=\"sm\"\n onClick={() => onPageChange(p)}\n aria-label={`Page ${p}`}\n aria-current={p === page ? \"page\" : undefined}\n >\n {p}\n </Button>\n )\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={!canGoNext}\n onClick={() => onPageChange(page + 1)}\n aria-label=\"Next page\"\n >\n »\n </Button>\n\n {showEdges && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={!canGoNext}\n onClick={() => onPageChange(totalPages)}\n aria-label=\"Last page\"\n >\n »»\n </Button>\n )}\n </HStack>\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../../src/components/Popover/Popover.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../../src/components/Popover/Popover.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAUpE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG;IACzB,sBAAsB;IACtB,OAAO,EAAE,SAAS,CAAC;IACnB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6BAA6B;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAMF;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,SAAoB,EACpB,WAAkB,EAClB,MAAM,EAAE,gBAAgB,EACxB,MAAM,EACN,OAAO,EACP,SAAS,EACT,QAAQ,GACT,EAAE,YAAY,2CA4Hd;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAaxE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CAMpE"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useRef, useEffect } from "react";
|
|
4
|
+
import { createPortal } from "react-dom";
|
|
5
|
+
import clsx from "clsx";
|
|
6
|
+
import { Box } from "../Box/Box.js";
|
|
7
|
+
import styles from "./popover.module.css.js";
|
|
8
|
+
function Popover({
|
|
9
|
+
content,
|
|
10
|
+
placement = "bottom",
|
|
11
|
+
closeOnBlur = true,
|
|
12
|
+
isOpen: controlledIsOpen,
|
|
13
|
+
onOpen,
|
|
14
|
+
onClose,
|
|
15
|
+
className,
|
|
16
|
+
children
|
|
17
|
+
}) {
|
|
18
|
+
const [internalIsOpen, setInternalIsOpen] = useState(false);
|
|
19
|
+
const isControlled = controlledIsOpen !== void 0;
|
|
20
|
+
const isOpen = isControlled ? controlledIsOpen : internalIsOpen;
|
|
21
|
+
const [position, setPosition] = useState({ top: 0, left: 0 });
|
|
22
|
+
const triggerRef = useRef(null);
|
|
23
|
+
const popoverRef = useRef(null);
|
|
24
|
+
const setOpen = (open) => {
|
|
25
|
+
if (!isControlled) {
|
|
26
|
+
setInternalIsOpen(open);
|
|
27
|
+
}
|
|
28
|
+
if (open) {
|
|
29
|
+
onOpen?.();
|
|
30
|
+
} else {
|
|
31
|
+
onClose?.();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const updatePosition = () => {
|
|
35
|
+
if (!triggerRef.current || !popoverRef.current) return;
|
|
36
|
+
const triggerRect = triggerRef.current.getBoundingClientRect();
|
|
37
|
+
const popoverRect = popoverRef.current.getBoundingClientRect();
|
|
38
|
+
const gap = 8;
|
|
39
|
+
let top = 0;
|
|
40
|
+
let left = 0;
|
|
41
|
+
switch (placement) {
|
|
42
|
+
case "top":
|
|
43
|
+
top = triggerRect.top - popoverRect.height - gap;
|
|
44
|
+
left = triggerRect.left + (triggerRect.width - popoverRect.width) / 2;
|
|
45
|
+
break;
|
|
46
|
+
case "bottom":
|
|
47
|
+
top = triggerRect.bottom + gap;
|
|
48
|
+
left = triggerRect.left + (triggerRect.width - popoverRect.width) / 2;
|
|
49
|
+
break;
|
|
50
|
+
case "left":
|
|
51
|
+
top = triggerRect.top + (triggerRect.height - popoverRect.height) / 2;
|
|
52
|
+
left = triggerRect.left - popoverRect.width - gap;
|
|
53
|
+
break;
|
|
54
|
+
case "right":
|
|
55
|
+
top = triggerRect.top + (triggerRect.height - popoverRect.height) / 2;
|
|
56
|
+
left = triggerRect.right + gap;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
setPosition({ top: top + window.scrollY, left: left + window.scrollX });
|
|
60
|
+
};
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (isOpen) updatePosition();
|
|
63
|
+
}, [isOpen, placement]);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (!isOpen || !closeOnBlur) return;
|
|
66
|
+
const handleClick = (e) => {
|
|
67
|
+
if (triggerRef.current?.contains(e.target) || popoverRef.current?.contains(e.target))
|
|
68
|
+
return;
|
|
69
|
+
setOpen(false);
|
|
70
|
+
};
|
|
71
|
+
document.addEventListener("click", handleClick);
|
|
72
|
+
return () => document.removeEventListener("click", handleClick);
|
|
73
|
+
}, [isOpen, closeOnBlur]);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (!isOpen) return;
|
|
76
|
+
const handleKeyDown = (e) => {
|
|
77
|
+
if (e.key === "Escape") setOpen(false);
|
|
78
|
+
};
|
|
79
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
80
|
+
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
81
|
+
}, [isOpen]);
|
|
82
|
+
const handleTriggerClick = () => {
|
|
83
|
+
setOpen(!isOpen);
|
|
84
|
+
};
|
|
85
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
86
|
+
/* @__PURE__ */ jsx(
|
|
87
|
+
Box,
|
|
88
|
+
{
|
|
89
|
+
as: "span",
|
|
90
|
+
ref: triggerRef,
|
|
91
|
+
display: "inline-block",
|
|
92
|
+
onClick: handleTriggerClick,
|
|
93
|
+
"aria-expanded": isOpen,
|
|
94
|
+
"aria-haspopup": "dialog",
|
|
95
|
+
cursor: "pointer",
|
|
96
|
+
children
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
isOpen && createPortal(
|
|
100
|
+
/* @__PURE__ */ jsx(
|
|
101
|
+
Box,
|
|
102
|
+
{
|
|
103
|
+
ref: popoverRef,
|
|
104
|
+
position: "absolute",
|
|
105
|
+
bg: "surface",
|
|
106
|
+
border: "thin",
|
|
107
|
+
borderColor: "border",
|
|
108
|
+
rounded: "md",
|
|
109
|
+
shadow: "lg",
|
|
110
|
+
zIndex: "dropdown",
|
|
111
|
+
minW: "200px",
|
|
112
|
+
className: clsx(styles.popover, className),
|
|
113
|
+
style: { top: position.top, left: position.left },
|
|
114
|
+
role: "dialog",
|
|
115
|
+
children: content
|
|
116
|
+
}
|
|
117
|
+
),
|
|
118
|
+
document.body
|
|
119
|
+
)
|
|
120
|
+
] });
|
|
121
|
+
}
|
|
122
|
+
function PopoverHeader({ className, children }) {
|
|
123
|
+
return /* @__PURE__ */ jsx(
|
|
124
|
+
Box,
|
|
125
|
+
{
|
|
126
|
+
px: 4,
|
|
127
|
+
py: 3,
|
|
128
|
+
borderBottom: "thin",
|
|
129
|
+
borderColor: "border",
|
|
130
|
+
fontWeight: "medium",
|
|
131
|
+
className: clsx(styles.header, className),
|
|
132
|
+
children
|
|
133
|
+
}
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
function PopoverBody({ className, children }) {
|
|
137
|
+
return /* @__PURE__ */ jsx(Box, { px: 4, py: 3, className: clsx(styles.body, className), children });
|
|
138
|
+
}
|
|
139
|
+
export {
|
|
140
|
+
Popover,
|
|
141
|
+
PopoverBody,
|
|
142
|
+
PopoverHeader
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=Popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["\"use client\";\n\nimport { type ReactNode, useState, useRef, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport clsx from \"clsx\";\nimport { Box } from \"@/components/Box/Box\";\nimport styles from \"./popover.module.css\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport type PopoverProps = {\n /** Popover content */\n content: ReactNode;\n /** Placement of popover */\n placement?: PopoverPlacement;\n /** Close on outside click */\n closeOnBlur?: boolean;\n /** Controlled open state */\n isOpen?: boolean;\n /** Callback when popover opens */\n onOpen?: () => void;\n /** Callback when popover closes */\n onClose?: () => void;\n /** Additional class name */\n className?: string;\n /** Trigger element */\n children: ReactNode;\n};\n\nexport type PopoverHeaderProps = {\n /** Additional class name */\n className?: string;\n /** Header content */\n children?: ReactNode;\n};\n\nexport type PopoverBodyProps = {\n /** Additional class name */\n className?: string;\n /** Body content */\n children?: ReactNode;\n};\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Popover - Click-triggered overlay with positioning\n *\n * A popover component that:\n * - Toggles on click\n * - Positions relative to trigger\n * - Closes on outside click and Escape\n * - Supports controlled mode via isOpen/onOpen/onClose\n * - Renders via portal\n */\nexport function Popover({\n content,\n placement = \"bottom\",\n closeOnBlur = true,\n isOpen: controlledIsOpen,\n onOpen,\n onClose,\n className,\n children,\n}: PopoverProps) {\n const [internalIsOpen, setInternalIsOpen] = useState(false);\n const isControlled = controlledIsOpen !== undefined;\n const isOpen = isControlled ? controlledIsOpen : internalIsOpen;\n\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const triggerRef = useRef<HTMLElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const setOpen = (open: boolean) => {\n if (!isControlled) {\n setInternalIsOpen(open);\n }\n if (open) {\n onOpen?.();\n } else {\n onClose?.();\n }\n };\n\n const updatePosition = () => {\n if (!triggerRef.current || !popoverRef.current) return;\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const gap = 8;\n\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case \"top\":\n top = triggerRect.top - popoverRect.height - gap;\n left = triggerRect.left + (triggerRect.width - popoverRect.width) / 2;\n break;\n case \"bottom\":\n top = triggerRect.bottom + gap;\n left = triggerRect.left + (triggerRect.width - popoverRect.width) / 2;\n break;\n case \"left\":\n top = triggerRect.top + (triggerRect.height - popoverRect.height) / 2;\n left = triggerRect.left - popoverRect.width - gap;\n break;\n case \"right\":\n top = triggerRect.top + (triggerRect.height - popoverRect.height) / 2;\n left = triggerRect.right + gap;\n break;\n }\n\n setPosition({ top: top + window.scrollY, left: left + window.scrollX });\n };\n\n useEffect(() => {\n if (isOpen) updatePosition();\n }, [isOpen, placement]);\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen || !closeOnBlur) return;\n\n const handleClick = (e: MouseEvent) => {\n if (\n triggerRef.current?.contains(e.target as Node) ||\n popoverRef.current?.contains(e.target as Node)\n )\n return;\n setOpen(false);\n };\n\n document.addEventListener(\"click\", handleClick);\n return () => document.removeEventListener(\"click\", handleClick);\n }, [isOpen, closeOnBlur]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isOpen]);\n\n const handleTriggerClick = () => {\n setOpen(!isOpen);\n };\n\n return (\n <>\n <Box\n as=\"span\"\n ref={triggerRef}\n display=\"inline-block\"\n onClick={handleTriggerClick}\n aria-expanded={isOpen}\n aria-haspopup=\"dialog\"\n cursor=\"pointer\"\n >\n {children}\n </Box>\n {isOpen &&\n createPortal(\n <Box\n ref={popoverRef}\n position=\"absolute\"\n bg=\"surface\"\n border=\"thin\"\n borderColor=\"border\"\n rounded=\"md\"\n shadow=\"lg\"\n zIndex=\"dropdown\"\n minW=\"200px\"\n className={clsx(styles.popover, className)}\n style={{ top: position.top, left: position.left }}\n role=\"dialog\"\n >\n {content}\n </Box>,\n document.body\n )}\n </>\n );\n}\n\n/**\n * PopoverHeader - Header section for popover\n */\nexport function PopoverHeader({ className, children }: PopoverHeaderProps) {\n return (\n <Box\n px={4}\n py={3}\n borderBottom=\"thin\"\n borderColor=\"border\"\n fontWeight=\"medium\"\n className={clsx(styles.header, className)}\n >\n {children}\n </Box>\n );\n}\n\n/**\n * PopoverBody - Body section for popover\n */\nexport function PopoverBody({ className, children }: PopoverBodyProps) {\n return (\n <Box px={4} py={3} className={clsx(styles.body, className)}>\n {children}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const popover = "_popover_pqlwh_1";
|
|
2
|
+
const header = "_header_pqlwh_5";
|
|
3
|
+
const body = "_body_pqlwh_9";
|
|
4
|
+
const styles = {
|
|
5
|
+
popover,
|
|
6
|
+
header,
|
|
7
|
+
body
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
body,
|
|
11
|
+
styles as default,
|
|
12
|
+
header,
|
|
13
|
+
popover
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=popover.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { Box } from "../Box/Box.js";
|
|
5
|
+
import styles from "./progress.module.css.js";
|
|
6
|
+
const sizeConfig = {
|
|
7
|
+
sm: "4px",
|
|
8
|
+
md: "8px",
|
|
9
|
+
lg: "12px"
|
|
10
|
+
};
|
|
11
|
+
function Progress({
|
|
12
|
+
value = 0,
|
|
13
|
+
max = 100,
|
|
14
|
+
colorScheme = "primary",
|
|
15
|
+
size = "md",
|
|
16
|
+
isIndeterminate = false,
|
|
17
|
+
className
|
|
18
|
+
}) {
|
|
19
|
+
const percentage = Math.min(100, Math.max(0, value / max * 100));
|
|
20
|
+
const height = sizeConfig[size];
|
|
21
|
+
return /* @__PURE__ */ jsx(
|
|
22
|
+
Box,
|
|
23
|
+
{
|
|
24
|
+
role: "progressbar",
|
|
25
|
+
"aria-valuenow": isIndeterminate ? void 0 : value,
|
|
26
|
+
"aria-valuemin": 0,
|
|
27
|
+
"aria-valuemax": max,
|
|
28
|
+
position: "relative",
|
|
29
|
+
overflow: "hidden",
|
|
30
|
+
rounded: "full",
|
|
31
|
+
bg: "surface",
|
|
32
|
+
className: clsx(styles.track, className),
|
|
33
|
+
style: { "--progress-height": height },
|
|
34
|
+
children: /* @__PURE__ */ jsx(
|
|
35
|
+
Box,
|
|
36
|
+
{
|
|
37
|
+
position: "absolute",
|
|
38
|
+
inset: 0,
|
|
39
|
+
rounded: "full",
|
|
40
|
+
bg: `${colorScheme}-default`,
|
|
41
|
+
className: clsx(
|
|
42
|
+
styles.fill,
|
|
43
|
+
isIndeterminate && styles.indeterminate
|
|
44
|
+
),
|
|
45
|
+
style: isIndeterminate ? void 0 : { "--progress-width": `${percentage}%` }
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
Progress
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=Progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Progress.js","sources":["../../../src/components/Progress/Progress.tsx"],"sourcesContent":["import { type CSSProperties } from \"react\";\nimport clsx from \"clsx\";\nimport { Box } from \"@/components/Box/Box\";\nimport styles from \"./progress.module.css\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ProgressColorScheme =\n | \"primary\"\n | \"accent\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"info\";\n\nexport type ProgressSize = \"sm\" | \"md\" | \"lg\";\n\nexport type ProgressProps = {\n /** Progress value (0-100) */\n value?: number;\n /** Maximum value (default 100) */\n max?: number;\n /** Color scheme */\n colorScheme?: ProgressColorScheme;\n /** Size */\n size?: ProgressSize;\n /** Indeterminate mode (loading without known progress) */\n isIndeterminate?: boolean;\n /** Additional class name */\n className?: string;\n};\n\n// ============================================================================\n// Size configurations\n// ============================================================================\n\nconst sizeConfig = {\n sm: \"4px\",\n md: \"8px\",\n lg: \"12px\",\n} as const;\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Progress - Progress bar indicator\n *\n * A visual indicator of completion progress:\n * - Value-based: shows percentage complete\n * - Indeterminate: animated loading state\n *\n * Features:\n * - 6 color schemes\n * - 3 sizes (sm, md, lg)\n * - Accessible with role=\"progressbar\" and ARIA attributes\n */\nexport function Progress({\n value = 0,\n max = 100,\n colorScheme = \"primary\",\n size = \"md\",\n isIndeterminate = false,\n className,\n}: ProgressProps) {\n const percentage = Math.min(100, Math.max(0, (value / max) * 100));\n const height = sizeConfig[size];\n\n return (\n <Box\n role=\"progressbar\"\n aria-valuenow={isIndeterminate ? undefined : value}\n aria-valuemin={0}\n aria-valuemax={max}\n position=\"relative\"\n overflow=\"hidden\"\n rounded=\"full\"\n bg=\"surface\"\n className={clsx(styles.track, className)}\n style={{ \"--progress-height\": height } as CSSProperties}\n >\n <Box\n position=\"absolute\"\n inset={0}\n rounded=\"full\"\n bg={`${colorScheme}-default` as any}\n className={clsx(\n styles.fill,\n isIndeterminate && styles.indeterminate\n )}\n style={\n isIndeterminate\n ? undefined\n : ({ \"--progress-width\": `${percentage}%` } as CSSProperties)\n }\n />\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;AAsCA,MAAM,aAAa;AAAA,EACjB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAkBO,SAAS,SAAS;AAAA,EACvB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAAA,EACd,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB;AACF,GAAkB;AAChB,QAAM,aAAa,KAAK,IAAI,KAAK,KAAK,IAAI,GAAI,QAAQ,MAAO,GAAG,CAAC;AACjE,QAAM,SAAS,WAAW,IAAI;AAE9B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,iBAAe,kBAAkB,SAAY;AAAA,MAC7C,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,UAAS;AAAA,MACT,UAAS;AAAA,MACT,SAAQ;AAAA,MACR,IAAG;AAAA,MACH,WAAW,KAAK,OAAO,OAAO,SAAS;AAAA,MACvC,OAAO,EAAE,qBAAqB,OAAA;AAAA,MAE9B,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,UAAS;AAAA,UACT,OAAO;AAAA,UACP,SAAQ;AAAA,UACR,IAAI,GAAG,WAAW;AAAA,UAClB,WAAW;AAAA,YACT,OAAO;AAAA,YACP,mBAAmB,OAAO;AAAA,UAAA;AAAA,UAE5B,OACE,kBACI,SACC,EAAE,oBAAoB,GAAG,UAAU,IAAA;AAAA,QAAI;AAAA,MAAA;AAAA,IAEhD;AAAA,EAAA;AAGN;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
._track_hrq7y_1 {
|
|
2
|
+
height: var(--progress-height);
|
|
3
|
+
width: 100%;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
._fill_hrq7y_6 {
|
|
7
|
+
width: var(--progress-width, 0%);
|
|
8
|
+
height: 100%;
|
|
9
|
+
transition: width 200ms ease-in-out;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
._indeterminate_hrq7y_12 {
|
|
13
|
+
width: 40%;
|
|
14
|
+
animation: _indeterminate_hrq7y_12 1.5s ease-in-out infinite;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@keyframes _indeterminate_hrq7y_12 {
|
|
18
|
+
0% {
|
|
19
|
+
left: -40%;
|
|
20
|
+
}
|
|
21
|
+
100% {
|
|
22
|
+
left: 100%;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const track = "_track_hrq7y_1";
|
|
2
|
+
const fill = "_fill_hrq7y_6";
|
|
3
|
+
const indeterminate = "_indeterminate_hrq7y_12";
|
|
4
|
+
const styles = {
|
|
5
|
+
track,
|
|
6
|
+
fill,
|
|
7
|
+
indeterminate
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
styles as default,
|
|
11
|
+
fill,
|
|
12
|
+
indeterminate,
|
|
13
|
+
track
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=progress.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { Box } from "../Box/Box.js";
|
|
5
|
+
import styles from "./radio.module.css.js";
|
|
6
|
+
const sizeConfig = {
|
|
7
|
+
sm: { circle: 16, fontSize: "sm" },
|
|
8
|
+
md: { circle: 20, fontSize: "md" },
|
|
9
|
+
lg: { circle: 24, fontSize: "lg" }
|
|
10
|
+
};
|
|
11
|
+
const Radio = forwardRef(function Radio2({
|
|
12
|
+
size = "md",
|
|
13
|
+
disabled = false,
|
|
14
|
+
isChecked,
|
|
15
|
+
label,
|
|
16
|
+
className,
|
|
17
|
+
style,
|
|
18
|
+
...rest
|
|
19
|
+
}, ref) {
|
|
20
|
+
const sizeProps = sizeConfig[size];
|
|
21
|
+
return /* @__PURE__ */ jsxs(
|
|
22
|
+
Box,
|
|
23
|
+
{
|
|
24
|
+
as: "label",
|
|
25
|
+
display: "inline-flex",
|
|
26
|
+
alignItems: "center",
|
|
27
|
+
gap: 2,
|
|
28
|
+
cursor: disabled ? "not-allowed" : "pointer",
|
|
29
|
+
opacity: disabled ? "faint" : void 0,
|
|
30
|
+
className: clsx(styles.wrapper, className),
|
|
31
|
+
style,
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsx(
|
|
34
|
+
"input",
|
|
35
|
+
{
|
|
36
|
+
type: "radio",
|
|
37
|
+
ref,
|
|
38
|
+
checked: isChecked,
|
|
39
|
+
disabled,
|
|
40
|
+
className: styles.input,
|
|
41
|
+
...rest
|
|
42
|
+
}
|
|
43
|
+
),
|
|
44
|
+
/* @__PURE__ */ jsx(
|
|
45
|
+
Box,
|
|
46
|
+
{
|
|
47
|
+
as: "span",
|
|
48
|
+
display: "inline-flex",
|
|
49
|
+
alignItems: "center",
|
|
50
|
+
justifyContent: "center",
|
|
51
|
+
rounded: "full",
|
|
52
|
+
border: "thin",
|
|
53
|
+
borderColor: "border",
|
|
54
|
+
flexShrink: 0,
|
|
55
|
+
className: styles.circle,
|
|
56
|
+
style: {
|
|
57
|
+
width: sizeProps.circle,
|
|
58
|
+
height: sizeProps.circle
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
label && /* @__PURE__ */ jsx(Box, { as: "span", fontSize: sizeProps.fontSize, color: "foreground", children: label })
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
export {
|
|
68
|
+
Radio
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=Radio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Radio.js","sources":["../../../src/components/Radio/Radio.tsx"],"sourcesContent":["import { type InputHTMLAttributes, forwardRef } from \"react\";\nimport clsx from \"clsx\";\nimport { Box } from \"@/components/Box/Box\";\nimport styles from \"./radio.module.css\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RadioSize = \"sm\" | \"md\" | \"lg\";\n\nexport type RadioProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"type\"\n> & {\n /** Radio size affecting circle dimensions */\n size?: RadioSize;\n /** Whether the radio is disabled */\n disabled?: boolean;\n /** Controlled checked state */\n isChecked?: boolean;\n /** Optional label text displayed to the right */\n label?: string;\n};\n\n// ============================================================================\n// Size configurations\n// ============================================================================\n\nconst sizeConfig = {\n sm: { circle: 16, fontSize: \"sm\" },\n md: { circle: 20, fontSize: \"md\" },\n lg: { circle: 24, fontSize: \"lg\" },\n} as const;\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Radio - Radio button component\n *\n * A styled radio component that provides:\n * - Sizes: sm, md (default), lg\n * - Custom styled circle with inner dot\n * - Optional inline label\n * - Disabled state\n * - Focus ring styling\n * - Use name prop to group radios together\n */\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(function Radio(\n {\n size = \"md\",\n disabled = false,\n isChecked,\n label,\n className,\n style,\n ...rest\n },\n ref\n) {\n const sizeProps = sizeConfig[size];\n\n return (\n <Box\n as=\"label\"\n display=\"inline-flex\"\n alignItems=\"center\"\n gap={2}\n cursor={disabled ? \"not-allowed\" : \"pointer\"}\n opacity={disabled ? \"faint\" : undefined}\n className={clsx(styles.wrapper, className)}\n style={style}\n >\n {/* Hidden native radio */}\n <input\n type=\"radio\"\n ref={ref}\n checked={isChecked}\n disabled={disabled}\n className={styles.input}\n {...rest}\n />\n\n {/* Custom visual radio circle */}\n <Box\n as=\"span\"\n display=\"inline-flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n rounded=\"full\"\n border=\"thin\"\n borderColor=\"border\"\n flexShrink={0}\n className={styles.circle}\n style={{\n width: sizeProps.circle,\n height: sizeProps.circle,\n }}\n />\n\n {/* Optional label */}\n {label && (\n <Box as=\"span\" fontSize={sizeProps.fontSize} color=\"foreground\">\n {label}\n </Box>\n )}\n </Box>\n );\n});\n"],"names":["Radio"],"mappings":";;;;;AA6BA,MAAM,aAAa;AAAA,EACjB,IAAI,EAAE,QAAQ,IAAI,UAAU,KAAA;AAAA,EAC5B,IAAI,EAAE,QAAQ,IAAI,UAAU,KAAA;AAAA,EAC5B,IAAI,EAAE,QAAQ,IAAI,UAAU,KAAA;AAC9B;AAiBO,MAAM,QAAQ,WAAyC,SAASA,OACrE;AAAA,EACE,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,YAAY,WAAW,IAAI;AAEjC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,SAAQ;AAAA,MACR,YAAW;AAAA,MACX,KAAK;AAAA,MACL,QAAQ,WAAW,gBAAgB;AAAA,MACnC,SAAS,WAAW,UAAU;AAAA,MAC9B,WAAW,KAAK,OAAO,SAAS,SAAS;AAAA,MACzC;AAAA,MAGA,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA,WAAW,OAAO;AAAA,YACjB,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAIN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,SAAQ;AAAA,YACR,YAAW;AAAA,YACX,gBAAe;AAAA,YACf,SAAQ;AAAA,YACR,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,YAAY;AAAA,YACZ,WAAW,OAAO;AAAA,YAClB,OAAO;AAAA,cACL,OAAO,UAAU;AAAA,cACjB,QAAQ,UAAU;AAAA,YAAA;AAAA,UACpB;AAAA,QAAA;AAAA,QAID,SACC,oBAAC,KAAA,EAAI,IAAG,QAAO,UAAU,UAAU,UAAU,OAAM,cAChD,UAAA,MAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/* Hidden native radio */
|
|
2
|
+
._input_16wxn_2 {
|
|
3
|
+
position: absolute;
|
|
4
|
+
opacity: 0;
|
|
5
|
+
width: 0;
|
|
6
|
+
height: 0;
|
|
7
|
+
margin: 0;
|
|
8
|
+
padding: 0;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* Custom radio circle */
|
|
12
|
+
._circle_16wxn_12 {
|
|
13
|
+
transition-duration: 150ms;
|
|
14
|
+
transition-property: border-color, background-color, box-shadow;
|
|
15
|
+
transition-timing-function: ease-in-out;
|
|
16
|
+
position: relative;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Inner dot (hidden by default) */
|
|
20
|
+
._circle_16wxn_12::before {
|
|
21
|
+
content: "";
|
|
22
|
+
position: absolute;
|
|
23
|
+
display: none;
|
|
24
|
+
width: 50%;
|
|
25
|
+
height: 50%;
|
|
26
|
+
background-color: var(--t-color-primary-default);
|
|
27
|
+
border-radius: 50%;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Focus ring when input is focused */
|
|
31
|
+
._input_16wxn_2:focus-visible ~ ._circle_16wxn_12 {
|
|
32
|
+
border-color: var(--t-color-primary-default);
|
|
33
|
+
box-shadow: 0 0 0 3px var(--t-color-primary-subtle);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Checked state */
|
|
37
|
+
._input_16wxn_2:checked ~ ._circle_16wxn_12 {
|
|
38
|
+
border-color: var(--t-color-primary-default);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
._input_16wxn_2:checked ~ ._circle_16wxn_12::before {
|
|
42
|
+
display: block;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Disabled state (handled via opacity on wrapper) */
|
|
46
|
+
._input_16wxn_2:disabled ~ ._circle_16wxn_12 {
|
|
47
|
+
cursor: not-allowed;
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|