@spark-ui/components 17.2.3-beta.1 → 17.2.4-beta.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 (302) hide show
  1. package/dist/DialogContent.styles-BSxCCi-u.mjs +62 -0
  2. package/dist/DialogContent.styles-BSxCCi-u.mjs.map +1 -0
  3. package/dist/DialogContent.styles-CAhJtUud.js +2 -0
  4. package/dist/DialogContent.styles-CAhJtUud.js.map +1 -0
  5. package/dist/FormFieldRequiredIndicator-CtgkvPZo.js +2 -0
  6. package/dist/FormFieldRequiredIndicator-CtgkvPZo.js.map +1 -0
  7. package/dist/FormFieldRequiredIndicator-DOGQ_HxO.mjs +14 -0
  8. package/dist/FormFieldRequiredIndicator-DOGQ_HxO.mjs.map +1 -0
  9. package/dist/accordion/index.js +2 -2
  10. package/dist/accordion/index.js.map +1 -1
  11. package/dist/accordion/index.mjs +99 -161
  12. package/dist/accordion/index.mjs.map +1 -1
  13. package/dist/alert-dialog/index.js +2 -2
  14. package/dist/alert-dialog/index.js.map +1 -1
  15. package/dist/alert-dialog/index.mjs +169 -235
  16. package/dist/alert-dialog/index.mjs.map +1 -1
  17. package/dist/avatar/index.js +2 -2
  18. package/dist/avatar/index.js.map +1 -1
  19. package/dist/avatar/index.mjs +187 -224
  20. package/dist/avatar/index.mjs.map +1 -1
  21. package/dist/badge/index.js +2 -2
  22. package/dist/badge/index.js.map +1 -1
  23. package/dist/badge/index.mjs +115 -81
  24. package/dist/badge/index.mjs.map +1 -1
  25. package/dist/breadcrumb/index.js +2 -2
  26. package/dist/breadcrumb/index.js.map +1 -1
  27. package/dist/breadcrumb/index.mjs +73 -106
  28. package/dist/breadcrumb/index.mjs.map +1 -1
  29. package/dist/button/index.js +1 -2
  30. package/dist/button/index.mjs +2 -5
  31. package/dist/button-BTDRzvpB.js +2 -0
  32. package/dist/button-BTDRzvpB.js.map +1 -0
  33. package/dist/button-_YZ_4J42.mjs +643 -0
  34. package/dist/button-_YZ_4J42.mjs.map +1 -0
  35. package/dist/card/index.js +2 -2
  36. package/dist/card/index.js.map +1 -1
  37. package/dist/card/index.mjs +327 -394
  38. package/dist/card/index.mjs.map +1 -1
  39. package/dist/carousel/index.js +2 -2
  40. package/dist/carousel/index.js.map +1 -1
  41. package/dist/carousel/index.mjs +515 -618
  42. package/dist/carousel/index.mjs.map +1 -1
  43. package/dist/checkbox/index.js +2 -2
  44. package/dist/checkbox/index.js.map +1 -1
  45. package/dist/checkbox/index.mjs +213 -246
  46. package/dist/checkbox/index.mjs.map +1 -1
  47. package/dist/chip/index.js +2 -2
  48. package/dist/chip/index.js.map +1 -1
  49. package/dist/chip/index.mjs +601 -652
  50. package/dist/chip/index.mjs.map +1 -1
  51. package/dist/chunk-C91j1N6u.js +1 -0
  52. package/dist/circular-meter/index.js +2 -2
  53. package/dist/circular-meter/index.js.map +1 -1
  54. package/dist/circular-meter/index.mjs +354 -309
  55. package/dist/circular-meter/index.mjs.map +1 -1
  56. package/dist/collapsible/index.js +2 -2
  57. package/dist/collapsible/index.js.map +1 -1
  58. package/dist/collapsible/index.mjs +53 -53
  59. package/dist/collapsible/index.mjs.map +1 -1
  60. package/dist/combobox/index.js +2 -2
  61. package/dist/combobox/index.js.map +1 -1
  62. package/dist/combobox/index.mjs +721 -876
  63. package/dist/combobox/index.mjs.map +1 -1
  64. package/dist/dialog/index.js +2 -2
  65. package/dist/dialog/index.js.map +1 -1
  66. package/dist/dialog/index.mjs +181 -206
  67. package/dist/dialog/index.mjs.map +1 -1
  68. package/dist/divider/index.js +2 -2
  69. package/dist/divider/index.js.map +1 -1
  70. package/dist/divider/index.mjs +178 -183
  71. package/dist/divider/index.mjs.map +1 -1
  72. package/dist/drawer/index.js +2 -2
  73. package/dist/drawer/index.js.map +1 -1
  74. package/dist/drawer/index.mjs +277 -309
  75. package/dist/drawer/index.mjs.map +1 -1
  76. package/dist/dropdown/index.js +2 -2
  77. package/dist/dropdown/index.js.map +1 -1
  78. package/dist/dropdown/index.mjs +429 -492
  79. package/dist/dropdown/index.mjs.map +1 -1
  80. package/dist/file-upload/index.js +2 -2
  81. package/dist/file-upload/index.js.map +1 -1
  82. package/dist/file-upload/index.mjs +540 -677
  83. package/dist/file-upload/index.mjs.map +1 -1
  84. package/dist/form-field/index.js +1 -2
  85. package/dist/form-field/index.mjs +2 -284
  86. package/dist/form-field-B8QzM655.mjs +231 -0
  87. package/dist/form-field-B8QzM655.mjs.map +1 -0
  88. package/dist/form-field-Bu_0E9tb.js +2 -0
  89. package/dist/form-field-Bu_0E9tb.js.map +1 -0
  90. package/dist/icon/index.js +1 -2
  91. package/dist/icon/index.mjs +2 -5
  92. package/dist/icon-CRPcdgYp.js +2 -0
  93. package/dist/icon-CRPcdgYp.js.map +1 -0
  94. package/dist/icon-D05Uqh8_.mjs +41 -0
  95. package/dist/icon-D05Uqh8_.mjs.map +1 -0
  96. package/dist/icon-button/index.js +1 -2
  97. package/dist/icon-button/index.mjs +2 -5
  98. package/dist/icon-button-6p3O7NIm.mjs +28 -0
  99. package/dist/icon-button-6p3O7NIm.mjs.map +1 -0
  100. package/dist/icon-button-CykysbgJ.js +2 -0
  101. package/dist/icon-button-CykysbgJ.js.map +1 -0
  102. package/dist/input/index.js +1 -2
  103. package/dist/input/index.mjs +2 -455
  104. package/dist/input-CmYeHYWQ.mjs +355 -0
  105. package/dist/input-CmYeHYWQ.mjs.map +1 -0
  106. package/dist/input-DNr40G2Z.js +2 -0
  107. package/dist/input-DNr40G2Z.js.map +1 -0
  108. package/dist/input-otp/index.js +2 -2
  109. package/dist/input-otp/index.js.map +1 -1
  110. package/dist/input-otp/index.mjs +344 -407
  111. package/dist/input-otp/index.mjs.map +1 -1
  112. package/dist/kbd/index.js +2 -2
  113. package/dist/kbd/index.js.map +1 -1
  114. package/dist/kbd/index.mjs +12 -17
  115. package/dist/kbd/index.mjs.map +1 -1
  116. package/dist/label/index.js +1 -2
  117. package/dist/label/index.mjs +2 -40
  118. package/dist/label-BqRlrca0.mjs +31 -0
  119. package/dist/label-BqRlrca0.mjs.map +1 -0
  120. package/dist/label-DU0p0d-f.js +2 -0
  121. package/dist/label-DU0p0d-f.js.map +1 -0
  122. package/dist/link-box/index.js +2 -2
  123. package/dist/link-box/index.js.map +1 -1
  124. package/dist/link-box/index.mjs +36 -34
  125. package/dist/link-box/index.mjs.map +1 -1
  126. package/dist/meter/index.js +2 -2
  127. package/dist/meter/index.js.map +1 -1
  128. package/dist/meter/index.mjs +149 -171
  129. package/dist/meter/index.mjs.map +1 -1
  130. package/dist/pagination/index.js +2 -2
  131. package/dist/pagination/index.js.map +1 -1
  132. package/dist/pagination/index.mjs +253 -214
  133. package/dist/pagination/index.mjs.map +1 -1
  134. package/dist/popover/index.js +1 -2
  135. package/dist/popover/index.mjs +2 -239
  136. package/dist/popover-CxZAQmw6.mjs +211 -0
  137. package/dist/popover-CxZAQmw6.mjs.map +1 -0
  138. package/dist/popover-GOovJ27J.js +2 -0
  139. package/dist/popover-GOovJ27J.js.map +1 -0
  140. package/dist/portal/index.js +2 -2
  141. package/dist/portal/index.js.map +1 -1
  142. package/dist/portal/index.mjs +8 -7
  143. package/dist/portal/index.mjs.map +1 -1
  144. package/dist/progress/index.js +1 -2
  145. package/dist/progress/index.mjs +2 -178
  146. package/dist/progress-cEf3tFbn.mjs +132 -0
  147. package/dist/progress-cEf3tFbn.mjs.map +1 -0
  148. package/dist/progress-rJZcPJsZ.js +2 -0
  149. package/dist/progress-rJZcPJsZ.js.map +1 -0
  150. package/dist/progress-tracker/index.js +2 -2
  151. package/dist/progress-tracker/index.js.map +1 -1
  152. package/dist/progress-tracker/index.mjs +303 -380
  153. package/dist/progress-tracker/index.mjs.map +1 -1
  154. package/dist/radio-group/index.js +2 -2
  155. package/dist/radio-group/index.js.map +1 -1
  156. package/dist/radio-group/index.mjs +204 -213
  157. package/dist/radio-group/index.mjs.map +1 -1
  158. package/dist/rating/index.js +2 -2
  159. package/dist/rating/index.js.map +1 -1
  160. package/dist/rating/index.mjs +189 -244
  161. package/dist/rating/index.mjs.map +1 -1
  162. package/dist/rating-display/index.js +2 -2
  163. package/dist/rating-display/index.js.map +1 -1
  164. package/dist/rating-display/index.mjs +165 -166
  165. package/dist/rating-display/index.mjs.map +1 -1
  166. package/dist/scrolling-list/index.js +2 -2
  167. package/dist/scrolling-list/index.js.map +1 -1
  168. package/dist/scrolling-list/index.mjs +216 -273
  169. package/dist/scrolling-list/index.mjs.map +1 -1
  170. package/dist/segmented-control/index.js +2 -2
  171. package/dist/segmented-control/index.js.map +1 -1
  172. package/dist/segmented-control/index.mjs +146 -180
  173. package/dist/segmented-control/index.mjs.map +1 -1
  174. package/dist/segmented-gauge/index.js +2 -2
  175. package/dist/segmented-gauge/index.js.map +1 -1
  176. package/dist/segmented-gauge/index.mjs +146 -195
  177. package/dist/segmented-gauge/index.mjs.map +1 -1
  178. package/dist/select/index.js +2 -2
  179. package/dist/select/index.js.map +1 -1
  180. package/dist/select/index.mjs +279 -327
  181. package/dist/select/index.mjs.map +1 -1
  182. package/dist/skeleton/index.js +2 -2
  183. package/dist/skeleton/index.js.map +1 -1
  184. package/dist/skeleton/index.mjs +92 -114
  185. package/dist/skeleton/index.mjs.map +1 -1
  186. package/dist/slider/index.js +2 -2
  187. package/dist/slider/index.js.map +1 -1
  188. package/dist/slider/index.mjs +259 -326
  189. package/dist/slider/index.mjs.map +1 -1
  190. package/dist/slot/index.js +2 -2
  191. package/dist/slot/index.js.map +1 -1
  192. package/dist/slot/index.mjs +12 -7
  193. package/dist/slot/index.mjs.map +1 -1
  194. package/dist/snackbar/index.js +2 -2
  195. package/dist/snackbar/index.js.map +1 -1
  196. package/dist/snackbar/index.mjs +404 -529
  197. package/dist/snackbar/index.mjs.map +1 -1
  198. package/dist/spinner/index.js +1 -2
  199. package/dist/spinner/index.mjs +2 -5
  200. package/dist/spinner-DFUoYvmm.js +2 -0
  201. package/dist/spinner-DFUoYvmm.js.map +1 -0
  202. package/dist/spinner-DULLiM6a.mjs +56 -0
  203. package/dist/spinner-DULLiM6a.mjs.map +1 -0
  204. package/dist/src/avatar/index.d.mts +2 -2
  205. package/dist/src/avatar/index.d.ts +2 -2
  206. package/dist/src/file-upload/index.d.mts +1 -1
  207. package/dist/src/file-upload/index.d.ts +1 -1
  208. package/dist/stepper/index.js +2 -2
  209. package/dist/stepper/index.js.map +1 -1
  210. package/dist/stepper/index.mjs +139 -176
  211. package/dist/stepper/index.mjs.map +1 -1
  212. package/dist/switch/index.js +2 -2
  213. package/dist/switch/index.js.map +1 -1
  214. package/dist/switch/index.mjs +194 -197
  215. package/dist/switch/index.mjs.map +1 -1
  216. package/dist/tabs/index.js +2 -2
  217. package/dist/tabs/index.js.map +1 -1
  218. package/dist/tabs/index.mjs +337 -389
  219. package/dist/tabs/index.mjs.map +1 -1
  220. package/dist/tag/index.js +2 -2
  221. package/dist/tag/index.js.map +1 -1
  222. package/dist/tag/index.mjs +192 -211
  223. package/dist/tag/index.mjs.map +1 -1
  224. package/dist/text-link/index.js +2 -2
  225. package/dist/text-link/index.js.map +1 -1
  226. package/dist/text-link/index.mjs +44 -5
  227. package/dist/text-link/index.mjs.map +1 -1
  228. package/dist/textarea/index.js +2 -2
  229. package/dist/textarea/index.js.map +1 -1
  230. package/dist/textarea/index.mjs +51 -50
  231. package/dist/textarea/index.mjs.map +1 -1
  232. package/dist/toast/index.js +2 -2
  233. package/dist/toast/index.js.map +1 -1
  234. package/dist/toast/index.mjs +314 -367
  235. package/dist/toast/index.mjs.map +1 -1
  236. package/dist/useRenderSlot-DP4fYerF.mjs +11 -0
  237. package/dist/useRenderSlot-DP4fYerF.mjs.map +1 -0
  238. package/dist/useRenderSlot-Xxf_s88b.js +2 -0
  239. package/dist/useRenderSlot-Xxf_s88b.js.map +1 -0
  240. package/dist/visually-hidden/index.js +2 -2
  241. package/dist/visually-hidden/index.js.map +1 -1
  242. package/dist/visually-hidden/index.mjs +25 -5
  243. package/dist/visually-hidden/index.mjs.map +1 -1
  244. package/package.json +4 -4
  245. package/dist/Button-1M9DcZl0.mjs +0 -704
  246. package/dist/Button-1M9DcZl0.mjs.map +0 -1
  247. package/dist/Button-FZceRWG2.js +0 -2
  248. package/dist/Button-FZceRWG2.js.map +0 -1
  249. package/dist/DialogContent.styles-CziMQtYr.js +0 -2
  250. package/dist/DialogContent.styles-CziMQtYr.js.map +0 -1
  251. package/dist/DialogContent.styles-Du7_Dkde.mjs +0 -60
  252. package/dist/DialogContent.styles-Du7_Dkde.mjs.map +0 -1
  253. package/dist/FormFieldRequiredIndicator-CHfcoT2y.js +0 -2
  254. package/dist/FormFieldRequiredIndicator-CHfcoT2y.js.map +0 -1
  255. package/dist/FormFieldRequiredIndicator-DTnCGiX2.mjs +0 -13
  256. package/dist/FormFieldRequiredIndicator-DTnCGiX2.mjs.map +0 -1
  257. package/dist/Icon-BO327oHU.mjs +0 -57
  258. package/dist/Icon-BO327oHU.mjs.map +0 -1
  259. package/dist/Icon-C-cNTnzd.js +0 -2
  260. package/dist/Icon-C-cNTnzd.js.map +0 -1
  261. package/dist/IconButton-BR1bJSQA.js +0 -2
  262. package/dist/IconButton-BR1bJSQA.js.map +0 -1
  263. package/dist/IconButton-DdB3Pq13.mjs +0 -43
  264. package/dist/IconButton-DdB3Pq13.mjs.map +0 -1
  265. package/dist/Slot-DLY1rJrG.mjs +0 -14
  266. package/dist/Slot-DLY1rJrG.mjs.map +0 -1
  267. package/dist/Slot-DQ8z2zsy.js +0 -2
  268. package/dist/Slot-DQ8z2zsy.js.map +0 -1
  269. package/dist/Spinner-Br4Rp9V2.js +0 -2
  270. package/dist/Spinner-Br4Rp9V2.js.map +0 -1
  271. package/dist/Spinner-Co3AjkQV.mjs +0 -68
  272. package/dist/Spinner-Co3AjkQV.mjs.map +0 -1
  273. package/dist/TextLink-5MvP0P8D.js +0 -2
  274. package/dist/TextLink-5MvP0P8D.js.map +0 -1
  275. package/dist/TextLink-Cc_LeVcx.mjs +0 -57
  276. package/dist/TextLink-Cc_LeVcx.mjs.map +0 -1
  277. package/dist/VisuallyHidden-CB6Nx76j.js +0 -2
  278. package/dist/VisuallyHidden-CB6Nx76j.js.map +0 -1
  279. package/dist/VisuallyHidden-DjlV0-CW.mjs +0 -28
  280. package/dist/VisuallyHidden-DjlV0-CW.mjs.map +0 -1
  281. package/dist/button/index.js.map +0 -1
  282. package/dist/button/index.mjs.map +0 -1
  283. package/dist/form-field/index.js.map +0 -1
  284. package/dist/form-field/index.mjs.map +0 -1
  285. package/dist/icon/index.js.map +0 -1
  286. package/dist/icon/index.mjs.map +0 -1
  287. package/dist/icon-button/index.js.map +0 -1
  288. package/dist/icon-button/index.mjs.map +0 -1
  289. package/dist/input/index.js.map +0 -1
  290. package/dist/input/index.mjs.map +0 -1
  291. package/dist/label/index.js.map +0 -1
  292. package/dist/label/index.mjs.map +0 -1
  293. package/dist/popover/index.js.map +0 -1
  294. package/dist/popover/index.mjs.map +0 -1
  295. package/dist/progress/index.js.map +0 -1
  296. package/dist/progress/index.mjs.map +0 -1
  297. package/dist/spinner/index.js.map +0 -1
  298. package/dist/spinner/index.mjs.map +0 -1
  299. package/dist/useRenderSlot-Bta2kdp4.mjs +0 -10
  300. package/dist/useRenderSlot-Bta2kdp4.mjs.map +0 -1
  301. package/dist/useRenderSlot-DATwjgpo.js +0 -2
  302. package/dist/useRenderSlot-DATwjgpo.js.map +0 -1
@@ -1,229 +1,192 @@
1
- import { jsx as m } from "react/jsx-runtime";
2
- import { cx as p } from "class-variance-authority";
3
- import * as g from "react";
4
- import { useState as k, useEffect as B } from "react";
5
- import { S as b } from "../Slot-DLY1rJrG.mjs";
6
- import { PenOutline as O } from "@spark-ui/icons/PenOutline";
7
- import { I as R } from "../Icon-BO327oHU.mjs";
8
- import { I as S } from "../IconButton-DdB3Pq13.mjs";
9
- const z = g.createContext(void 0), f = () => {
10
- const t = g.useContext(z);
11
- if (!t)
12
- throw new Error("useAvatarContext must be used within an Avatar component");
13
- return t;
14
- }, N = {
15
- xs: 24,
16
- sm: 32,
17
- md: 40,
18
- lg: 56,
19
- xl: 64,
20
- // default
21
- "2xl": 96
22
- }, C = g.forwardRef(
23
- ({
24
- className: t,
25
- size: a = "xl",
26
- isOnline: n = !1,
27
- onlineText: e,
28
- username: s,
29
- asChild: l,
30
- children: i,
31
- shape: c = "circle",
32
- ...o
33
- }, u) => {
34
- const d = l ? b : "div", r = g.useMemo(
35
- () => ({
36
- size: a,
37
- isOnline: n,
38
- onlineText: e,
39
- username: s,
40
- shape: c,
41
- pixelSize: N[a]
42
- }),
43
- [a, n, s, c, e]
44
- );
45
- return /* @__PURE__ */ m(z.Provider, { value: r, children: /* @__PURE__ */ m(
46
- d,
47
- {
48
- ref: u,
49
- style: {
50
- width: N[a],
51
- height: N[a]
52
- },
53
- "data-spark-component": "avatar",
54
- className: p("relative inline-flex items-center justify-center", t),
55
- ...o,
56
- children: i
57
- }
58
- ) });
59
- }
60
- );
61
- C.displayName = "Avatar";
62
- const I = ({
63
- className: t,
64
- asChild: a,
65
- src: n,
66
- onLoad: e,
67
- onError: s,
68
- ...l
69
- }) => {
70
- const { username: i, isOnline: c, onlineText: o } = f(), u = a ? b : "img", [d, r] = k(!1), y = c && o ? `${i} (${o})` : i;
71
- if (B(() => {
72
- r(!1);
73
- }, [n]), !n)
74
- return null;
75
- const h = (A) => {
76
- r(!0), e?.(A);
77
- }, x = (A) => {
78
- r(!1), s?.(A);
79
- };
80
- return /* @__PURE__ */ m(
81
- u,
82
- {
83
- "aria-hidden": !0,
84
- className: p(
85
- "absolute inset-0 size-full",
86
- "object-cover",
87
- { "transition-all duration-300 group-hover:scale-120": l.onClick },
88
- "focus-visible:u-outline",
89
- d ? "block" : "hidden",
90
- t
91
- ),
92
- alt: y,
93
- src: n,
94
- onLoad: h,
95
- onError: x,
96
- ...l
97
- }
98
- );
1
+ import { Slot as e } from "../slot/index.mjs";
2
+ import { t } from "../icon-D05Uqh8_.mjs";
3
+ import { t as n } from "../icon-button-6p3O7NIm.mjs";
4
+ import { cx as r } from "class-variance-authority";
5
+ import * as i from "react";
6
+ import { useEffect as a, useState as o } from "react";
7
+ import { jsx as s } from "react/jsx-runtime";
8
+ import { PenOutline as c } from "@spark-ui/icons/PenOutline";
9
+ //#region src/avatar/context.ts
10
+ var l = i.createContext(void 0), u = () => {
11
+ let e = i.useContext(l);
12
+ if (!e) throw Error("useAvatarContext must be used within an Avatar component");
13
+ return e;
14
+ }, d = {
15
+ xs: 24,
16
+ sm: 32,
17
+ md: 40,
18
+ lg: 56,
19
+ xl: 64,
20
+ "2xl": 96
21
+ }, f = i.forwardRef(({ className: t, size: n = "xl", isOnline: a = !1, onlineText: o, username: c, asChild: u, children: f, shape: p = "circle", ...m }, h) => {
22
+ let g = u ? e : "div", _ = i.useMemo(() => ({
23
+ size: n,
24
+ isOnline: a,
25
+ onlineText: o,
26
+ username: c,
27
+ shape: p,
28
+ pixelSize: d[n]
29
+ }), [
30
+ n,
31
+ a,
32
+ c,
33
+ p,
34
+ o
35
+ ]);
36
+ return /* @__PURE__ */ s(l.Provider, {
37
+ value: _,
38
+ children: /* @__PURE__ */ s(g, {
39
+ ref: h,
40
+ style: {
41
+ width: d[n],
42
+ height: d[n]
43
+ },
44
+ "data-spark-component": "avatar",
45
+ className: r("relative inline-flex items-center justify-center", t),
46
+ ...m,
47
+ children: f
48
+ })
49
+ });
50
+ });
51
+ f.displayName = "Avatar";
52
+ //#endregion
53
+ //#region src/avatar/AvatarAction.tsx
54
+ var p = ({ className: i, children: a, asChild: o, angle: l = 135, ariaLabel: d, ...f }) => {
55
+ let p = o ? e : n, { pixelSize: m, shape: h } = u();
56
+ function g(e) {
57
+ let t = (90 - l) * Math.PI / 180, n = e / 2;
58
+ return {
59
+ x: n + n * Math.cos(t),
60
+ y: n - n * Math.sin(t)
61
+ };
62
+ }
63
+ let _ = g(m), v = o;
64
+ return /* @__PURE__ */ s(p, {
65
+ "data-spark-component": "avatar-action",
66
+ style: {
67
+ position: "absolute",
68
+ ...h === "circle" ? {
69
+ left: `${_.x}px`,
70
+ top: `${_.y}px`
71
+ } : {},
72
+ ...h === "square" ? {
73
+ right: "0px",
74
+ bottom: "0px"
75
+ } : {}
76
+ },
77
+ className: r("z-raised", h === "circle" ? "-translate-x-1/2 -translate-y-1/2" : "translate-x-1/4 translate-y-1/4", { "shadow-sm": !v }, i),
78
+ "aria-label": d,
79
+ title: d,
80
+ ...v ? {} : {
81
+ size: "sm",
82
+ intent: "support",
83
+ design: "contrast"
84
+ },
85
+ ...f,
86
+ children: a || /* @__PURE__ */ s(t, {
87
+ size: "sm",
88
+ children: /* @__PURE__ */ s(c, {})
89
+ })
90
+ });
99
91
  };
100
- I.displayName = "AvatarImage";
101
- const P = ({
102
- className: t,
103
- children: a,
104
- asChild: n,
105
- angle: e = 135,
106
- ariaLabel: s,
107
- ...l
108
- }) => {
109
- const i = n ? b : S, { pixelSize: c, shape: o } = f();
110
- function u(y) {
111
- const h = (90 - e) * Math.PI / 180, x = y / 2;
112
- return {
113
- x: x + x * Math.cos(h),
114
- y: x - x * Math.sin(h)
115
- };
116
- }
117
- const d = u(c), r = n;
118
- return /* @__PURE__ */ m(
119
- i,
120
- {
121
- "data-spark-component": "avatar-action",
122
- style: {
123
- position: "absolute",
124
- ...o === "circle" ? { left: `${d.x}px`, top: `${d.y}px` } : {},
125
- ...o === "square" ? { right: "0px", bottom: "0px" } : {}
126
- },
127
- className: p(
128
- "z-raised",
129
- o === "circle" ? "-translate-x-1/2 -translate-y-1/2" : "translate-x-1/4 translate-y-1/4",
130
- { "shadow-sm": !r },
131
- t
132
- ),
133
- "aria-label": s,
134
- title: s,
135
- ...r ? {} : { size: "sm", intent: "support", design: "contrast" },
136
- ...l,
137
- children: a || /* @__PURE__ */ m(R, { size: "sm", children: /* @__PURE__ */ m(O, {}) })
138
- }
139
- );
92
+ p.displayName = "AvatarAction";
93
+ //#endregion
94
+ //#region src/avatar/AvatarImage.tsx
95
+ var m = ({ className: t, asChild: n, src: i, onLoad: c, onError: l, ...d }) => {
96
+ let { username: f, isOnline: p, onlineText: m } = u(), h = n ? e : "img", [g, _] = o(!1), v = p && m ? `${f} (${m})` : f;
97
+ if (a(() => {
98
+ _(!1);
99
+ }, [i]), !i) return null;
100
+ let y = (e) => {
101
+ _(!0), c?.(e);
102
+ }, b = (e) => {
103
+ _(!1), l?.(e);
104
+ };
105
+ return /* @__PURE__ */ s(h, {
106
+ "aria-hidden": !0,
107
+ className: r("absolute inset-0 size-full", "object-cover", { "transition-all duration-300 group-hover:scale-120": d.onClick }, "focus-visible:u-outline", g ? "block" : "hidden", t),
108
+ alt: v,
109
+ src: i,
110
+ onLoad: y,
111
+ onError: b,
112
+ ...d
113
+ });
140
114
  };
141
- P.displayName = "AvatarAction";
142
- const M = ({ angle: t = 135, ...a }) => {
143
- const { isOnline: n, pixelSize: e, shape: s, onlineText: l, size: i } = f();
144
- if (!n) return null;
145
- function c(u) {
146
- const d = (90 - t) * Math.PI / 180, r = u / 2;
147
- return {
148
- x: r + r * Math.cos(d),
149
- y: r - r * Math.sin(d)
150
- };
151
- }
152
- const o = c(e);
153
- return /* @__PURE__ */ m(
154
- "div",
155
- {
156
- "data-spark-component": "avatar-online-badge",
157
- role: "status",
158
- "aria-label": l,
159
- style: {
160
- ...s === "circle" ? { left: `${o.x}px`, top: `${o.y}px` } : { right: "0px", bottom: "0px" }
161
- },
162
- className: p(
163
- "bg-success outline-surface absolute rounded-full",
164
- s === "circle" ? "-translate-x-1/2 -translate-y-1/2" : "translate-x-1/4 translate-y-1/4",
165
- ["lg", "xl", "2xl"].includes(i) ? p("size-sz-12 outline-4") : p("size-sz-8 outline-2")
166
- ),
167
- ...a
168
- }
169
- );
115
+ m.displayName = "AvatarImage";
116
+ //#endregion
117
+ //#region src/avatar/AvatarOnlineBadge.tsx
118
+ var h = ({ angle: e = 135, ...t }) => {
119
+ let { isOnline: n, pixelSize: i, shape: a, onlineText: o, size: c } = u();
120
+ if (!n) return null;
121
+ function l(t) {
122
+ let n = (90 - e) * Math.PI / 180, r = t / 2;
123
+ return {
124
+ x: r + r * Math.cos(n),
125
+ y: r - r * Math.sin(n)
126
+ };
127
+ }
128
+ let d = l(i);
129
+ return /* @__PURE__ */ s("div", {
130
+ "data-spark-component": "avatar-online-badge",
131
+ role: "status",
132
+ "aria-label": o,
133
+ style: { ...a === "circle" ? {
134
+ left: `${d.x}px`,
135
+ top: `${d.y}px`
136
+ } : {
137
+ right: "0px",
138
+ bottom: "0px"
139
+ } },
140
+ className: r("bg-success outline-surface absolute rounded-full", a === "circle" ? "-translate-x-1/2 -translate-y-1/2" : "translate-x-1/4 translate-y-1/4", [
141
+ "lg",
142
+ "xl",
143
+ "2xl"
144
+ ].includes(c) ? r("size-sz-12 outline-4") : r("size-sz-8 outline-2")),
145
+ ...t
146
+ });
170
147
  };
171
- M.displayName = "AvatarOnlineBadge";
172
- const $ = ({ asChild: t, children: a, className: n, ...e }) => {
173
- const { shape: s, isOnline: l, onlineText: i, username: c } = f(), o = t ? b : "div", u = l && i ? `${c} (${i})` : c;
174
- return /* @__PURE__ */ m(
175
- o,
176
- {
177
- ...!t && { role: "img" },
178
- "aria-label": u,
179
- title: u,
180
- className: p(
181
- "group default:border-outline relative size-full overflow-hidden",
182
- "focus-visible:u-outline",
183
- {
184
- "default:rounded-full": s === "circle",
185
- "default:rounded-md": s === "square",
186
- "hover:opacity-dim-1 cursor-pointer": t || e.onClick
187
- },
188
- n
189
- ),
190
- ...e,
191
- children: a
192
- }
193
- );
148
+ h.displayName = "AvatarOnlineBadge";
149
+ //#endregion
150
+ //#region src/avatar/AvatarPlaceholder.tsx
151
+ var g = ({ className: e, children: t, ...n }) => {
152
+ let { size: i, username: a } = u(), o = a?.charAt(0);
153
+ return /* @__PURE__ */ s("div", {
154
+ "aria-hidden": !0,
155
+ className: r("absolute inset-0 flex size-full items-center justify-center", "default:bg-neutral default:text-on-neutral", {
156
+ "text-display-1": i === "2xl",
157
+ "text-display-2": ["xl", "lg"].includes(i),
158
+ "text-display-3": i === "md",
159
+ "text-headline-2": i === "sm",
160
+ "text-body-2 font-bold": i === "xs"
161
+ }, e),
162
+ ...n,
163
+ children: t || o
164
+ });
194
165
  };
195
- $.displayName = "AvatarUser";
196
- const w = ({ className: t, children: a, ...n }) => {
197
- const { size: e, username: s } = f(), l = s?.charAt(0);
198
- return /* @__PURE__ */ m(
199
- "div",
200
- {
201
- "aria-hidden": !0,
202
- className: p(
203
- "absolute inset-0 flex size-full items-center justify-center",
204
- "default:bg-neutral default:text-on-neutral",
205
- {
206
- "text-display-1": e === "2xl",
207
- "text-display-2": ["xl", "lg"].includes(e),
208
- "text-display-3": e === "md",
209
- "text-headline-2": e === "sm",
210
- "text-body-2 font-bold": e === "xs"
211
- },
212
- t
213
- ),
214
- ...n,
215
- children: a || l
216
- }
217
- );
166
+ g.displayName = "AvatarPlaceholder";
167
+ //#endregion
168
+ //#region src/avatar/AvatarUser.tsx
169
+ var _ = ({ asChild: t, children: n, className: i, ...a }) => {
170
+ let { shape: o, isOnline: c, onlineText: l, username: d } = u(), f = t ? e : "div", p = c && l ? `${d} (${l})` : d;
171
+ return /* @__PURE__ */ s(f, {
172
+ ...!t && { role: "img" },
173
+ "aria-label": p,
174
+ title: p,
175
+ className: r("group default:border-outline relative size-full overflow-hidden", "focus-visible:u-outline", {
176
+ "default:rounded-full": o === "circle",
177
+ "default:rounded-md": o === "square",
178
+ "hover:opacity-dim-1 cursor-pointer": t || a.onClick
179
+ }, i),
180
+ ...a,
181
+ children: n
182
+ });
218
183
  };
219
- w.displayName = "AvatarPlaceholder";
220
- const v = C;
221
- v.Image = I;
222
- v.Action = P;
223
- v.OnlineBadge = M;
224
- v.User = $;
225
- v.Placeholder = w;
226
- export {
227
- v as Avatar
228
- };
229
- //# sourceMappingURL=index.mjs.map
184
+ _.displayName = "AvatarUser";
185
+ //#endregion
186
+ //#region src/avatar/index.ts
187
+ var v = f;
188
+ v.Image = m, v.Action = p, v.OnlineBadge = h, v.User = _, v.Placeholder = g;
189
+ //#endregion
190
+ export { v as Avatar };
191
+
192
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/avatar/context.ts","../../src/avatar/Avatar.tsx","../../src/avatar/AvatarImage.tsx","../../src/avatar/AvatarAction.tsx","../../src/avatar/AvatarOnlineBadge.tsx","../../src/avatar/AvatarUser.tsx","../../src/avatar/AvatarPlaceholder.tsx","../../src/avatar/index.ts"],"sourcesContent":["import * as React from 'react'\nimport type { AvatarContextValue } from './types'\n\nconst AvatarContext = React.createContext<AvatarContextValue | undefined>(undefined)\n\nexport const useAvatarContext = () => {\n const context = React.useContext(AvatarContext)\n if (!context) {\n throw new Error('useAvatarContext must be used within an Avatar component')\n }\n return context\n}\n\nexport { AvatarContext }\n","import { cx } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { Slot } from '../slot'\nimport { AvatarContext } from './context'\nimport type { AvatarProps } from './types'\n\nconst sizeMap = {\n xs: 24,\n sm: 32,\n md: 40,\n lg: 56,\n xl: 64, // default\n '2xl': 96,\n}\n\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n (\n {\n className,\n size = 'xl',\n isOnline = false,\n onlineText,\n username,\n asChild,\n children,\n shape = 'circle',\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : 'div'\n const contextValue = React.useMemo(\n () => ({\n size,\n isOnline,\n onlineText,\n username,\n shape,\n pixelSize: sizeMap[size],\n }),\n [size, isOnline, username, shape, onlineText]\n )\n\n return (\n <AvatarContext.Provider value={contextValue}>\n <Comp\n ref={ref}\n style={{\n width: sizeMap[size],\n height: sizeMap[size],\n }}\n data-spark-component=\"avatar\"\n className={cx('relative inline-flex items-center justify-center', className)}\n {...props}\n >\n {children}\n </Comp>\n </AvatarContext.Provider>\n )\n }\n)\n\nAvatar.displayName = 'Avatar'\n","import { cx } from 'class-variance-authority'\nimport { useEffect, useState } from 'react'\n\nimport { Slot } from '../slot'\nimport { useAvatarContext } from './context'\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n asChild?: boolean\n}\n\nexport const AvatarImage = ({\n className,\n asChild,\n src,\n onLoad,\n onError,\n ...props\n}: AvatarImageProps) => {\n const { username, isOnline, onlineText } = useAvatarContext()\n const Comp = asChild ? Slot : 'img'\n\n const [isVisible, setIsVisible] = useState(false)\n\n const accessibleName = isOnline && onlineText ? `${username} (${onlineText})` : username\n\n // Reset visibility when src changes\n useEffect(() => {\n setIsVisible(false)\n }, [src])\n\n // Don't render the image if src is undefined or null\n if (!src) {\n return null\n }\n\n const handleLoad = (event: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsVisible(true)\n onLoad?.(event)\n }\n\n const handleError = (event: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsVisible(false)\n onError?.(event)\n }\n\n return (\n <Comp\n aria-hidden\n className={cx(\n 'absolute inset-0 size-full',\n 'object-cover',\n { 'transition-all duration-300 group-hover:scale-120': props.onClick },\n 'focus-visible:u-outline',\n isVisible ? 'block' : 'hidden',\n className\n )}\n alt={accessibleName}\n src={src}\n onLoad={handleLoad}\n onError={handleError}\n {...props}\n />\n )\n}\n\nAvatarImage.displayName = 'AvatarImage'\n","import { PenOutline } from '@spark-ui/icons/PenOutline'\nimport { cx } from 'class-variance-authority'\n\nimport { Icon } from '../icon'\nimport { IconButton } from '../icon-button'\nimport { Slot } from '../slot'\nimport { useAvatarContext } from './context'\n\nexport interface AvatarActionProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n angle?: number\n ariaLabel: string\n}\n\nexport const AvatarAction = ({\n className,\n children,\n asChild,\n angle = 135,\n ariaLabel,\n ...props\n}: AvatarActionProps) => {\n const Comp = asChild ? Slot : IconButton\n const { pixelSize, shape } = useAvatarContext()\n\n function getBadgePosition(circleSize: number) {\n const angleRad = ((90 - angle) * Math.PI) / 180\n const circleRadius = circleSize / 2\n\n return {\n x: circleRadius + circleRadius * Math.cos(angleRad),\n y: circleRadius - circleRadius * Math.sin(angleRad),\n }\n }\n\n const position = getBadgePosition(pixelSize)\n\n const isCustomElement = asChild\n\n return (\n <Comp\n data-spark-component=\"avatar-action\"\n style={{\n position: 'absolute',\n ...(shape === 'circle' ? { left: `${position.x}px`, top: `${position.y}px` } : {}),\n ...(shape === 'square' ? { right: '0px', bottom: '0px' } : {}),\n }}\n className={cx(\n 'z-raised',\n shape === 'circle'\n ? '-translate-x-1/2 -translate-y-1/2'\n : 'translate-x-1/4 translate-y-1/4',\n { 'shadow-sm': !isCustomElement },\n className\n )}\n aria-label={ariaLabel}\n title={ariaLabel}\n {...(!isCustomElement ? { size: 'sm', intent: 'support', design: 'contrast' } : {})}\n {...props}\n >\n {children || (\n <Icon size=\"sm\">\n <PenOutline />\n </Icon>\n )}\n </Comp>\n )\n}\n\nAvatarAction.displayName = 'AvatarAction'\n","import { cx } from 'class-variance-authority'\nimport { ComponentPropsWithoutRef } from 'react'\n\nimport { useAvatarContext } from './context'\n\ninterface AvatarOnlineBadgeProps extends ComponentPropsWithoutRef<'div'> {\n angle?: number\n}\n\nexport const AvatarOnlineBadge = ({ angle = 135, ...props }: AvatarOnlineBadgeProps) => {\n const { isOnline, pixelSize, shape, onlineText, size } = useAvatarContext()\n\n if (!isOnline) return null\n\n function getBadgePosition(circleSize: number) {\n const angleRad = ((90 - angle) * Math.PI) / 180\n const circleRadius = circleSize / 2\n\n return {\n x: circleRadius + circleRadius * Math.cos(angleRad),\n y: circleRadius - circleRadius * Math.sin(angleRad),\n }\n }\n\n const badgePosition = getBadgePosition(pixelSize)\n\n return (\n <div\n data-spark-component=\"avatar-online-badge\"\n role=\"status\"\n aria-label={onlineText}\n style={{\n ...(shape === 'circle'\n ? { left: `${badgePosition.x}px`, top: `${badgePosition.y}px` }\n : { right: '0px', bottom: '0px' }),\n }}\n className={cx(\n 'bg-success outline-surface absolute rounded-full',\n shape === 'circle'\n ? '-translate-x-1/2 -translate-y-1/2'\n : 'translate-x-1/4 translate-y-1/4',\n ['lg', 'xl', '2xl'].includes(size) ? cx('size-sz-12 outline-4') : cx('size-sz-8 outline-2')\n )}\n {...props}\n />\n )\n}\n\nAvatarOnlineBadge.displayName = 'AvatarOnlineBadge'\n","import { cx } from 'class-variance-authority'\n\nimport { Slot } from '../slot'\nimport { useAvatarContext } from './context'\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLDivElement> {\n asChild?: boolean\n}\n\nexport const AvatarUser = ({ asChild, children, className, ...props }: AvatarImageProps) => {\n const { shape, isOnline, onlineText, username } = useAvatarContext()\n const Comp = asChild ? Slot : 'div'\n\n const accessibleName = isOnline && onlineText ? `${username} (${onlineText})` : username\n\n return (\n <Comp\n {...(!asChild && { role: 'img' })}\n aria-label={accessibleName}\n title={accessibleName}\n className={cx(\n 'group default:border-outline relative size-full overflow-hidden',\n 'focus-visible:u-outline',\n {\n 'default:rounded-full': shape === 'circle',\n 'default:rounded-md': shape === 'square',\n 'hover:opacity-dim-1 cursor-pointer': asChild || props.onClick,\n },\n className\n )}\n {...props}\n >\n {children}\n </Comp>\n )\n}\n\nAvatarUser.displayName = 'AvatarUser'\n","import { cx } from 'class-variance-authority'\n\nimport { useAvatarContext } from './context'\n\nexport interface AvatarPlaceholderProps extends React.ImgHTMLAttributes<HTMLDivElement> {\n className?: string\n children?: React.ReactNode\n}\n\nexport const AvatarPlaceholder = ({ className, children, ...props }: AvatarPlaceholderProps) => {\n const { size, username } = useAvatarContext()\n\n const firstLetter = username?.charAt(0)\n\n return (\n <div\n aria-hidden\n className={cx(\n 'absolute inset-0 flex size-full items-center justify-center',\n 'default:bg-neutral default:text-on-neutral',\n {\n 'text-display-1': size === '2xl',\n 'text-display-2': ['xl', 'lg'].includes(size),\n 'text-display-3': size === 'md',\n 'text-headline-2': size === 'sm',\n 'text-body-2 font-bold': size === 'xs',\n },\n className\n )}\n {...props}\n >\n {children || firstLetter}\n </div>\n )\n}\n\nAvatarPlaceholder.displayName = 'AvatarPlaceholder'\n","import { Avatar } from './Avatar'\nimport { AvatarImage } from './AvatarImage'\nimport { AvatarAction } from './AvatarAction'\nimport { AvatarOnlineBadge } from './AvatarOnlineBadge'\nimport { AvatarUser } from './AvatarUser'\nimport { AvatarPlaceholder } from './AvatarPlaceholder'\nimport type { AvatarProps } from './types'\n\nexport interface AvatarComponent\n extends React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<HTMLDivElement>> {\n Image: typeof AvatarImage\n Action: typeof AvatarAction\n OnlineBadge: typeof AvatarOnlineBadge\n User: typeof AvatarUser\n Placeholder: typeof AvatarPlaceholder\n}\n\nconst AvatarComponent = Avatar as AvatarComponent\n\nAvatarComponent.Image = AvatarImage\nAvatarComponent.Action = AvatarAction\nAvatarComponent.OnlineBadge = AvatarOnlineBadge\nAvatarComponent.User = AvatarUser\nAvatarComponent.Placeholder = AvatarPlaceholder\nexport { AvatarComponent as Avatar }\n"],"names":["AvatarContext","React","useAvatarContext","context","sizeMap","Avatar","className","size","isOnline","onlineText","username","asChild","children","shape","props","ref","Comp","Slot","contextValue","jsx","cx","AvatarImage","src","onLoad","onError","isVisible","setIsVisible","useState","accessibleName","useEffect","handleLoad","event","handleError","AvatarAction","angle","ariaLabel","IconButton","pixelSize","getBadgePosition","circleSize","angleRad","circleRadius","position","isCustomElement","Icon","PenOutline","AvatarOnlineBadge","badgePosition","AvatarUser","AvatarPlaceholder","firstLetter","AvatarComponent"],"mappings":";;;;;;;;AAGA,MAAMA,IAAgBC,EAAM,cAA8C,MAAS,GAEtEC,IAAmB,MAAM;AACpC,QAAMC,IAAUF,EAAM,WAAWD,CAAa;AAC9C,MAAI,CAACG;AACH,UAAM,IAAI,MAAM,0DAA0D;AAE5E,SAAOA;AACT,GCJMC,IAAU;AAAA,EACd,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA;AAAA,EACJ,OAAO;AACT,GAEaC,IAASJ,EAAM;AAAA,EAC1B,CACE;AAAA,IACE,WAAAK;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,UAAAC,IAAW;AAAA,IACX,YAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAOL,IAAUM,IAAO,OACxBC,IAAejB,EAAM;AAAA,MACzB,OAAO;AAAA,QACL,MAAAM;AAAA,QACA,UAAAC;AAAA,QACA,YAAAC;AAAA,QACA,UAAAC;AAAA,QACA,OAAAG;AAAA,QACA,WAAWT,EAAQG,CAAI;AAAA,MAAA;AAAA,MAEzB,CAACA,GAAMC,GAAUE,GAAUG,GAAOJ,CAAU;AAAA,IAAA;AAG9C,WACE,gBAAAU,EAACnB,EAAc,UAAd,EAAuB,OAAOkB,GAC7B,UAAA,gBAAAC;AAAA,MAACH;AAAA,MAAA;AAAA,QACC,KAAAD;AAAA,QACA,OAAO;AAAA,UACL,OAAOX,EAAQG,CAAI;AAAA,UACnB,QAAQH,EAAQG,CAAI;AAAA,QAAA;AAAA,QAEtB,wBAAqB;AAAA,QACrB,WAAWa,EAAG,oDAAoDd,CAAS;AAAA,QAC1E,GAAGQ;AAAA,QAEH,UAAAF;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ;AACF;AAEAP,EAAO,cAAc;ACrDd,MAAMgB,IAAc,CAAC;AAAA,EAC1B,WAAAf;AAAA,EACA,SAAAK;AAAA,EACA,KAAAW;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAGV;AACL,MAAwB;AACtB,QAAM,EAAE,UAAAJ,GAAU,UAAAF,GAAU,YAAAC,EAAA,IAAeP,EAAA,GACrCc,IAAOL,IAAUM,IAAO,OAExB,CAACQ,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAE1CC,IAAiBpB,KAAYC,IAAa,GAAGC,CAAQ,KAAKD,CAAU,MAAMC;AAQhF,MALAmB,EAAU,MAAM;AACd,IAAAH,EAAa,EAAK;AAAA,EACpB,GAAG,CAACJ,CAAG,CAAC,GAGJ,CAACA;AACH,WAAO;AAGT,QAAMQ,IAAa,CAACC,MAAyD;AAC3E,IAAAL,EAAa,EAAI,GACjBH,IAASQ,CAAK;AAAA,EAChB,GAEMC,IAAc,CAACD,MAAyD;AAC5E,IAAAL,EAAa,EAAK,GAClBF,IAAUO,CAAK;AAAA,EACjB;AAEA,SACE,gBAAAZ;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,eAAW;AAAA,MACX,WAAWI;AAAA,QACT;AAAA,QACA;AAAA,QACA,EAAE,qDAAqDN,EAAM,QAAA;AAAA,QAC7D;AAAA,QACAW,IAAY,UAAU;AAAA,QACtBnB;AAAA,MAAA;AAAA,MAEF,KAAKsB;AAAA,MACL,KAAAN;AAAA,MACA,QAAQQ;AAAA,MACR,SAASE;AAAA,MACR,GAAGlB;AAAA,IAAA;AAAA,EAAA;AAGV;AAEAO,EAAY,cAAc;ACnDnB,MAAMY,IAAe,CAAC;AAAA,EAC3B,WAAA3B;AAAA,EACA,UAAAM;AAAA,EACA,SAAAD;AAAA,EACA,OAAAuB,IAAQ;AAAA,EACR,WAAAC;AAAA,EACA,GAAGrB;AACL,MAAyB;AACvB,QAAME,IAAOL,IAAUM,IAAOmB,GACxB,EAAE,WAAAC,GAAW,OAAAxB,EAAA,IAAUX,EAAA;AAE7B,WAASoC,EAAiBC,GAAoB;AAC5C,UAAMC,KAAa,KAAKN,KAAS,KAAK,KAAM,KACtCO,IAAeF,IAAa;AAElC,WAAO;AAAA,MACL,GAAGE,IAAeA,IAAe,KAAK,IAAID,CAAQ;AAAA,MAClD,GAAGC,IAAeA,IAAe,KAAK,IAAID,CAAQ;AAAA,IAAA;AAAA,EAEtD;AAEA,QAAME,IAAWJ,EAAiBD,CAAS,GAErCM,IAAkBhC;AAExB,SACE,gBAAAQ;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,wBAAqB;AAAA,MACrB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,GAAIH,MAAU,WAAW,EAAE,MAAM,GAAG6B,EAAS,CAAC,MAAM,KAAK,GAAGA,EAAS,CAAC,KAAA,IAAS,CAAA;AAAA,QAC/E,GAAI7B,MAAU,WAAW,EAAE,OAAO,OAAO,QAAQ,UAAU,CAAA;AAAA,MAAC;AAAA,MAE9D,WAAWO;AAAA,QACT;AAAA,QACAP,MAAU,WACN,sCACA;AAAA,QACJ,EAAE,aAAa,CAAC8B,EAAA;AAAA,QAChBrC;AAAA,MAAA;AAAA,MAEF,cAAY6B;AAAA,MACZ,OAAOA;AAAA,MACN,GAAKQ,IAA0E,CAAA,IAAxD,EAAE,MAAM,MAAM,QAAQ,WAAW,QAAQ,WAAA;AAAA,MAChE,GAAG7B;AAAA,MAEH,eACC,gBAAAK,EAACyB,GAAA,EAAK,MAAK,MACT,UAAA,gBAAAzB,EAAC0B,KAAW,EAAA,CACd;AAAA,IAAA;AAAA,EAAA;AAIR;AAEAZ,EAAa,cAAc;AC5DpB,MAAMa,IAAoB,CAAC,EAAE,OAAAZ,IAAQ,KAAK,GAAGpB,QAAoC;AACtF,QAAM,EAAE,UAAAN,GAAU,WAAA6B,GAAW,OAAAxB,GAAO,YAAAJ,GAAY,MAAAF,EAAA,IAASL,EAAA;AAEzD,MAAI,CAACM,EAAU,QAAO;AAEtB,WAAS8B,EAAiBC,GAAoB;AAC5C,UAAMC,KAAa,KAAKN,KAAS,KAAK,KAAM,KACtCO,IAAeF,IAAa;AAElC,WAAO;AAAA,MACL,GAAGE,IAAeA,IAAe,KAAK,IAAID,CAAQ;AAAA,MAClD,GAAGC,IAAeA,IAAe,KAAK,IAAID,CAAQ;AAAA,IAAA;AAAA,EAEtD;AAEA,QAAMO,IAAgBT,EAAiBD,CAAS;AAEhD,SACE,gBAAAlB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,wBAAqB;AAAA,MACrB,MAAK;AAAA,MACL,cAAYV;AAAA,MACZ,OAAO;AAAA,QACL,GAAII,MAAU,WACV,EAAE,MAAM,GAAGkC,EAAc,CAAC,MAAM,KAAK,GAAGA,EAAc,CAAC,KAAA,IACvD,EAAE,OAAO,OAAO,QAAQ,MAAA;AAAA,MAAM;AAAA,MAEpC,WAAW3B;AAAA,QACT;AAAA,QACAP,MAAU,WACN,sCACA;AAAA,QACJ,CAAC,MAAM,MAAM,KAAK,EAAE,SAASN,CAAI,IAAIa,EAAG,sBAAsB,IAAIA,EAAG,qBAAqB;AAAA,MAAA;AAAA,MAE3F,GAAGN;AAAA,IAAA;AAAA,EAAA;AAGV;AAEAgC,EAAkB,cAAc;ACvCzB,MAAME,IAAa,CAAC,EAAE,SAAArC,GAAS,UAAAC,GAAU,WAAAN,GAAW,GAAGQ,QAA8B;AAC1F,QAAM,EAAE,OAAAD,GAAO,UAAAL,GAAU,YAAAC,GAAY,UAAAC,EAAA,IAAaR,EAAA,GAC5Cc,IAAOL,IAAUM,IAAO,OAExBW,IAAiBpB,KAAYC,IAAa,GAAGC,CAAQ,KAAKD,CAAU,MAAMC;AAEhF,SACE,gBAAAS;AAAA,IAACH;AAAA,IAAA;AAAA,MACE,GAAI,CAACL,KAAW,EAAE,MAAM,MAAA;AAAA,MACzB,cAAYiB;AAAA,MACZ,OAAOA;AAAA,MACP,WAAWR;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,UACE,wBAAwBP,MAAU;AAAA,UAClC,sBAAsBA,MAAU;AAAA,UAChC,sCAAsCF,KAAWG,EAAM;AAAA,QAAA;AAAA,QAEzDR;AAAA,MAAA;AAAA,MAED,GAAGQ;AAAA,MAEH,UAAAF;AAAA,IAAA;AAAA,EAAA;AAGP;AAEAoC,EAAW,cAAc;AC5BlB,MAAMC,IAAoB,CAAC,EAAE,WAAA3C,GAAW,UAAAM,GAAU,GAAGE,QAAoC;AAC9F,QAAM,EAAE,MAAAP,GAAM,UAAAG,EAAA,IAAaR,EAAA,GAErBgD,IAAcxC,GAAU,OAAO,CAAC;AAEtC,SACE,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAW;AAAA,MACX,WAAWC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,UACE,kBAAkBb,MAAS;AAAA,UAC3B,kBAAkB,CAAC,MAAM,IAAI,EAAE,SAASA,CAAI;AAAA,UAC5C,kBAAkBA,MAAS;AAAA,UAC3B,mBAAmBA,MAAS;AAAA,UAC5B,yBAAyBA,MAAS;AAAA,QAAA;AAAA,QAEpCD;AAAA,MAAA;AAAA,MAED,GAAGQ;AAAA,MAEH,UAAAF,KAAYsC;AAAA,IAAA;AAAA,EAAA;AAGnB;AAEAD,EAAkB,cAAc;ACnBhC,MAAME,IAAkB9C;AAExB8C,EAAgB,QAAQ9B;AACxB8B,EAAgB,SAASlB;AACzBkB,EAAgB,cAAcL;AAC9BK,EAAgB,OAAOH;AACvBG,EAAgB,cAAcF;"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/avatar/context.ts","../../src/avatar/Avatar.tsx","../../src/avatar/AvatarAction.tsx","../../src/avatar/AvatarImage.tsx","../../src/avatar/AvatarOnlineBadge.tsx","../../src/avatar/AvatarPlaceholder.tsx","../../src/avatar/AvatarUser.tsx","../../src/avatar/index.ts"],"sourcesContent":["import * as React from 'react'\n\nimport type { AvatarContextValue } from './types'\n\nconst AvatarContext = React.createContext<AvatarContextValue | undefined>(undefined)\n\nexport const useAvatarContext = () => {\n const context = React.useContext(AvatarContext)\n if (!context) {\n throw new Error('useAvatarContext must be used within an Avatar component')\n }\n return context\n}\n\nexport { AvatarContext }\n","import { cx } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { Slot } from '../slot'\nimport { AvatarContext } from './context'\nimport type { AvatarProps } from './types'\n\nconst sizeMap = {\n xs: 24,\n sm: 32,\n md: 40,\n lg: 56,\n xl: 64, // default\n '2xl': 96,\n}\n\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n (\n {\n className,\n size = 'xl',\n isOnline = false,\n onlineText,\n username,\n asChild,\n children,\n shape = 'circle',\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : 'div'\n const contextValue = React.useMemo(\n () => ({\n size,\n isOnline,\n onlineText,\n username,\n shape,\n pixelSize: sizeMap[size],\n }),\n [size, isOnline, username, shape, onlineText]\n )\n\n return (\n <AvatarContext.Provider value={contextValue}>\n <Comp\n ref={ref}\n style={{\n width: sizeMap[size],\n height: sizeMap[size],\n }}\n data-spark-component=\"avatar\"\n className={cx('relative inline-flex items-center justify-center', className)}\n {...props}\n >\n {children}\n </Comp>\n </AvatarContext.Provider>\n )\n }\n)\n\nAvatar.displayName = 'Avatar'\n","import { PenOutline } from '@spark-ui/icons/PenOutline'\nimport { cx } from 'class-variance-authority'\n\nimport { Icon } from '../icon'\nimport { IconButton } from '../icon-button'\nimport { Slot } from '../slot'\nimport { useAvatarContext } from './context'\n\nexport interface AvatarActionProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n angle?: number\n ariaLabel: string\n}\n\nexport const AvatarAction = ({\n className,\n children,\n asChild,\n angle = 135,\n ariaLabel,\n ...props\n}: AvatarActionProps) => {\n const Comp = asChild ? Slot : IconButton\n const { pixelSize, shape } = useAvatarContext()\n\n function getBadgePosition(circleSize: number) {\n const angleRad = ((90 - angle) * Math.PI) / 180\n const circleRadius = circleSize / 2\n\n return {\n x: circleRadius + circleRadius * Math.cos(angleRad),\n y: circleRadius - circleRadius * Math.sin(angleRad),\n }\n }\n\n const position = getBadgePosition(pixelSize)\n\n const isCustomElement = asChild\n\n return (\n <Comp\n data-spark-component=\"avatar-action\"\n style={{\n position: 'absolute',\n ...(shape === 'circle' ? { left: `${position.x}px`, top: `${position.y}px` } : {}),\n ...(shape === 'square' ? { right: '0px', bottom: '0px' } : {}),\n }}\n className={cx(\n 'z-raised',\n shape === 'circle'\n ? '-translate-x-1/2 -translate-y-1/2'\n : 'translate-x-1/4 translate-y-1/4',\n { 'shadow-sm': !isCustomElement },\n className\n )}\n aria-label={ariaLabel}\n title={ariaLabel}\n {...(!isCustomElement ? { size: 'sm', intent: 'support', design: 'contrast' } : {})}\n {...props}\n >\n {children || (\n <Icon size=\"sm\">\n <PenOutline />\n </Icon>\n )}\n </Comp>\n )\n}\n\nAvatarAction.displayName = 'AvatarAction'\n","import { cx } from 'class-variance-authority'\nimport { useEffect, useState } from 'react'\n\nimport { Slot } from '../slot'\nimport { useAvatarContext } from './context'\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n asChild?: boolean\n}\n\nexport const AvatarImage = ({\n className,\n asChild,\n src,\n onLoad,\n onError,\n ...props\n}: AvatarImageProps) => {\n const { username, isOnline, onlineText } = useAvatarContext()\n const Comp = asChild ? Slot : 'img'\n\n const [isVisible, setIsVisible] = useState(false)\n\n const accessibleName = isOnline && onlineText ? `${username} (${onlineText})` : username\n\n // Reset visibility when src changes\n useEffect(() => {\n setIsVisible(false)\n }, [src])\n\n // Don't render the image if src is undefined or null\n if (!src) {\n return null\n }\n\n const handleLoad = (event: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsVisible(true)\n onLoad?.(event)\n }\n\n const handleError = (event: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsVisible(false)\n onError?.(event)\n }\n\n return (\n <Comp\n aria-hidden\n className={cx(\n 'absolute inset-0 size-full',\n 'object-cover',\n { 'transition-all duration-300 group-hover:scale-120': props.onClick },\n 'focus-visible:u-outline',\n isVisible ? 'block' : 'hidden',\n className\n )}\n alt={accessibleName}\n src={src}\n onLoad={handleLoad}\n onError={handleError}\n {...props}\n />\n )\n}\n\nAvatarImage.displayName = 'AvatarImage'\n","import { cx } from 'class-variance-authority'\nimport { ComponentPropsWithoutRef } from 'react'\n\nimport { useAvatarContext } from './context'\n\ninterface AvatarOnlineBadgeProps extends ComponentPropsWithoutRef<'div'> {\n angle?: number\n}\n\nexport const AvatarOnlineBadge = ({ angle = 135, ...props }: AvatarOnlineBadgeProps) => {\n const { isOnline, pixelSize, shape, onlineText, size } = useAvatarContext()\n\n if (!isOnline) return null\n\n function getBadgePosition(circleSize: number) {\n const angleRad = ((90 - angle) * Math.PI) / 180\n const circleRadius = circleSize / 2\n\n return {\n x: circleRadius + circleRadius * Math.cos(angleRad),\n y: circleRadius - circleRadius * Math.sin(angleRad),\n }\n }\n\n const badgePosition = getBadgePosition(pixelSize)\n\n return (\n <div\n data-spark-component=\"avatar-online-badge\"\n role=\"status\"\n aria-label={onlineText}\n style={{\n ...(shape === 'circle'\n ? { left: `${badgePosition.x}px`, top: `${badgePosition.y}px` }\n : { right: '0px', bottom: '0px' }),\n }}\n className={cx(\n 'bg-success outline-surface absolute rounded-full',\n shape === 'circle'\n ? '-translate-x-1/2 -translate-y-1/2'\n : 'translate-x-1/4 translate-y-1/4',\n ['lg', 'xl', '2xl'].includes(size) ? cx('size-sz-12 outline-4') : cx('size-sz-8 outline-2')\n )}\n {...props}\n />\n )\n}\n\nAvatarOnlineBadge.displayName = 'AvatarOnlineBadge'\n","import { cx } from 'class-variance-authority'\n\nimport { useAvatarContext } from './context'\n\nexport interface AvatarPlaceholderProps extends React.ImgHTMLAttributes<HTMLDivElement> {\n className?: string\n children?: React.ReactNode\n}\n\nexport const AvatarPlaceholder = ({ className, children, ...props }: AvatarPlaceholderProps) => {\n const { size, username } = useAvatarContext()\n\n const firstLetter = username?.charAt(0)\n\n return (\n <div\n aria-hidden\n className={cx(\n 'absolute inset-0 flex size-full items-center justify-center',\n 'default:bg-neutral default:text-on-neutral',\n {\n 'text-display-1': size === '2xl',\n 'text-display-2': ['xl', 'lg'].includes(size),\n 'text-display-3': size === 'md',\n 'text-headline-2': size === 'sm',\n 'text-body-2 font-bold': size === 'xs',\n },\n className\n )}\n {...props}\n >\n {children || firstLetter}\n </div>\n )\n}\n\nAvatarPlaceholder.displayName = 'AvatarPlaceholder'\n","import { cx } from 'class-variance-authority'\n\nimport { Slot } from '../slot'\nimport { useAvatarContext } from './context'\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLDivElement> {\n asChild?: boolean\n}\n\nexport const AvatarUser = ({ asChild, children, className, ...props }: AvatarImageProps) => {\n const { shape, isOnline, onlineText, username } = useAvatarContext()\n const Comp = asChild ? Slot : 'div'\n\n const accessibleName = isOnline && onlineText ? `${username} (${onlineText})` : username\n\n return (\n <Comp\n {...(!asChild && { role: 'img' })}\n aria-label={accessibleName}\n title={accessibleName}\n className={cx(\n 'group default:border-outline relative size-full overflow-hidden',\n 'focus-visible:u-outline',\n {\n 'default:rounded-full': shape === 'circle',\n 'default:rounded-md': shape === 'square',\n 'hover:opacity-dim-1 cursor-pointer': asChild || props.onClick,\n },\n className\n )}\n {...props}\n >\n {children}\n </Comp>\n )\n}\n\nAvatarUser.displayName = 'AvatarUser'\n","import { Avatar } from './Avatar'\nimport { AvatarAction } from './AvatarAction'\nimport { AvatarImage } from './AvatarImage'\nimport { AvatarOnlineBadge } from './AvatarOnlineBadge'\nimport { AvatarPlaceholder } from './AvatarPlaceholder'\nimport { AvatarUser } from './AvatarUser'\nimport type { AvatarProps } from './types'\n\nexport interface AvatarComponent extends React.ForwardRefExoticComponent<\n AvatarProps & React.RefAttributes<HTMLDivElement>\n> {\n Image: typeof AvatarImage\n Action: typeof AvatarAction\n OnlineBadge: typeof AvatarOnlineBadge\n User: typeof AvatarUser\n Placeholder: typeof AvatarPlaceholder\n}\n\nconst AvatarComponent = Avatar as AvatarComponent\n\nAvatarComponent.Image = AvatarImage\nAvatarComponent.Action = AvatarAction\nAvatarComponent.OnlineBadge = AvatarOnlineBadge\nAvatarComponent.User = AvatarUser\nAvatarComponent.Placeholder = AvatarPlaceholder\nexport { AvatarComponent as Avatar }\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),c=require("@spark-ui/internal-utils"),f=require("class-variance-authority"),g=f.cva(["inline-flex h-fit","empty:p-0","text-center font-bold","rounded-full box-content"],{variants:{intent:c.makeVariants({main:["bg-main","text-on-main","border-surface"],support:["bg-support","text-on-support","border-surface"],accent:["bg-accent","text-on-accent","border-surface"],success:["bg-success","text-on-success","border-surface"],alert:["bg-alert","text-on-alert","border-surface"],danger:["bg-error","text-on-error","border-surface"],info:["bg-info","text-on-info","border-surface"],neutral:["bg-neutral","text-on-neutral","border-surface"],surface:["bg-surface","text-on-surface","border-surface"]}),size:c.makeVariants({sm:["text-small","px-[var(--spacing-sz-6)] py-[var(--spacing-sz-2)]","empty:size-sz-8"],md:["text-caption","px-md py-sm","empty:size-sz-16"]}),type:{relative:["absolute right-0 border-md","translate-x-1/2 -translate-y-1/2"],standalone:[]}},defaultVariants:{intent:"danger",size:"md",type:"relative"}}),i=({intent:e="danger",size:t="md",type:o="relative",count:a,overflowCount:s=99,"aria-label":n,className:d,...u})=>{const p=a&&a>s,b=typeof n=="function"?n({count:a,overflowCount:s}):n,m={...u,"aria-label":b};return r.jsx("span",{"data-spark-component":"badge",role:"status",className:g({intent:e,size:t,type:o,className:d}),...m,children:p?`${s}+`:a})};i.displayName="BadgeItem";const l=({children:e,...t})=>!e?r.jsx(i,{type:"standalone",...t}):r.jsxs("div",{className:"relative inline-flex",children:[e,r.jsx(i,{...t})]});l.displayName="Badge";exports.Badge=l;
2
- //# sourceMappingURL=index.js.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../chunk-C91j1N6u.js`);let e=require(`class-variance-authority`),t=require(`react/jsx-runtime`),n=require(`@spark-ui/internal-utils`);var r=(0,e.cva)([`inline-flex h-fit`,`empty:p-0`,`text-center font-bold`,`rounded-full box-content`],{variants:{intent:(0,n.makeVariants)({main:[`bg-main`,`text-on-main`,`border-surface`],support:[`bg-support`,`text-on-support`,`border-surface`],accent:[`bg-accent`,`text-on-accent`,`border-surface`],success:[`bg-success`,`text-on-success`,`border-surface`],alert:[`bg-alert`,`text-on-alert`,`border-surface`],danger:[`bg-error`,`text-on-error`,`border-surface`],info:[`bg-info`,`text-on-info`,`border-surface`],neutral:[`bg-neutral`,`text-on-neutral`,`border-surface`],surface:[`bg-surface`,`text-on-surface`,`border-surface`]}),size:(0,n.makeVariants)({sm:[`text-small`,`px-[var(--spacing-sz-6)] py-[var(--spacing-sz-2)]`,`empty:size-sz-8`],md:[`text-caption`,`px-md py-sm`,`empty:size-sz-16`]}),type:{relative:[`absolute right-0 border-md`,`translate-x-1/2 -translate-y-1/2`],standalone:[]}},defaultVariants:{intent:`danger`,size:`md`,type:`relative`}}),i=({intent:e=`danger`,size:n=`md`,type:i=`relative`,count:a,overflowCount:o=99,"aria-label":s,className:c,...l})=>{let u=a&&a>o,d=typeof s==`function`?s({count:a,overflowCount:o}):s,f={...l,"aria-label":d};return(0,t.jsx)(`span`,{"data-spark-component":`badge`,role:`status`,className:r({intent:e,size:n,type:i,className:c}),...f,children:u?`${o}+`:a})};i.displayName=`BadgeItem`;var a=({children:e,...n})=>e?(0,t.jsxs)(`div`,{className:`relative inline-flex`,children:[e,(0,t.jsx)(i,{...n})]}):(0,t.jsx)(i,{type:`standalone`,...n});a.displayName=`Badge`,exports.Badge=a;
2
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/badge/BadgeItem.styles.tsx","../../src/badge/BadgeItem.tsx","../../src/badge/Badge.tsx"],"sourcesContent":["import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const styles = cva(\n ['inline-flex h-fit', 'empty:p-0', 'text-center font-bold', 'rounded-full box-content'],\n {\n variants: {\n /**\n * Visual color appearance of the component.\n * @default 'danger'\n */\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'danger', 'info', 'neutral', 'surface']\n >({\n main: ['bg-main', 'text-on-main', 'border-surface'],\n support: ['bg-support', 'text-on-support', 'border-surface'],\n accent: ['bg-accent', 'text-on-accent', 'border-surface'],\n success: ['bg-success', 'text-on-success', 'border-surface'],\n alert: ['bg-alert', 'text-on-alert', 'border-surface'],\n danger: ['bg-error', 'text-on-error', 'border-surface'],\n info: ['bg-info', 'text-on-info', 'border-surface'],\n neutral: ['bg-neutral', 'text-on-neutral', 'border-surface'],\n surface: ['bg-surface', 'text-on-surface', 'border-surface'],\n }),\n /**\n * Size of the component.\n * @default 'md'\n */\n size: makeVariants<'size', ['sm', 'md']>({\n sm: ['text-small', 'px-[var(--spacing-sz-6)] py-[var(--spacing-sz-2)]', 'empty:size-sz-8'],\n md: ['text-caption', 'px-md py-sm', 'empty:size-sz-16'],\n }),\n /**\n * Type of the component.\n * @default 'relative'\n */\n type: {\n relative: ['absolute right-0 border-md', 'translate-x-1/2 -translate-y-1/2'],\n standalone: [],\n },\n },\n defaultVariants: {\n intent: 'danger',\n size: 'md',\n type: 'relative',\n },\n }\n)\n\nexport type StylesProps = VariantProps<typeof styles>\n","import { HTMLAttributes, Ref } from 'react'\n\nimport { styles, type StylesProps } from './BadgeItem.styles'\n\nexport interface BadgeItemProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, 'aria-label'>,\n StylesProps {\n /**\n * Numeric value used as indicator inside the component.\n */\n count?: number\n /**\n * Maximum numeric value to be dispayed as a count value.\n * @default 99\n */\n overflowCount?: number\n /**\n * A custom label for accessibility purposes. It can also be defined as a builder function\n * to handle dynamic inner data to create a custom label.\n */\n 'aria-label'?:\n | string\n | (({ count, overflowCount }: { count?: number; overflowCount?: number }) => string)\n /**\n * Describes the way the component is displayed: relative to another element or just standalone.\n * @default 'relative'\n */\n type?: 'relative' | 'standalone'\n ref?: Ref<HTMLSpanElement>\n}\n\nexport const BadgeItem = ({\n intent = 'danger',\n size = 'md',\n type = 'relative',\n count,\n overflowCount = 99,\n 'aria-label': label,\n className,\n ...others\n}: BadgeItemProps) => {\n const hasOverflow = count && count > overflowCount\n const ariaLabel = typeof label === 'function' ? label({ count, overflowCount }) : label\n const props = { ...others, 'aria-label': ariaLabel }\n\n return (\n <span\n data-spark-component=\"badge\"\n role=\"status\"\n className={styles({\n intent,\n size,\n type,\n className,\n })}\n {...props}\n >\n {hasOverflow ? `${overflowCount}+` : count}\n </span>\n )\n}\n\nBadgeItem.displayName = 'BadgeItem'\n","import { PropsWithChildren, Ref } from 'react'\n\nimport { BadgeItem, BadgeItemProps } from './BadgeItem'\n\nexport type BadgeProps = PropsWithChildren<Omit<BadgeItemProps, 'type'>> & {\n ref?: Ref<HTMLElement>\n}\n\nexport const Badge = ({ children, ...props }: BadgeProps) => {\n const isStandalone = !children\n\n return isStandalone ? (\n <BadgeItem type=\"standalone\" {...props} />\n ) : (\n <div className=\"relative inline-flex\">\n {children}\n <BadgeItem {...props} />\n </div>\n )\n}\n\nBadge.displayName = 'Badge'\n"],"names":["styles","cva","makeVariants","BadgeItem","intent","size","type","count","overflowCount","label","className","others","hasOverflow","ariaLabel","props","jsx","Badge","children","jsxs"],"mappings":"iMAGaA,EAASC,EAAAA,IACpB,CAAC,oBAAqB,YAAa,wBAAyB,0BAA0B,EACtF,CACE,SAAU,CAKR,OAAQC,EAAAA,aAGN,CACA,KAAM,CAAC,UAAW,eAAgB,gBAAgB,EAClD,QAAS,CAAC,aAAc,kBAAmB,gBAAgB,EAC3D,OAAQ,CAAC,YAAa,iBAAkB,gBAAgB,EACxD,QAAS,CAAC,aAAc,kBAAmB,gBAAgB,EAC3D,MAAO,CAAC,WAAY,gBAAiB,gBAAgB,EACrD,OAAQ,CAAC,WAAY,gBAAiB,gBAAgB,EACtD,KAAM,CAAC,UAAW,eAAgB,gBAAgB,EAClD,QAAS,CAAC,aAAc,kBAAmB,gBAAgB,EAC3D,QAAS,CAAC,aAAc,kBAAmB,gBAAgB,CAAA,CAC5D,EAKD,KAAMA,EAAAA,aAAmC,CACvC,GAAI,CAAC,aAAc,oDAAqD,iBAAiB,EACzF,GAAI,CAAC,eAAgB,cAAe,kBAAkB,CAAA,CACvD,EAKD,KAAM,CACJ,SAAU,CAAC,6BAA8B,kCAAkC,EAC3E,WAAY,CAAA,CAAC,CACf,EAEF,gBAAiB,CACf,OAAQ,SACR,KAAM,KACN,KAAM,UAAA,CACR,CAEJ,ECjBaC,EAAY,CAAC,CACxB,OAAAC,EAAS,SACT,KAAAC,EAAO,KACP,KAAAC,EAAO,WACP,MAAAC,EACA,cAAAC,EAAgB,GAChB,aAAcC,EACd,UAAAC,EACA,GAAGC,CACL,IAAsB,CACpB,MAAMC,EAAcL,GAASA,EAAQC,EAC/BK,EAAY,OAAOJ,GAAU,WAAaA,EAAM,CAAE,MAAAF,EAAO,cAAAC,CAAA,CAAe,EAAIC,EAC5EK,EAAQ,CAAE,GAAGH,EAAQ,aAAcE,CAAA,EAEzC,OACEE,EAAAA,IAAC,OAAA,CACC,uBAAqB,QACrB,KAAK,SACL,UAAWf,EAAO,CAChB,OAAAI,EACA,KAAAC,EACA,KAAAC,EACA,UAAAI,CAAA,CACD,EACA,GAAGI,EAEH,SAAAF,EAAc,GAAGJ,CAAa,IAAMD,CAAA,CAAA,CAG3C,EAEAJ,EAAU,YAAc,YCtDjB,MAAMa,EAAQ,CAAC,CAAE,SAAAC,EAAU,GAAGH,KACd,CAACG,EAGpBF,EAAAA,IAACZ,EAAA,CAAU,KAAK,aAAc,GAAGW,CAAA,CAAO,EAExCI,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACZ,SAAA,CAAAD,EACDF,MAACZ,EAAA,CAAW,GAAGW,CAAA,CAAO,CAAA,EACxB,EAIJE,EAAM,YAAc"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/badge/BadgeItem.styles.tsx","../../src/badge/BadgeItem.tsx","../../src/badge/Badge.tsx"],"sourcesContent":["import { makeVariants } from '@spark-ui/internal-utils'\nimport { cva, VariantProps } from 'class-variance-authority'\n\nexport const styles = cva(\n ['inline-flex h-fit', 'empty:p-0', 'text-center font-bold', 'rounded-full box-content'],\n {\n variants: {\n /**\n * Visual color appearance of the component.\n * @default 'danger'\n */\n intent: makeVariants<\n 'intent',\n ['main', 'support', 'accent', 'success', 'alert', 'danger', 'info', 'neutral', 'surface']\n >({\n main: ['bg-main', 'text-on-main', 'border-surface'],\n support: ['bg-support', 'text-on-support', 'border-surface'],\n accent: ['bg-accent', 'text-on-accent', 'border-surface'],\n success: ['bg-success', 'text-on-success', 'border-surface'],\n alert: ['bg-alert', 'text-on-alert', 'border-surface'],\n danger: ['bg-error', 'text-on-error', 'border-surface'],\n info: ['bg-info', 'text-on-info', 'border-surface'],\n neutral: ['bg-neutral', 'text-on-neutral', 'border-surface'],\n surface: ['bg-surface', 'text-on-surface', 'border-surface'],\n }),\n /**\n * Size of the component.\n * @default 'md'\n */\n size: makeVariants<'size', ['sm', 'md']>({\n sm: ['text-small', 'px-[var(--spacing-sz-6)] py-[var(--spacing-sz-2)]', 'empty:size-sz-8'],\n md: ['text-caption', 'px-md py-sm', 'empty:size-sz-16'],\n }),\n /**\n * Type of the component.\n * @default 'relative'\n */\n type: {\n relative: ['absolute right-0 border-md', 'translate-x-1/2 -translate-y-1/2'],\n standalone: [],\n },\n },\n defaultVariants: {\n intent: 'danger',\n size: 'md',\n type: 'relative',\n },\n }\n)\n\nexport type StylesProps = VariantProps<typeof styles>\n","import { HTMLAttributes, Ref } from 'react'\n\nimport { styles, type StylesProps } from './BadgeItem.styles'\n\nexport interface BadgeItemProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, 'aria-label'>, StylesProps {\n /**\n * Numeric value used as indicator inside the component.\n */\n count?: number\n /**\n * Maximum numeric value to be dispayed as a count value.\n * @default 99\n */\n overflowCount?: number\n /**\n * A custom label for accessibility purposes. It can also be defined as a builder function\n * to handle dynamic inner data to create a custom label.\n */\n 'aria-label'?:\n | string\n | (({ count, overflowCount }: { count?: number; overflowCount?: number }) => string)\n /**\n * Describes the way the component is displayed: relative to another element or just standalone.\n * @default 'relative'\n */\n type?: 'relative' | 'standalone'\n ref?: Ref<HTMLSpanElement>\n}\n\nexport const BadgeItem = ({\n intent = 'danger',\n size = 'md',\n type = 'relative',\n count,\n overflowCount = 99,\n 'aria-label': label,\n className,\n ...others\n}: BadgeItemProps) => {\n const hasOverflow = count && count > overflowCount\n const ariaLabel = typeof label === 'function' ? label({ count, overflowCount }) : label\n const props = { ...others, 'aria-label': ariaLabel }\n\n return (\n <span\n data-spark-component=\"badge\"\n role=\"status\"\n className={styles({\n intent,\n size,\n type,\n className,\n })}\n {...props}\n >\n {hasOverflow ? `${overflowCount}+` : count}\n </span>\n )\n}\n\nBadgeItem.displayName = 'BadgeItem'\n","import { PropsWithChildren, Ref } from 'react'\n\nimport { BadgeItem, BadgeItemProps } from './BadgeItem'\n\nexport type BadgeProps = PropsWithChildren<Omit<BadgeItemProps, 'type'>> & {\n ref?: Ref<HTMLElement>\n}\n\nexport const Badge = ({ children, ...props }: BadgeProps) => {\n const isStandalone = !children\n\n return isStandalone ? (\n <BadgeItem type=\"standalone\" {...props} />\n ) : (\n <div className=\"relative inline-flex\">\n {children}\n <BadgeItem {...props} />\n </div>\n )\n}\n\nBadge.displayName = 'Badge'\n"],"mappings":"kNAGA,IAAa,GAAA,EAAA,EAAA,KACX,CAAC,oBAAqB,YAAa,wBAAyB,2BAA2B,CACvF,CACE,SAAU,CAKR,QAAA,EAAA,EAAA,cAGE,CACA,KAAM,CAAC,UAAW,eAAgB,iBAAiB,CACnD,QAAS,CAAC,aAAc,kBAAmB,iBAAiB,CAC5D,OAAQ,CAAC,YAAa,iBAAkB,iBAAiB,CACzD,QAAS,CAAC,aAAc,kBAAmB,iBAAiB,CAC5D,MAAO,CAAC,WAAY,gBAAiB,iBAAiB,CACtD,OAAQ,CAAC,WAAY,gBAAiB,iBAAiB,CACvD,KAAM,CAAC,UAAW,eAAgB,iBAAiB,CACnD,QAAS,CAAC,aAAc,kBAAmB,iBAAiB,CAC5D,QAAS,CAAC,aAAc,kBAAmB,iBAAiB,CAC7D,CAAC,CAKF,MAAA,EAAA,EAAA,cAAyC,CACvC,GAAI,CAAC,aAAc,oDAAqD,kBAAkB,CAC1F,GAAI,CAAC,eAAgB,cAAe,mBAAmB,CACxD,CAAC,CAKF,KAAM,CACJ,SAAU,CAAC,6BAA8B,mCAAmC,CAC5E,WAAY,EAAE,CACf,CACF,CACD,gBAAiB,CACf,OAAQ,SACR,KAAM,KACN,KAAM,WACP,CACF,CACF,CClBY,GAAa,CACxB,SAAS,SACT,OAAO,KACP,OAAO,WACP,QACA,gBAAgB,GAChB,aAAc,EACd,YACA,GAAG,KACiB,CACpB,IAAM,EAAc,GAAS,EAAQ,EAC/B,EAAY,OAAO,GAAU,WAAa,EAAM,CAAE,QAAO,gBAAe,CAAC,CAAG,EAC5E,EAAQ,CAAE,GAAG,EAAQ,aAAc,EAAW,CAEpD,OACE,EAAA,EAAA,KAAC,OAAD,CACE,uBAAqB,QACrB,KAAK,SACL,UAAW,EAAO,CAChB,SACA,OACA,OACA,YACD,CAAC,CACF,GAAI,WAEH,EAAc,GAAG,EAAc,GAAK,EAChC,CAAA,EAIX,EAAU,YAAc,YCrDxB,IAAa,GAAS,CAAE,WAAU,GAAG,KACb,GAKpB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gCAAf,CACG,GACD,EAAA,EAAA,KAAC,EAAD,CAAW,GAAI,EAAS,CAAA,CACpB,IALN,EAAA,EAAA,KAAC,EAAD,CAAW,KAAK,aAAa,GAAI,EAAS,CAAA,CAS9C,EAAM,YAAc"}