@hellboy/ds 0.1.3 → 0.2.7

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 (298) hide show
  1. package/README.md +512 -162
  2. package/{src/style/components/badge → dist/components}/badge.css +9 -25
  3. package/dist/components/badge.d.mts +12 -0
  4. package/dist/components/badge.d.ts +12 -0
  5. package/dist/components/badge.js +42 -0
  6. package/dist/components/badge.mjs +15 -0
  7. package/dist/components/banner.css +280 -0
  8. package/dist/components/banner.d.mts +12 -0
  9. package/dist/components/banner.d.ts +12 -0
  10. package/dist/components/banner.js +184 -0
  11. package/dist/components/banner.mjs +147 -0
  12. package/dist/components/button-group.css +289 -0
  13. package/dist/components/button-group.d.mts +81 -0
  14. package/dist/components/button-group.d.ts +81 -0
  15. package/dist/components/button-group.js +180 -0
  16. package/dist/components/button-group.mjs +143 -0
  17. package/{src/style/components/button → dist/components}/button.css +59 -62
  18. package/dist/components/button.d.mts +57 -0
  19. package/dist/components/button.d.ts +57 -0
  20. package/dist/components/button.js +129 -0
  21. package/dist/components/button.mjs +92 -0
  22. package/{src/style/components/card → dist/components}/card.css +9 -30
  23. package/dist/components/card.d.mts +31 -0
  24. package/dist/components/card.d.ts +31 -0
  25. package/dist/components/card.js +59 -0
  26. package/dist/components/card.mjs +32 -0
  27. package/{src/style → dist}/components/checkbox.css +51 -43
  28. package/dist/components/checkbox.d.mts +31 -0
  29. package/dist/components/checkbox.d.ts +31 -0
  30. package/dist/components/checkbox.js +130 -0
  31. package/dist/components/checkbox.mjs +93 -0
  32. package/{src/style/components/code-block → dist/components}/code-block.css +3 -7
  33. package/dist/components/code-block.d.mts +24 -0
  34. package/dist/components/code-block.d.ts +24 -0
  35. package/dist/components/code-block.js +43 -0
  36. package/dist/components/code-block.mjs +16 -0
  37. package/dist/components/color-control.css +285 -0
  38. package/dist/components/color-control.d.mts +5 -0
  39. package/dist/components/color-control.d.ts +5 -0
  40. package/dist/components/color-control.js +534 -0
  41. package/dist/components/color-control.mjs +497 -0
  42. package/dist/components/dialog.css +930 -0
  43. package/dist/components/dialog.d.mts +32 -0
  44. package/dist/components/dialog.d.ts +32 -0
  45. package/dist/components/dialog.js +1111 -0
  46. package/dist/components/dialog.mjs +1074 -0
  47. package/dist/components/divider.css +356 -0
  48. package/dist/components/divider.d.mts +32 -0
  49. package/dist/components/divider.d.ts +32 -0
  50. package/dist/components/divider.js +344 -0
  51. package/dist/components/divider.mjs +307 -0
  52. package/{src/style/components/drag-handle → dist/components}/drag-handle.css +3 -18
  53. package/dist/components/drag-handle.d.mts +11 -0
  54. package/dist/components/drag-handle.d.ts +11 -0
  55. package/dist/components/drag-handle.js +103 -0
  56. package/dist/components/drag-handle.mjs +66 -0
  57. package/dist/components/drawer.css +1027 -0
  58. package/dist/components/drawer.d.mts +14 -0
  59. package/dist/components/drawer.d.ts +14 -0
  60. package/dist/components/drawer.js +1072 -0
  61. package/dist/components/drawer.mjs +1035 -0
  62. package/dist/components/floating-bar.css +17 -0
  63. package/dist/components/floating-bar.d.mts +25 -0
  64. package/dist/components/floating-bar.d.ts +25 -0
  65. package/dist/components/floating-bar.js +52 -0
  66. package/dist/components/floating-bar.mjs +25 -0
  67. package/dist/components/footer.css +40 -0
  68. package/dist/components/footer.d.mts +8 -0
  69. package/dist/components/footer.d.ts +8 -0
  70. package/dist/components/footer.js +44 -0
  71. package/dist/components/footer.mjs +17 -0
  72. package/dist/components/grid.css +47 -0
  73. package/dist/components/grid.d.mts +27 -0
  74. package/dist/components/grid.d.ts +27 -0
  75. package/dist/components/grid.js +52 -0
  76. package/dist/components/grid.mjs +25 -0
  77. package/dist/components/header.css +1075 -0
  78. package/dist/components/header.d.mts +35 -0
  79. package/dist/components/header.d.ts +35 -0
  80. package/dist/components/header.js +1402 -0
  81. package/dist/components/header.mjs +1365 -0
  82. package/dist/components/hero.css +121 -0
  83. package/dist/components/hero.d.mts +111 -0
  84. package/dist/components/hero.d.ts +111 -0
  85. package/dist/components/hero.js +285 -0
  86. package/dist/components/hero.mjs +248 -0
  87. package/{src/style/components/icons → dist/components}/icons.css +14 -15
  88. package/dist/components/icons.d.mts +104 -0
  89. package/dist/components/icons.d.ts +104 -0
  90. package/dist/components/icons.js +239 -0
  91. package/dist/components/icons.mjs +203 -0
  92. package/{src/style/components/input → dist/components}/input.css +189 -102
  93. package/dist/components/input.d.mts +114 -0
  94. package/dist/components/input.d.ts +114 -0
  95. package/dist/components/input.js +926 -0
  96. package/dist/components/input.mjs +879 -0
  97. package/dist/components/layout.css +551 -0
  98. package/dist/components/layout.d.mts +16 -0
  99. package/dist/components/layout.d.ts +16 -0
  100. package/dist/components/layout.js +387 -0
  101. package/dist/components/layout.mjs +352 -0
  102. package/{src/style/components/list → dist/components}/list.css +47 -41
  103. package/dist/components/list.d.mts +46 -0
  104. package/dist/components/list.d.ts +46 -0
  105. package/dist/components/list.js +124 -0
  106. package/dist/components/list.mjs +96 -0
  107. package/dist/components/navbar.css +706 -0
  108. package/dist/components/navbar.d.mts +56 -0
  109. package/dist/components/navbar.d.ts +56 -0
  110. package/dist/components/navbar.js +994 -0
  111. package/dist/components/navbar.mjs +952 -0
  112. package/{src/style/components/page-index → dist/components}/page-index.css +2 -47
  113. package/dist/components/page-index.d.mts +25 -0
  114. package/dist/components/page-index.d.ts +25 -0
  115. package/dist/components/page-index.js +239 -0
  116. package/dist/components/page-index.mjs +202 -0
  117. package/{src/style/components/page → dist/components}/page.css +4 -15
  118. package/dist/components/page.d.mts +30 -0
  119. package/dist/components/page.d.ts +30 -0
  120. package/dist/components/page.js +40 -0
  121. package/dist/components/page.mjs +13 -0
  122. package/dist/components/popover.css +87 -0
  123. package/dist/components/popover.d.mts +22 -0
  124. package/dist/components/popover.d.ts +22 -0
  125. package/dist/components/popover.js +243 -0
  126. package/dist/components/popover.mjs +206 -0
  127. package/{src/style → dist}/components/radio.css +8 -51
  128. package/dist/components/radio.d.mts +59 -0
  129. package/dist/components/radio.d.ts +59 -0
  130. package/dist/components/radio.js +133 -0
  131. package/dist/components/radio.mjs +95 -0
  132. package/dist/components/section.css +993 -0
  133. package/dist/components/section.d.mts +33 -0
  134. package/dist/components/section.d.ts +33 -0
  135. package/dist/components/section.js +1401 -0
  136. package/dist/components/section.mjs +1364 -0
  137. package/dist/components/select.css +391 -0
  138. package/dist/components/select.d.mts +63 -0
  139. package/dist/components/select.d.ts +63 -0
  140. package/dist/components/select.js +452 -0
  141. package/dist/components/select.mjs +415 -0
  142. package/{src/style/components/slider → dist/components}/slider.css +55 -33
  143. package/dist/components/slider.d.mts +69 -0
  144. package/dist/components/slider.d.ts +69 -0
  145. package/dist/components/slider.js +254 -0
  146. package/dist/components/slider.mjs +217 -0
  147. package/dist/components/switch.css +1081 -0
  148. package/dist/components/switch.d.mts +33 -0
  149. package/dist/components/switch.d.ts +33 -0
  150. package/dist/components/switch.js +1092 -0
  151. package/dist/components/switch.mjs +1055 -0
  152. package/{src/style/components/table → dist/components}/table.css +3 -28
  153. package/dist/components/table.d.mts +42 -0
  154. package/dist/components/table.d.ts +42 -0
  155. package/dist/components/table.js +108 -0
  156. package/dist/components/table.mjs +76 -0
  157. package/dist/components/tag.css +97 -0
  158. package/dist/components/tag.d.mts +12 -0
  159. package/dist/components/tag.d.ts +12 -0
  160. package/dist/components/tag.js +42 -0
  161. package/dist/components/tag.mjs +15 -0
  162. package/dist/components/textarea.css +1359 -0
  163. package/dist/components/textarea.d.mts +84 -0
  164. package/dist/components/textarea.d.ts +84 -0
  165. package/dist/components/textarea.js +1962 -0
  166. package/dist/components/textarea.mjs +1924 -0
  167. package/{src/style/components/theme-control → dist/components}/theme-control.css +3 -7
  168. package/dist/components/theme-control.d.mts +9 -0
  169. package/dist/components/theme-control.d.ts +9 -0
  170. package/dist/components/theme-control.js +235 -0
  171. package/dist/components/theme-control.mjs +200 -0
  172. package/{src/style/components/tooltip → dist/components}/tooltip.css +5 -13
  173. package/dist/components/tooltip.d.mts +12 -0
  174. package/dist/components/tooltip.d.ts +12 -0
  175. package/dist/components/tooltip.js +200 -0
  176. package/dist/components/tooltip.mjs +163 -0
  177. package/dist/icons-Czahnf-r.d.mts +15 -0
  178. package/dist/icons-Czahnf-r.d.ts +15 -0
  179. package/dist/index.css +2914 -2067
  180. package/dist/index.d.mts +144 -721
  181. package/dist/index.d.ts +144 -721
  182. package/dist/index.js +4076 -2282
  183. package/dist/index.mjs +4132 -2366
  184. package/dist/theme.css +34 -34
  185. package/package.json +27 -8
  186. package/dist/index.css.map +0 -1
  187. package/dist/index.js.map +0 -1
  188. package/dist/index.mjs.map +0 -1
  189. package/hellboy-ds-0.1.2.tgz +0 -0
  190. package/src/components/badge/Badge.tsx +0 -29
  191. package/src/components/badge/index.ts +0 -1
  192. package/src/components/banner/Banner.tsx +0 -48
  193. package/src/components/banner/banner.css +0 -44
  194. package/src/components/banner/index.ts +0 -1
  195. package/src/components/button/button.tsx +0 -127
  196. package/src/components/button/index.ts +0 -1
  197. package/src/components/card/card.tsx +0 -57
  198. package/src/components/card/index.ts +0 -1
  199. package/src/components/checkbox/Checkbox.tsx +0 -98
  200. package/src/components/checkbox/index.ts +0 -1
  201. package/src/components/code-block/code-block.tsx +0 -44
  202. package/src/components/code-block/index.ts +0 -1
  203. package/src/components/color-control/color-control.tsx +0 -322
  204. package/src/components/color-control/index.ts +0 -1
  205. package/src/components/drag-handle/DragHandle.tsx +0 -78
  206. package/src/components/drag-handle/index.ts +0 -1
  207. package/src/components/drawer/drawer.tsx +0 -82
  208. package/src/components/drawer/index.ts +0 -1
  209. package/src/components/floating-bar/floating-bar.tsx +0 -52
  210. package/src/components/floating-bar/index.ts +0 -2
  211. package/src/components/footer/footer.tsx +0 -28
  212. package/src/components/footer/index.ts +0 -1
  213. package/src/components/grid/Grid.tsx +0 -53
  214. package/src/components/grid/index.ts +0 -1
  215. package/src/components/header/header.tsx +0 -57
  216. package/src/components/header/index.ts +0 -1
  217. package/src/components/icons/icons.tsx +0 -44
  218. package/src/components/icons/index.ts +0 -1
  219. package/src/components/index.ts +0 -29
  220. package/src/components/input/DatePicker.tsx +0 -133
  221. package/src/components/input/Input.tsx +0 -220
  222. package/src/components/input/InputDate.tsx +0 -10
  223. package/src/components/input/InputDateTime.tsx +0 -10
  224. package/src/components/input/InputEmail.tsx +0 -10
  225. package/src/components/input/InputField.tsx +0 -137
  226. package/src/components/input/InputNumber.tsx +0 -10
  227. package/src/components/input/InputPassword.tsx +0 -10
  228. package/src/components/input/InputSearch.tsx +0 -10
  229. package/src/components/input/InputTel.tsx +0 -10
  230. package/src/components/input/InputText.tsx +0 -10
  231. package/src/components/input/InputTime.tsx +0 -10
  232. package/src/components/input/InputUrl.tsx +0 -10
  233. package/src/components/input/TimePicker.tsx +0 -151
  234. package/src/components/input/index.ts +0 -11
  235. package/src/components/layout/Layout.tsx +0 -244
  236. package/src/components/layout/index.ts +0 -1
  237. package/src/components/list/List.tsx +0 -159
  238. package/src/components/list/index.ts +0 -1
  239. package/src/components/navbar/MenuCategory.tsx +0 -20
  240. package/src/components/navbar/MenuGroup.tsx +0 -288
  241. package/src/components/navbar/MenuItem.tsx +0 -65
  242. package/src/components/navbar/Navbar.tsx +0 -23
  243. package/src/components/navbar/index.ts +0 -4
  244. package/src/components/page/index.ts +0 -1
  245. package/src/components/page/page.tsx +0 -46
  246. package/src/components/page-index/PageIndex.tsx +0 -275
  247. package/src/components/page-index/index.ts +0 -1
  248. package/src/components/popover/index.ts +0 -1
  249. package/src/components/popover/popover.tsx +0 -199
  250. package/src/components/radio/Radio.tsx +0 -176
  251. package/src/components/radio/index.ts +0 -1
  252. package/src/components/section/index.ts +0 -1
  253. package/src/components/section/section.tsx +0 -66
  254. package/src/components/select/Select.tsx +0 -212
  255. package/src/components/select/index.ts +0 -1
  256. package/src/components/slider/Slider.tsx +0 -267
  257. package/src/components/slider/index.ts +0 -1
  258. package/src/components/switch/index.ts +0 -1
  259. package/src/components/switch/switch.tsx +0 -99
  260. package/src/components/table/Table.tsx +0 -147
  261. package/src/components/table/index.ts +0 -1
  262. package/src/components/theme-control/index.ts +0 -1
  263. package/src/components/theme-control/theme-control.tsx +0 -78
  264. package/src/components/tooltip/index.ts +0 -1
  265. package/src/components/tooltip/tooltip.tsx +0 -207
  266. package/src/contexts/NavbarTooltipContext.tsx +0 -48
  267. package/src/contexts/index.ts +0 -1
  268. package/src/foundations/motion.md +0 -136
  269. package/src/index.ts +0 -40
  270. package/src/style/_shared/field.css +0 -69
  271. package/src/style/components/color-control/color-control.css +0 -126
  272. package/src/style/components/drawer/drawer.css +0 -210
  273. package/src/style/components/floating-bar/floating-bar.css +0 -39
  274. package/src/style/components/footer/footer.css +0 -108
  275. package/src/style/components/grid/grid.css +0 -33
  276. package/src/style/components/header/header.css +0 -44
  277. package/src/style/components/layout/layout.css +0 -205
  278. package/src/style/components/navbar/navbar.css +0 -342
  279. package/src/style/components/popover/popover.css +0 -44
  280. package/src/style/components/section/section.css +0 -67
  281. package/src/style/components/select/select.css +0 -143
  282. package/src/style/components/switch/switch.css +0 -267
  283. package/src/style/foundations/global.css +0 -316
  284. package/src/style/foundations/motion.css +0 -164
  285. package/src/style/foundations/spacing.css +0 -51
  286. package/src/style/foundations/typography.css +0 -39
  287. package/src/style/foundations/z-index.css +0 -81
  288. package/src/style/modes/dark.css +0 -146
  289. package/src/style/modes/light.css +0 -147
  290. package/src/style/semantic.css +0 -52
  291. package/src/style/styles.css +0 -51
  292. package/src/style/themes/theme.json +0 -37
  293. package/src/utils/README.md +0 -305
  294. package/src/utils/USER_PREFERENCES.md +0 -558
  295. package/src/utils/theme.ts +0 -127
  296. package/src/utils/user-preferences.ts +0 -577
  297. package/tsconfig.json +0 -25
  298. package/tsup.config.ts +0 -52
@@ -0,0 +1,415 @@
1
+ // src/components/select/Select.tsx
2
+ import * as React2 from "react";
3
+
4
+ // src/components/icons/icons.tsx
5
+ import { Icon as IconifyIcon } from "@iconify/react";
6
+ import { jsx } from "react/jsx-runtime";
7
+ var Icon = ({ name, size = 24, className, loading = false, ...rest }) => {
8
+ const iconName = name.includes(":") ? name : `heroicons:${name}`;
9
+ const classes = ["icon", className].filter(Boolean).join(" ");
10
+ if (loading) {
11
+ const style = { width: size, height: size };
12
+ return /* @__PURE__ */ jsx(
13
+ "span",
14
+ {
15
+ className: `${classes} icon--skeleton`,
16
+ style,
17
+ "aria-hidden": rest["aria-label"] ? "false" : "true",
18
+ ...rest["aria-label"] ? { "aria-label": rest["aria-label"] } : {}
19
+ }
20
+ );
21
+ }
22
+ return /* @__PURE__ */ jsx(
23
+ IconifyIcon,
24
+ {
25
+ icon: iconName,
26
+ width: size,
27
+ height: size,
28
+ className: classes,
29
+ ...rest
30
+ }
31
+ );
32
+ };
33
+
34
+ // src/components/popover/popover.tsx
35
+ import * as React from "react";
36
+ import * as ReactDOM from "react-dom";
37
+ import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
38
+ var Popover = ({
39
+ trigger,
40
+ children,
41
+ isOpen,
42
+ onToggle,
43
+ placement = "bottom",
44
+ align = "start",
45
+ offset = 8,
46
+ flip = true,
47
+ closeOnEscape = true,
48
+ closeOnClickOutside = true
49
+ }) => {
50
+ const [internalOpen, setInternalOpen] = React.useState(false);
51
+ const triggerRef = React.useRef(null);
52
+ const popoverRef = React.useRef(null);
53
+ const [popoverStyle, setPopoverStyle] = React.useState({});
54
+ const [resolvedPlacement, setResolvedPlacement] = React.useState(placement);
55
+ const isControlled = isOpen !== void 0;
56
+ const open = isControlled ? isOpen : internalOpen;
57
+ const toggle = React.useCallback(() => {
58
+ if (isControlled) {
59
+ onToggle?.();
60
+ } else {
61
+ setInternalOpen((prev) => !prev);
62
+ }
63
+ }, [isControlled, onToggle]);
64
+ React.useEffect(() => {
65
+ const handleClickOutside = (event) => {
66
+ if (closeOnClickOutside && triggerRef.current && !triggerRef.current.contains(event.target) && popoverRef.current && !popoverRef.current.contains(event.target)) {
67
+ toggle();
68
+ }
69
+ };
70
+ if (open) {
71
+ document.addEventListener("mousedown", handleClickOutside);
72
+ }
73
+ return () => {
74
+ document.removeEventListener("mousedown", handleClickOutside);
75
+ };
76
+ }, [open, toggle, closeOnClickOutside]);
77
+ React.useEffect(() => {
78
+ const handleEscapeKey = (event) => {
79
+ if (closeOnEscape && event.key === "Escape" && open) {
80
+ toggle();
81
+ }
82
+ };
83
+ if (open) {
84
+ document.addEventListener("keydown", handleEscapeKey);
85
+ }
86
+ return () => {
87
+ document.removeEventListener("keydown", handleEscapeKey);
88
+ };
89
+ }, [open, toggle, closeOnEscape]);
90
+ React.useEffect(() => {
91
+ if (!open || !triggerRef.current || !popoverRef.current) {
92
+ return;
93
+ }
94
+ const updatePosition = () => {
95
+ if (!triggerRef.current || !popoverRef.current) {
96
+ return;
97
+ }
98
+ const triggerRect = triggerRef.current.getBoundingClientRect();
99
+ const popoverRect = popoverRef.current.getBoundingClientRect();
100
+ const viewportWidth = window.innerWidth;
101
+ const viewportHeight = window.innerHeight;
102
+ const spaceTop = triggerRect.top;
103
+ const spaceBottom = viewportHeight - triggerRect.bottom;
104
+ const spaceLeft = triggerRect.left;
105
+ const spaceRight = viewportWidth - triggerRect.right;
106
+ let finalPlacement = placement;
107
+ if (flip) {
108
+ if (placement === "right" && spaceRight < popoverRect.width + offset) {
109
+ finalPlacement = spaceLeft >= popoverRect.width + offset ? "left" : "bottom";
110
+ } else if (placement === "left" && spaceLeft < popoverRect.width + offset) {
111
+ finalPlacement = spaceRight >= popoverRect.width + offset ? "right" : "bottom";
112
+ } else if (placement === "bottom" && spaceBottom < popoverRect.height + offset) {
113
+ finalPlacement = spaceTop >= popoverRect.height + offset ? "top" : "bottom";
114
+ } else if (placement === "top" && spaceTop < popoverRect.height + offset) {
115
+ finalPlacement = spaceBottom >= popoverRect.height + offset ? "bottom" : "top";
116
+ }
117
+ }
118
+ setResolvedPlacement(finalPlacement);
119
+ const newStyle = {
120
+ position: "fixed",
121
+ zIndex: "var(--z-popover)",
122
+ opacity: 1,
123
+ visibility: "visible",
124
+ pointerEvents: "auto"
125
+ };
126
+ const getAlignmentOffset = () => {
127
+ let alignmentOffset = 0;
128
+ if (finalPlacement === "left" || finalPlacement === "right") {
129
+ switch (align) {
130
+ case "center":
131
+ alignmentOffset = (triggerRect.height - popoverRect.height) / 2;
132
+ break;
133
+ case "end":
134
+ alignmentOffset = triggerRect.height - popoverRect.height;
135
+ break;
136
+ case "start":
137
+ default:
138
+ alignmentOffset = 0;
139
+ }
140
+ } else {
141
+ switch (align) {
142
+ case "center":
143
+ alignmentOffset = (triggerRect.width - popoverRect.width) / 2;
144
+ break;
145
+ case "end":
146
+ alignmentOffset = triggerRect.width - popoverRect.width;
147
+ break;
148
+ case "start":
149
+ default:
150
+ alignmentOffset = 0;
151
+ }
152
+ }
153
+ return alignmentOffset;
154
+ };
155
+ switch (finalPlacement) {
156
+ case "right":
157
+ newStyle.top = triggerRect.top + getAlignmentOffset();
158
+ newStyle.left = triggerRect.right + offset;
159
+ break;
160
+ case "left":
161
+ newStyle.top = triggerRect.top + getAlignmentOffset();
162
+ newStyle.left = triggerRect.left - popoverRect.width - offset;
163
+ break;
164
+ case "top":
165
+ newStyle.top = triggerRect.top - popoverRect.height - offset;
166
+ newStyle.left = triggerRect.left + getAlignmentOffset();
167
+ break;
168
+ case "bottom":
169
+ default:
170
+ newStyle.top = triggerRect.bottom + offset;
171
+ newStyle.left = triggerRect.left + getAlignmentOffset();
172
+ }
173
+ if (typeof newStyle.left === "number") {
174
+ if (newStyle.left + popoverRect.width > viewportWidth - offset) {
175
+ newStyle.left = viewportWidth - popoverRect.width - offset;
176
+ }
177
+ if (newStyle.left < offset) {
178
+ newStyle.left = offset;
179
+ }
180
+ }
181
+ if (typeof newStyle.top === "number") {
182
+ if (newStyle.top + popoverRect.height > viewportHeight - offset) {
183
+ newStyle.top = viewportHeight - popoverRect.height - offset;
184
+ }
185
+ if (newStyle.top < offset) {
186
+ newStyle.top = offset;
187
+ }
188
+ }
189
+ setPopoverStyle(newStyle);
190
+ };
191
+ requestAnimationFrame(updatePosition);
192
+ window.addEventListener("resize", updatePosition);
193
+ window.addEventListener("scroll", updatePosition, true);
194
+ return () => {
195
+ window.removeEventListener("resize", updatePosition);
196
+ window.removeEventListener("scroll", updatePosition, true);
197
+ };
198
+ }, [open, placement, align, offset, flip]);
199
+ const handleTriggerClick = React.useCallback(() => {
200
+ toggle();
201
+ }, [toggle]);
202
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
203
+ /* @__PURE__ */ jsx2(
204
+ "div",
205
+ {
206
+ ref: triggerRef,
207
+ onClick: handleTriggerClick,
208
+ style: { display: "inline-block", position: "relative" },
209
+ children: React.isValidElement(trigger) ? React.cloneElement(trigger, {
210
+ onClick: (e) => {
211
+ e.stopPropagation();
212
+ handleTriggerClick();
213
+ trigger.props?.onClick?.(e);
214
+ }
215
+ }) : trigger
216
+ }
217
+ ),
218
+ open && ReactDOM.createPortal(
219
+ /* @__PURE__ */ jsx2(
220
+ "div",
221
+ {
222
+ ref: popoverRef,
223
+ className: `popover popover--${resolvedPlacement}`,
224
+ style: {
225
+ ...popoverStyle,
226
+ // Start with opacity 0 and visibility hidden to prevent initial flash
227
+ opacity: popoverStyle.top !== void 0 ? 1 : 0,
228
+ visibility: popoverStyle.top !== void 0 ? "visible" : "hidden"
229
+ },
230
+ children: /* @__PURE__ */ jsx2("div", { className: "popover__content", children })
231
+ }
232
+ ),
233
+ document.body
234
+ )
235
+ ] });
236
+ };
237
+
238
+ // src/components/icons/iconConstants.ts
239
+ var LIST_ICONS = {
240
+ selected: "check-solid",
241
+ unselected: "circle-solid"
242
+ };
243
+
244
+ // src/components/list/List.tsx
245
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
246
+ var ListItem = ({
247
+ children,
248
+ icon,
249
+ selected = false,
250
+ disabled = false,
251
+ onClick,
252
+ category,
253
+ className = "",
254
+ ...props
255
+ }) => {
256
+ const classes = [
257
+ "list-item",
258
+ selected && "list-item--selected",
259
+ disabled && "list-item--disabled",
260
+ onClick && !disabled && "list-item--interactive",
261
+ className
262
+ ].filter(Boolean).join(" ");
263
+ const handleClick = () => {
264
+ if (!disabled && onClick) {
265
+ onClick();
266
+ }
267
+ };
268
+ const handleKeyDown = (e) => {
269
+ if (!disabled && onClick && (e.key === "Enter" || e.key === " ")) {
270
+ e.preventDefault();
271
+ onClick();
272
+ }
273
+ };
274
+ return /* @__PURE__ */ jsxs2(
275
+ "div",
276
+ {
277
+ className: classes,
278
+ onClick: handleClick,
279
+ onKeyDown: handleKeyDown,
280
+ role: onClick ? "button" : void 0,
281
+ tabIndex: onClick && !disabled ? 0 : void 0,
282
+ "aria-selected": selected,
283
+ "aria-disabled": disabled,
284
+ ...props,
285
+ children: [
286
+ icon && /* @__PURE__ */ jsx3("div", { className: "list-item__icon", children: /* @__PURE__ */ jsx3(Icon, { name: icon, size: 20 }) }),
287
+ /* @__PURE__ */ jsxs2("div", { className: "list-item__content", children: [
288
+ category && /* @__PURE__ */ jsx3("div", { className: "list-item__category", children: category }),
289
+ /* @__PURE__ */ jsx3("div", { children })
290
+ ] }),
291
+ selected && /* @__PURE__ */ jsx3("div", { className: "list-item__indicator", children: /* @__PURE__ */ jsx3(Icon, { name: LIST_ICONS.selected, size: 16 }) })
292
+ ]
293
+ }
294
+ );
295
+ };
296
+ var List = ({ children, className = "", ...props }) => {
297
+ const classes = ["list", className].filter(Boolean).join(" ");
298
+ return /* @__PURE__ */ jsx3("div", { className: classes, role: "list", ...props, children });
299
+ };
300
+
301
+ // src/components/select/Select.tsx
302
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
303
+ var Select = ({
304
+ options,
305
+ value,
306
+ onChange,
307
+ label,
308
+ placeholder = "Select an option",
309
+ helperText,
310
+ error,
311
+ disabled = false,
312
+ fullWidth = false,
313
+ size = "md",
314
+ className = "",
315
+ id
316
+ }) => {
317
+ const [isOpen, setIsOpen] = React2.useState(false);
318
+ const selectId = id || `select-${React2.useId()}`;
319
+ const selectedOption = options.find((opt) => opt.value === value);
320
+ const handleSelect = (optionValue) => {
321
+ onChange?.(optionValue);
322
+ setIsOpen(false);
323
+ };
324
+ const handleKeyDown = (e) => {
325
+ if (disabled) return;
326
+ if (e.key === "Enter" || e.key === " ") {
327
+ e.preventDefault();
328
+ setIsOpen(!isOpen);
329
+ } else if (e.key === "Escape") {
330
+ setIsOpen(false);
331
+ } else if (e.key === "ArrowDown" || e.key === "ArrowUp") {
332
+ e.preventDefault();
333
+ if (!isOpen) {
334
+ setIsOpen(true);
335
+ }
336
+ }
337
+ };
338
+ const containerClasses = [
339
+ "select-container",
340
+ fullWidth && "select-container--full-width",
341
+ className
342
+ ].filter(Boolean).join(" ");
343
+ const triggerClasses = [
344
+ "select__trigger",
345
+ `select__trigger--${size}`,
346
+ error && "select__trigger--error",
347
+ disabled && "select__trigger--disabled",
348
+ isOpen && "select__trigger--open"
349
+ ].filter(Boolean).join(" ");
350
+ return /* @__PURE__ */ jsxs3("div", { className: containerClasses, children: [
351
+ label && /* @__PURE__ */ jsx4("label", { htmlFor: selectId, className: "select__label", children: label }),
352
+ /* @__PURE__ */ jsx4(
353
+ Popover,
354
+ {
355
+ trigger: /* @__PURE__ */ jsxs3(
356
+ "button",
357
+ {
358
+ id: selectId,
359
+ type: "button",
360
+ className: triggerClasses,
361
+ onClick: () => !disabled && setIsOpen(!isOpen),
362
+ onKeyDown: handleKeyDown,
363
+ disabled,
364
+ "aria-haspopup": "listbox",
365
+ "aria-expanded": isOpen,
366
+ "aria-labelledby": label ? `${selectId}-label` : void 0,
367
+ "aria-describedby": error ? `${selectId}-error` : helperText ? `${selectId}-helper` : void 0,
368
+ "aria-invalid": error ? "true" : "false",
369
+ children: [
370
+ /* @__PURE__ */ jsxs3("span", { className: "select__trigger-content", children: [
371
+ selectedOption?.icon && /* @__PURE__ */ jsx4(
372
+ Icon,
373
+ {
374
+ name: selectedOption.icon,
375
+ size: size === "sm" ? 16 : size === "lg" ? 24 : 20
376
+ }
377
+ ),
378
+ /* @__PURE__ */ jsx4("span", { className: "select__trigger-text", children: selectedOption ? selectedOption.label : placeholder })
379
+ ] }),
380
+ /* @__PURE__ */ jsx4(
381
+ Icon,
382
+ {
383
+ name: "flowbite:chevron-down-outline",
384
+ size: size === "sm" ? 16 : size === "lg" ? 24 : 20,
385
+ className: "select__trigger-icon"
386
+ }
387
+ )
388
+ ]
389
+ }
390
+ ),
391
+ isOpen,
392
+ onToggle: () => !disabled && setIsOpen(!isOpen),
393
+ placement: "bottom",
394
+ children: /* @__PURE__ */ jsx4("div", { className: "select__dropdown scrollable", role: "listbox", children: /* @__PURE__ */ jsx4(List, { children: options.map((option) => /* @__PURE__ */ jsx4(
395
+ ListItem,
396
+ {
397
+ icon: option.icon,
398
+ selected: option.value === value,
399
+ disabled: option.disabled,
400
+ onClick: () => !option.disabled && handleSelect(option.value),
401
+ role: "option",
402
+ "aria-selected": option.value === value,
403
+ children: option.label
404
+ },
405
+ option.value
406
+ )) }) })
407
+ }
408
+ ),
409
+ error && /* @__PURE__ */ jsx4("p", { id: `${selectId}-error`, className: "select__message select__message--error", children: error }),
410
+ helperText && !error && /* @__PURE__ */ jsx4("p", { id: `${selectId}-helper`, className: "select__message", children: helperText })
411
+ ] });
412
+ };
413
+ export {
414
+ Select
415
+ };
@@ -1,27 +1,64 @@
1
- /**
2
- * Slider Component Styles
3
- * Custom range input with improved drag behavior
4
- */
1
+ /* src/style/components/icons/icons.css */
2
+ .icon {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ }
7
+ .icon--skeleton {
8
+ background:
9
+ linear-gradient(
10
+ 90deg,
11
+ rgba(0, 0, 0, 0.06) 0%,
12
+ rgba(0, 0, 0, 0.03) 50%,
13
+ rgba(0, 0, 0, 0.06) 100%);
14
+ border-radius: 4px;
15
+ animation: hb-skeleton 1.2s ease-in-out infinite;
16
+ }
17
+ @keyframes hb-skeleton {
18
+ 0% {
19
+ background-position: 200% 0;
20
+ }
21
+ 100% {
22
+ background-position: -200% 0;
23
+ }
24
+ }
25
+ .icon {
26
+ display: inline-block;
27
+ flex-shrink: 0;
28
+ transition: color var(--transition-base, 0.2s ease);
29
+ }
30
+ .icon--interactive {
31
+ cursor: pointer;
32
+ color: var(--color-foreground-1);
33
+ }
34
+ .icon--interactive:hover:not(:disabled) {
35
+ color: var(--color-action-primary-hover);
36
+ }
37
+ .icon--interactive:active:not(:disabled) {
38
+ color: var(--color-action-primary-active);
39
+ }
40
+ .icon--interactive:disabled {
41
+ cursor: not-allowed;
42
+ color: var(--color-foreground-2);
43
+ }
5
44
 
45
+ /* src/style/components/slider/slider.css */
6
46
  .slider {
7
47
  display: flex;
8
48
  flex-direction: column;
9
49
  gap: var(--spacing-2);
10
50
  width: 100%;
11
51
  }
12
-
13
52
  .slider__header {
14
53
  display: flex;
15
54
  justify-content: space-between;
16
55
  align-items: center;
17
56
  }
18
-
19
57
  .slider__label {
20
58
  font-weight: 500;
21
59
  color: var(--color-foreground-1);
22
60
  font-size: var(--font-size-sm);
23
61
  }
24
-
25
62
  .slider__value {
26
63
  font-family: var(--font-family-mono);
27
64
  font-size: var(--font-size-xs);
@@ -33,17 +70,14 @@
33
70
  text-align: center;
34
71
  transition: all var(--transition-base, 0.2s ease);
35
72
  }
36
-
37
73
  .slider__container {
38
74
  position: relative;
39
75
  width: 100%;
40
76
  cursor: grab;
41
77
  }
42
-
43
78
  .slider--dragging .slider__container {
44
79
  cursor: grabbing;
45
80
  }
46
-
47
81
  .slider__input {
48
82
  width: 100%;
49
83
  height: 8px;
@@ -51,16 +85,11 @@
51
85
  outline: none;
52
86
  cursor: pointer;
53
87
  appearance: none;
54
- /* Default: single color background */
55
88
  background: var(--color-action-primary);
56
89
  }
57
-
58
- /* Override with custom gradient for hue slider */
59
- .slider__input[style*="hsl"],
60
- .slider__input[style*="linear-gradient"] {
61
- /* Custom background will be applied via inline styles */
90
+ .slider__input[style*=hsl],
91
+ .slider__input[style*=linear-gradient] {
62
92
  }
63
-
64
93
  .slider__input::-webkit-slider-thumb {
65
94
  appearance: none;
66
95
  width: 32px;
@@ -71,7 +100,6 @@
71
100
  pointer-events: auto;
72
101
  margin-top: -16px;
73
102
  }
74
-
75
103
  .slider__input::-webkit-slider-thumb:hover,
76
104
  .slider__input::-webkit-slider-thumb:active,
77
105
  .slider--dragging .slider__input::-webkit-slider-thumb {
@@ -79,7 +107,6 @@
79
107
  background: transparent;
80
108
  cursor: grabbing;
81
109
  }
82
-
83
110
  .slider__input::-moz-range-thumb {
84
111
  width: 32px;
85
112
  height: 32px;
@@ -88,14 +115,12 @@
88
115
  cursor: grab;
89
116
  pointer-events: auto;
90
117
  }
91
-
92
118
  .slider__input::-moz-range-thumb:hover,
93
119
  .slider__input::-moz-range-thumb:active {
94
120
  border: none;
95
121
  background: transparent;
96
122
  cursor: grabbing;
97
123
  }
98
-
99
124
  .slider__input::-ms-thumb {
100
125
  width: 32px;
101
126
  height: 32px;
@@ -104,12 +129,10 @@
104
129
  cursor: grab;
105
130
  pointer-events: auto;
106
131
  }
107
-
108
132
  .slider--disabled .slider__input {
109
133
  cursor: not-allowed;
110
134
  filter: brightness(0.6);
111
135
  }
112
-
113
136
  .slider__marks {
114
137
  position: absolute;
115
138
  top: -6px;
@@ -118,14 +141,12 @@
118
141
  height: 8px;
119
142
  pointer-events: none;
120
143
  }
121
-
122
144
  .slider__thumb {
123
145
  position: absolute;
124
146
  top: -4px;
125
147
  pointer-events: none;
126
148
  z-index: 1;
127
149
  }
128
-
129
150
  .slider__thumb-icon {
130
151
  width: 32px;
131
152
  height: 32px;
@@ -135,25 +156,26 @@
135
156
  display: flex;
136
157
  align-items: center;
137
158
  justify-content: center;
138
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
139
- transition: transform 0.1s ease, box-shadow 0.1s ease, border-color 0.1s ease;
159
+ box-shadow: var(--shadow-thumb);
160
+ color: var(--color-on-accent);
161
+ transition:
162
+ transform var(--motion-transition-fast),
163
+ box-shadow var(--motion-transition-fast),
164
+ border-color var(--motion-transition-fast);
140
165
  }
141
-
142
166
  .slider__input:hover + .slider__thumb .slider__thumb-icon,
143
167
  .slider__input:focus + .slider__thumb .slider__thumb-icon {
144
168
  border-color: var(--color-action-primary-hover);
145
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4);
169
+ box-shadow: var(--shadow-thumb-hover);
146
170
  }
147
-
148
171
  .slider__input:active + .slider__thumb .slider__thumb-icon,
149
172
  .slider--dragging .slider__thumb .slider__thumb-icon {
150
173
  transform: scale(1.2);
151
174
  border-color: var(--color-action-primary-active);
152
- box-shadow: 0 6px 12px rgba(0, 0, 0, 0.5);
175
+ box-shadow: var(--shadow-thumb-active);
153
176
  }
154
-
155
177
  .slider--disabled .slider__thumb .slider__thumb-icon {
156
178
  border-color: var(--color-foreground-3);
157
179
  background-color: var(--color-bg-3);
158
180
  opacity: 0.6;
159
- }
181
+ }
@@ -0,0 +1,69 @@
1
+ import React__default from 'react';
2
+
3
+ interface SliderProps {
4
+ /**
5
+ * Minimum value
6
+ * @default 0
7
+ */
8
+ min?: number;
9
+ /**
10
+ * Maximum value
11
+ * @default 100
12
+ */
13
+ max?: number;
14
+ /**
15
+ * Current value
16
+ */
17
+ value: number;
18
+ /**
19
+ * Step increment
20
+ * @default 1
21
+ */
22
+ step?: number;
23
+ /**
24
+ * Callback when value changes
25
+ */
26
+ onChange: (value: number) => void;
27
+ /**
28
+ * Callback when drag starts
29
+ */
30
+ onDragStart?: () => void;
31
+ /**
32
+ * Callback when drag ends (value committed)
33
+ */
34
+ onChangeEnd?: (value: number) => void;
35
+ /**
36
+ * Label for the slider
37
+ */
38
+ label?: string;
39
+ /**
40
+ * Show value display
41
+ * @default true
42
+ */
43
+ showValue?: boolean;
44
+ /**
45
+ * Custom class name
46
+ */
47
+ className?: string;
48
+ /**
49
+ * Disabled state
50
+ * @default false
51
+ */
52
+ disabled?: boolean;
53
+ /**
54
+ * Slider type for different backgrounds
55
+ * @default 'default'
56
+ */
57
+ type?: 'default' | 'hue' | 'saturation' | 'lightness';
58
+ /**
59
+ * Base color for saturation/lightness gradients (hsl values)
60
+ */
61
+ baseHue?: number;
62
+ /**
63
+ * Base saturation for lightness gradient (0-100)
64
+ */
65
+ baseSaturation?: number;
66
+ }
67
+ declare const Slider: React__default.FC<SliderProps>;
68
+
69
+ export { Slider, type SliderProps };