@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.
Files changed (276) hide show
  1. package/dist/components/Accordion/Accordion.d.ts.map +1 -1
  2. package/dist/components/Accordion/Accordion.js +109 -0
  3. package/dist/components/Accordion/Accordion.js.map +1 -0
  4. package/dist/components/Accordion/accordion.module.css +36 -0
  5. package/dist/components/Accordion/accordion.module.css.js +27 -0
  6. package/dist/components/Accordion/accordion.module.css.js.map +1 -0
  7. package/dist/components/Alert/Alert.js +109 -0
  8. package/dist/components/Alert/Alert.js.map +1 -0
  9. package/dist/components/Alert/alert.module.css +27 -0
  10. package/dist/components/Alert/alert.module.css.js +24 -0
  11. package/dist/components/Alert/alert.module.css.js.map +1 -0
  12. package/dist/components/Avatar/Avatar.d.ts.map +1 -1
  13. package/dist/components/Avatar/Avatar.js +72 -0
  14. package/dist/components/Avatar/Avatar.js.map +1 -0
  15. package/dist/components/Avatar/avatar.module.css +14 -0
  16. package/dist/components/Avatar/avatar.module.css.js +15 -0
  17. package/dist/components/Avatar/avatar.module.css.js.map +1 -0
  18. package/dist/components/Badge/Badge.js +66 -0
  19. package/dist/components/Badge/Badge.js.map +1 -0
  20. package/dist/components/Badge/badge.module.css +3 -0
  21. package/dist/components/Badge/badge.module.css.js +9 -0
  22. package/dist/components/Badge/badge.module.css.js.map +1 -0
  23. package/dist/components/Box/Box.js +217 -0
  24. package/dist/components/Box/Box.js.map +1 -0
  25. package/dist/components/Box/borders/borders.js +91 -0
  26. package/dist/components/Box/borders/borders.js.map +1 -0
  27. package/dist/components/Box/borders/borders.module.css +49 -0
  28. package/dist/components/Box/borders/borders.module.css.js +46 -0
  29. package/dist/components/Box/borders/borders.module.css.js.map +1 -0
  30. package/dist/components/Box/colors/colors.js +45 -0
  31. package/dist/components/Box/colors/colors.js.map +1 -0
  32. package/dist/components/Box/colors/colors.module.css +113 -0
  33. package/dist/components/Box/colors/colors.module.css.js +114 -0
  34. package/dist/components/Box/colors/colors.module.css.js.map +1 -0
  35. package/dist/components/Box/display/display.js +52 -0
  36. package/dist/components/Box/display/display.js.map +1 -0
  37. package/dist/components/Box/display/display.module.css +375 -0
  38. package/dist/components/Box/display/display.module.css.js +318 -0
  39. package/dist/components/Box/display/display.module.css.js.map +1 -0
  40. package/dist/components/Box/flexbox/flexbox.js +139 -0
  41. package/dist/components/Box/flexbox/flexbox.js.map +1 -0
  42. package/dist/components/Box/flexbox/flexbox.module.css +65 -0
  43. package/dist/components/Box/flexbox/flexbox.module.css.js +62 -0
  44. package/dist/components/Box/flexbox/flexbox.module.css.js.map +1 -0
  45. package/dist/components/Box/grid/grid.js +49 -0
  46. package/dist/components/Box/grid/grid.js.map +1 -0
  47. package/dist/components/Box/grid/grid.module.css +19 -0
  48. package/dist/components/Box/grid/grid.module.css.js +20 -0
  49. package/dist/components/Box/grid/grid.module.css.js.map +1 -0
  50. package/dist/components/Box/inset/inset.js +96 -0
  51. package/dist/components/Box/inset/inset.js.map +1 -0
  52. package/dist/components/Box/inset/inset.module.css +187 -0
  53. package/dist/components/Box/inset/inset.module.css.js +174 -0
  54. package/dist/components/Box/inset/inset.module.css.js.map +1 -0
  55. package/dist/components/Box/interactions/interactions.js +45 -0
  56. package/dist/components/Box/interactions/interactions.js.map +1 -0
  57. package/dist/components/Box/interactions/interactions.module.css +43 -0
  58. package/dist/components/Box/interactions/interactions.module.css.js +44 -0
  59. package/dist/components/Box/interactions/interactions.module.css.js.map +1 -0
  60. package/dist/components/Box/margin/margin.js +96 -0
  61. package/dist/components/Box/margin/margin.js.map +1 -0
  62. package/dist/components/Box/margin/margin.module.css +187 -0
  63. package/dist/components/Box/margin/margin.module.css.js +174 -0
  64. package/dist/components/Box/margin/margin.module.css.js.map +1 -0
  65. package/dist/components/Box/opacity/opacity.js +52 -0
  66. package/dist/components/Box/opacity/opacity.js.map +1 -0
  67. package/dist/components/Box/opacity/opacity.module.css +51 -0
  68. package/dist/components/Box/opacity/opacity.module.css.js +174 -0
  69. package/dist/components/Box/opacity/opacity.module.css.js.map +1 -0
  70. package/dist/components/Box/overflow/overflow.js +69 -0
  71. package/dist/components/Box/overflow/overflow.js.map +1 -0
  72. package/dist/components/Box/overflow/overflow.module.css +155 -0
  73. package/dist/components/Box/overflow/overflow.module.css.js +510 -0
  74. package/dist/components/Box/overflow/overflow.module.css.js.map +1 -0
  75. package/dist/components/Box/padding/padding.js +96 -0
  76. package/dist/components/Box/padding/padding.js.map +1 -0
  77. package/dist/components/Box/padding/padding.module.css +187 -0
  78. package/dist/components/Box/padding/padding.module.css.js +174 -0
  79. package/dist/components/Box/padding/padding.module.css.js.map +1 -0
  80. package/dist/components/Box/position/position.js +52 -0
  81. package/dist/components/Box/position/position.js.map +1 -0
  82. package/dist/components/Box/position/position.module.css +234 -0
  83. package/dist/components/Box/position/position.module.css.js +214 -0
  84. package/dist/components/Box/position/position.module.css.js.map +1 -0
  85. package/dist/components/Box/reset/reset.js +6 -0
  86. package/dist/components/Box/reset/reset.js.map +1 -0
  87. package/dist/components/Box/reset/reset.module.css +23 -0
  88. package/dist/components/Box/reset/reset.module.css.js +9 -0
  89. package/dist/components/Box/reset/reset.module.css.js.map +1 -0
  90. package/dist/components/Box/roundness/roundness.js +92 -0
  91. package/dist/components/Box/roundness/roundness.js.map +1 -0
  92. package/dist/components/Box/roundness/roundness.module.css +47 -0
  93. package/dist/components/Box/roundness/roundness.module.css.js +46 -0
  94. package/dist/components/Box/roundness/roundness.module.css.js.map +1 -0
  95. package/dist/components/Box/shadows/shadows.js +52 -0
  96. package/dist/components/Box/shadows/shadows.js.map +1 -0
  97. package/dist/components/Box/shadows/shadows.module.css +51 -0
  98. package/dist/components/Box/shadows/shadows.module.css.js +174 -0
  99. package/dist/components/Box/shadows/shadows.module.css.js.map +1 -0
  100. package/dist/components/Box/shared/constants.js +21 -0
  101. package/dist/components/Box/shared/constants.js.map +1 -0
  102. package/dist/components/Box/shared/spacing.js +10 -0
  103. package/dist/components/Box/shared/spacing.js.map +1 -0
  104. package/dist/components/Box/sizing/sizing.js +75 -0
  105. package/dist/components/Box/sizing/sizing.js.map +1 -0
  106. package/dist/components/Box/sizing/sizing.module.css +281 -0
  107. package/dist/components/Box/sizing/sizing.module.css.js +258 -0
  108. package/dist/components/Box/sizing/sizing.module.css.js.map +1 -0
  109. package/dist/components/Box/text/text.js +45 -0
  110. package/dist/components/Box/text/text.js.map +1 -0
  111. package/dist/components/Box/text/text.module.css +29 -0
  112. package/dist/components/Box/text/text.module.css.js +30 -0
  113. package/dist/components/Box/text/text.module.css.js.map +1 -0
  114. package/dist/components/Box/typography/typography.js +27 -0
  115. package/dist/components/Box/typography/typography.js.map +1 -0
  116. package/dist/components/Box/typography/typography.module.css +26 -0
  117. package/dist/components/Box/typography/typography.module.css.js +25 -0
  118. package/dist/components/Box/typography/typography.module.css.js.map +1 -0
  119. package/dist/components/Box/zIndex/zIndex.js +52 -0
  120. package/dist/components/Box/zIndex/zIndex.js.map +1 -0
  121. package/dist/components/Box/zIndex/zIndex.module.css +90 -0
  122. package/dist/components/Box/zIndex/zIndex.module.css.js +300 -0
  123. package/dist/components/Box/zIndex/zIndex.module.css.js.map +1 -0
  124. package/dist/components/Breadcrumb/Breadcrumb.js +78 -0
  125. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -0
  126. package/dist/components/Breadcrumb/breadcrumb.module.css +25 -0
  127. package/dist/components/Breadcrumb/breadcrumb.module.css.js +21 -0
  128. package/dist/components/Breadcrumb/breadcrumb.module.css.js.map +1 -0
  129. package/dist/components/Button/Button.js +129 -0
  130. package/dist/components/Button/Button.js.map +1 -0
  131. package/dist/components/Button/button.module.css +17 -0
  132. package/dist/components/Button/button.module.css.js +18 -0
  133. package/dist/components/Button/button.module.css.js.map +1 -0
  134. package/dist/components/Card/Card.js +60 -0
  135. package/dist/components/Card/Card.js.map +1 -0
  136. package/dist/components/Card/card.module.css +16 -0
  137. package/dist/components/Card/card.module.css.js +18 -0
  138. package/dist/components/Card/card.module.css.js.map +1 -0
  139. package/dist/components/Checkbox/Checkbox.js +74 -0
  140. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  141. package/dist/components/Checkbox/checkbox.module.css +65 -0
  142. package/dist/components/Checkbox/checkbox.module.css.js +15 -0
  143. package/dist/components/Checkbox/checkbox.module.css.js.map +1 -0
  144. package/dist/components/Code/Code.js +32 -0
  145. package/dist/components/Code/Code.js.map +1 -0
  146. package/dist/components/Container/Container.js +44 -0
  147. package/dist/components/Container/Container.js.map +1 -0
  148. package/dist/components/Divider/Divider.js +48 -0
  149. package/dist/components/Divider/Divider.js.map +1 -0
  150. package/dist/components/Flex/Flex.js +48 -0
  151. package/dist/components/Flex/Flex.js.map +1 -0
  152. package/dist/components/FormField/FormField.js +52 -0
  153. package/dist/components/FormField/FormField.js.map +1 -0
  154. package/dist/components/Grid/Grid.js +41 -0
  155. package/dist/components/Grid/Grid.js.map +1 -0
  156. package/dist/components/HStack/HStack.js +17 -0
  157. package/dist/components/HStack/HStack.js.map +1 -0
  158. package/dist/components/Heading/Heading.js +42 -0
  159. package/dist/components/Heading/Heading.js.map +1 -0
  160. package/dist/components/IconButton/IconButton.js +93 -0
  161. package/dist/components/IconButton/IconButton.js.map +1 -0
  162. package/dist/components/IconButton/iconbutton.module.css +18 -0
  163. package/dist/components/IconButton/iconbutton.module.css.js +18 -0
  164. package/dist/components/IconButton/iconbutton.module.css.js.map +1 -0
  165. package/dist/components/Image/Image.d.ts.map +1 -1
  166. package/dist/components/Image/Image.js +101 -0
  167. package/dist/components/Image/Image.js.map +1 -0
  168. package/dist/components/Image/image.module.css +44 -0
  169. package/dist/components/Image/image.module.css.js +36 -0
  170. package/dist/components/Image/image.module.css.js.map +1 -0
  171. package/dist/components/Input/Input.js +57 -0
  172. package/dist/components/Input/Input.js.map +1 -0
  173. package/dist/components/Input/input.module.css +29 -0
  174. package/dist/components/Input/input.module.css.js +12 -0
  175. package/dist/components/Input/input.module.css.js.map +1 -0
  176. package/dist/components/Label/Label.js +36 -0
  177. package/dist/components/Label/Label.js.map +1 -0
  178. package/dist/components/Link/Link.js +38 -0
  179. package/dist/components/Link/Link.js.map +1 -0
  180. package/dist/components/Link/link.module.css +28 -0
  181. package/dist/components/Link/link.module.css.js +16 -0
  182. package/dist/components/Link/link.module.css.js.map +1 -0
  183. package/dist/components/List/List.js +51 -0
  184. package/dist/components/List/List.js.map +1 -0
  185. package/dist/components/List/list.module.css +45 -0
  186. package/dist/components/List/list.module.css.js +24 -0
  187. package/dist/components/List/list.module.css.js.map +1 -0
  188. package/dist/components/Menu/Menu.d.ts.map +1 -1
  189. package/dist/components/Menu/Menu.js +143 -0
  190. package/dist/components/Menu/Menu.js.map +1 -0
  191. package/dist/components/Menu/menu.module.css +24 -0
  192. package/dist/components/Menu/menu.module.css.js +18 -0
  193. package/dist/components/Menu/menu.module.css.js.map +1 -0
  194. package/dist/components/Modal/Modal.d.ts.map +1 -1
  195. package/dist/components/Modal/Modal.js +130 -0
  196. package/dist/components/Modal/Modal.js.map +1 -0
  197. package/dist/components/Modal/modal.module.css +26 -0
  198. package/dist/components/Modal/modal.module.css.js +21 -0
  199. package/dist/components/Modal/modal.module.css.js.map +1 -0
  200. package/dist/components/Pagination/Pagination.js +125 -0
  201. package/dist/components/Pagination/Pagination.js.map +1 -0
  202. package/dist/components/Pagination/pagination.module.css +3 -0
  203. package/dist/components/Pagination/pagination.module.css.js +9 -0
  204. package/dist/components/Pagination/pagination.module.css.js.map +1 -0
  205. package/dist/components/Popover/Popover.d.ts.map +1 -1
  206. package/dist/components/Popover/Popover.js +144 -0
  207. package/dist/components/Popover/Popover.js.map +1 -0
  208. package/dist/components/Popover/popover.module.css +11 -0
  209. package/dist/components/Popover/popover.module.css.js +15 -0
  210. package/dist/components/Popover/popover.module.css.js.map +1 -0
  211. package/dist/components/Progress/Progress.js +54 -0
  212. package/dist/components/Progress/Progress.js.map +1 -0
  213. package/dist/components/Progress/progress.module.css +24 -0
  214. package/dist/components/Progress/progress.module.css.js +15 -0
  215. package/dist/components/Progress/progress.module.css.js.map +1 -0
  216. package/dist/components/Radio/Radio.js +70 -0
  217. package/dist/components/Radio/Radio.js.map +1 -0
  218. package/dist/components/Radio/radio.module.css +48 -0
  219. package/dist/components/Radio/radio.module.css.js +12 -0
  220. package/dist/components/Radio/radio.module.css.js.map +1 -0
  221. package/dist/components/Select/Select.js +57 -0
  222. package/dist/components/Select/Select.js.map +1 -0
  223. package/dist/components/Select/select.module.css +43 -0
  224. package/dist/components/Select/select.module.css.js +12 -0
  225. package/dist/components/Select/select.module.css.js.map +1 -0
  226. package/dist/components/Skeleton/Skeleton.js +37 -0
  227. package/dist/components/Skeleton/Skeleton.js.map +1 -0
  228. package/dist/components/Skeleton/skeleton.module.css +26 -0
  229. package/dist/components/Skeleton/skeleton.module.css.js +9 -0
  230. package/dist/components/Skeleton/skeleton.module.css.js.map +1 -0
  231. package/dist/components/Spacer/Spacer.js +16 -0
  232. package/dist/components/Spacer/Spacer.js.map +1 -0
  233. package/dist/components/Spinner/Spinner.js +41 -0
  234. package/dist/components/Spinner/Spinner.js.map +1 -0
  235. package/dist/components/Spinner/spinner.module.css +21 -0
  236. package/dist/components/Spinner/spinner.module.css.js +9 -0
  237. package/dist/components/Spinner/spinner.module.css.js.map +1 -0
  238. package/dist/components/Stack/Stack.js +35 -0
  239. package/dist/components/Stack/Stack.js.map +1 -0
  240. package/dist/components/Switch/Switch.js +83 -0
  241. package/dist/components/Switch/Switch.js.map +1 -0
  242. package/dist/components/Switch/switch.module.css +48 -0
  243. package/dist/components/Switch/switch.module.css.js +15 -0
  244. package/dist/components/Switch/switch.module.css.js.map +1 -0
  245. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  246. package/dist/components/Tabs/Tabs.js +87 -0
  247. package/dist/components/Tabs/Tabs.js.map +1 -0
  248. package/dist/components/Tabs/tabs.module.css +55 -0
  249. package/dist/components/Tabs/tabs.module.css.js +27 -0
  250. package/dist/components/Tabs/tabs.module.css.js.map +1 -0
  251. package/dist/components/Text/Text.d.ts.map +1 -1
  252. package/dist/components/Text/Text.js +40 -0
  253. package/dist/components/Text/Text.js.map +1 -0
  254. package/dist/components/Text/text.module.css +9 -0
  255. package/dist/components/Text/text.module.css.js +12 -0
  256. package/dist/components/Text/text.module.css.js.map +1 -0
  257. package/dist/components/Textarea/Textarea.js +70 -0
  258. package/dist/components/Textarea/Textarea.js.map +1 -0
  259. package/dist/components/Textarea/textarea.module.css +46 -0
  260. package/dist/components/Textarea/textarea.module.css.js +24 -0
  261. package/dist/components/Textarea/textarea.module.css.js.map +1 -0
  262. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  263. package/dist/components/Tooltip/Tooltip.js +135 -0
  264. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  265. package/dist/components/Tooltip/tooltip.module.css +4 -0
  266. package/dist/components/Tooltip/tooltip.module.css.js +9 -0
  267. package/dist/components/Tooltip/tooltip.module.css.js.map +1 -0
  268. package/dist/components/VStack/VStack.js +17 -0
  269. package/dist/components/VStack/VStack.js.map +1 -0
  270. package/dist/fonts.css +23 -1
  271. package/dist/index.css +3320 -1
  272. package/dist/index.d.ts.map +1 -1
  273. package/dist/index.js +99 -5521
  274. package/dist/index.js.map +1 -1
  275. package/dist/styles/styles.css +353 -0
  276. 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,3 @@
1
+ ._pagination_12b5w_1 {
2
+ /* Container styles */
3
+ }
@@ -0,0 +1,9 @@
1
+ const pagination = "_pagination_12b5w_1";
2
+ const styles = {
3
+ pagination
4
+ };
5
+ export {
6
+ styles as default,
7
+ pagination
8
+ };
9
+ //# sourceMappingURL=pagination.module.css.js.map
@@ -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":"AAAA,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"}
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,11 @@
1
+ ._popover_pqlwh_1 {
2
+ /* Popover styles */
3
+ }
4
+
5
+ ._header_pqlwh_5 {
6
+ /* Header styles */
7
+ }
8
+
9
+ ._body_pqlwh_9 {
10
+ /* Body styles */
11
+ }
@@ -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,12 @@
1
+ const input = "_input_16wxn_2";
2
+ const circle = "_circle_16wxn_12";
3
+ const styles = {
4
+ input,
5
+ circle
6
+ };
7
+ export {
8
+ circle,
9
+ styles as default,
10
+ input
11
+ };
12
+ //# sourceMappingURL=radio.module.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}