@devalok/shilp-sutra 0.48.0 → 0.49.1

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 (261) hide show
  1. package/BREAKING.json +32 -0
  2. package/MIGRATION.md +891 -881
  3. package/dist/_chunks/badge-group.js +52 -65
  4. package/dist/_chunks/badge-group.js.map +1 -1
  5. package/dist/_chunks/block-shell.js +1 -1
  6. package/dist/_chunks/chart-container.js +1 -1
  7. package/dist/_chunks/chat.js +4 -4
  8. package/dist/_chunks/chat.js.map +1 -1
  9. package/dist/_chunks/colors.js +2 -2
  10. package/dist/_chunks/document-preview.js +4 -4
  11. package/dist/_chunks/emoji-suggestion.js +5 -5
  12. package/dist/_chunks/emoji-suggestion.js.map +1 -1
  13. package/dist/_chunks/emoji.js +1 -1
  14. package/dist/_chunks/field-state.js +8 -0
  15. package/dist/_chunks/field-state.js.map +1 -0
  16. package/dist/_chunks/grid-lines.js +1 -1
  17. package/dist/_chunks/image-preview.js +7 -7
  18. package/dist/_chunks/keybinding.js +1 -1
  19. package/dist/_chunks/link-context.js +1 -1
  20. package/dist/_chunks/mention-suggestion.js +2 -2
  21. package/dist/_chunks/mention.js +1 -1
  22. package/dist/_chunks/motion-provider.js +1 -1
  23. package/dist/_chunks/normalize-icon.js +1 -1
  24. package/dist/_chunks/oauth-button.js +2 -2
  25. package/dist/_chunks/popover.js +55 -52
  26. package/dist/_chunks/popover.js.map +1 -1
  27. package/dist/_chunks/primitives.js +155 -155
  28. package/dist/_chunks/primitives.js.map +1 -1
  29. package/dist/_chunks/shared.js +5 -5
  30. package/dist/_chunks/success.js +4 -4
  31. package/dist/_chunks/tiptap.js +8 -8
  32. package/dist/_chunks/tooltip.js +1 -1
  33. package/dist/_chunks/tree-view.js +2 -2
  34. package/dist/_chunks/use-calendar.js +2 -2
  35. package/dist/_chunks/use-calendar.js.map +1 -1
  36. package/dist/_chunks/use-controllable-open.js +15 -0
  37. package/dist/_chunks/use-controllable-open.js.map +1 -0
  38. package/dist/_chunks/vendor-client.js +1 -1
  39. package/dist/_chunks/vendor-utils.js +1 -1
  40. package/dist/ai/block-renderer.js +7 -7
  41. package/dist/ai/blocks/error.js +1 -1
  42. package/dist/ai/blocks/index.js +2 -2
  43. package/dist/ai/blocks/text.js +1 -1
  44. package/dist/ai/command-bar.js +6 -6
  45. package/dist/ai/conversation.js +2 -2
  46. package/dist/ai/index.js +3 -3
  47. package/dist/composed/avatar-group.js +1 -1
  48. package/dist/composed/bulk-action-bar.js +1 -1
  49. package/dist/composed/command-palette.js +9 -9
  50. package/dist/composed/command-palette.js.map +1 -1
  51. package/dist/composed/confirm-dialog.js +3 -3
  52. package/dist/composed/confirm-dialog.js.map +1 -1
  53. package/dist/composed/content-card.js +1 -1
  54. package/dist/composed/date-picker/index.js +13 -13
  55. package/dist/composed/date-picker/index.js.map +1 -1
  56. package/dist/composed/emoji-picker.js +4 -4
  57. package/dist/composed/empty-state.js +1 -1
  58. package/dist/composed/error-boundary.js +1 -1
  59. package/dist/composed/error-boundary.js.map +1 -1
  60. package/dist/composed/extensions/emoji-node.js +1 -1
  61. package/dist/composed/extensions/emoji-suggestion.js +1 -1
  62. package/dist/composed/file-preview.js +14 -14
  63. package/dist/composed/filter-bar.js +1 -1
  64. package/dist/composed/index.d.ts +3 -1
  65. package/dist/composed/index.d.ts.map +1 -1
  66. package/dist/composed/index.js +4 -3
  67. package/dist/composed/loading-skeleton.js +15 -15
  68. package/dist/composed/loading-skeleton.js.map +1 -1
  69. package/dist/composed/multi-select-popover.js +3 -3
  70. package/dist/composed/page-header.d.ts.map +1 -1
  71. package/dist/composed/page-header.js +32 -45
  72. package/dist/composed/page-header.js.map +1 -1
  73. package/dist/composed/page-skeletons.js +19 -19
  74. package/dist/composed/page-skeletons.js.map +1 -1
  75. package/dist/composed/priority-indicator.js +1 -1
  76. package/dist/composed/responsive-modal.d.ts +39 -0
  77. package/dist/composed/responsive-modal.d.ts.map +1 -0
  78. package/dist/composed/responsive-modal.js +212 -0
  79. package/dist/composed/responsive-modal.js.map +1 -0
  80. package/dist/composed/rich-chat-input.js +445 -445
  81. package/dist/composed/rich-chat-input.js.map +1 -1
  82. package/dist/composed/rich-text-editor.js +29 -29
  83. package/dist/composed/rich-text-editor.js.map +1 -1
  84. package/dist/composed/schedule-view.d.ts +1 -1
  85. package/dist/composed/schedule-view.d.ts.map +1 -1
  86. package/dist/composed/schedule-view.js +48 -54
  87. package/dist/composed/schedule-view.js.map +1 -1
  88. package/dist/composed/status-badge.d.ts +13 -11
  89. package/dist/composed/status-badge.d.ts.map +1 -1
  90. package/dist/composed/status-badge.js +54 -130
  91. package/dist/composed/status-badge.js.map +1 -1
  92. package/dist/motion/index.js +2 -2
  93. package/dist/shell/bottom-navbar.js +3 -3
  94. package/dist/shell/bottom-navbar.js.map +1 -1
  95. package/dist/shell/index.js +2 -2
  96. package/dist/shell/link-context.js +2 -2
  97. package/dist/shell/notification-center.js +3 -3
  98. package/dist/shell/sidebar.js +2 -2
  99. package/dist/shell/top-bar.js +2 -2
  100. package/dist/shell/top-bar.js.map +1 -1
  101. package/dist/tokens/semantic.css +8 -1
  102. package/dist/ui/accordion.js +11 -11
  103. package/dist/ui/alert-dialog.js +34 -34
  104. package/dist/ui/alert.js +1 -1
  105. package/dist/ui/aspect-ratio.js +1 -1
  106. package/dist/ui/autocomplete.js +7 -7
  107. package/dist/ui/avatar.d.ts.map +1 -1
  108. package/dist/ui/avatar.js +84 -79
  109. package/dist/ui/avatar.js.map +1 -1
  110. package/dist/ui/badge-group.js +1 -1
  111. package/dist/ui/badge.d.ts.map +1 -1
  112. package/dist/ui/badge.js +1 -1
  113. package/dist/ui/banner.js +1 -1
  114. package/dist/ui/breadcrumb.d.ts +0 -1
  115. package/dist/ui/breadcrumb.d.ts.map +1 -1
  116. package/dist/ui/breadcrumb.js +58 -35
  117. package/dist/ui/breadcrumb.js.map +1 -1
  118. package/dist/ui/button.js +3 -3
  119. package/dist/ui/card.js +1 -1
  120. package/dist/ui/charts/area-chart.js +6 -6
  121. package/dist/ui/charts/bar-chart.js +6 -6
  122. package/dist/ui/charts/chart-container.js +1 -1
  123. package/dist/ui/charts/gauge-chart.js +2 -2
  124. package/dist/ui/charts/index.js +2 -2
  125. package/dist/ui/charts/line-chart.js +6 -6
  126. package/dist/ui/charts/pie-chart.js +5 -5
  127. package/dist/ui/charts/radar-chart.js +5 -5
  128. package/dist/ui/charts/sparkline.js +2 -2
  129. package/dist/ui/chat/index.js +2 -2
  130. package/dist/ui/checkbox.d.ts +4 -2
  131. package/dist/ui/checkbox.d.ts.map +1 -1
  132. package/dist/ui/checkbox.js +33 -28
  133. package/dist/ui/checkbox.js.map +1 -1
  134. package/dist/ui/collapsible.js +5 -5
  135. package/dist/ui/color-input.js +4 -4
  136. package/dist/ui/combobox.d.ts +3 -0
  137. package/dist/ui/combobox.d.ts.map +1 -1
  138. package/dist/ui/combobox.js +137 -132
  139. package/dist/ui/combobox.js.map +1 -1
  140. package/dist/ui/context-menu.js +32 -32
  141. package/dist/ui/dialog.d.ts.map +1 -1
  142. package/dist/ui/dialog.js +49 -46
  143. package/dist/ui/dialog.js.map +1 -1
  144. package/dist/ui/dot.d.ts +38 -0
  145. package/dist/ui/dot.d.ts.map +1 -0
  146. package/dist/ui/dot.js +92 -0
  147. package/dist/ui/dot.js.map +1 -0
  148. package/dist/ui/dropdown-menu.d.ts.map +1 -1
  149. package/dist/ui/dropdown-menu.js +81 -76
  150. package/dist/ui/dropdown-menu.js.map +1 -1
  151. package/dist/ui/hover-card.js +6 -6
  152. package/dist/ui/icon-button.js +1 -1
  153. package/dist/ui/index.d.ts +3 -2
  154. package/dist/ui/index.d.ts.map +1 -1
  155. package/dist/ui/index.js +67 -67
  156. package/dist/ui/index.js.map +1 -1
  157. package/dist/ui/input-otp.js +1 -1
  158. package/dist/ui/input-otp.js.map +1 -1
  159. package/dist/ui/input.d.ts +4 -2
  160. package/dist/ui/input.d.ts.map +1 -1
  161. package/dist/ui/input.js +39 -38
  162. package/dist/ui/input.js.map +1 -1
  163. package/dist/ui/label.js +1 -1
  164. package/dist/ui/lib/field-state.d.ts +21 -0
  165. package/dist/ui/lib/field-state.d.ts.map +1 -0
  166. package/dist/ui/lib/use-controllable-open.d.ts +32 -0
  167. package/dist/ui/lib/use-controllable-open.d.ts.map +1 -0
  168. package/dist/ui/lib/utils.js +4 -4
  169. package/dist/ui/link.js +1 -1
  170. package/dist/ui/menubar.js +53 -53
  171. package/dist/ui/navigation-menu.js +27 -27
  172. package/dist/ui/number-input.d.ts +4 -2
  173. package/dist/ui/number-input.d.ts.map +1 -1
  174. package/dist/ui/number-input.js +52 -51
  175. package/dist/ui/number-input.js.map +1 -1
  176. package/dist/ui/oauth-button/index.js +2 -2
  177. package/dist/ui/pagination.js +1 -1
  178. package/dist/ui/popover.d.ts.map +1 -1
  179. package/dist/ui/popover.js +2 -2
  180. package/dist/ui/progress.d.ts +66 -42
  181. package/dist/ui/progress.d.ts.map +1 -1
  182. package/dist/ui/progress.js +144 -40
  183. package/dist/ui/progress.js.map +1 -1
  184. package/dist/ui/radio.d.ts +6 -2
  185. package/dist/ui/radio.d.ts.map +1 -1
  186. package/dist/ui/radio.js +44 -33
  187. package/dist/ui/radio.js.map +1 -1
  188. package/dist/ui/segmented-control.js +1 -1
  189. package/dist/ui/select.d.ts +1 -1
  190. package/dist/ui/select.d.ts.map +1 -1
  191. package/dist/ui/select.js +56 -55
  192. package/dist/ui/select.js.map +1 -1
  193. package/dist/ui/separator.js +2 -2
  194. package/dist/ui/separator.js.map +1 -1
  195. package/dist/ui/sheet.d.ts.map +1 -1
  196. package/dist/ui/sheet.js +56 -53
  197. package/dist/ui/sheet.js.map +1 -1
  198. package/dist/ui/sidebar.js +6 -6
  199. package/dist/ui/sidebar.js.map +1 -1
  200. package/dist/ui/skeleton.js +1 -1
  201. package/dist/ui/slider.js +8 -8
  202. package/dist/ui/slider.js.map +1 -1
  203. package/dist/ui/split-button.js +3 -3
  204. package/dist/ui/stat-card.d.ts.map +1 -1
  205. package/dist/ui/stat-card.js +123 -126
  206. package/dist/ui/stat-card.js.map +1 -1
  207. package/dist/ui/stat-flash.js +1 -1
  208. package/dist/ui/stepper.js +1 -1
  209. package/dist/ui/surface.js +2 -2
  210. package/dist/ui/switch.d.ts +3 -1
  211. package/dist/ui/switch.d.ts.map +1 -1
  212. package/dist/ui/switch.js +32 -27
  213. package/dist/ui/switch.js.map +1 -1
  214. package/dist/ui/table-row-link.js +1 -1
  215. package/dist/ui/tabs.js +13 -13
  216. package/dist/ui/text.js +1 -1
  217. package/dist/ui/textarea.d.ts +3 -3
  218. package/dist/ui/textarea.d.ts.map +1 -1
  219. package/dist/ui/textarea.js +19 -18
  220. package/dist/ui/textarea.js.map +1 -1
  221. package/dist/ui/toast.js +2 -2
  222. package/dist/ui/toast.js.map +1 -1
  223. package/dist/ui/toggle-group.js +1 -1
  224. package/dist/ui/toggle.js +2 -2
  225. package/dist/ui/tooltip.d.ts.map +1 -1
  226. package/dist/ui/tooltip.js +37 -34
  227. package/dist/ui/tooltip.js.map +1 -1
  228. package/dist/ui/tree-view/index.js +2 -2
  229. package/docs/components/ai/ai-command-provider.md +46 -0
  230. package/docs/components/ai/block-renderer.md +59 -0
  231. package/docs/components/ai/command-bar.md +78 -0
  232. package/docs/components/ai/conversation.md +59 -0
  233. package/docs/components/ai/devadoot-icon.md +41 -0
  234. package/docs/components/composed/page-header.md +1 -1
  235. package/docs/components/composed/responsive-modal.md +66 -0
  236. package/docs/components/composed/schedule-view.md +6 -2
  237. package/docs/components/ui/breadcrumb.md +1 -1
  238. package/docs/components/ui/checkbox.md +4 -1
  239. package/docs/components/ui/combobox.md +4 -0
  240. package/docs/components/ui/dot.md +61 -0
  241. package/docs/components/ui/progress.md +54 -16
  242. package/docs/components/ui/radio.md +6 -2
  243. package/docs/components/ui/select.md +9 -5
  244. package/docs/components/ui/switch.md +4 -1
  245. package/docs/components/ui/table.md +2 -1
  246. package/llms.txt +11 -3
  247. package/make-kit/components/form.md +2 -2
  248. package/make-kit/components/icon.md +2 -2
  249. package/make-kit/components/overview.md +2 -2
  250. package/make-kit/components/select.md +1 -1
  251. package/make-kit/components/table.md +1 -1
  252. package/mcp-manifest.json +2656 -1068
  253. package/mcp-manifest.schema.json +18 -0
  254. package/package.json +11 -6
  255. package/skill/SKILL.md +1 -1
  256. package/skill/references/components.md +11 -3
  257. package/dist/ui/status-dot.d.ts +0 -27
  258. package/dist/ui/status-dot.d.ts.map +0 -1
  259. package/dist/ui/status-dot.js +0 -68
  260. package/dist/ui/status-dot.js.map +0 -1
  261. package/docs/components/ui/status-dot.md +0 -35
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { At as e, Bt as t, Ft as n, Ht as r, It as i, Lt as a, Mt as o, Nt as s, Pt as c, Rt as l, Ut as u, Vt as d, Wt as f, jt as p, zt as m } from "../_chunks/primitives.js";
2
+ import { CheckboxItem2$2 as e, Content2$5 as t, Group2$2 as n, Item2$3 as r, ItemIndicator2$2 as i, Label2$2 as a, Portal2$2 as o, RadioGroup2$2 as s, RadioItem2$2 as c, Root2$7 as l, Separator2$2 as u, Sub2$2 as d, SubContent2$2 as f, SubTrigger2$2 as p, Trigger$7 as m } from "../_chunks/primitives.js";
3
3
  import { springs as h, tweens as g } from "./lib/motion.js";
4
4
  import { cn as _ } from "./lib/utils.js";
5
5
  import { Icon as v } from "./icon.js";
@@ -14,14 +14,14 @@ var D = y.createContext(!1), O = y.createContext(!1), k = ({ onOpenChange: e, ..
14
14
  }, [e]);
15
15
  return /* @__PURE__ */ b(D.Provider, {
16
16
  value: n,
17
- children: /* @__PURE__ */ b(m, {
17
+ children: /* @__PURE__ */ b(l, {
18
18
  onOpenChange: i,
19
19
  ...t
20
20
  })
21
21
  });
22
22
  };
23
23
  k.displayName = "ContextMenu";
24
- var A = f, j = o, M = i, N = ({ open: e, defaultOpen: t = !1, onOpenChange: n, ...r }) => {
24
+ var A = m, j = n, M = o, N = ({ open: e, defaultOpen: t = !1, onOpenChange: n, ...r }) => {
25
25
  let [i, a] = y.useState(t), o = e !== void 0, s = o ? e : i, c = y.useCallback((e) => {
26
26
  o || a(e), n?.(e);
27
27
  }, [o, n]);
@@ -35,7 +35,7 @@ var A = f, j = o, M = i, N = ({ open: e, defaultOpen: t = !1, onOpenChange: n, .
35
35
  });
36
36
  };
37
37
  N.displayName = "ContextMenuSub";
38
- var P = a, F = y.forwardRef(({ className: e, inset: t, children: n, ...r }, i) => /* @__PURE__ */ x(u, {
38
+ var P = s, F = y.forwardRef(({ className: e, inset: t, children: n, ...r }, i) => /* @__PURE__ */ x(p, {
39
39
  ref: i,
40
40
  className: _("flex cursor-default select-none items-center rounded-control px-ds-03 py-ds-02b text-ds-md outline-hidden focus:bg-surface-raised focus:text-surface-fg data-[state=open]:bg-surface-raised data-[state=open]:text-surface-fg", t && "pl-ds-07", e),
41
41
  ...r,
@@ -45,9 +45,9 @@ var P = a, F = y.forwardRef(({ className: e, inset: t, children: n, ...r }, i) =
45
45
  className: "ml-auto"
46
46
  })]
47
47
  }));
48
- F.displayName = u.displayName;
49
- var I = y.forwardRef(({ className: e, children: t, ...n }, i) => /* @__PURE__ */ b(T, { children: y.useContext(O) && /* @__PURE__ */ b(r, {
50
- ref: i,
48
+ F.displayName = p.displayName;
49
+ var I = y.forwardRef(({ className: e, children: t, ...n }, r) => /* @__PURE__ */ b(T, { children: y.useContext(O) && /* @__PURE__ */ b(f, {
50
+ ref: r,
51
51
  forceMount: !0,
52
52
  asChild: !0,
53
53
  ...n,
@@ -72,14 +72,14 @@ var I = y.forwardRef(({ className: e, children: t, ...n }, i) => /* @__PURE__ */
72
72
  children: t
73
73
  })
74
74
  }) }));
75
- I.displayName = r.displayName;
76
- var L = y.forwardRef(({ className: e, children: t, ...n }, r) => /* @__PURE__ */ b(T, { children: y.useContext(D) && /* @__PURE__ */ b(i, {
75
+ I.displayName = f.displayName;
76
+ var L = y.forwardRef(({ className: e, children: n, ...r }, i) => /* @__PURE__ */ b(T, { children: y.useContext(D) && /* @__PURE__ */ b(o, {
77
77
  forceMount: !0,
78
- children: /* @__PURE__ */ b(p, {
79
- ref: r,
78
+ children: /* @__PURE__ */ b(t, {
79
+ ref: i,
80
80
  forceMount: !0,
81
81
  asChild: !0,
82
- ...n,
82
+ ...r,
83
83
  children: /* @__PURE__ */ b(E.div, {
84
84
  initial: {
85
85
  opacity: 0,
@@ -98,57 +98,57 @@ var L = y.forwardRef(({ className: e, children: t, ...n }, r) => /* @__PURE__ */
98
98
  opacity: g.fade
99
99
  },
100
100
  className: _("z-popover rounded-overlay bg-surface-overlay p-ds-02 text-surface-fg shadow-floating", e),
101
- children: t
101
+ children: n
102
102
  })
103
103
  })
104
104
  }) }));
105
- L.displayName = p.displayName;
106
- var R = y.forwardRef(({ className: e, inset: t, ...n }, r) => /* @__PURE__ */ b(s, {
107
- ref: r,
105
+ L.displayName = t.displayName;
106
+ var R = y.forwardRef(({ className: e, inset: t, ...n }, i) => /* @__PURE__ */ b(r, {
107
+ ref: i,
108
108
  className: _("relative flex cursor-default select-none items-center rounded-control px-ds-03 py-ds-02b text-ds-md outline-hidden focus:bg-surface-raised focus:text-surface-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-action-disabled", t && "pl-ds-07", e),
109
109
  ...n
110
110
  }));
111
- R.displayName = s.displayName;
112
- var z = y.forwardRef(({ className: t, children: n, checked: r, ...i }, a) => /* @__PURE__ */ x(e, {
113
- ref: a,
111
+ R.displayName = r.displayName;
112
+ var z = y.forwardRef(({ className: t, children: n, checked: r, ...a }, o) => /* @__PURE__ */ x(e, {
113
+ ref: o,
114
114
  className: _("relative flex cursor-default select-none items-center rounded-control py-ds-02b pl-ds-07 pr-ds-03 text-ds-md outline-hidden focus:bg-surface-raised focus:text-surface-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-action-disabled", t),
115
115
  checked: r,
116
- ...i,
116
+ ...a,
117
117
  children: [/* @__PURE__ */ b("span", {
118
118
  className: "absolute left-ds-03 flex h-ico-sm w-ico-sm items-center justify-center",
119
- children: /* @__PURE__ */ b(c, { children: /* @__PURE__ */ b(v, {
119
+ children: /* @__PURE__ */ b(i, { children: /* @__PURE__ */ b(v, {
120
120
  icon: S,
121
121
  size: "sm"
122
122
  }) })
123
123
  }), n]
124
124
  }));
125
125
  z.displayName = e.displayName;
126
- var B = y.forwardRef(({ className: e, children: t, ...n }, r) => /* @__PURE__ */ x(l, {
126
+ var B = y.forwardRef(({ className: e, children: t, ...n }, r) => /* @__PURE__ */ x(c, {
127
127
  ref: r,
128
128
  className: _("relative flex cursor-default select-none items-center rounded-control py-ds-02b pl-ds-07 pr-ds-03 text-ds-md outline-hidden focus:bg-surface-raised focus:text-surface-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-action-disabled", e),
129
129
  ...n,
130
130
  children: [/* @__PURE__ */ b("span", {
131
131
  className: "absolute left-ds-03 flex h-ico-sm w-ico-sm items-center justify-center",
132
- children: /* @__PURE__ */ b(c, { children: /* @__PURE__ */ b(v, {
132
+ children: /* @__PURE__ */ b(i, { children: /* @__PURE__ */ b(v, {
133
133
  icon: w,
134
134
  size: "sm",
135
135
  className: "fill-current"
136
136
  }) })
137
137
  }), t]
138
138
  }));
139
- B.displayName = l.displayName;
140
- var V = y.forwardRef(({ className: e, inset: t, ...r }, i) => /* @__PURE__ */ b(n, {
141
- ref: i,
139
+ B.displayName = c.displayName;
140
+ var V = y.forwardRef(({ className: e, inset: t, ...n }, r) => /* @__PURE__ */ b(a, {
141
+ ref: r,
142
142
  className: _("px-ds-03 py-ds-02b text-ds-md font-semibold text-surface-fg", t && "pl-ds-07", e),
143
- ...r
143
+ ...n
144
144
  }));
145
- V.displayName = n.displayName;
146
- var H = y.forwardRef(({ className: e, ...n }, r) => /* @__PURE__ */ b(t, {
147
- ref: r,
145
+ V.displayName = a.displayName;
146
+ var H = y.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ b(u, {
147
+ ref: n,
148
148
  className: _("-mx-ds-01 my-ds-02 h-px bg-surface-border", e),
149
- ...n
149
+ ...t
150
150
  }));
151
- H.displayName = t.displayName;
151
+ H.displayName = u.displayName;
152
152
  var U = ({ className: e, ...t }) => /* @__PURE__ */ b("span", {
153
153
  className: _("ml-auto text-ds-sm text-surface-fg-subtle", e),
154
154
  ...t
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/ui/dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAG3D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,CA0BjF,CAAA;AAGD,QAAA,MAAM,aAAa,8GAA0B,CAAA;AAE7C,QAAA,MAAM,YAAY,6CAAyB,CAAA;AAE3C,QAAA,MAAM,WAAW,4GAAwB,CAAA;AAEzC,QAAA,MAAM,aAAa,8JAajB,CAAA;AAGF,UAAU,kBAAmB,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC;IACjG,+GAA+G;IAC/G,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,QAAA,MAAM,aAAa,2FAqDjB,CAAA;AAGF;;;;;GAKG;AACH,QAAA,MAAM,gBAAgB,8JASpB,CAAA;AAGF,QAAA,MAAM,YAAY,6GAWjB,CAAA;AAGD,QAAA,MAAM,YAAY,6GAWjB,CAAA;AAGD,QAAA,MAAM,WAAW,oKAYf,CAAA;AAGF,QAAA,MAAM,iBAAiB,8KASrB,CAAA;AAGF,YAAY,EAAE,kBAAkB,EAAE,CAAA;AAClC,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAE3F,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,GACd,CAAA"}
1
+ {"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/ui/dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAG3D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAc9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,CAejF,CAAA;AAGD,QAAA,MAAM,aAAa,8GAA0B,CAAA;AAE7C,QAAA,MAAM,YAAY,6CAAyB,CAAA;AAE3C,QAAA,MAAM,WAAW,4GAAwB,CAAA;AAEzC,QAAA,MAAM,aAAa,8JAajB,CAAA;AAGF,UAAU,kBAAmB,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC;IACjG,+GAA+G;IAC/G,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,QAAA,MAAM,aAAa,2FAqDjB,CAAA;AAGF;;;;;GAKG;AACH,QAAA,MAAM,gBAAgB,8JASpB,CAAA;AAGF,QAAA,MAAM,YAAY,6GAWjB,CAAA;AAGD,QAAA,MAAM,YAAY,6GAWjB,CAAA;AAGD,QAAA,MAAM,WAAW,oKAYf,CAAA;AAGF,QAAA,MAAM,iBAAiB,8KASrB,CAAA;AAGF,YAAY,EAAE,kBAAkB,EAAE,CAAA;AAClC,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAE3F,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,GACd,CAAA"}
package/dist/ui/dialog.js CHANGED
@@ -1,83 +1,86 @@
1
1
  "use client";
2
- import { An as e, Dn as t, En as n, Mn as r, Nn as i, On as a, jn as o, kn as s } from "../_chunks/primitives.js";
2
+ import { Close as e, Content$2 as t, Description as n, Overlay as r, Portal$4 as i, Root$8 as a, Title as o, Trigger$9 as s } from "../_chunks/primitives.js";
3
3
  import { springs as c, tweens as l } from "./lib/motion.js";
4
4
  import { cn as u } from "./lib/utils.js";
5
5
  import { Icon as d } from "./icon.js";
6
6
  import { useIsMobile as f } from "../hooks/use-mobile.js";
7
- import * as p from "react";
8
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
9
- import { IconX as g } from "@tabler/icons-react";
10
- import { AnimatePresence as _, motion as v } from "framer-motion";
7
+ import { useControllableOpen as p } from "../_chunks/use-controllable-open.js";
8
+ import * as m from "react";
9
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
10
+ import { IconX as _ } from "@tabler/icons-react";
11
+ import { AnimatePresence as v, motion as y } from "framer-motion";
11
12
  //#region src/ui/dialog.tsx
12
- var y = p.createContext({ open: !1 }), b = () => p.useContext(y), x = ({ open: e, defaultOpen: t, onOpenChange: n, ...r }) => {
13
- let [i, a] = p.useState(t ?? !1), s = e !== void 0, c = s ? e : i, l = p.useCallback((e) => {
14
- s || a(e), n?.(e);
15
- }, [s, n]), u = p.useMemo(() => ({ open: c }), [c]);
16
- return /* @__PURE__ */ m(y.Provider, {
17
- value: u,
18
- children: /* @__PURE__ */ m(o, {
19
- open: c,
20
- onOpenChange: l,
13
+ var b = m.createContext({ open: !1 }), x = () => m.useContext(b), S = ({ open: e, defaultOpen: t, onOpenChange: n, ...r }) => {
14
+ let { open: i, setOpen: o } = p({
15
+ open: e,
16
+ defaultOpen: t,
17
+ onOpenChange: n
18
+ }), s = m.useMemo(() => ({ open: i }), [i]);
19
+ return /* @__PURE__ */ h(b.Provider, {
20
+ value: s,
21
+ children: /* @__PURE__ */ h(a, {
22
+ open: i,
23
+ onOpenChange: o,
21
24
  ...r
22
25
  })
23
26
  });
24
27
  };
25
- x.displayName = "Dialog";
26
- var S = i, C = e, w = n, T = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m(s, {
28
+ S.displayName = "Dialog";
29
+ var C = s, w = i, T = e, E = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h(r, {
27
30
  ref: n,
28
31
  forceMount: !0,
29
32
  className: u("fixed inset-0 z-overlay bg-overlay", e),
30
33
  ...t
31
34
  }));
32
- T.displayName = s.displayName;
33
- var E = p.forwardRef(({ className: e, children: r, responsive: i, ...a }, o) => {
34
- let { open: s } = b(), p = f(), y = i !== !1 && p;
35
- return /* @__PURE__ */ m(_, { children: s && /* @__PURE__ */ h(C, {
35
+ E.displayName = r.displayName;
36
+ var D = m.forwardRef(({ className: n, children: r, responsive: i, ...a }, o) => {
37
+ let { open: s } = x(), p = f(), m = i !== !1 && p;
38
+ return /* @__PURE__ */ h(v, { children: s && /* @__PURE__ */ g(w, {
36
39
  forceMount: !0,
37
- children: [/* @__PURE__ */ m(T, {
40
+ children: [/* @__PURE__ */ h(E, {
38
41
  asChild: !0,
39
- children: /* @__PURE__ */ m(v.div, {
42
+ children: /* @__PURE__ */ h(y.div, {
40
43
  initial: { opacity: 0 },
41
44
  animate: { opacity: 1 },
42
45
  exit: { opacity: 0 },
43
46
  transition: l.fade
44
47
  })
45
- }), /* @__PURE__ */ m(t, {
48
+ }), /* @__PURE__ */ h(t, {
46
49
  ref: o,
47
50
  forceMount: !0,
48
51
  asChild: !0,
49
52
  ...a,
50
- children: /* @__PURE__ */ h(v.div, {
51
- initial: y ? { y: "100%" } : {
53
+ children: /* @__PURE__ */ g(y.div, {
54
+ initial: m ? { y: "100%" } : {
52
55
  opacity: 0,
53
56
  scale: .95,
54
57
  x: "-50%",
55
58
  y: "-50%"
56
59
  },
57
- animate: y ? { y: 0 } : {
60
+ animate: m ? { y: 0 } : {
58
61
  opacity: 1,
59
62
  scale: 1,
60
63
  x: "-50%",
61
64
  y: "-50%"
62
65
  },
63
- exit: y ? { y: "100%" } : {
66
+ exit: m ? { y: "100%" } : {
64
67
  opacity: 0,
65
68
  scale: .95,
66
69
  x: "-50%",
67
70
  y: "-50%"
68
71
  },
69
- transition: y ? c.smooth : {
72
+ transition: m ? c.smooth : {
70
73
  ...c.smooth,
71
74
  opacity: l.fade
72
75
  },
73
- className: u("fixed z-modal grid w-full gap-ds-05 bg-surface-overlay p-ds-06", i === !1 ? "left-[50%] top-[50%] max-w-lg rounded-overlay-lg shadow-overlay" : "inset-0 md:inset-auto md:left-[50%] md:top-[50%] md:max-w-lg md:rounded-overlay-lg md:shadow-overlay", e),
74
- children: [r, /* @__PURE__ */ h(n, {
76
+ className: u("fixed z-modal grid w-full gap-ds-05 bg-surface-overlay p-ds-06", i === !1 ? "left-[50%] top-[50%] max-w-lg rounded-overlay-lg shadow-overlay" : "inset-0 md:inset-auto md:left-[50%] md:top-[50%] md:max-w-lg md:rounded-overlay-lg md:shadow-overlay", n),
77
+ children: [r, /* @__PURE__ */ g(e, {
75
78
  title: "Close",
76
79
  className: "absolute right-ds-05 top-ds-05 min-h-ds-xs min-w-ds-xs flex items-center justify-center rounded-control-inner text-surface-fg-subtle transition-colors duration-fast-01 ease-productive-standard hover:text-surface-fg-muted hover:bg-surface-raised-hover active:scale-90 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 disabled:pointer-events-none",
77
- children: [/* @__PURE__ */ m(d, {
78
- icon: g,
80
+ children: [/* @__PURE__ */ h(d, {
81
+ icon: _,
79
82
  size: "lg"
80
- }), /* @__PURE__ */ m("span", {
83
+ }), /* @__PURE__ */ h("span", {
81
84
  className: "sr-only",
82
85
  children: "Close"
83
86
  })]
@@ -86,36 +89,36 @@ var E = p.forwardRef(({ className: e, children: r, responsive: i, ...a }, o) =>
86
89
  })]
87
90
  }) });
88
91
  });
89
- E.displayName = t.displayName;
90
- var D = p.forwardRef(({ className: e, ...n }, r) => /* @__PURE__ */ m(t, {
92
+ D.displayName = t.displayName;
93
+ var O = m.forwardRef(({ className: e, ...n }, r) => /* @__PURE__ */ h(t, {
91
94
  ref: r,
92
95
  className: u(e),
93
96
  ...n
94
97
  }));
95
- D.displayName = "DialogContentRaw";
96
- var O = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m("div", {
98
+ O.displayName = "DialogContentRaw";
99
+ var k = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h("div", {
97
100
  ref: n,
98
101
  className: u("flex flex-col space-y-ds-02b text-center sm:text-left", e),
99
102
  ...t
100
103
  }));
101
- O.displayName = "DialogHeader";
102
- var k = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m("div", {
104
+ k.displayName = "DialogHeader";
105
+ var A = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h("div", {
103
106
  ref: n,
104
107
  className: u("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-ds-03", e),
105
108
  ...t
106
109
  }));
107
- k.displayName = "DialogFooter";
108
- var A = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m(r, {
110
+ A.displayName = "DialogFooter";
111
+ var j = m.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ h(o, {
109
112
  ref: n,
110
113
  className: u("text-ds-lg font-semibold", e),
111
114
  ...t
112
115
  }));
113
- A.displayName = r.displayName;
114
- var j = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m(a, {
115
- ref: n,
116
+ j.displayName = o.displayName;
117
+ var M = m.forwardRef(({ className: e, ...t }, r) => /* @__PURE__ */ h(n, {
118
+ ref: r,
116
119
  className: u("text-ds-md text-surface-fg-muted", e),
117
120
  ...t
118
121
  }));
119
- j.displayName = a.displayName;
122
+ M.displayName = n.displayName;
120
123
  //#endregion
121
- export { x as Dialog, w as DialogClose, E as DialogContent, D as DialogContentRaw, j as DialogDescription, k as DialogFooter, O as DialogHeader, T as DialogOverlay, C as DialogPortal, A as DialogTitle, S as DialogTrigger };
124
+ export { S as Dialog, T as DialogClose, D as DialogContent, O as DialogContentRaw, M as DialogDescription, A as DialogFooter, k as DialogHeader, E as DialogOverlay, w as DialogPortal, j as DialogTitle, C as DialogTrigger };
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.js","names":[],"sources":["../../src/ui/dialog.tsx"],"sourcesContent":["'use client'\n\nimport * as DialogPrimitive from '@primitives/react-dialog'\nimport { IconX as CloseIcon } from '@tabler/icons-react'\nimport { AnimatePresence,motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useIsMobile } from '../hooks/use-mobile'\nimport { Icon } from './icon'\nimport { springs, tweens } from './lib/motion'\nimport { cn } from './lib/utils'\n\n// ── Internal context to thread `open` state to animated children ──\n\ntype DialogContextValue = { open: boolean }\nconst DialogContext = React.createContext<DialogContextValue>({ open: false })\nconst useDialogOpen = () => React.useContext(DialogContext)\n\n/**\n * Dialog compound component — accessible modal overlay with focus trap and Escape dismissal.\n *\n * **Parts (in composition order):**\n * - `Dialog` — manages open/closed state (this root)\n * - `DialogTrigger` — element that opens the dialog (use `asChild` to render your own button)\n * - `DialogContent` — the modal panel (auto-includes portal, overlay, and close button)\n * - `DialogHeader` — optional layout wrapper for title + description\n * - `DialogTitle` — required for accessibility (sets the dialog's ARIA label)\n * - `DialogDescription` — optional subtitle text\n * - `DialogFooter` — optional layout wrapper for action buttons\n * - `DialogClose` — manual close trigger (a close button is already built into DialogContent)\n * - `DialogContentRaw` — use instead of DialogContent when you need full portal/overlay control\n * - `DialogPortal` — low-level portal wrapper (exported for custom layout; used internally by DialogContent)\n * - `DialogOverlay` — the backdrop element (exported for custom overlay styling or positioning)\n *\n * @compound\n * @example\n * // Confirmation dialog:\n * <Dialog>\n * <DialogTrigger asChild>\n * <Button variant=\"solid\" color=\"error\">Delete project</Button>\n * </DialogTrigger>\n * <DialogContent>\n * <DialogHeader>\n * <DialogTitle>Are you absolutely sure?</DialogTitle>\n * <DialogDescription>\n * This action cannot be undone. This will permanently delete your project.\n * </DialogDescription>\n * </DialogHeader>\n * <DialogFooter>\n * <DialogClose asChild><Button variant=\"outline\">Cancel</Button></DialogClose>\n * <Button variant=\"solid\" color=\"error\" onClick={handleDelete}>Delete</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n *\n * @example\n * // Controlled open state (no trigger in markup):\n * const [open, setOpen] = useState(false)\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogContent>\n * <DialogTitle>Edit profile</DialogTitle>\n * // form fields\n * </DialogContent>\n * </Dialog>\n */\nconst Dialog: React.FC<React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>> = ({\n open: openProp,\n defaultOpen,\n onOpenChange,\n ...props\n}) => {\n // Track internal open state for uncontrolled usage\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen ?? false)\n const isControlled = openProp !== undefined\n const open = isControlled ? openProp : internalOpen\n\n const handleOpenChange = React.useCallback(\n (nextOpen: boolean) => {\n if (!isControlled) setInternalOpen(nextOpen)\n onOpenChange?.(nextOpen)\n },\n [isControlled, onOpenChange],\n )\n\n const contextValue = React.useMemo(() => ({ open }), [open])\n\n return (\n <DialogContext.Provider value={contextValue}>\n <DialogPrimitive.Root open={open} onOpenChange={handleOpenChange} {...props} />\n </DialogContext.Provider>\n )\n}\nDialog.displayName = 'Dialog'\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n forceMount\n className={cn(\n 'fixed inset-0 z-overlay bg-overlay',\n className,\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\ninterface DialogContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /** When true (default), Dialog fills the screen on mobile (<768px). Set false to always use centered modal. */\n responsive?: boolean\n}\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, responsive, ...props }, ref) => {\n const { open } = useDialogOpen()\n const isMobileRaw = useIsMobile()\n const isMobile = responsive !== false && isMobileRaw\n\n return (\n <AnimatePresence>\n {open && (\n <DialogPortal forceMount>\n <DialogOverlay asChild>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={tweens.fade}\n />\n </DialogOverlay>\n <DialogPrimitive.Content\n ref={ref}\n forceMount\n asChild\n {...props}\n >\n <motion.div\n initial={isMobile ? { y: '100%' } : { opacity: 0, scale: 0.95, x: '-50%', y: '-50%' }}\n animate={isMobile ? { y: 0 } : { opacity: 1, scale: 1, x: '-50%', y: '-50%' }}\n exit={isMobile ? { y: '100%' } : { opacity: 0, scale: 0.95, x: '-50%', y: '-50%' }}\n transition={isMobile\n ? springs.smooth\n : { ...springs.smooth, opacity: tweens.fade }\n }\n className={cn(\n 'fixed z-modal grid w-full gap-ds-05 bg-surface-overlay p-ds-06',\n responsive !== false\n ? 'inset-0 md:inset-auto md:left-[50%] md:top-[50%] md:max-w-lg md:rounded-overlay-lg md:shadow-overlay'\n : 'left-[50%] top-[50%] max-w-lg rounded-overlay-lg shadow-overlay',\n className,\n )}\n >\n {children}\n <DialogPrimitive.Close title=\"Close\" className=\"absolute right-ds-05 top-ds-05 min-h-ds-xs min-w-ds-xs flex items-center justify-center rounded-control-inner text-surface-fg-subtle transition-colors duration-fast-01 ease-productive-standard hover:text-surface-fg-muted hover:bg-surface-raised-hover active:scale-90 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 disabled:pointer-events-none\">\n <Icon icon={CloseIcon} size=\"lg\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </motion.div>\n </DialogPrimitive.Content>\n </DialogPortal>\n )}\n </AnimatePresence>\n )\n})\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\n/**\n * DialogContentRaw -- a minimal forwardRef wrapper around the primitive Content.\n * Unlike DialogContent, it does NOT include Portal, Overlay, or CloseButton.\n * Use this when you need full control over portal/overlay/close behaviour\n * (e.g. CommandPalette in shared/).\n */\nconst DialogContentRaw = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Content\n ref={ref}\n className={cn(className)}\n {...props}\n />\n))\nDialogContentRaw.displayName = 'DialogContentRaw'\n\nconst DialogHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col space-y-ds-02b text-center sm:text-left',\n className,\n )}\n {...props}\n />\n ),\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-ds-03',\n className,\n )}\n {...props}\n />\n ),\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n 'text-ds-lg font-semibold',\n className,\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-ds-md text-surface-fg-muted', className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport type { DialogContentProps }\nexport type DialogTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogContentRaw,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dialog.js","names":[],"sources":["../../src/ui/dialog.tsx"],"sourcesContent":["'use client'\n\nimport * as DialogPrimitive from '@primitives/react-dialog'\nimport { IconX as CloseIcon } from '@tabler/icons-react'\nimport { AnimatePresence,motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useIsMobile } from '../hooks/use-mobile'\nimport { Icon } from './icon'\nimport { springs, tweens } from './lib/motion'\nimport { useControllableOpen } from './lib/use-controllable-open'\nimport { cn } from './lib/utils'\n\n// ── Internal context to thread `open` state to animated children ──\n\ntype DialogContextValue = { open: boolean }\nconst DialogContext = React.createContext<DialogContextValue>({ open: false })\nconst useDialogOpen = () => React.useContext(DialogContext)\n\n/**\n * Dialog compound component — accessible modal overlay with focus trap and Escape dismissal.\n *\n * **Parts (in composition order):**\n * - `Dialog` — manages open/closed state (this root)\n * - `DialogTrigger` — element that opens the dialog (use `asChild` to render your own button)\n * - `DialogContent` — the modal panel (auto-includes portal, overlay, and close button)\n * - `DialogHeader` — optional layout wrapper for title + description\n * - `DialogTitle` — required for accessibility (sets the dialog's ARIA label)\n * - `DialogDescription` — optional subtitle text\n * - `DialogFooter` — optional layout wrapper for action buttons\n * - `DialogClose` — manual close trigger (a close button is already built into DialogContent)\n * - `DialogContentRaw` — use instead of DialogContent when you need full portal/overlay control\n * - `DialogPortal` — low-level portal wrapper (exported for custom layout; used internally by DialogContent)\n * - `DialogOverlay` — the backdrop element (exported for custom overlay styling or positioning)\n *\n * @compound\n * @example\n * // Confirmation dialog:\n * <Dialog>\n * <DialogTrigger asChild>\n * <Button variant=\"solid\" color=\"error\">Delete project</Button>\n * </DialogTrigger>\n * <DialogContent>\n * <DialogHeader>\n * <DialogTitle>Are you absolutely sure?</DialogTitle>\n * <DialogDescription>\n * This action cannot be undone. This will permanently delete your project.\n * </DialogDescription>\n * </DialogHeader>\n * <DialogFooter>\n * <DialogClose asChild><Button variant=\"outline\">Cancel</Button></DialogClose>\n * <Button variant=\"solid\" color=\"error\" onClick={handleDelete}>Delete</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n *\n * @example\n * // Controlled open state (no trigger in markup):\n * const [open, setOpen] = useState(false)\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogContent>\n * <DialogTitle>Edit profile</DialogTitle>\n * // form fields\n * </DialogContent>\n * </Dialog>\n */\nconst Dialog: React.FC<React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>> = ({\n open: openProp,\n defaultOpen,\n onOpenChange,\n ...props\n}) => {\n const { open, setOpen } = useControllableOpen({ open: openProp, defaultOpen, onOpenChange })\n\n const contextValue = React.useMemo(() => ({ open }), [open])\n\n return (\n <DialogContext.Provider value={contextValue}>\n <DialogPrimitive.Root open={open} onOpenChange={setOpen} {...props} />\n </DialogContext.Provider>\n )\n}\nDialog.displayName = 'Dialog'\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n forceMount\n className={cn(\n 'fixed inset-0 z-overlay bg-overlay',\n className,\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\ninterface DialogContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /** When true (default), Dialog fills the screen on mobile (<768px). Set false to always use centered modal. */\n responsive?: boolean\n}\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(({ className, children, responsive, ...props }, ref) => {\n const { open } = useDialogOpen()\n const isMobileRaw = useIsMobile()\n const isMobile = responsive !== false && isMobileRaw\n\n return (\n <AnimatePresence>\n {open && (\n <DialogPortal forceMount>\n <DialogOverlay asChild>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={tweens.fade}\n />\n </DialogOverlay>\n <DialogPrimitive.Content\n ref={ref}\n forceMount\n asChild\n {...props}\n >\n <motion.div\n initial={isMobile ? { y: '100%' } : { opacity: 0, scale: 0.95, x: '-50%', y: '-50%' }}\n animate={isMobile ? { y: 0 } : { opacity: 1, scale: 1, x: '-50%', y: '-50%' }}\n exit={isMobile ? { y: '100%' } : { opacity: 0, scale: 0.95, x: '-50%', y: '-50%' }}\n transition={isMobile\n ? springs.smooth\n : { ...springs.smooth, opacity: tweens.fade }\n }\n className={cn(\n 'fixed z-modal grid w-full gap-ds-05 bg-surface-overlay p-ds-06',\n responsive !== false\n ? 'inset-0 md:inset-auto md:left-[50%] md:top-[50%] md:max-w-lg md:rounded-overlay-lg md:shadow-overlay'\n : 'left-[50%] top-[50%] max-w-lg rounded-overlay-lg shadow-overlay',\n className,\n )}\n >\n {children}\n <DialogPrimitive.Close title=\"Close\" className=\"absolute right-ds-05 top-ds-05 min-h-ds-xs min-w-ds-xs flex items-center justify-center rounded-control-inner text-surface-fg-subtle transition-colors duration-fast-01 ease-productive-standard hover:text-surface-fg-muted hover:bg-surface-raised-hover active:scale-90 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 disabled:pointer-events-none\">\n <Icon icon={CloseIcon} size=\"lg\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </motion.div>\n </DialogPrimitive.Content>\n </DialogPortal>\n )}\n </AnimatePresence>\n )\n})\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\n/**\n * DialogContentRaw -- a minimal forwardRef wrapper around the primitive Content.\n * Unlike DialogContent, it does NOT include Portal, Overlay, or CloseButton.\n * Use this when you need full control over portal/overlay/close behaviour\n * (e.g. CommandPalette in shared/).\n */\nconst DialogContentRaw = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Content\n ref={ref}\n className={cn(className)}\n {...props}\n />\n))\nDialogContentRaw.displayName = 'DialogContentRaw'\n\nconst DialogHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col space-y-ds-02b text-center sm:text-left',\n className,\n )}\n {...props}\n />\n ),\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-ds-03',\n className,\n )}\n {...props}\n />\n ),\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n 'text-ds-lg font-semibold',\n className,\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-ds-md text-surface-fg-muted', className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport type { DialogContentProps }\nexport type DialogTitleProps = React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogContentRaw,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import * as React from 'react';
4
+ export type DotColor = 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'current';
5
+ export type DotSize = 'xs' | 'sm' | 'md' | 'lg';
6
+ export type DotVariant = 'filled' | 'ring' | 'off';
7
+ declare const dotVariants: (props?: ({
8
+ size?: "xs" | "sm" | "md" | "lg" | null | undefined;
9
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
10
+ /**
11
+ * Props for Dot — a small semantic indicator dot.
12
+ *
13
+ * @example
14
+ * <Dot color="success" /> // bare dot
15
+ * <Dot color="error" pulse pulseSpeed="fast" label="Recording" />
16
+ * <Dot color="neutral" variant="off" label="Offline" /> // inactive
17
+ * <Dot color="success" withBorder /> // contrast ring on busy bg
18
+ */
19
+ export interface DotProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'color'>, VariantProps<typeof dotVariants> {
20
+ /** Intent colour, or `current` to inherit text colour. @default 'neutral' */
21
+ color?: DotColor;
22
+ /** `filled` disc, hollow `ring`, or `off` (faint fill + light border = inactive). @default 'filled' */
23
+ variant?: DotVariant;
24
+ /** A contrast ring around the dot so it stays visible on busy/colored backgrounds. @default false */
25
+ withBorder?: boolean;
26
+ /** Animate a pulsing ripple (ignored for `off`). @default false */
27
+ pulse?: boolean;
28
+ /** Pulse tempo. @default 'normal' */
29
+ pulseSpeed?: 'slow' | 'normal' | 'fast';
30
+ /** Inline label. Makes the dot an announced status. */
31
+ label?: React.ReactNode;
32
+ /** Which side the label sits on. @default 'end' */
33
+ labelPosition?: 'start' | 'end';
34
+ labelClassName?: string;
35
+ }
36
+ declare const Dot: React.ForwardRefExoticComponent<DotProps & React.RefAttributes<HTMLSpanElement>>;
37
+ export { Dot, dotVariants };
38
+ //# sourceMappingURL=dot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dot.d.ts","sourceRoot":"","sources":["../../src/ui/dot.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAmB9B,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;AAClG,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC/C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAA;AA4DlD,QAAA,MAAM,WAAW;;8EAUf,CAAA;AASF;;;;;;;;GAQG;AACH,MAAM,WAAW,QACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,EAC1D,YAAY,CAAC,OAAO,WAAW,CAAC;IAClC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,uGAAuG;IACvG,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,qGAAqG;IACrG,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,mEAAmE;IACnE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;IACvC,uDAAuD;IACvD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,mDAAmD;IACnD,aAAa,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,QAAA,MAAM,GAAG,kFA8DR,CAAA;AAGD,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,CAAA"}
package/dist/ui/dot.js ADDED
@@ -0,0 +1,92 @@
1
+ "use client";
2
+ import { cva as e } from "../_chunks/vendor-utils.js";
3
+ import { cn as t } from "./lib/utils.js";
4
+ import * as n from "react";
5
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
6
+ //#region src/ui/dot.tsx
7
+ var a = {
8
+ accent: "bg-accent-9",
9
+ success: "bg-success-9",
10
+ warning: "bg-warning-9",
11
+ error: "bg-error-9",
12
+ info: "bg-info-9",
13
+ neutral: "bg-neutral-8",
14
+ current: "bg-current"
15
+ }, o = {
16
+ accent: "border-accent-9",
17
+ success: "border-success-9",
18
+ warning: "border-warning-9",
19
+ error: "border-error-9",
20
+ info: "border-info-9",
21
+ neutral: "border-neutral-8",
22
+ current: "border-current"
23
+ }, s = {
24
+ accent: "border-accent-9/40 bg-accent-9/10",
25
+ success: "border-success-9/40 bg-success-9/10",
26
+ warning: "border-warning-9/40 bg-warning-9/10",
27
+ error: "border-error-9/40 bg-error-9/10",
28
+ info: "border-info-9/40 bg-info-9/10",
29
+ neutral: "border-neutral-8/40 bg-neutral-8/10",
30
+ current: "border-current/40 bg-current/10"
31
+ }, c = {
32
+ accent: "bg-accent-9/40",
33
+ success: "bg-success-9/40",
34
+ warning: "bg-warning-9/40",
35
+ error: "bg-error-9/40",
36
+ info: "bg-info-9/40",
37
+ neutral: "bg-neutral-8/40",
38
+ current: "bg-current/40"
39
+ }, l = {
40
+ accent: "text-accent-11",
41
+ success: "text-success-11",
42
+ warning: "text-warning-11",
43
+ error: "text-error-11",
44
+ info: "text-info-11",
45
+ neutral: "text-surface-fg-muted",
46
+ current: ""
47
+ }, u = {
48
+ slow: "2s",
49
+ normal: "1s",
50
+ fast: "0.6s"
51
+ }, d = e("relative inline-flex shrink-0 rounded-pill", {
52
+ variants: { size: {
53
+ xs: "h-1 w-1",
54
+ sm: "h-1.5 w-1.5",
55
+ md: "h-2 w-2",
56
+ lg: "h-2.5 w-2.5"
57
+ } },
58
+ defaultVariants: { size: "md" }
59
+ }), f = {
60
+ xs: "text-ds-xs",
61
+ sm: "text-ds-xs",
62
+ md: "text-ds-sm",
63
+ lg: "text-ds-sm"
64
+ }, p = n.forwardRef(({ color: e = "neutral", size: n = "md", variant: p = "filled", withBorder: m = !1, pulse: h = !1, pulseSpeed: g = "normal", label: _, labelPosition: v = "end", labelClassName: y, className: b, "aria-label": x, ...S }, C) => {
65
+ let w = n ?? "md", T = _ != null || x != null, E = h && p !== "off", D = t(d({ size: w }), p === "filled" && a[e], p === "ring" && t("border-[1.5px] bg-transparent", o[e]), p === "off" && t("border", s[e]), m && "ring-2 ring-surface-raised"), O = _ == null ? null : /* @__PURE__ */ r("span", {
66
+ className: t(f[w], l[e], "font-sans", y),
67
+ children: _
68
+ });
69
+ return /* @__PURE__ */ i("span", {
70
+ ref: C,
71
+ role: T ? "status" : void 0,
72
+ "aria-hidden": T ? void 0 : !0,
73
+ "aria-label": x,
74
+ className: t("inline-flex items-center gap-ds-02", b),
75
+ ...S,
76
+ children: [
77
+ v === "start" && O,
78
+ /* @__PURE__ */ i("span", {
79
+ className: "relative inline-flex shrink-0",
80
+ children: [E && /* @__PURE__ */ r("span", {
81
+ "data-pulse": "",
82
+ style: { animationDuration: u[g] },
83
+ className: t("absolute inset-0 inline-flex rounded-pill animate-ping motion-reduce:animate-none", c[e])
84
+ }), /* @__PURE__ */ r("span", { className: D })]
85
+ }),
86
+ v === "end" && O
87
+ ]
88
+ });
89
+ });
90
+ p.displayName = "Dot";
91
+ //#endregion
92
+ export { p as Dot, d as dotVariants };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dot.js","names":[],"sources":["../../src/ui/dot.tsx"],"sourcesContent":["'use client'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from './lib/utils'\n\n/* ---------------------------------------------------------------------------\n * Dot — a small semantic status/indicator dot. The low-level primitive behind\n * StatusBadge, status/presence/health indicators, legend swatches, Avatar status.\n *\n * Intent-coloured, sized (xs–lg), filled / ring / off, optionally pulsing (with\n * a speed), optionally with a contrast border, and an optional label on either\n * side. Decorative by default (aria-hidden); a `label` (or `aria-label`) makes\n * it an announced status.\n *\n * For a dot/count that overlays a child element (notification badge), use\n * `BadgeIndicator` instead — that's the positioned-overlay pattern.\n *\n * API informed by Mantine `Indicator`, Ant `Badge status`, Chakra `Status`.\n * ------------------------------------------------------------------------ */\n\nexport type DotColor = 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'current'\nexport type DotSize = 'xs' | 'sm' | 'md' | 'lg'\nexport type DotVariant = 'filled' | 'ring' | 'off'\n\nconst FILL: Record<DotColor, string> = {\n accent: 'bg-accent-9',\n success: 'bg-success-9',\n warning: 'bg-warning-9',\n error: 'bg-error-9',\n info: 'bg-info-9',\n neutral: 'bg-neutral-8',\n current: 'bg-current',\n}\n\nconst RING: Record<DotColor, string> = {\n accent: 'border-accent-9',\n success: 'border-success-9',\n warning: 'border-warning-9',\n error: 'border-error-9',\n info: 'border-info-9',\n neutral: 'border-neutral-8',\n current: 'border-current',\n}\n\n// Off — \"exists but inactive\": faint same-tone fill + a light border.\nconst OFF: Record<DotColor, string> = {\n accent: 'border-accent-9/40 bg-accent-9/10',\n success: 'border-success-9/40 bg-success-9/10',\n warning: 'border-warning-9/40 bg-warning-9/10',\n error: 'border-error-9/40 bg-error-9/10',\n info: 'border-info-9/40 bg-info-9/10',\n neutral: 'border-neutral-8/40 bg-neutral-8/10',\n current: 'border-current/40 bg-current/10',\n}\n\n// Pulse ripple — the fill colour at low opacity.\nconst PULSE: Record<DotColor, string> = {\n accent: 'bg-accent-9/40',\n success: 'bg-success-9/40',\n warning: 'bg-warning-9/40',\n error: 'bg-error-9/40',\n info: 'bg-info-9/40',\n neutral: 'bg-neutral-8/40',\n current: 'bg-current/40',\n}\n\nconst TEXT: Record<DotColor, string> = {\n accent: 'text-accent-11',\n success: 'text-success-11',\n warning: 'text-warning-11',\n error: 'text-error-11',\n info: 'text-info-11',\n neutral: 'text-surface-fg-muted',\n current: '',\n}\n\nconst PULSE_SPEED: Record<'slow' | 'normal' | 'fast', string> = {\n slow: '2s',\n normal: '1s',\n fast: '0.6s',\n}\n\nconst dotVariants = cva('relative inline-flex shrink-0 rounded-pill', {\n variants: {\n size: {\n xs: 'h-1 w-1',\n sm: 'h-1.5 w-1.5',\n md: 'h-2 w-2',\n lg: 'h-2.5 w-2.5',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nconst labelTextSize: Record<DotSize, string> = {\n xs: 'text-ds-xs',\n sm: 'text-ds-xs',\n md: 'text-ds-sm',\n lg: 'text-ds-sm',\n}\n\n/**\n * Props for Dot — a small semantic indicator dot.\n *\n * @example\n * <Dot color=\"success\" /> // bare dot\n * <Dot color=\"error\" pulse pulseSpeed=\"fast\" label=\"Recording\" />\n * <Dot color=\"neutral\" variant=\"off\" label=\"Offline\" /> // inactive\n * <Dot color=\"success\" withBorder /> // contrast ring on busy bg\n */\nexport interface DotProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'color'>,\n VariantProps<typeof dotVariants> {\n /** Intent colour, or `current` to inherit text colour. @default 'neutral' */\n color?: DotColor\n /** `filled` disc, hollow `ring`, or `off` (faint fill + light border = inactive). @default 'filled' */\n variant?: DotVariant\n /** A contrast ring around the dot so it stays visible on busy/colored backgrounds. @default false */\n withBorder?: boolean\n /** Animate a pulsing ripple (ignored for `off`). @default false */\n pulse?: boolean\n /** Pulse tempo. @default 'normal' */\n pulseSpeed?: 'slow' | 'normal' | 'fast'\n /** Inline label. Makes the dot an announced status. */\n label?: React.ReactNode\n /** Which side the label sits on. @default 'end' */\n labelPosition?: 'start' | 'end'\n labelClassName?: string\n}\n\nconst Dot = React.forwardRef<HTMLSpanElement, DotProps>(\n (\n {\n color = 'neutral',\n size = 'md',\n variant = 'filled',\n withBorder = false,\n pulse = false,\n pulseSpeed = 'normal',\n label,\n labelPosition = 'end',\n labelClassName,\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n ) => {\n const resolvedSize = size ?? 'md'\n // A dot with a label (or explicit aria-label) is an announced status;\n // a bare dot is decorative (the surrounding element carries the meaning).\n const isAnnounced = label != null || ariaLabel != null\n // Off dots are inactive — a pulse would contradict that.\n const showPulse = pulse && variant !== 'off'\n\n const disc = cn(\n dotVariants({ size: resolvedSize }),\n variant === 'filled' && FILL[color],\n variant === 'ring' && cn('border-[1.5px] bg-transparent', RING[color]),\n variant === 'off' && cn('border', OFF[color]),\n withBorder && 'ring-2 ring-surface-raised',\n )\n\n const labelEl =\n label != null ? (\n <span className={cn(labelTextSize[resolvedSize], TEXT[color], 'font-sans', labelClassName)}>{label}</span>\n ) : null\n\n return (\n <span\n ref={ref}\n role={isAnnounced ? 'status' : undefined}\n aria-hidden={isAnnounced ? undefined : true}\n aria-label={ariaLabel}\n className={cn('inline-flex items-center gap-ds-02', className)}\n {...props}\n >\n {labelPosition === 'start' && labelEl}\n <span className=\"relative inline-flex shrink-0\">\n {showPulse && (\n <span\n data-pulse=\"\"\n style={{ animationDuration: PULSE_SPEED[pulseSpeed] }}\n className={cn('absolute inset-0 inline-flex rounded-pill animate-ping motion-reduce:animate-none', PULSE[color])}\n />\n )}\n <span className={disc} />\n </span>\n {labelPosition === 'end' && labelEl}\n </span>\n )\n },\n)\nDot.displayName = 'Dot'\n\nexport { Dot, dotVariants }\n"],"mappings":";;;;;;AA0BA,IAAM,IAAiC;CACrC,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACV,EAEK,IAAiC;CACrC,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACV,EAGK,IAAgC;CACpC,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACV,EAGK,IAAkC;CACtC,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACV,EAEK,IAAiC;CACrC,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,SAAS;CACV,EAEK,IAA0D;CAC9D,MAAM;CACN,QAAQ;CACR,MAAM;CACP,EAEK,IAAc,EAAI,8CAA8C;CACpE,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACL,EACF;CACD,iBAAiB,EAAE,MAAM,MAAM;CAChC,CAAC,EAEI,IAAyC;CAC7C,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACL,EA+BK,IAAM,EAAM,YAEd,EACE,WAAQ,WACR,UAAO,MACP,aAAU,UACV,gBAAa,IACb,WAAQ,IACR,gBAAa,UACb,UACA,mBAAgB,OAChB,mBACA,cACA,cAAc,GACd,GAAG,KAEL,MACG;CACH,IAAM,IAAe,KAAQ,MAGvB,IAAc,KAAS,QAAQ,KAAa,MAE5C,IAAY,KAAS,MAAY,OAEjC,IAAO,EACX,EAAY,EAAE,MAAM,GAAc,CAAC,EACnC,MAAY,YAAY,EAAK,IAC7B,MAAY,UAAU,EAAG,iCAAiC,EAAK,GAAO,EACtE,MAAY,SAAS,EAAG,UAAU,EAAI,GAAO,EAC7C,KAAc,6BACf,EAEK,IACJ,KAAS,OAEL,OADF,kBAAC,QAAD;EAAM,WAAW,EAAG,EAAc,IAAe,EAAK,IAAQ,aAAa,EAAe;YAAG;EAAa,CAAA;AAG9G,QACE,kBAAC,QAAD;EACO;EACL,MAAM,IAAc,WAAW,KAAA;EAC/B,eAAa,IAAc,KAAA,IAAY;EACvC,cAAY;EACZ,WAAW,EAAG,sCAAsC,EAAU;EAC9D,GAAI;YANN;GAQG,MAAkB,WAAW;GAC9B,kBAAC,QAAD;IAAM,WAAU;cAAhB,CACG,KACC,kBAAC,QAAD;KACE,cAAW;KACX,OAAO,EAAE,mBAAmB,EAAY,IAAa;KACrD,WAAW,EAAG,qFAAqF,EAAM,GAAO;KAChH,CAAA,EAEJ,kBAAC,QAAD,EAAM,WAAW,GAAQ,CAAA,CACpB;;GACN,MAAkB,SAAS;GACvB;;EAGZ;AACD,EAAI,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../src/ui/dropdown-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,qBAAqB,MAAM,iCAAiC,CAAA;AAGxE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAuB7F,CAAA;AAGD,QAAA,MAAM,mBAAmB,0HAAgC,CAAA;AAEzD,QAAA,MAAM,iBAAiB,qHAA8B,CAAA;AAErD,QAAA,MAAM,kBAAkB,yDAA+B,CAAA;AAEvD,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAuB/F,CAAA;AAGD,QAAA,MAAM,sBAAsB,0HAAmC,CAAA;AAE/D,QAAA,MAAM,sBAAsB;YAGhB,OAAO;wCAejB,CAAA;AAIF,QAAA,MAAM,sBAAsB,6KA+B1B,CAAA;AAIF,QAAA,MAAM,mBAAmB,0KAkCvB,CAAA;AAGF,QAAA,MAAM,gBAAgB;YAGV,OAAO;wCAYjB,CAAA;AAGF,QAAA,MAAM,wBAAwB,+KAoB5B,CAAA;AAIF,QAAA,MAAM,qBAAqB,4KAmBzB,CAAA;AAGF,QAAA,MAAM,iBAAiB;YAGX,OAAO;wCAYjB,CAAA;AAGF,QAAA,MAAM,qBAAqB,4KASzB,CAAA;AAGF,QAAA,MAAM,oBAAoB;8BAGvB,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;;CAOvC,CAAA;AAGD,MAAM,MAAM,wBAAwB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC3G,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAA;AAErG,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,CAAA"}
1
+ {"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../src/ui/dropdown-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,qBAAqB,MAAM,iCAAiC,CAAA;AAGxE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAa7F,CAAA;AAGD,QAAA,MAAM,mBAAmB,0HAAgC,CAAA;AAEzD,QAAA,MAAM,iBAAiB,qHAA8B,CAAA;AAErD,QAAA,MAAM,kBAAkB,yDAA+B,CAAA;AAEvD,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAa/F,CAAA;AAGD,QAAA,MAAM,sBAAsB,0HAAmC,CAAA;AAE/D,QAAA,MAAM,sBAAsB;YAGhB,OAAO;wCAejB,CAAA;AAIF,QAAA,MAAM,sBAAsB,6KA+B1B,CAAA;AAIF,QAAA,MAAM,mBAAmB,0KAkCvB,CAAA;AAGF,QAAA,MAAM,gBAAgB;YAGV,OAAO;wCAYjB,CAAA;AAGF,QAAA,MAAM,wBAAwB,+KAoB5B,CAAA;AAIF,QAAA,MAAM,qBAAqB,4KAmBzB,CAAA;AAGF,QAAA,MAAM,iBAAiB;YAGX,OAAO;wCAYjB,CAAA;AAGF,QAAA,MAAM,qBAAqB,4KASzB,CAAA;AAGF,QAAA,MAAM,oBAAoB;8BAGvB,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;;CAOvC,CAAA;AAGD,MAAM,MAAM,wBAAwB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC3G,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAA;AAErG,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,CAAA"}