jaci-ui 0.6.3 → 0.8.0

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 (292) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +48 -0
  3. package/dist/components/alert/alert.cjs +11 -1
  4. package/dist/components/alert/alert.cjs.map +1 -1
  5. package/dist/components/alert/alert.d.cts +4 -1
  6. package/dist/components/alert/alert.d.ts +4 -1
  7. package/dist/components/alert/alert.js +11 -2
  8. package/dist/components/alert/alert.js.map +1 -1
  9. package/dist/components/alert/index.d.cts +2 -2
  10. package/dist/components/alert/index.d.ts +2 -2
  11. package/dist/components/alert-dialog/alert-dialog.cjs +4 -1
  12. package/dist/components/alert-dialog/alert-dialog.cjs.map +1 -1
  13. package/dist/components/alert-dialog/alert-dialog.d.cts +2 -2
  14. package/dist/components/alert-dialog/alert-dialog.d.ts +2 -2
  15. package/dist/components/alert-dialog/alert-dialog.js +4 -1
  16. package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
  17. package/dist/components/aspect-ratio/aspect-ratio.cjs +23 -0
  18. package/dist/components/aspect-ratio/aspect-ratio.cjs.map +1 -0
  19. package/dist/components/aspect-ratio/aspect-ratio.d.cts +9 -0
  20. package/dist/components/aspect-ratio/aspect-ratio.d.ts +9 -0
  21. package/dist/components/aspect-ratio/aspect-ratio.js +23 -0
  22. package/dist/components/aspect-ratio/aspect-ratio.js.map +1 -0
  23. package/dist/components/aspect-ratio/index.d.cts +2 -0
  24. package/dist/components/aspect-ratio/index.d.ts +2 -0
  25. package/dist/components/card/card.cjs +10 -1
  26. package/dist/components/card/card.cjs.map +1 -1
  27. package/dist/components/card/card.d.cts +15 -2
  28. package/dist/components/card/card.d.ts +15 -2
  29. package/dist/components/card/card.js +10 -2
  30. package/dist/components/card/card.js.map +1 -1
  31. package/dist/components/card/index.d.cts +2 -2
  32. package/dist/components/card/index.d.ts +2 -2
  33. package/dist/components/code/code.cjs +39 -0
  34. package/dist/components/code/code.cjs.map +1 -0
  35. package/dist/components/code/code.d.cts +14 -0
  36. package/dist/components/code/code.d.ts +14 -0
  37. package/dist/components/code/code.js +39 -0
  38. package/dist/components/code/code.js.map +1 -0
  39. package/dist/components/code/index.d.cts +2 -0
  40. package/dist/components/code/index.d.ts +2 -0
  41. package/dist/components/color-picker/color-picker.cjs +4 -1
  42. package/dist/components/color-picker/color-picker.cjs.map +1 -1
  43. package/dist/components/color-picker/color-picker.d.cts +2 -2
  44. package/dist/components/color-picker/color-picker.d.ts +2 -2
  45. package/dist/components/color-picker/color-picker.js +4 -1
  46. package/dist/components/color-picker/color-picker.js.map +1 -1
  47. package/dist/components/combobox/combobox.cjs +4 -1
  48. package/dist/components/combobox/combobox.cjs.map +1 -1
  49. package/dist/components/combobox/combobox.d.cts +2 -2
  50. package/dist/components/combobox/combobox.d.ts +2 -2
  51. package/dist/components/combobox/combobox.js +4 -1
  52. package/dist/components/combobox/combobox.js.map +1 -1
  53. package/dist/components/command/command.cjs +73 -12
  54. package/dist/components/command/command.cjs.map +1 -1
  55. package/dist/components/command/command.d.cts +7 -1
  56. package/dist/components/command/command.d.ts +7 -1
  57. package/dist/components/command/command.js +73 -12
  58. package/dist/components/command/command.js.map +1 -1
  59. package/dist/components/command/index.d.cts +2 -2
  60. package/dist/components/command/index.d.ts +2 -2
  61. package/dist/components/context-menu/context-menu.cjs +4 -1
  62. package/dist/components/context-menu/context-menu.cjs.map +1 -1
  63. package/dist/components/context-menu/context-menu.d.cts +2 -2
  64. package/dist/components/context-menu/context-menu.d.ts +2 -2
  65. package/dist/components/context-menu/context-menu.js +4 -1
  66. package/dist/components/context-menu/context-menu.js.map +1 -1
  67. package/dist/components/date-picker/date-picker.cjs +4 -1
  68. package/dist/components/date-picker/date-picker.cjs.map +1 -1
  69. package/dist/components/date-picker/date-picker.d.cts +2 -2
  70. package/dist/components/date-picker/date-picker.d.ts +2 -2
  71. package/dist/components/date-picker/date-picker.js +4 -1
  72. package/dist/components/date-picker/date-picker.js.map +1 -1
  73. package/dist/components/date-range-picker/date-range-picker.cjs +4 -1
  74. package/dist/components/date-range-picker/date-range-picker.cjs.map +1 -1
  75. package/dist/components/date-range-picker/date-range-picker.d.cts +2 -2
  76. package/dist/components/date-range-picker/date-range-picker.d.ts +2 -2
  77. package/dist/components/date-range-picker/date-range-picker.js +4 -1
  78. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  79. package/dist/components/dialog/dialog.cjs +4 -1
  80. package/dist/components/dialog/dialog.cjs.map +1 -1
  81. package/dist/components/dialog/dialog.d.cts +2 -2
  82. package/dist/components/dialog/dialog.d.ts +2 -2
  83. package/dist/components/dialog/dialog.js +4 -1
  84. package/dist/components/dialog/dialog.js.map +1 -1
  85. package/dist/components/drawer/drawer.cjs +4 -1
  86. package/dist/components/drawer/drawer.cjs.map +1 -1
  87. package/dist/components/drawer/drawer.d.cts +2 -2
  88. package/dist/components/drawer/drawer.d.ts +2 -2
  89. package/dist/components/drawer/drawer.js +4 -1
  90. package/dist/components/drawer/drawer.js.map +1 -1
  91. package/dist/components/feedback/badge.cjs +6 -3
  92. package/dist/components/feedback/badge.cjs.map +1 -1
  93. package/dist/components/feedback/badge.d.cts +1 -0
  94. package/dist/components/feedback/badge.d.ts +1 -0
  95. package/dist/components/feedback/badge.js +6 -3
  96. package/dist/components/feedback/badge.js.map +1 -1
  97. package/dist/components/figure/figure.cjs +134 -0
  98. package/dist/components/figure/figure.cjs.map +1 -0
  99. package/dist/components/figure/figure.d.cts +24 -0
  100. package/dist/components/figure/figure.d.ts +24 -0
  101. package/dist/components/figure/figure.js +131 -0
  102. package/dist/components/figure/figure.js.map +1 -0
  103. package/dist/components/figure/index.d.cts +2 -0
  104. package/dist/components/figure/index.d.ts +2 -0
  105. package/dist/components/image/image.cjs +112 -0
  106. package/dist/components/image/image.cjs.map +1 -0
  107. package/dist/components/image/image.d.cts +21 -0
  108. package/dist/components/image/image.d.ts +21 -0
  109. package/dist/components/image/image.js +112 -0
  110. package/dist/components/image/image.js.map +1 -0
  111. package/dist/components/image/index.d.cts +2 -0
  112. package/dist/components/image/index.d.ts +2 -0
  113. package/dist/components/kbd/index.d.cts +2 -0
  114. package/dist/components/kbd/index.d.ts +2 -0
  115. package/dist/components/kbd/kbd.cjs +23 -0
  116. package/dist/components/kbd/kbd.cjs.map +1 -0
  117. package/dist/components/kbd/kbd.d.cts +12 -0
  118. package/dist/components/kbd/kbd.d.ts +12 -0
  119. package/dist/components/kbd/kbd.js +23 -0
  120. package/dist/components/kbd/kbd.js.map +1 -0
  121. package/dist/components/menu/menu.cjs +4 -1
  122. package/dist/components/menu/menu.cjs.map +1 -1
  123. package/dist/components/menu/menu.d.cts +2 -2
  124. package/dist/components/menu/menu.d.ts +2 -2
  125. package/dist/components/menu/menu.js +4 -1
  126. package/dist/components/menu/menu.js.map +1 -1
  127. package/dist/components/menubar/menubar.cjs +4 -1
  128. package/dist/components/menubar/menubar.cjs.map +1 -1
  129. package/dist/components/menubar/menubar.d.cts +2 -2
  130. package/dist/components/menubar/menubar.d.ts +2 -2
  131. package/dist/components/menubar/menubar.js +4 -1
  132. package/dist/components/menubar/menubar.js.map +1 -1
  133. package/dist/components/navigation/navigation.cjs +3 -1
  134. package/dist/components/navigation/navigation.cjs.map +1 -1
  135. package/dist/components/navigation/navigation.js +3 -1
  136. package/dist/components/navigation/navigation.js.map +1 -1
  137. package/dist/components/navigation-menu/navigation-menu.cjs +4 -1
  138. package/dist/components/navigation-menu/navigation-menu.cjs.map +1 -1
  139. package/dist/components/navigation-menu/navigation-menu.d.cts +2 -2
  140. package/dist/components/navigation-menu/navigation-menu.d.ts +2 -2
  141. package/dist/components/navigation-menu/navigation-menu.js +4 -1
  142. package/dist/components/navigation-menu/navigation-menu.js.map +1 -1
  143. package/dist/components/popover/popover.cjs +4 -1
  144. package/dist/components/popover/popover.cjs.map +1 -1
  145. package/dist/components/popover/popover.d.cts +2 -2
  146. package/dist/components/popover/popover.d.ts +2 -2
  147. package/dist/components/popover/popover.js +4 -1
  148. package/dist/components/popover/popover.js.map +1 -1
  149. package/dist/components/progress/progress.cjs +19 -7
  150. package/dist/components/progress/progress.cjs.map +1 -1
  151. package/dist/components/progress/progress.d.cts +4 -0
  152. package/dist/components/progress/progress.d.ts +4 -0
  153. package/dist/components/progress/progress.js +19 -7
  154. package/dist/components/progress/progress.js.map +1 -1
  155. package/dist/components/quote/index.d.cts +2 -0
  156. package/dist/components/quote/index.d.ts +2 -0
  157. package/dist/components/quote/quote.cjs +38 -0
  158. package/dist/components/quote/quote.cjs.map +1 -0
  159. package/dist/components/quote/quote.d.cts +19 -0
  160. package/dist/components/quote/quote.d.ts +19 -0
  161. package/dist/components/quote/quote.js +38 -0
  162. package/dist/components/quote/quote.js.map +1 -0
  163. package/dist/components/select/select.cjs +4 -1
  164. package/dist/components/select/select.cjs.map +1 -1
  165. package/dist/components/select/select.d.cts +2 -2
  166. package/dist/components/select/select.d.ts +2 -2
  167. package/dist/components/select/select.js +4 -1
  168. package/dist/components/select/select.js.map +1 -1
  169. package/dist/components/sidebar/sidebar.cjs +24 -17
  170. package/dist/components/sidebar/sidebar.cjs.map +1 -1
  171. package/dist/components/sidebar/sidebar.d.cts +4 -2
  172. package/dist/components/sidebar/sidebar.d.ts +4 -2
  173. package/dist/components/sidebar/sidebar.js +24 -17
  174. package/dist/components/sidebar/sidebar.js.map +1 -1
  175. package/dist/components/stat/index.d.cts +2 -0
  176. package/dist/components/stat/index.d.ts +2 -0
  177. package/dist/components/stat/stat.cjs +122 -0
  178. package/dist/components/stat/stat.cjs.map +1 -0
  179. package/dist/components/stat/stat.d.cts +51 -0
  180. package/dist/components/stat/stat.d.ts +51 -0
  181. package/dist/components/stat/stat.js +114 -0
  182. package/dist/components/stat/stat.js.map +1 -0
  183. package/dist/components/stat-group/index.d.cts +2 -0
  184. package/dist/components/stat-group/index.d.ts +2 -0
  185. package/dist/components/toast/toast.cjs +4 -1
  186. package/dist/components/toast/toast.cjs.map +1 -1
  187. package/dist/components/toast/toast.d.cts +1 -1
  188. package/dist/components/toast/toast.d.ts +1 -1
  189. package/dist/components/toast/toast.js +4 -1
  190. package/dist/components/toast/toast.js.map +1 -1
  191. package/dist/components/tooltip/tooltip.cjs +4 -1
  192. package/dist/components/tooltip/tooltip.cjs.map +1 -1
  193. package/dist/components/tooltip/tooltip.d.cts +2 -2
  194. package/dist/components/tooltip/tooltip.d.ts +2 -2
  195. package/dist/components/tooltip/tooltip.js +4 -1
  196. package/dist/components/tooltip/tooltip.js.map +1 -1
  197. package/dist/components/typography/heading.cjs +8 -2
  198. package/dist/components/typography/heading.cjs.map +1 -1
  199. package/dist/components/typography/heading.d.cts +8 -1
  200. package/dist/components/typography/heading.d.ts +8 -1
  201. package/dist/components/typography/heading.js +8 -2
  202. package/dist/components/typography/heading.js.map +1 -1
  203. package/dist/components/typography/index.d.cts +2 -2
  204. package/dist/components/typography/index.d.ts +2 -2
  205. package/dist/components/typography/paragraph.cjs +7 -2
  206. package/dist/components/typography/paragraph.cjs.map +1 -1
  207. package/dist/components/typography/paragraph.d.cts +8 -2
  208. package/dist/components/typography/paragraph.d.ts +8 -2
  209. package/dist/components/typography/paragraph.js +7 -2
  210. package/dist/components/typography/paragraph.js.map +1 -1
  211. package/dist/components/typography/text.cjs +6 -2
  212. package/dist/components/typography/text.cjs.map +1 -1
  213. package/dist/components/typography/text.d.cts +5 -0
  214. package/dist/components/typography/text.d.ts +5 -0
  215. package/dist/components/typography/text.js +6 -2
  216. package/dist/components/typography/text.js.map +1 -1
  217. package/dist/index.cjs +28 -0
  218. package/dist/index.cjs.map +1 -0
  219. package/dist/index.d.cts +20 -5
  220. package/dist/index.d.ts +20 -5
  221. package/dist/index.js +11 -3
  222. package/dist/index.js.map +1 -0
  223. package/dist/styled-system/recipes/alert.cjs +2 -1
  224. package/dist/styled-system/recipes/alert.cjs.map +1 -1
  225. package/dist/styled-system/recipes/alert.js +2 -1
  226. package/dist/styled-system/recipes/alert.js.map +1 -1
  227. package/dist/styled-system/recipes/aspect-ratio-box.cjs +25 -0
  228. package/dist/styled-system/recipes/aspect-ratio-box.cjs.map +1 -0
  229. package/dist/styled-system/recipes/aspect-ratio-box.js +25 -0
  230. package/dist/styled-system/recipes/aspect-ratio-box.js.map +1 -0
  231. package/dist/styled-system/recipes/badge.cjs +16 -6
  232. package/dist/styled-system/recipes/badge.cjs.map +1 -1
  233. package/dist/styled-system/recipes/badge.js +16 -6
  234. package/dist/styled-system/recipes/badge.js.map +1 -1
  235. package/dist/styled-system/recipes/code.cjs +33 -0
  236. package/dist/styled-system/recipes/code.cjs.map +1 -0
  237. package/dist/styled-system/recipes/code.js +33 -0
  238. package/dist/styled-system/recipes/code.js.map +1 -0
  239. package/dist/styled-system/recipes/command.cjs +3 -3
  240. package/dist/styled-system/recipes/command.cjs.map +1 -1
  241. package/dist/styled-system/recipes/command.js +3 -3
  242. package/dist/styled-system/recipes/command.js.map +1 -1
  243. package/dist/styled-system/recipes/figure.cjs +43 -0
  244. package/dist/styled-system/recipes/figure.cjs.map +1 -0
  245. package/dist/styled-system/recipes/figure.js +43 -0
  246. package/dist/styled-system/recipes/figure.js.map +1 -0
  247. package/dist/styled-system/recipes/heading.cjs +34 -9
  248. package/dist/styled-system/recipes/heading.cjs.map +1 -1
  249. package/dist/styled-system/recipes/heading.js +34 -9
  250. package/dist/styled-system/recipes/heading.js.map +1 -1
  251. package/dist/styled-system/recipes/image.cjs +57 -0
  252. package/dist/styled-system/recipes/image.cjs.map +1 -0
  253. package/dist/styled-system/recipes/image.js +57 -0
  254. package/dist/styled-system/recipes/image.js.map +1 -0
  255. package/dist/styled-system/recipes/kbd.cjs +39 -0
  256. package/dist/styled-system/recipes/kbd.cjs.map +1 -0
  257. package/dist/styled-system/recipes/kbd.js +39 -0
  258. package/dist/styled-system/recipes/kbd.js.map +1 -0
  259. package/dist/styled-system/recipes/paragraph.cjs +25 -2
  260. package/dist/styled-system/recipes/paragraph.cjs.map +1 -1
  261. package/dist/styled-system/recipes/paragraph.js +25 -2
  262. package/dist/styled-system/recipes/paragraph.js.map +1 -1
  263. package/dist/styled-system/recipes/progress.cjs +1 -0
  264. package/dist/styled-system/recipes/progress.cjs.map +1 -1
  265. package/dist/styled-system/recipes/progress.js +1 -0
  266. package/dist/styled-system/recipes/progress.js.map +1 -1
  267. package/dist/styled-system/recipes/quote.cjs +39 -0
  268. package/dist/styled-system/recipes/quote.cjs.map +1 -0
  269. package/dist/styled-system/recipes/quote.js +39 -0
  270. package/dist/styled-system/recipes/quote.js.map +1 -0
  271. package/dist/styled-system/recipes/stat-group.cjs +40 -0
  272. package/dist/styled-system/recipes/stat-group.cjs.map +1 -0
  273. package/dist/styled-system/recipes/stat-group.js +40 -0
  274. package/dist/styled-system/recipes/stat-group.js.map +1 -0
  275. package/dist/styled-system/recipes/stat.cjs +63 -0
  276. package/dist/styled-system/recipes/stat.cjs.map +1 -0
  277. package/dist/styled-system/recipes/stat.js +63 -0
  278. package/dist/styled-system/recipes/stat.js.map +1 -0
  279. package/dist/styled-system/recipes/text.cjs +23 -2
  280. package/dist/styled-system/recipes/text.cjs.map +1 -1
  281. package/dist/styled-system/recipes/text.js +23 -2
  282. package/dist/styled-system/recipes/text.js.map +1 -1
  283. package/dist/styles.css +1064 -117
  284. package/dist/theme/theme-provider.cjs +18 -8
  285. package/dist/theme/theme-provider.cjs.map +1 -1
  286. package/dist/theme/theme-provider.js +18 -8
  287. package/dist/theme/theme-provider.js.map +1 -1
  288. package/dist/theme/theme-scope.cjs +21 -0
  289. package/dist/theme/theme-scope.cjs.map +1 -0
  290. package/dist/theme/theme-scope.js +19 -0
  291. package/dist/theme/theme-scope.js.map +1 -0
  292. package/package.json +7 -4
@@ -3,13 +3,16 @@ const require_badge = require("../../styled-system/recipes/badge.cjs");
3
3
  let react = require("react");
4
4
  let react_jsx_runtime = require("react/jsx-runtime");
5
5
  //#region src/components/feedback/badge.tsx
6
- const Badge = (0, react.forwardRef)(function Badge({ className, tone = "neutral", ...props }, ref) {
6
+ const Badge = (0, react.forwardRef)(function Badge({ className, tone = "neutral", variant = "solid", ...props }, ref) {
7
+ const appearance = `${tone}-${variant}`;
7
8
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8
9
  ...props,
9
10
  ref,
10
- className: require_cx.cx(require_badge.badge({ tone }), className),
11
+ className: require_cx.cx(require_badge.badge({ tone: appearance }), className),
11
12
  "data-jaci-component": "badge",
12
- "data-slot": "badge"
13
+ "data-jaci-tone": tone,
14
+ "data-slot": "badge",
15
+ "data-variant": variant
13
16
  });
14
17
  });
15
18
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"badge.cjs","names":["cx","badge"],"sources":["../../../src/components/feedback/badge.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { badge } from \"../../styled-system/recipes\";\n\nexport interface BadgeProps extends ComponentPropsWithoutRef<\"span\"> {\n tone?: \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { className, tone = \"neutral\", ...props },\n ref,\n) {\n return (\n <span\n {...props}\n ref={ref}\n className={cx(badge({ tone }), className)}\n data-jaci-component=\"badge\"\n data-slot=\"badge\"\n />\n );\n});\n"],"mappings":";;;;;AAUA,MAAa,SAAA,GAAA,MAAA,WAAA,CAAgD,SAAS,MACpE,EAAE,WAAW,OAAO,WAAW,GAAG,SAClC,KACA;CACA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EACE,GAAI;EACC;EACL,WAAWA,WAAAA,GAAGC,cAAAA,MAAM,EAAE,KAAK,CAAC,GAAG,SAAS;EACxC,uBAAoB;EACpB,aAAU;CACX,CAAA;AAEL,CAAC"}
1
+ {"version":3,"file":"badge.cjs","names":["cx","badge"],"sources":["../../../src/components/feedback/badge.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { badge } from \"../../styled-system/recipes\";\n\nexport interface BadgeProps extends ComponentPropsWithoutRef<\"span\"> {\n tone?: \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\n variant?: \"solid\" | \"soft\" | \"outline\";\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { className, tone = \"neutral\", variant = \"solid\", ...props },\n ref,\n) {\n const appearance = `${tone}-${variant}` as\n | \"neutral-solid\"\n | \"accent-solid\"\n | \"success-solid\"\n | \"warning-solid\"\n | \"danger-solid\"\n | \"neutral-soft\"\n | \"accent-soft\"\n | \"success-soft\"\n | \"warning-soft\"\n | \"danger-soft\"\n | \"neutral-outline\"\n | \"accent-outline\"\n | \"success-outline\"\n | \"warning-outline\"\n | \"danger-outline\";\n\n return (\n <span\n {...props}\n ref={ref}\n className={cx(badge({ tone: appearance }), className)}\n data-jaci-component=\"badge\"\n data-jaci-tone={tone}\n data-slot=\"badge\"\n data-variant={variant}\n />\n );\n});\n"],"mappings":";;;;;AAWA,MAAa,SAAA,GAAA,MAAA,WAAA,CAAgD,SAAS,MACpE,EAAE,WAAW,OAAO,WAAW,UAAU,SAAS,GAAG,SACrD,KACA;CACA,MAAM,aAAa,GAAG,KAAK,GAAG;CAiB9B,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EACE,GAAI;EACC;EACL,WAAWA,WAAAA,GAAGC,cAAAA,MAAM,EAAE,MAAM,WAAW,CAAC,GAAG,SAAS;EACpD,uBAAoB;EACpB,kBAAgB;EAChB,aAAU;EACV,gBAAc;CACf,CAAA;AAEL,CAAC"}
@@ -2,6 +2,7 @@ import { ComponentPropsWithoutRef } from "react";
2
2
  //#region src/components/feedback/badge.d.ts
3
3
  interface BadgeProps extends ComponentPropsWithoutRef<"span"> {
4
4
  tone?: "neutral" | "accent" | "success" | "warning" | "danger";
5
+ variant?: "solid" | "soft" | "outline";
5
6
  }
6
7
  declare const Badge: import("react").ForwardRefExoticComponent<BadgeProps & import("react").RefAttributes<HTMLSpanElement>>;
7
8
  //#endregion
@@ -2,6 +2,7 @@ import { ComponentPropsWithoutRef } from "react";
2
2
  //#region src/components/feedback/badge.d.ts
3
3
  interface BadgeProps extends ComponentPropsWithoutRef<"span"> {
4
4
  tone?: "neutral" | "accent" | "success" | "warning" | "danger";
5
+ variant?: "solid" | "soft" | "outline";
5
6
  }
6
7
  declare const Badge: import("react").ForwardRefExoticComponent<BadgeProps & import("react").RefAttributes<HTMLSpanElement>>;
7
8
  //#endregion
@@ -3,13 +3,16 @@ import { badge } from "../../styled-system/recipes/badge.js";
3
3
  import { forwardRef } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/components/feedback/badge.tsx
6
- const Badge = forwardRef(function Badge({ className, tone = "neutral", ...props }, ref) {
6
+ const Badge = forwardRef(function Badge({ className, tone = "neutral", variant = "solid", ...props }, ref) {
7
+ const appearance = `${tone}-${variant}`;
7
8
  return /* @__PURE__ */ jsx("span", {
8
9
  ...props,
9
10
  ref,
10
- className: cx(badge({ tone }), className),
11
+ className: cx(badge({ tone: appearance }), className),
11
12
  "data-jaci-component": "badge",
12
- "data-slot": "badge"
13
+ "data-jaci-tone": tone,
14
+ "data-slot": "badge",
15
+ "data-variant": variant
13
16
  });
14
17
  });
15
18
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","names":[],"sources":["../../../src/components/feedback/badge.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { badge } from \"../../styled-system/recipes\";\n\nexport interface BadgeProps extends ComponentPropsWithoutRef<\"span\"> {\n tone?: \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { className, tone = \"neutral\", ...props },\n ref,\n) {\n return (\n <span\n {...props}\n ref={ref}\n className={cx(badge({ tone }), className)}\n data-jaci-component=\"badge\"\n data-slot=\"badge\"\n />\n );\n});\n"],"mappings":";;;;;AAUA,MAAa,QAAQ,WAAwC,SAAS,MACpE,EAAE,WAAW,OAAO,WAAW,GAAG,SAClC,KACA;CACA,OACE,oBAAC,QAAD;EACE,GAAI;EACC;EACL,WAAW,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,SAAS;EACxC,uBAAoB;EACpB,aAAU;CACX,CAAA;AAEL,CAAC"}
1
+ {"version":3,"file":"badge.js","names":[],"sources":["../../../src/components/feedback/badge.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { badge } from \"../../styled-system/recipes\";\n\nexport interface BadgeProps extends ComponentPropsWithoutRef<\"span\"> {\n tone?: \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\n variant?: \"solid\" | \"soft\" | \"outline\";\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { className, tone = \"neutral\", variant = \"solid\", ...props },\n ref,\n) {\n const appearance = `${tone}-${variant}` as\n | \"neutral-solid\"\n | \"accent-solid\"\n | \"success-solid\"\n | \"warning-solid\"\n | \"danger-solid\"\n | \"neutral-soft\"\n | \"accent-soft\"\n | \"success-soft\"\n | \"warning-soft\"\n | \"danger-soft\"\n | \"neutral-outline\"\n | \"accent-outline\"\n | \"success-outline\"\n | \"warning-outline\"\n | \"danger-outline\";\n\n return (\n <span\n {...props}\n ref={ref}\n className={cx(badge({ tone: appearance }), className)}\n data-jaci-component=\"badge\"\n data-jaci-tone={tone}\n data-slot=\"badge\"\n data-variant={variant}\n />\n );\n});\n"],"mappings":";;;;;AAWA,MAAa,QAAQ,WAAwC,SAAS,MACpE,EAAE,WAAW,OAAO,WAAW,UAAU,SAAS,GAAG,SACrD,KACA;CACA,MAAM,aAAa,GAAG,KAAK,GAAG;CAiB9B,OACE,oBAAC,QAAD;EACE,GAAI;EACC;EACL,WAAW,GAAG,MAAM,EAAE,MAAM,WAAW,CAAC,GAAG,SAAS;EACpD,uBAAoB;EACpB,kBAAgB;EAChB,aAAU;EACV,gBAAc;CACf,CAAA;AAEL,CAAC"}
@@ -0,0 +1,134 @@
1
+ "use client";
2
+ const require_cx = require("../../styled-system/css/cx.cjs");
3
+ const require_figure = require("../../styled-system/recipes/figure.cjs");
4
+ const require_theme_scope = require("../../theme/theme-scope.cjs");
5
+ const require_image = require("../image/image.cjs");
6
+ let react = require("react");
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ let _base_ui_react_dialog = require("@base-ui/react/dialog");
9
+ //#region src/components/figure/figure.tsx
10
+ const FigureContext = (0, react.createContext)(null);
11
+ function useFigureContext() {
12
+ const value = (0, react.useContext)(FigureContext);
13
+ if (!value) throw new Error("Figure parts must be rendered inside Figure.Root.");
14
+ return value;
15
+ }
16
+ const FigureImage = (0, react.forwardRef)(function FigureImage({ className, lightbox: _lightbox, ...props }, ref) {
17
+ const { lightbox, styles } = useFigureContext();
18
+ const content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.Image, {
19
+ ...props,
20
+ ref,
21
+ className: require_cx.cx(styles.image, className),
22
+ "data-slot": "figure-image",
23
+ lightbox: false
24
+ });
25
+ if (!lightbox) return content;
26
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Trigger, {
27
+ "aria-label": "Open image",
28
+ className: styles.trigger,
29
+ "data-jaci-component": "figure-trigger",
30
+ "data-slot": "figure-trigger",
31
+ children: content
32
+ });
33
+ });
34
+ const FigureCaption = (0, react.forwardRef)(function FigureCaption({ className, ...props }, ref) {
35
+ const { styles } = useFigureContext();
36
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("figcaption", {
37
+ ...props,
38
+ ref,
39
+ className: require_cx.cx(styles.caption, className),
40
+ "data-slot": "figure-caption"
41
+ });
42
+ });
43
+ function findChild(children, component) {
44
+ return react.Children.toArray(children).find((item) => (0, react.isValidElement)(item) && item.type === component) ?? null;
45
+ }
46
+ const FigureRoot = (0, react.forwardRef)(function FigureRoot({ children, className, closeLabel = "Close image", defaultOpen, lightbox = false, onOpenChange, open, ...props }, ref) {
47
+ const styles = require_figure.figure();
48
+ const media = findChild(children, FigureImage);
49
+ const caption = findChild(children, FigureCaption);
50
+ const canOpen = Boolean(lightbox && media?.props.src);
51
+ const content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("figure", {
52
+ ...props,
53
+ ref,
54
+ className: require_cx.cx(styles.root, className),
55
+ "data-jaci-component": "figure",
56
+ "data-lightbox": canOpen || void 0,
57
+ "data-slot": "figure",
58
+ children
59
+ });
60
+ const value = {
61
+ lightbox: canOpen,
62
+ styles
63
+ };
64
+ const scopedPortalProps = require_theme_scope.useThemePortalProps({});
65
+ if (!canOpen || !media) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FigureContext.Provider, {
66
+ value,
67
+ children: content
68
+ });
69
+ const alt = media.props.alt;
70
+ const src = media.props.src;
71
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FigureContext.Provider, {
72
+ value,
73
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_dialog.Dialog.Root, {
74
+ defaultOpen,
75
+ onOpenChange: (nextOpen) => onOpenChange?.(nextOpen),
76
+ open,
77
+ children: [content, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_dialog.Dialog.Portal, {
78
+ ...scopedPortalProps,
79
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Backdrop, {
80
+ className: styles.backdrop,
81
+ "data-slot": "figure-lightbox-backdrop"
82
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Viewport, {
83
+ className: styles.viewport,
84
+ "data-slot": "figure-lightbox-viewport",
85
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_dialog.Dialog.Popup, {
86
+ "aria-label": alt || "Image preview",
87
+ className: styles.popup,
88
+ "data-jaci-component": "figure-lightbox",
89
+ "data-slot": "figure-lightbox-popup",
90
+ children: [
91
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Title, {
92
+ className: styles.title,
93
+ children: alt || "Image preview"
94
+ }),
95
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
96
+ className: styles.closeRow,
97
+ "data-slot": "figure-lightbox-close-row",
98
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Close, {
99
+ "aria-label": closeLabel,
100
+ className: styles.close,
101
+ "data-slot": "figure-lightbox-close",
102
+ children: "×"
103
+ })
104
+ }),
105
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
106
+ alt,
107
+ className: styles.lightboxImage,
108
+ "data-slot": "figure-lightbox-image",
109
+ src
110
+ }),
111
+ caption ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("figcaption", {
112
+ className: styles.lightboxCaption,
113
+ "data-slot": "figure-lightbox-caption",
114
+ children: caption.props.children
115
+ }) : null
116
+ ]
117
+ })
118
+ })]
119
+ })]
120
+ })
121
+ });
122
+ });
123
+ const Figure = {
124
+ Root: FigureRoot,
125
+ Image: FigureImage,
126
+ Caption: FigureCaption
127
+ };
128
+ //#endregion
129
+ exports.Figure = Figure;
130
+ exports.FigureCaption = FigureCaption;
131
+ exports.FigureImage = FigureImage;
132
+ exports.FigureRoot = FigureRoot;
133
+
134
+ //# sourceMappingURL=figure.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figure.cjs","names":["Image","cx","BaseDialog","Children","figureStyles","useThemePortalProps"],"sources":["../../../src/components/figure/figure.tsx"],"sourcesContent":["\"use client\";\n\nimport { Dialog as BaseDialog } from \"@base-ui/react/dialog\";\nimport { Children, createContext, forwardRef, isValidElement, useContext } from \"react\";\nimport type { ComponentPropsWithoutRef, ElementType, ReactElement, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { figure as figureStyles } from \"../../styled-system/recipes\";\nimport { Image } from \"../image\";\nimport type { ImageProps } from \"../image\";\nimport { useThemePortalProps } from \"../../theme/theme-scope\";\n\ninterface FigureContextValue {\n lightbox: boolean;\n styles: ReturnType<typeof figureStyles>;\n}\n\nconst FigureContext = createContext<FigureContextValue | null>(null);\n\nfunction useFigureContext() {\n const value = useContext(FigureContext);\n if (!value) {\n throw new Error(\"Figure parts must be rendered inside Figure.Root.\");\n }\n return value;\n}\n\nexport type FigureImageProps = ImageProps;\n\nexport const FigureImage = forwardRef<HTMLImageElement, FigureImageProps>(function FigureImage(\n { className, lightbox: _lightbox, ...props },\n ref,\n) {\n const { lightbox, styles } = useFigureContext();\n const content = (\n <Image\n {...props}\n ref={ref}\n className={cx(styles.image, className)}\n data-slot=\"figure-image\"\n lightbox={false}\n />\n );\n\n if (!lightbox) {\n return content;\n }\n\n return (\n <BaseDialog.Trigger\n aria-label=\"Open image\"\n className={styles.trigger}\n data-jaci-component=\"figure-trigger\"\n data-slot=\"figure-trigger\"\n >\n {content}\n </BaseDialog.Trigger>\n );\n});\n\nexport type FigureCaptionProps = ComponentPropsWithoutRef<\"figcaption\">;\n\nexport const FigureCaption = forwardRef<HTMLElement, FigureCaptionProps>(function FigureCaption(\n { className, ...props },\n ref,\n) {\n const { styles } = useFigureContext();\n return (\n <figcaption\n {...props}\n ref={ref}\n className={cx(styles.caption, className)}\n data-slot=\"figure-caption\"\n />\n );\n});\n\nexport interface FigureRootProps extends ComponentPropsWithoutRef<\"figure\"> {\n lightbox?: boolean;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n closeLabel?: string;\n}\n\nfunction findChild<T>(children: ReactNode, component: ElementType): ReactElement<T> | null {\n const child = Children.toArray(children).find(\n (item) => isValidElement(item) && item.type === component,\n );\n return (child as ReactElement<T> | undefined) ?? null;\n}\n\nexport const FigureRoot = forwardRef<HTMLElement, FigureRootProps>(function FigureRoot(\n {\n children,\n className,\n closeLabel = \"Close image\",\n defaultOpen,\n lightbox = false,\n onOpenChange,\n open,\n ...props\n },\n ref,\n) {\n const styles = figureStyles();\n const media = findChild<FigureImageProps>(children, FigureImage);\n const caption = findChild<FigureCaptionProps>(children, FigureCaption);\n const canOpen = Boolean(lightbox && media?.props.src);\n const content = (\n <figure\n {...props}\n ref={ref}\n className={cx(styles.root, className)}\n data-jaci-component=\"figure\"\n data-lightbox={canOpen || undefined}\n data-slot=\"figure\"\n >\n {children}\n </figure>\n );\n\n const value = { lightbox: canOpen, styles };\n const scopedPortalProps = useThemePortalProps({});\n\n if (!canOpen || !media) {\n return <FigureContext.Provider value={value}>{content}</FigureContext.Provider>;\n }\n\n const alt = media.props.alt;\n const src = media.props.src;\n\n return (\n <FigureContext.Provider value={value}>\n <BaseDialog.Root\n defaultOpen={defaultOpen}\n onOpenChange={(nextOpen) => onOpenChange?.(nextOpen)}\n open={open}\n >\n {content}\n <BaseDialog.Portal {...scopedPortalProps}>\n <BaseDialog.Backdrop className={styles.backdrop} data-slot=\"figure-lightbox-backdrop\" />\n <BaseDialog.Viewport className={styles.viewport} data-slot=\"figure-lightbox-viewport\">\n <BaseDialog.Popup\n aria-label={alt || \"Image preview\"}\n className={styles.popup}\n data-jaci-component=\"figure-lightbox\"\n data-slot=\"figure-lightbox-popup\"\n >\n <BaseDialog.Title className={styles.title}>{alt || \"Image preview\"}</BaseDialog.Title>\n <div className={styles.closeRow} data-slot=\"figure-lightbox-close-row\">\n <BaseDialog.Close\n aria-label={closeLabel}\n className={styles.close}\n data-slot=\"figure-lightbox-close\"\n >\n ×\n </BaseDialog.Close>\n </div>\n <img\n alt={alt}\n className={styles.lightboxImage}\n data-slot=\"figure-lightbox-image\"\n src={src}\n />\n {caption ? (\n <figcaption className={styles.lightboxCaption} data-slot=\"figure-lightbox-caption\">\n {caption.props.children}\n </figcaption>\n ) : null}\n </BaseDialog.Popup>\n </BaseDialog.Viewport>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n </FigureContext.Provider>\n );\n});\n\nexport const Figure = {\n Root: FigureRoot,\n Image: FigureImage,\n Caption: FigureCaption,\n};\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { ImageProps } from "../image/image.cjs";
2
+ import "../image/index.cjs";
3
+ import { ComponentPropsWithoutRef } from "react";
4
+ //#region src/components/figure/figure.d.ts
5
+ type FigureImageProps = ImageProps;
6
+ declare const FigureImage: import("react").ForwardRefExoticComponent<ImageProps & import("react").RefAttributes<HTMLImageElement>>;
7
+ type FigureCaptionProps = ComponentPropsWithoutRef<"figcaption">;
8
+ declare const FigureCaption: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & import("react").RefAttributes<HTMLElement>>;
9
+ interface FigureRootProps extends ComponentPropsWithoutRef<"figure"> {
10
+ lightbox?: boolean;
11
+ defaultOpen?: boolean;
12
+ open?: boolean;
13
+ onOpenChange?: (open: boolean) => void;
14
+ closeLabel?: string;
15
+ }
16
+ declare const FigureRoot: import("react").ForwardRefExoticComponent<FigureRootProps & import("react").RefAttributes<HTMLElement>>;
17
+ declare const Figure: {
18
+ Root: import("react").ForwardRefExoticComponent<FigureRootProps & import("react").RefAttributes<HTMLElement>>;
19
+ Image: import("react").ForwardRefExoticComponent<ImageProps & import("react").RefAttributes<HTMLImageElement>>;
20
+ Caption: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & import("react").RefAttributes<HTMLElement>>;
21
+ };
22
+ //#endregion
23
+ export { Figure, FigureCaption, FigureCaptionProps, FigureImage, FigureImageProps, FigureRoot, FigureRootProps };
24
+ //# sourceMappingURL=figure.d.cts.map
@@ -0,0 +1,24 @@
1
+ import { ImageProps } from "../image/image.js";
2
+ import "../image/index.js";
3
+ import { ComponentPropsWithoutRef } from "react";
4
+ //#region src/components/figure/figure.d.ts
5
+ type FigureImageProps = ImageProps;
6
+ declare const FigureImage: import("react").ForwardRefExoticComponent<ImageProps & import("react").RefAttributes<HTMLImageElement>>;
7
+ type FigureCaptionProps = ComponentPropsWithoutRef<"figcaption">;
8
+ declare const FigureCaption: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & import("react").RefAttributes<HTMLElement>>;
9
+ interface FigureRootProps extends ComponentPropsWithoutRef<"figure"> {
10
+ lightbox?: boolean;
11
+ defaultOpen?: boolean;
12
+ open?: boolean;
13
+ onOpenChange?: (open: boolean) => void;
14
+ closeLabel?: string;
15
+ }
16
+ declare const FigureRoot: import("react").ForwardRefExoticComponent<FigureRootProps & import("react").RefAttributes<HTMLElement>>;
17
+ declare const Figure: {
18
+ Root: import("react").ForwardRefExoticComponent<FigureRootProps & import("react").RefAttributes<HTMLElement>>;
19
+ Image: import("react").ForwardRefExoticComponent<ImageProps & import("react").RefAttributes<HTMLImageElement>>;
20
+ Caption: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & import("react").RefAttributes<HTMLElement>>;
21
+ };
22
+ //#endregion
23
+ export { Figure, FigureCaption, FigureCaptionProps, FigureImage, FigureImageProps, FigureRoot, FigureRootProps };
24
+ //# sourceMappingURL=figure.d.ts.map
@@ -0,0 +1,131 @@
1
+ "use client";
2
+ import { cx } from "../../styled-system/css/cx.js";
3
+ import { figure } from "../../styled-system/recipes/figure.js";
4
+ import { useThemePortalProps } from "../../theme/theme-scope.js";
5
+ import { Image } from "../image/image.js";
6
+ import { Children, createContext, forwardRef, isValidElement, useContext } from "react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { Dialog } from "@base-ui/react/dialog";
9
+ //#region src/components/figure/figure.tsx
10
+ const FigureContext = createContext(null);
11
+ function useFigureContext() {
12
+ const value = useContext(FigureContext);
13
+ if (!value) throw new Error("Figure parts must be rendered inside Figure.Root.");
14
+ return value;
15
+ }
16
+ const FigureImage = forwardRef(function FigureImage({ className, lightbox: _lightbox, ...props }, ref) {
17
+ const { lightbox, styles } = useFigureContext();
18
+ const content = /* @__PURE__ */ jsx(Image, {
19
+ ...props,
20
+ ref,
21
+ className: cx(styles.image, className),
22
+ "data-slot": "figure-image",
23
+ lightbox: false
24
+ });
25
+ if (!lightbox) return content;
26
+ return /* @__PURE__ */ jsx(Dialog.Trigger, {
27
+ "aria-label": "Open image",
28
+ className: styles.trigger,
29
+ "data-jaci-component": "figure-trigger",
30
+ "data-slot": "figure-trigger",
31
+ children: content
32
+ });
33
+ });
34
+ const FigureCaption = forwardRef(function FigureCaption({ className, ...props }, ref) {
35
+ const { styles } = useFigureContext();
36
+ return /* @__PURE__ */ jsx("figcaption", {
37
+ ...props,
38
+ ref,
39
+ className: cx(styles.caption, className),
40
+ "data-slot": "figure-caption"
41
+ });
42
+ });
43
+ function findChild(children, component) {
44
+ return Children.toArray(children).find((item) => isValidElement(item) && item.type === component) ?? null;
45
+ }
46
+ const FigureRoot = forwardRef(function FigureRoot({ children, className, closeLabel = "Close image", defaultOpen, lightbox = false, onOpenChange, open, ...props }, ref) {
47
+ const styles = figure();
48
+ const media = findChild(children, FigureImage);
49
+ const caption = findChild(children, FigureCaption);
50
+ const canOpen = Boolean(lightbox && media?.props.src);
51
+ const content = /* @__PURE__ */ jsx("figure", {
52
+ ...props,
53
+ ref,
54
+ className: cx(styles.root, className),
55
+ "data-jaci-component": "figure",
56
+ "data-lightbox": canOpen || void 0,
57
+ "data-slot": "figure",
58
+ children
59
+ });
60
+ const value = {
61
+ lightbox: canOpen,
62
+ styles
63
+ };
64
+ const scopedPortalProps = useThemePortalProps({});
65
+ if (!canOpen || !media) return /* @__PURE__ */ jsx(FigureContext.Provider, {
66
+ value,
67
+ children: content
68
+ });
69
+ const alt = media.props.alt;
70
+ const src = media.props.src;
71
+ return /* @__PURE__ */ jsx(FigureContext.Provider, {
72
+ value,
73
+ children: /* @__PURE__ */ jsxs(Dialog.Root, {
74
+ defaultOpen,
75
+ onOpenChange: (nextOpen) => onOpenChange?.(nextOpen),
76
+ open,
77
+ children: [content, /* @__PURE__ */ jsxs(Dialog.Portal, {
78
+ ...scopedPortalProps,
79
+ children: [/* @__PURE__ */ jsx(Dialog.Backdrop, {
80
+ className: styles.backdrop,
81
+ "data-slot": "figure-lightbox-backdrop"
82
+ }), /* @__PURE__ */ jsx(Dialog.Viewport, {
83
+ className: styles.viewport,
84
+ "data-slot": "figure-lightbox-viewport",
85
+ children: /* @__PURE__ */ jsxs(Dialog.Popup, {
86
+ "aria-label": alt || "Image preview",
87
+ className: styles.popup,
88
+ "data-jaci-component": "figure-lightbox",
89
+ "data-slot": "figure-lightbox-popup",
90
+ children: [
91
+ /* @__PURE__ */ jsx(Dialog.Title, {
92
+ className: styles.title,
93
+ children: alt || "Image preview"
94
+ }),
95
+ /* @__PURE__ */ jsx("div", {
96
+ className: styles.closeRow,
97
+ "data-slot": "figure-lightbox-close-row",
98
+ children: /* @__PURE__ */ jsx(Dialog.Close, {
99
+ "aria-label": closeLabel,
100
+ className: styles.close,
101
+ "data-slot": "figure-lightbox-close",
102
+ children: "×"
103
+ })
104
+ }),
105
+ /* @__PURE__ */ jsx("img", {
106
+ alt,
107
+ className: styles.lightboxImage,
108
+ "data-slot": "figure-lightbox-image",
109
+ src
110
+ }),
111
+ caption ? /* @__PURE__ */ jsx("figcaption", {
112
+ className: styles.lightboxCaption,
113
+ "data-slot": "figure-lightbox-caption",
114
+ children: caption.props.children
115
+ }) : null
116
+ ]
117
+ })
118
+ })]
119
+ })]
120
+ })
121
+ });
122
+ });
123
+ const Figure = {
124
+ Root: FigureRoot,
125
+ Image: FigureImage,
126
+ Caption: FigureCaption
127
+ };
128
+ //#endregion
129
+ export { Figure, FigureCaption, FigureImage, FigureRoot };
130
+
131
+ //# sourceMappingURL=figure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figure.js","names":["BaseDialog","figureStyles"],"sources":["../../../src/components/figure/figure.tsx"],"sourcesContent":["\"use client\";\n\nimport { Dialog as BaseDialog } from \"@base-ui/react/dialog\";\nimport { Children, createContext, forwardRef, isValidElement, useContext } from \"react\";\nimport type { ComponentPropsWithoutRef, ElementType, ReactElement, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { figure as figureStyles } from \"../../styled-system/recipes\";\nimport { Image } from \"../image\";\nimport type { ImageProps } from \"../image\";\nimport { useThemePortalProps } from \"../../theme/theme-scope\";\n\ninterface FigureContextValue {\n lightbox: boolean;\n styles: ReturnType<typeof figureStyles>;\n}\n\nconst FigureContext = createContext<FigureContextValue | null>(null);\n\nfunction useFigureContext() {\n const value = useContext(FigureContext);\n if (!value) {\n throw new Error(\"Figure parts must be rendered inside Figure.Root.\");\n }\n return value;\n}\n\nexport type FigureImageProps = ImageProps;\n\nexport const FigureImage = forwardRef<HTMLImageElement, FigureImageProps>(function FigureImage(\n { className, lightbox: _lightbox, ...props },\n ref,\n) {\n const { lightbox, styles } = useFigureContext();\n const content = (\n <Image\n {...props}\n ref={ref}\n className={cx(styles.image, className)}\n data-slot=\"figure-image\"\n lightbox={false}\n />\n );\n\n if (!lightbox) {\n return content;\n }\n\n return (\n <BaseDialog.Trigger\n aria-label=\"Open image\"\n className={styles.trigger}\n data-jaci-component=\"figure-trigger\"\n data-slot=\"figure-trigger\"\n >\n {content}\n </BaseDialog.Trigger>\n );\n});\n\nexport type FigureCaptionProps = ComponentPropsWithoutRef<\"figcaption\">;\n\nexport const FigureCaption = forwardRef<HTMLElement, FigureCaptionProps>(function FigureCaption(\n { className, ...props },\n ref,\n) {\n const { styles } = useFigureContext();\n return (\n <figcaption\n {...props}\n ref={ref}\n className={cx(styles.caption, className)}\n data-slot=\"figure-caption\"\n />\n );\n});\n\nexport interface FigureRootProps extends ComponentPropsWithoutRef<\"figure\"> {\n lightbox?: boolean;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n closeLabel?: string;\n}\n\nfunction findChild<T>(children: ReactNode, component: ElementType): ReactElement<T> | null {\n const child = Children.toArray(children).find(\n (item) => isValidElement(item) && item.type === component,\n );\n return (child as ReactElement<T> | undefined) ?? null;\n}\n\nexport const FigureRoot = forwardRef<HTMLElement, FigureRootProps>(function FigureRoot(\n {\n children,\n className,\n closeLabel = \"Close image\",\n defaultOpen,\n lightbox = false,\n onOpenChange,\n open,\n ...props\n },\n ref,\n) {\n const styles = figureStyles();\n const media = findChild<FigureImageProps>(children, FigureImage);\n const caption = findChild<FigureCaptionProps>(children, FigureCaption);\n const canOpen = Boolean(lightbox && media?.props.src);\n const content = (\n <figure\n {...props}\n ref={ref}\n className={cx(styles.root, className)}\n data-jaci-component=\"figure\"\n data-lightbox={canOpen || undefined}\n data-slot=\"figure\"\n >\n {children}\n </figure>\n );\n\n const value = { lightbox: canOpen, styles };\n const scopedPortalProps = useThemePortalProps({});\n\n if (!canOpen || !media) {\n return <FigureContext.Provider value={value}>{content}</FigureContext.Provider>;\n }\n\n const alt = media.props.alt;\n const src = media.props.src;\n\n return (\n <FigureContext.Provider value={value}>\n <BaseDialog.Root\n defaultOpen={defaultOpen}\n onOpenChange={(nextOpen) => onOpenChange?.(nextOpen)}\n open={open}\n >\n {content}\n <BaseDialog.Portal {...scopedPortalProps}>\n <BaseDialog.Backdrop className={styles.backdrop} data-slot=\"figure-lightbox-backdrop\" />\n <BaseDialog.Viewport className={styles.viewport} data-slot=\"figure-lightbox-viewport\">\n <BaseDialog.Popup\n aria-label={alt || \"Image preview\"}\n className={styles.popup}\n data-jaci-component=\"figure-lightbox\"\n data-slot=\"figure-lightbox-popup\"\n >\n <BaseDialog.Title className={styles.title}>{alt || \"Image preview\"}</BaseDialog.Title>\n <div className={styles.closeRow} data-slot=\"figure-lightbox-close-row\">\n <BaseDialog.Close\n aria-label={closeLabel}\n className={styles.close}\n data-slot=\"figure-lightbox-close\"\n >\n ×\n </BaseDialog.Close>\n </div>\n <img\n alt={alt}\n className={styles.lightboxImage}\n data-slot=\"figure-lightbox-image\"\n src={src}\n />\n {caption ? (\n <figcaption className={styles.lightboxCaption} data-slot=\"figure-lightbox-caption\">\n {caption.props.children}\n </figcaption>\n ) : null}\n </BaseDialog.Popup>\n </BaseDialog.Viewport>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n </FigureContext.Provider>\n );\n});\n\nexport const Figure = {\n Root: FigureRoot,\n Image: FigureImage,\n Caption: FigureCaption,\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Figure, FigureCaption, FigureCaptionProps, FigureImage, FigureImageProps, FigureRoot, FigureRootProps } from "./figure.cjs";
2
+ export { Figure, FigureCaption, type FigureCaptionProps, FigureImage, type FigureImageProps, FigureRoot, type FigureRootProps };
@@ -0,0 +1,2 @@
1
+ import { Figure, FigureCaption, FigureCaptionProps, FigureImage, FigureImageProps, FigureRoot, FigureRootProps } from "./figure.js";
2
+ export { Figure, FigureCaption, type FigureCaptionProps, FigureImage, type FigureImageProps, FigureRoot, type FigureRootProps };
@@ -0,0 +1,112 @@
1
+ "use client";
2
+ const require_cx = require("../../styled-system/css/cx.cjs");
3
+ const require_image = require("../../styled-system/recipes/image.cjs");
4
+ const require_theme_scope = require("../../theme/theme-scope.cjs");
5
+ let react = require("react");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ let _base_ui_react_dialog = require("@base-ui/react/dialog");
8
+ //#region src/components/image/image.tsx
9
+ const Image = (0, react.forwardRef)(function Image({ alt, aspectRatio, className, defaultOpen, fallback, fit = "cover", lightbox = false, lightboxLabel = "Open image", onError, onLoad, onOpenChange, onStatusChange, open, position, src, style, ...props }, ref) {
10
+ const [status, setStatus] = (0, react.useState)("loading");
11
+ (0, react.useEffect)(() => {
12
+ setStatus("loading");
13
+ }, [src]);
14
+ (0, react.useEffect)(() => {
15
+ onStatusChange?.(status);
16
+ }, [onStatusChange, status]);
17
+ const styles = require_image.image({
18
+ fit,
19
+ status
20
+ });
21
+ const scopedPortalProps = require_theme_scope.useThemePortalProps({});
22
+ const rootStyle = {
23
+ ...aspectRatio && Number.isFinite(aspectRatio) && aspectRatio > 0 ? { aspectRatio } : void 0,
24
+ ...style
25
+ };
26
+ const content = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
27
+ "aria-busy": status === "loading" || void 0,
28
+ className: styles.root,
29
+ "data-fit": fit,
30
+ "data-jaci-component": "image",
31
+ "data-slot": "image",
32
+ "data-status": status,
33
+ style: rootStyle,
34
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
35
+ ...props,
36
+ ref,
37
+ alt,
38
+ className: require_cx.cx(styles.image, className),
39
+ "data-slot": "image-content",
40
+ onError: (event) => {
41
+ setStatus("error");
42
+ onError?.(event);
43
+ },
44
+ onLoad: (event) => {
45
+ setStatus("loaded");
46
+ onLoad?.(event);
47
+ },
48
+ src,
49
+ style: { objectPosition: position }
50
+ }), status === "error" && fallback ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
51
+ "aria-live": "polite",
52
+ className: styles.fallback,
53
+ "data-slot": "image-fallback",
54
+ children: fallback
55
+ }) : null]
56
+ });
57
+ if (!lightbox) return content;
58
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_dialog.Dialog.Root, {
59
+ defaultOpen,
60
+ onOpenChange: (nextOpen) => onOpenChange?.(nextOpen),
61
+ open,
62
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Trigger, {
63
+ "aria-label": lightboxLabel,
64
+ className: styles.trigger,
65
+ "data-jaci-component": "image-trigger",
66
+ "data-slot": "image-trigger",
67
+ children: content
68
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_dialog.Dialog.Portal, {
69
+ ...scopedPortalProps,
70
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Backdrop, {
71
+ className: styles.backdrop,
72
+ "data-slot": "image-lightbox-backdrop"
73
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Viewport, {
74
+ className: styles.viewport,
75
+ "data-slot": "image-lightbox-viewport",
76
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_dialog.Dialog.Popup, {
77
+ "aria-label": alt || lightboxLabel,
78
+ className: styles.popup,
79
+ "data-jaci-component": "image-lightbox",
80
+ "data-slot": "image-lightbox-popup",
81
+ children: [
82
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Title, {
83
+ className: styles.title,
84
+ children: alt || lightboxLabel
85
+ }),
86
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
87
+ className: styles.closeRow,
88
+ "data-slot": "image-lightbox-close-row",
89
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Close, {
90
+ "aria-label": "Close image",
91
+ className: styles.close,
92
+ "data-slot": "image-lightbox-close",
93
+ children: "×"
94
+ })
95
+ }),
96
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
97
+ alt,
98
+ className: styles.lightboxImage,
99
+ "data-slot": "image-lightbox-content",
100
+ src,
101
+ style: { objectPosition: position }
102
+ })
103
+ ]
104
+ })
105
+ })]
106
+ })]
107
+ });
108
+ });
109
+ //#endregion
110
+ exports.Image = Image;
111
+
112
+ //# sourceMappingURL=image.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.cjs","names":["image","useThemePortalProps","cx","BaseDialog"],"sources":["../../../src/components/image/image.tsx"],"sourcesContent":["\"use client\";\n\nimport { Dialog as BaseDialog } from \"@base-ui/react/dialog\";\nimport { forwardRef, useEffect, useState } from \"react\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cx } from \"../../styled-system/css\";\nimport { image } from \"../../styled-system/recipes\";\nimport { useThemePortalProps } from \"../../theme/theme-scope\";\n\nexport type ImageFit = \"contain\" | \"cover\" | \"fill\" | \"none\";\nexport type ImageStatus = \"loading\" | \"loaded\" | \"error\";\n\nexport interface ImageProps extends Omit<ComponentPropsWithoutRef<\"img\">, \"children\"> {\n alt: string;\n aspectRatio?: number;\n defaultOpen?: boolean;\n fallback?: ReactNode;\n fit?: ImageFit;\n lightbox?: boolean;\n lightboxLabel?: string;\n onOpenChange?: (open: boolean) => void;\n onStatusChange?: (status: ImageStatus) => void;\n open?: boolean;\n position?: string;\n}\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(\n {\n alt,\n aspectRatio,\n className,\n defaultOpen,\n fallback,\n fit = \"cover\",\n lightbox = false,\n lightboxLabel = \"Open image\",\n onError,\n onLoad,\n onOpenChange,\n onStatusChange,\n open,\n position,\n src,\n style,\n ...props\n },\n ref,\n) {\n const [status, setStatus] = useState<ImageStatus>(\"loading\");\n\n // The source is intentionally the reset key for the native image lifecycle.\n // biome-ignore lint/correctness/useExhaustiveDependencies: changing src starts a new lifecycle.\n useEffect(() => {\n setStatus(\"loading\");\n }, [src]);\n\n useEffect(() => {\n onStatusChange?.(status);\n }, [onStatusChange, status]);\n\n const styles = image({ fit, status });\n const scopedPortalProps = useThemePortalProps({});\n const rootStyle = {\n ...(aspectRatio && Number.isFinite(aspectRatio) && aspectRatio > 0\n ? { aspectRatio }\n : undefined),\n ...style,\n };\n\n const content = (\n <span\n aria-busy={status === \"loading\" || undefined}\n className={styles.root}\n data-fit={fit}\n data-jaci-component=\"image\"\n data-slot=\"image\"\n data-status={status}\n style={rootStyle}\n >\n <img\n {...props}\n ref={ref}\n alt={alt}\n className={cx(styles.image, className)}\n data-slot=\"image-content\"\n onError={(event) => {\n setStatus(\"error\");\n onError?.(event);\n }}\n onLoad={(event) => {\n setStatus(\"loaded\");\n onLoad?.(event);\n }}\n src={src}\n style={{ objectPosition: position }}\n />\n {status === \"error\" && fallback ? (\n <span aria-live=\"polite\" className={styles.fallback} data-slot=\"image-fallback\">\n {fallback}\n </span>\n ) : null}\n </span>\n );\n\n if (!lightbox) {\n return content;\n }\n\n return (\n <BaseDialog.Root\n defaultOpen={defaultOpen}\n onOpenChange={(nextOpen) => onOpenChange?.(nextOpen)}\n open={open}\n >\n <BaseDialog.Trigger\n aria-label={lightboxLabel}\n className={styles.trigger}\n data-jaci-component=\"image-trigger\"\n data-slot=\"image-trigger\"\n >\n {content}\n </BaseDialog.Trigger>\n <BaseDialog.Portal {...scopedPortalProps}>\n <BaseDialog.Backdrop className={styles.backdrop} data-slot=\"image-lightbox-backdrop\" />\n <BaseDialog.Viewport className={styles.viewport} data-slot=\"image-lightbox-viewport\">\n <BaseDialog.Popup\n aria-label={alt || lightboxLabel}\n className={styles.popup}\n data-jaci-component=\"image-lightbox\"\n data-slot=\"image-lightbox-popup\"\n >\n <BaseDialog.Title className={styles.title}>{alt || lightboxLabel}</BaseDialog.Title>\n <div className={styles.closeRow} data-slot=\"image-lightbox-close-row\">\n <BaseDialog.Close\n aria-label=\"Close image\"\n className={styles.close}\n data-slot=\"image-lightbox-close\"\n >\n ×\n </BaseDialog.Close>\n </div>\n <img\n alt={alt}\n className={styles.lightboxImage}\n data-slot=\"image-lightbox-content\"\n src={src}\n style={{ objectPosition: position }}\n />\n </BaseDialog.Popup>\n </BaseDialog.Viewport>\n </BaseDialog.Portal>\n </BaseDialog.Root>\n );\n});\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ //#region src/components/image/image.d.ts
3
+ type ImageFit = "contain" | "cover" | "fill" | "none";
4
+ type ImageStatus = "loading" | "loaded" | "error";
5
+ interface ImageProps extends Omit<ComponentPropsWithoutRef<"img">, "children"> {
6
+ alt: string;
7
+ aspectRatio?: number;
8
+ defaultOpen?: boolean;
9
+ fallback?: ReactNode;
10
+ fit?: ImageFit;
11
+ lightbox?: boolean;
12
+ lightboxLabel?: string;
13
+ onOpenChange?: (open: boolean) => void;
14
+ onStatusChange?: (status: ImageStatus) => void;
15
+ open?: boolean;
16
+ position?: string;
17
+ }
18
+ declare const Image: import("react").ForwardRefExoticComponent<ImageProps & import("react").RefAttributes<HTMLImageElement>>;
19
+ //#endregion
20
+ export { Image, ImageFit, ImageProps, ImageStatus };
21
+ //# sourceMappingURL=image.d.cts.map
@@ -0,0 +1,21 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ //#region src/components/image/image.d.ts
3
+ type ImageFit = "contain" | "cover" | "fill" | "none";
4
+ type ImageStatus = "loading" | "loaded" | "error";
5
+ interface ImageProps extends Omit<ComponentPropsWithoutRef<"img">, "children"> {
6
+ alt: string;
7
+ aspectRatio?: number;
8
+ defaultOpen?: boolean;
9
+ fallback?: ReactNode;
10
+ fit?: ImageFit;
11
+ lightbox?: boolean;
12
+ lightboxLabel?: string;
13
+ onOpenChange?: (open: boolean) => void;
14
+ onStatusChange?: (status: ImageStatus) => void;
15
+ open?: boolean;
16
+ position?: string;
17
+ }
18
+ declare const Image: import("react").ForwardRefExoticComponent<ImageProps & import("react").RefAttributes<HTMLImageElement>>;
19
+ //#endregion
20
+ export { Image, ImageFit, ImageProps, ImageStatus };
21
+ //# sourceMappingURL=image.d.ts.map