@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,30 @@
1
+ import React__default, { ReactNode } from 'react';
2
+
3
+ type PageWidth = 'full' | 'wide' | 'medium' | 'narrow';
4
+ interface PageProps {
5
+ /**
6
+ * Page content width
7
+ * - full: 100% width
8
+ * - wide: 1400px max
9
+ * - medium: 1200px max (default)
10
+ * - narrow: 800px max
11
+ * @default 'medium'
12
+ */
13
+ width?: PageWidth;
14
+ /**
15
+ * Page content
16
+ */
17
+ children: ReactNode;
18
+ /**
19
+ * Custom class name
20
+ */
21
+ className?: string;
22
+ }
23
+ /**
24
+ * Page Component
25
+ * Main content container with responsive width control
26
+ * Use inside Layout's children for consistent content sizing
27
+ */
28
+ declare const Page: React__default.FC<PageProps>;
29
+
30
+ export { Page, type PageProps, type PageWidth };
@@ -0,0 +1,30 @@
1
+ import React__default, { ReactNode } from 'react';
2
+
3
+ type PageWidth = 'full' | 'wide' | 'medium' | 'narrow';
4
+ interface PageProps {
5
+ /**
6
+ * Page content width
7
+ * - full: 100% width
8
+ * - wide: 1400px max
9
+ * - medium: 1200px max (default)
10
+ * - narrow: 800px max
11
+ * @default 'medium'
12
+ */
13
+ width?: PageWidth;
14
+ /**
15
+ * Page content
16
+ */
17
+ children: ReactNode;
18
+ /**
19
+ * Custom class name
20
+ */
21
+ className?: string;
22
+ }
23
+ /**
24
+ * Page Component
25
+ * Main content container with responsive width control
26
+ * Use inside Layout's children for consistent content sizing
27
+ */
28
+ declare const Page: React__default.FC<PageProps>;
29
+
30
+ export { Page, type PageProps, type PageWidth };
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/components/page/index.ts
21
+ var page_exports = {};
22
+ __export(page_exports, {
23
+ Page: () => Page
24
+ });
25
+ module.exports = __toCommonJS(page_exports);
26
+
27
+ // src/components/page/page.tsx
28
+ var import_jsx_runtime = require("react/jsx-runtime");
29
+ var Page = ({ width = "medium", children, className }) => {
30
+ const pageClasses = [
31
+ "page",
32
+ `page--${width}`,
33
+ className
34
+ ].filter(Boolean).join(" ");
35
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("main", { className: pageClasses, children });
36
+ };
37
+ // Annotate the CommonJS export names for ESM import in node:
38
+ 0 && (module.exports = {
39
+ Page
40
+ });
@@ -0,0 +1,13 @@
1
+ // src/components/page/page.tsx
2
+ import { jsx } from "react/jsx-runtime";
3
+ var Page = ({ width = "medium", children, className }) => {
4
+ const pageClasses = [
5
+ "page",
6
+ `page--${width}`,
7
+ className
8
+ ].filter(Boolean).join(" ");
9
+ return /* @__PURE__ */ jsx("main", { className: pageClasses, children });
10
+ };
11
+ export {
12
+ Page
13
+ };
@@ -0,0 +1,87 @@
1
+ /* src/style/components/popover/popover.css */
2
+ .popover {
3
+ position: fixed;
4
+ background: var(--color-bg-1);
5
+ border-radius: var(--radius-base);
6
+ outline: 2px solid var(--color-bg-3);
7
+ outline-offset: -2px;
8
+ box-shadow: var(--shadow-md);
9
+ z-index: var(--z-popover);
10
+ min-width: 200px;
11
+ margin-top: var(--spacing-1);
12
+ animation: popover-slide-in var(--transition-base, 0.2s ease);
13
+ opacity: 0;
14
+ visibility: hidden;
15
+ pointer-events: none;
16
+ }
17
+ .popover--top {
18
+ animation: popover-slide-in-top var(--transition-base, 0.2s ease);
19
+ margin-bottom: var(--spacing-2);
20
+ }
21
+ .popover--bottom {
22
+ animation: popover-slide-in-bottom var(--transition-base, 0.2s ease);
23
+ margin-top: var(--spacing-2);
24
+ }
25
+ .popover--left {
26
+ animation: popover-slide-in-left var(--transition-base, 0.2s ease);
27
+ margin-right: var(--spacing-2);
28
+ }
29
+ .popover--right {
30
+ animation: popover-slide-in-right var(--transition-base, 0.2s ease);
31
+ margin-left: var(--spacing-2);
32
+ }
33
+ .popover:hover {
34
+ outline: 2px solid var(--color-primary-hover);
35
+ }
36
+ @keyframes popover-slide-in {
37
+ from {
38
+ opacity: 0;
39
+ transform: translateY(-8px);
40
+ }
41
+ to {
42
+ opacity: 1;
43
+ transform: translateY(0);
44
+ }
45
+ }
46
+ @keyframes popover-slide-in-top {
47
+ from {
48
+ opacity: 0;
49
+ transform: translateY(8px);
50
+ }
51
+ to {
52
+ opacity: 1;
53
+ transform: translateY(0);
54
+ }
55
+ }
56
+ @keyframes popover-slide-in-bottom {
57
+ from {
58
+ opacity: 0;
59
+ transform: translateY(-8px);
60
+ }
61
+ to {
62
+ opacity: 1;
63
+ transform: translateY(0);
64
+ }
65
+ }
66
+ @keyframes popover-slide-in-left {
67
+ from {
68
+ opacity: 0;
69
+ transform: translateX(8px);
70
+ }
71
+ to {
72
+ opacity: 1;
73
+ transform: translateX(0);
74
+ }
75
+ }
76
+ @keyframes popover-slide-in-right {
77
+ from {
78
+ opacity: 0;
79
+ transform: translateX(-8px);
80
+ }
81
+ to {
82
+ opacity: 1;
83
+ transform: translateX(0);
84
+ }
85
+ }
86
+ .popover__content {
87
+ }
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+
3
+ interface PopoverProps {
4
+ trigger: React.ReactNode;
5
+ children: React.ReactNode;
6
+ isOpen?: boolean;
7
+ onToggle?: () => void;
8
+ placement?: 'top' | 'bottom' | 'left' | 'right';
9
+ /** Alignment relative to the trigger: 'start', 'center', 'end' */
10
+ align?: 'start' | 'center' | 'end';
11
+ /** Gap (in pixels) between trigger and popover */
12
+ offset?: number;
13
+ /** Automatically flip to opposite placement if no space */
14
+ flip?: boolean;
15
+ /** Close popover when Escape key is pressed */
16
+ closeOnEscape?: boolean;
17
+ /** Close popover when clicking outside */
18
+ closeOnClickOutside?: boolean;
19
+ }
20
+ declare const Popover: React.FC<PopoverProps>;
21
+
22
+ export { Popover, type PopoverProps };
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+
3
+ interface PopoverProps {
4
+ trigger: React.ReactNode;
5
+ children: React.ReactNode;
6
+ isOpen?: boolean;
7
+ onToggle?: () => void;
8
+ placement?: 'top' | 'bottom' | 'left' | 'right';
9
+ /** Alignment relative to the trigger: 'start', 'center', 'end' */
10
+ align?: 'start' | 'center' | 'end';
11
+ /** Gap (in pixels) between trigger and popover */
12
+ offset?: number;
13
+ /** Automatically flip to opposite placement if no space */
14
+ flip?: boolean;
15
+ /** Close popover when Escape key is pressed */
16
+ closeOnEscape?: boolean;
17
+ /** Close popover when clicking outside */
18
+ closeOnClickOutside?: boolean;
19
+ }
20
+ declare const Popover: React.FC<PopoverProps>;
21
+
22
+ export { Popover, type PopoverProps };
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/components/popover/index.ts
31
+ var popover_exports = {};
32
+ __export(popover_exports, {
33
+ Popover: () => Popover
34
+ });
35
+ module.exports = __toCommonJS(popover_exports);
36
+
37
+ // src/components/popover/popover.tsx
38
+ var React = __toESM(require("react"));
39
+ var ReactDOM = __toESM(require("react-dom"));
40
+ var import_jsx_runtime = require("react/jsx-runtime");
41
+ var Popover = ({
42
+ trigger,
43
+ children,
44
+ isOpen,
45
+ onToggle,
46
+ placement = "bottom",
47
+ align = "start",
48
+ offset = 8,
49
+ flip = true,
50
+ closeOnEscape = true,
51
+ closeOnClickOutside = true
52
+ }) => {
53
+ const [internalOpen, setInternalOpen] = React.useState(false);
54
+ const triggerRef = React.useRef(null);
55
+ const popoverRef = React.useRef(null);
56
+ const [popoverStyle, setPopoverStyle] = React.useState({});
57
+ const [resolvedPlacement, setResolvedPlacement] = React.useState(placement);
58
+ const isControlled = isOpen !== void 0;
59
+ const open = isControlled ? isOpen : internalOpen;
60
+ const toggle = React.useCallback(() => {
61
+ if (isControlled) {
62
+ onToggle?.();
63
+ } else {
64
+ setInternalOpen((prev) => !prev);
65
+ }
66
+ }, [isControlled, onToggle]);
67
+ React.useEffect(() => {
68
+ const handleClickOutside = (event) => {
69
+ if (closeOnClickOutside && triggerRef.current && !triggerRef.current.contains(event.target) && popoverRef.current && !popoverRef.current.contains(event.target)) {
70
+ toggle();
71
+ }
72
+ };
73
+ if (open) {
74
+ document.addEventListener("mousedown", handleClickOutside);
75
+ }
76
+ return () => {
77
+ document.removeEventListener("mousedown", handleClickOutside);
78
+ };
79
+ }, [open, toggle, closeOnClickOutside]);
80
+ React.useEffect(() => {
81
+ const handleEscapeKey = (event) => {
82
+ if (closeOnEscape && event.key === "Escape" && open) {
83
+ toggle();
84
+ }
85
+ };
86
+ if (open) {
87
+ document.addEventListener("keydown", handleEscapeKey);
88
+ }
89
+ return () => {
90
+ document.removeEventListener("keydown", handleEscapeKey);
91
+ };
92
+ }, [open, toggle, closeOnEscape]);
93
+ React.useEffect(() => {
94
+ if (!open || !triggerRef.current || !popoverRef.current) {
95
+ return;
96
+ }
97
+ const updatePosition = () => {
98
+ if (!triggerRef.current || !popoverRef.current) {
99
+ return;
100
+ }
101
+ const triggerRect = triggerRef.current.getBoundingClientRect();
102
+ const popoverRect = popoverRef.current.getBoundingClientRect();
103
+ const viewportWidth = window.innerWidth;
104
+ const viewportHeight = window.innerHeight;
105
+ const spaceTop = triggerRect.top;
106
+ const spaceBottom = viewportHeight - triggerRect.bottom;
107
+ const spaceLeft = triggerRect.left;
108
+ const spaceRight = viewportWidth - triggerRect.right;
109
+ let finalPlacement = placement;
110
+ if (flip) {
111
+ if (placement === "right" && spaceRight < popoverRect.width + offset) {
112
+ finalPlacement = spaceLeft >= popoverRect.width + offset ? "left" : "bottom";
113
+ } else if (placement === "left" && spaceLeft < popoverRect.width + offset) {
114
+ finalPlacement = spaceRight >= popoverRect.width + offset ? "right" : "bottom";
115
+ } else if (placement === "bottom" && spaceBottom < popoverRect.height + offset) {
116
+ finalPlacement = spaceTop >= popoverRect.height + offset ? "top" : "bottom";
117
+ } else if (placement === "top" && spaceTop < popoverRect.height + offset) {
118
+ finalPlacement = spaceBottom >= popoverRect.height + offset ? "bottom" : "top";
119
+ }
120
+ }
121
+ setResolvedPlacement(finalPlacement);
122
+ const newStyle = {
123
+ position: "fixed",
124
+ zIndex: "var(--z-popover)",
125
+ opacity: 1,
126
+ visibility: "visible",
127
+ pointerEvents: "auto"
128
+ };
129
+ const getAlignmentOffset = () => {
130
+ let alignmentOffset = 0;
131
+ if (finalPlacement === "left" || finalPlacement === "right") {
132
+ switch (align) {
133
+ case "center":
134
+ alignmentOffset = (triggerRect.height - popoverRect.height) / 2;
135
+ break;
136
+ case "end":
137
+ alignmentOffset = triggerRect.height - popoverRect.height;
138
+ break;
139
+ case "start":
140
+ default:
141
+ alignmentOffset = 0;
142
+ }
143
+ } else {
144
+ switch (align) {
145
+ case "center":
146
+ alignmentOffset = (triggerRect.width - popoverRect.width) / 2;
147
+ break;
148
+ case "end":
149
+ alignmentOffset = triggerRect.width - popoverRect.width;
150
+ break;
151
+ case "start":
152
+ default:
153
+ alignmentOffset = 0;
154
+ }
155
+ }
156
+ return alignmentOffset;
157
+ };
158
+ switch (finalPlacement) {
159
+ case "right":
160
+ newStyle.top = triggerRect.top + getAlignmentOffset();
161
+ newStyle.left = triggerRect.right + offset;
162
+ break;
163
+ case "left":
164
+ newStyle.top = triggerRect.top + getAlignmentOffset();
165
+ newStyle.left = triggerRect.left - popoverRect.width - offset;
166
+ break;
167
+ case "top":
168
+ newStyle.top = triggerRect.top - popoverRect.height - offset;
169
+ newStyle.left = triggerRect.left + getAlignmentOffset();
170
+ break;
171
+ case "bottom":
172
+ default:
173
+ newStyle.top = triggerRect.bottom + offset;
174
+ newStyle.left = triggerRect.left + getAlignmentOffset();
175
+ }
176
+ if (typeof newStyle.left === "number") {
177
+ if (newStyle.left + popoverRect.width > viewportWidth - offset) {
178
+ newStyle.left = viewportWidth - popoverRect.width - offset;
179
+ }
180
+ if (newStyle.left < offset) {
181
+ newStyle.left = offset;
182
+ }
183
+ }
184
+ if (typeof newStyle.top === "number") {
185
+ if (newStyle.top + popoverRect.height > viewportHeight - offset) {
186
+ newStyle.top = viewportHeight - popoverRect.height - offset;
187
+ }
188
+ if (newStyle.top < offset) {
189
+ newStyle.top = offset;
190
+ }
191
+ }
192
+ setPopoverStyle(newStyle);
193
+ };
194
+ requestAnimationFrame(updatePosition);
195
+ window.addEventListener("resize", updatePosition);
196
+ window.addEventListener("scroll", updatePosition, true);
197
+ return () => {
198
+ window.removeEventListener("resize", updatePosition);
199
+ window.removeEventListener("scroll", updatePosition, true);
200
+ };
201
+ }, [open, placement, align, offset, flip]);
202
+ const handleTriggerClick = React.useCallback(() => {
203
+ toggle();
204
+ }, [toggle]);
205
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
206
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
207
+ "div",
208
+ {
209
+ ref: triggerRef,
210
+ onClick: handleTriggerClick,
211
+ style: { display: "inline-block", position: "relative" },
212
+ children: React.isValidElement(trigger) ? React.cloneElement(trigger, {
213
+ onClick: (e) => {
214
+ e.stopPropagation();
215
+ handleTriggerClick();
216
+ trigger.props?.onClick?.(e);
217
+ }
218
+ }) : trigger
219
+ }
220
+ ),
221
+ open && ReactDOM.createPortal(
222
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
223
+ "div",
224
+ {
225
+ ref: popoverRef,
226
+ className: `popover popover--${resolvedPlacement}`,
227
+ style: {
228
+ ...popoverStyle,
229
+ // Start with opacity 0 and visibility hidden to prevent initial flash
230
+ opacity: popoverStyle.top !== void 0 ? 1 : 0,
231
+ visibility: popoverStyle.top !== void 0 ? "visible" : "hidden"
232
+ },
233
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "popover__content", children })
234
+ }
235
+ ),
236
+ document.body
237
+ )
238
+ ] });
239
+ };
240
+ // Annotate the CommonJS export names for ESM import in node:
241
+ 0 && (module.exports = {
242
+ Popover
243
+ });
@@ -0,0 +1,206 @@
1
+ // src/components/popover/popover.tsx
2
+ import * as React from "react";
3
+ import * as ReactDOM from "react-dom";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ var Popover = ({
6
+ trigger,
7
+ children,
8
+ isOpen,
9
+ onToggle,
10
+ placement = "bottom",
11
+ align = "start",
12
+ offset = 8,
13
+ flip = true,
14
+ closeOnEscape = true,
15
+ closeOnClickOutside = true
16
+ }) => {
17
+ const [internalOpen, setInternalOpen] = React.useState(false);
18
+ const triggerRef = React.useRef(null);
19
+ const popoverRef = React.useRef(null);
20
+ const [popoverStyle, setPopoverStyle] = React.useState({});
21
+ const [resolvedPlacement, setResolvedPlacement] = React.useState(placement);
22
+ const isControlled = isOpen !== void 0;
23
+ const open = isControlled ? isOpen : internalOpen;
24
+ const toggle = React.useCallback(() => {
25
+ if (isControlled) {
26
+ onToggle?.();
27
+ } else {
28
+ setInternalOpen((prev) => !prev);
29
+ }
30
+ }, [isControlled, onToggle]);
31
+ React.useEffect(() => {
32
+ const handleClickOutside = (event) => {
33
+ if (closeOnClickOutside && triggerRef.current && !triggerRef.current.contains(event.target) && popoverRef.current && !popoverRef.current.contains(event.target)) {
34
+ toggle();
35
+ }
36
+ };
37
+ if (open) {
38
+ document.addEventListener("mousedown", handleClickOutside);
39
+ }
40
+ return () => {
41
+ document.removeEventListener("mousedown", handleClickOutside);
42
+ };
43
+ }, [open, toggle, closeOnClickOutside]);
44
+ React.useEffect(() => {
45
+ const handleEscapeKey = (event) => {
46
+ if (closeOnEscape && event.key === "Escape" && open) {
47
+ toggle();
48
+ }
49
+ };
50
+ if (open) {
51
+ document.addEventListener("keydown", handleEscapeKey);
52
+ }
53
+ return () => {
54
+ document.removeEventListener("keydown", handleEscapeKey);
55
+ };
56
+ }, [open, toggle, closeOnEscape]);
57
+ React.useEffect(() => {
58
+ if (!open || !triggerRef.current || !popoverRef.current) {
59
+ return;
60
+ }
61
+ const updatePosition = () => {
62
+ if (!triggerRef.current || !popoverRef.current) {
63
+ return;
64
+ }
65
+ const triggerRect = triggerRef.current.getBoundingClientRect();
66
+ const popoverRect = popoverRef.current.getBoundingClientRect();
67
+ const viewportWidth = window.innerWidth;
68
+ const viewportHeight = window.innerHeight;
69
+ const spaceTop = triggerRect.top;
70
+ const spaceBottom = viewportHeight - triggerRect.bottom;
71
+ const spaceLeft = triggerRect.left;
72
+ const spaceRight = viewportWidth - triggerRect.right;
73
+ let finalPlacement = placement;
74
+ if (flip) {
75
+ if (placement === "right" && spaceRight < popoverRect.width + offset) {
76
+ finalPlacement = spaceLeft >= popoverRect.width + offset ? "left" : "bottom";
77
+ } else if (placement === "left" && spaceLeft < popoverRect.width + offset) {
78
+ finalPlacement = spaceRight >= popoverRect.width + offset ? "right" : "bottom";
79
+ } else if (placement === "bottom" && spaceBottom < popoverRect.height + offset) {
80
+ finalPlacement = spaceTop >= popoverRect.height + offset ? "top" : "bottom";
81
+ } else if (placement === "top" && spaceTop < popoverRect.height + offset) {
82
+ finalPlacement = spaceBottom >= popoverRect.height + offset ? "bottom" : "top";
83
+ }
84
+ }
85
+ setResolvedPlacement(finalPlacement);
86
+ const newStyle = {
87
+ position: "fixed",
88
+ zIndex: "var(--z-popover)",
89
+ opacity: 1,
90
+ visibility: "visible",
91
+ pointerEvents: "auto"
92
+ };
93
+ const getAlignmentOffset = () => {
94
+ let alignmentOffset = 0;
95
+ if (finalPlacement === "left" || finalPlacement === "right") {
96
+ switch (align) {
97
+ case "center":
98
+ alignmentOffset = (triggerRect.height - popoverRect.height) / 2;
99
+ break;
100
+ case "end":
101
+ alignmentOffset = triggerRect.height - popoverRect.height;
102
+ break;
103
+ case "start":
104
+ default:
105
+ alignmentOffset = 0;
106
+ }
107
+ } else {
108
+ switch (align) {
109
+ case "center":
110
+ alignmentOffset = (triggerRect.width - popoverRect.width) / 2;
111
+ break;
112
+ case "end":
113
+ alignmentOffset = triggerRect.width - popoverRect.width;
114
+ break;
115
+ case "start":
116
+ default:
117
+ alignmentOffset = 0;
118
+ }
119
+ }
120
+ return alignmentOffset;
121
+ };
122
+ switch (finalPlacement) {
123
+ case "right":
124
+ newStyle.top = triggerRect.top + getAlignmentOffset();
125
+ newStyle.left = triggerRect.right + offset;
126
+ break;
127
+ case "left":
128
+ newStyle.top = triggerRect.top + getAlignmentOffset();
129
+ newStyle.left = triggerRect.left - popoverRect.width - offset;
130
+ break;
131
+ case "top":
132
+ newStyle.top = triggerRect.top - popoverRect.height - offset;
133
+ newStyle.left = triggerRect.left + getAlignmentOffset();
134
+ break;
135
+ case "bottom":
136
+ default:
137
+ newStyle.top = triggerRect.bottom + offset;
138
+ newStyle.left = triggerRect.left + getAlignmentOffset();
139
+ }
140
+ if (typeof newStyle.left === "number") {
141
+ if (newStyle.left + popoverRect.width > viewportWidth - offset) {
142
+ newStyle.left = viewportWidth - popoverRect.width - offset;
143
+ }
144
+ if (newStyle.left < offset) {
145
+ newStyle.left = offset;
146
+ }
147
+ }
148
+ if (typeof newStyle.top === "number") {
149
+ if (newStyle.top + popoverRect.height > viewportHeight - offset) {
150
+ newStyle.top = viewportHeight - popoverRect.height - offset;
151
+ }
152
+ if (newStyle.top < offset) {
153
+ newStyle.top = offset;
154
+ }
155
+ }
156
+ setPopoverStyle(newStyle);
157
+ };
158
+ requestAnimationFrame(updatePosition);
159
+ window.addEventListener("resize", updatePosition);
160
+ window.addEventListener("scroll", updatePosition, true);
161
+ return () => {
162
+ window.removeEventListener("resize", updatePosition);
163
+ window.removeEventListener("scroll", updatePosition, true);
164
+ };
165
+ }, [open, placement, align, offset, flip]);
166
+ const handleTriggerClick = React.useCallback(() => {
167
+ toggle();
168
+ }, [toggle]);
169
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
170
+ /* @__PURE__ */ jsx(
171
+ "div",
172
+ {
173
+ ref: triggerRef,
174
+ onClick: handleTriggerClick,
175
+ style: { display: "inline-block", position: "relative" },
176
+ children: React.isValidElement(trigger) ? React.cloneElement(trigger, {
177
+ onClick: (e) => {
178
+ e.stopPropagation();
179
+ handleTriggerClick();
180
+ trigger.props?.onClick?.(e);
181
+ }
182
+ }) : trigger
183
+ }
184
+ ),
185
+ open && ReactDOM.createPortal(
186
+ /* @__PURE__ */ jsx(
187
+ "div",
188
+ {
189
+ ref: popoverRef,
190
+ className: `popover popover--${resolvedPlacement}`,
191
+ style: {
192
+ ...popoverStyle,
193
+ // Start with opacity 0 and visibility hidden to prevent initial flash
194
+ opacity: popoverStyle.top !== void 0 ? 1 : 0,
195
+ visibility: popoverStyle.top !== void 0 ? "visible" : "hidden"
196
+ },
197
+ children: /* @__PURE__ */ jsx("div", { className: "popover__content", children })
198
+ }
199
+ ),
200
+ document.body
201
+ )
202
+ ] });
203
+ };
204
+ export {
205
+ Popover
206
+ };