@devalok/shilp-sutra 0.56.0 → 0.57.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 (253) hide show
  1. package/MIGRATION.md +107 -0
  2. package/dist/_chunks/badge-group.js +48 -34
  3. package/dist/_chunks/badge-group.js.map +1 -1
  4. package/dist/_chunks/chat.js +91 -75
  5. package/dist/_chunks/chat.js.map +1 -1
  6. package/dist/_chunks/document-preview.js +1 -1
  7. package/dist/_chunks/document-preview.js.map +1 -1
  8. package/dist/_chunks/emoji-suggestion.js +1 -1
  9. package/dist/_chunks/emoji-suggestion.js.map +1 -1
  10. package/dist/_chunks/mention-suggestion.js +2 -2
  11. package/dist/_chunks/mention-suggestion.js.map +1 -1
  12. package/dist/_chunks/oauth-button.js +1 -1
  13. package/dist/_chunks/oauth-button.js.map +1 -1
  14. package/dist/_chunks/success.js +2 -2
  15. package/dist/_chunks/success.js.map +1 -1
  16. package/dist/_chunks/tree-view.js +1 -1
  17. package/dist/_chunks/tree-view.js.map +1 -1
  18. package/dist/_chunks/use-calendar.js +4 -4
  19. package/dist/_chunks/use-calendar.js.map +1 -1
  20. package/dist/ai/blocks/text.js +1 -1
  21. package/dist/ai/blocks/text.js.map +1 -1
  22. package/dist/ai/command-bar.js +9 -9
  23. package/dist/ai/command-bar.js.map +1 -1
  24. package/dist/ai/conversation.js +2 -2
  25. package/dist/ai/conversation.js.map +1 -1
  26. package/dist/composed/activity-feed.js +1 -1
  27. package/dist/composed/activity-feed.js.map +1 -1
  28. package/dist/composed/avatar-group.d.ts +7 -2
  29. package/dist/composed/avatar-group.d.ts.map +1 -1
  30. package/dist/composed/avatar-group.js +3 -3
  31. package/dist/composed/avatar-group.js.map +1 -1
  32. package/dist/composed/command-palette.js +7 -7
  33. package/dist/composed/command-palette.js.map +1 -1
  34. package/dist/composed/content-card.js +2 -2
  35. package/dist/composed/content-card.js.map +1 -1
  36. package/dist/composed/date-picker/index.js +4 -4
  37. package/dist/composed/date-picker/index.js.map +1 -1
  38. package/dist/composed/diff.d.ts +23 -2
  39. package/dist/composed/diff.d.ts.map +1 -1
  40. package/dist/composed/diff.js +341 -260
  41. package/dist/composed/diff.js.map +1 -1
  42. package/dist/composed/emoji-picker.js +3 -3
  43. package/dist/composed/emoji-picker.js.map +1 -1
  44. package/dist/composed/error-boundary.js +2 -2
  45. package/dist/composed/error-boundary.js.map +1 -1
  46. package/dist/composed/file-preview.js +1 -1
  47. package/dist/composed/file-preview.js.map +1 -1
  48. package/dist/composed/filter-bar.js +1 -1
  49. package/dist/composed/filter-bar.js.map +1 -1
  50. package/dist/composed/inline-edit.js +1 -1
  51. package/dist/composed/inline-edit.js.map +1 -1
  52. package/dist/composed/loading-skeleton.js +3 -3
  53. package/dist/composed/loading-skeleton.js.map +1 -1
  54. package/dist/composed/master-detail.js +1 -1
  55. package/dist/composed/master-detail.js.map +1 -1
  56. package/dist/composed/member-picker.js +1 -1
  57. package/dist/composed/member-picker.js.map +1 -1
  58. package/dist/composed/multi-select-popover.js +1 -1
  59. package/dist/composed/multi-select-popover.js.map +1 -1
  60. package/dist/composed/page-skeletons.js +4 -4
  61. package/dist/composed/page-skeletons.js.map +1 -1
  62. package/dist/composed/responsive-modal.js +1 -1
  63. package/dist/composed/responsive-modal.js.map +1 -1
  64. package/dist/composed/rich-chat-input.js +17 -17
  65. package/dist/composed/rich-chat-input.js.map +1 -1
  66. package/dist/composed/rich-text-editor.js +5 -5
  67. package/dist/composed/rich-text-editor.js.map +1 -1
  68. package/dist/composed/schedule-view.js +5 -5
  69. package/dist/composed/schedule-view.js.map +1 -1
  70. package/dist/hooks/index.d.ts +1 -0
  71. package/dist/hooks/index.d.ts.map +1 -1
  72. package/dist/hooks/index.js +4 -3
  73. package/dist/hooks/use-container-size.d.ts +18 -0
  74. package/dist/hooks/use-container-size.d.ts.map +1 -0
  75. package/dist/hooks/use-container-size.js +28 -0
  76. package/dist/hooks/use-container-size.js.map +1 -0
  77. package/dist/shell/app-shell.d.ts +101 -0
  78. package/dist/shell/app-shell.d.ts.map +1 -0
  79. package/dist/shell/app-shell.js +76 -0
  80. package/dist/shell/app-shell.js.map +1 -0
  81. package/dist/shell/bottom-navbar.js +2 -2
  82. package/dist/shell/bottom-navbar.js.map +1 -1
  83. package/dist/shell/index.d.ts +1 -0
  84. package/dist/shell/index.d.ts.map +1 -1
  85. package/dist/shell/index.js +6 -5
  86. package/dist/shell/notification-center.js +4 -4
  87. package/dist/shell/notification-center.js.map +1 -1
  88. package/dist/shell/notification-preferences.js +1 -1
  89. package/dist/shell/notification-preferences.js.map +1 -1
  90. package/dist/shell/top-bar.js +7 -7
  91. package/dist/shell/top-bar.js.map +1 -1
  92. package/dist/tokens/generate-scale.d.ts +49 -0
  93. package/dist/tokens/generate-scale.d.ts.map +1 -1
  94. package/dist/tokens/primitives.css +29 -26
  95. package/dist/tokens/semantic.css +98 -39
  96. package/dist/tokens/variants.css +1 -1
  97. package/dist/ui/accordion.js +1 -1
  98. package/dist/ui/accordion.js.map +1 -1
  99. package/dist/ui/alert-dialog.js +1 -1
  100. package/dist/ui/alert-dialog.js.map +1 -1
  101. package/dist/ui/alert.d.ts.map +1 -1
  102. package/dist/ui/alert.js +7 -7
  103. package/dist/ui/alert.js.map +1 -1
  104. package/dist/ui/avatar.js +3 -3
  105. package/dist/ui/avatar.js.map +1 -1
  106. package/dist/ui/badge-indicator.js +1 -1
  107. package/dist/ui/badge-indicator.js.map +1 -1
  108. package/dist/ui/badge.d.ts +47 -33
  109. package/dist/ui/badge.d.ts.map +1 -1
  110. package/dist/ui/banner.js +1 -1
  111. package/dist/ui/banner.js.map +1 -1
  112. package/dist/ui/button.js +4 -4
  113. package/dist/ui/button.js.map +1 -1
  114. package/dist/ui/card.js +4 -4
  115. package/dist/ui/card.js.map +1 -1
  116. package/dist/ui/chat/date-separator.d.ts +8 -1
  117. package/dist/ui/chat/date-separator.d.ts.map +1 -1
  118. package/dist/ui/checkbox.js +1 -1
  119. package/dist/ui/checkbox.js.map +1 -1
  120. package/dist/ui/code.js +2 -2
  121. package/dist/ui/code.js.map +1 -1
  122. package/dist/ui/color-input.js +3 -3
  123. package/dist/ui/color-input.js.map +1 -1
  124. package/dist/ui/combobox.js +4 -4
  125. package/dist/ui/combobox.js.map +1 -1
  126. package/dist/ui/context-menu.js +4 -4
  127. package/dist/ui/context-menu.js.map +1 -1
  128. package/dist/ui/data-table-body.d.ts +3 -1
  129. package/dist/ui/data-table-body.d.ts.map +1 -1
  130. package/dist/ui/data-table-body.js +93 -92
  131. package/dist/ui/data-table-body.js.map +1 -1
  132. package/dist/ui/data-table-bulk-actions.d.ts +7 -1
  133. package/dist/ui/data-table-bulk-actions.d.ts.map +1 -1
  134. package/dist/ui/data-table-bulk-actions.js +14 -8
  135. package/dist/ui/data-table-bulk-actions.js.map +1 -1
  136. package/dist/ui/data-table-card.d.ts.map +1 -1
  137. package/dist/ui/data-table-card.js +66 -47
  138. package/dist/ui/data-table-card.js.map +1 -1
  139. package/dist/ui/data-table-context.d.ts +4 -0
  140. package/dist/ui/data-table-context.d.ts.map +1 -1
  141. package/dist/ui/data-table-context.js.map +1 -1
  142. package/dist/ui/data-table-header.d.ts.map +1 -1
  143. package/dist/ui/data-table-header.js +18 -15
  144. package/dist/ui/data-table-header.js.map +1 -1
  145. package/dist/ui/data-table-pagination.js +3 -3
  146. package/dist/ui/data-table-pagination.js.map +1 -1
  147. package/dist/ui/data-table-toolbar.d.ts +11 -1
  148. package/dist/ui/data-table-toolbar.d.ts.map +1 -1
  149. package/dist/ui/data-table-toolbar.js +7 -7
  150. package/dist/ui/data-table-toolbar.js.map +1 -1
  151. package/dist/ui/data-table.d.ts +52 -5
  152. package/dist/ui/data-table.d.ts.map +1 -1
  153. package/dist/ui/data-table.js +181 -169
  154. package/dist/ui/data-table.js.map +1 -1
  155. package/dist/ui/dialog.js +1 -1
  156. package/dist/ui/dialog.js.map +1 -1
  157. package/dist/ui/dot.js +1 -1
  158. package/dist/ui/dot.js.map +1 -1
  159. package/dist/ui/dropdown-menu.js +4 -4
  160. package/dist/ui/dropdown-menu.js.map +1 -1
  161. package/dist/ui/file-upload.js +3 -3
  162. package/dist/ui/file-upload.js.map +1 -1
  163. package/dist/ui/input-otp.js +1 -1
  164. package/dist/ui/input-otp.js.map +1 -1
  165. package/dist/ui/input.js +8 -8
  166. package/dist/ui/input.js.map +1 -1
  167. package/dist/ui/menubar.js +5 -5
  168. package/dist/ui/menubar.js.map +1 -1
  169. package/dist/ui/navigation-menu.js +1 -1
  170. package/dist/ui/navigation-menu.js.map +1 -1
  171. package/dist/ui/number-input.js +3 -3
  172. package/dist/ui/number-input.js.map +1 -1
  173. package/dist/ui/pagination.js +1 -1
  174. package/dist/ui/pagination.js.map +1 -1
  175. package/dist/ui/progress-ring.js +2 -2
  176. package/dist/ui/progress-ring.js.map +1 -1
  177. package/dist/ui/progress.d.ts.map +1 -1
  178. package/dist/ui/progress.js +16 -12
  179. package/dist/ui/progress.js.map +1 -1
  180. package/dist/ui/radio.js +1 -1
  181. package/dist/ui/radio.js.map +1 -1
  182. package/dist/ui/select.js +5 -5
  183. package/dist/ui/select.js.map +1 -1
  184. package/dist/ui/sheet.js +1 -1
  185. package/dist/ui/sheet.js.map +1 -1
  186. package/dist/ui/sidebar.js +12 -12
  187. package/dist/ui/sidebar.js.map +1 -1
  188. package/dist/ui/slider.js +1 -1
  189. package/dist/ui/slider.js.map +1 -1
  190. package/dist/ui/split-button.js +3 -3
  191. package/dist/ui/split-button.js.map +1 -1
  192. package/dist/ui/stat-card.js +1 -1
  193. package/dist/ui/stat-card.js.map +1 -1
  194. package/dist/ui/stepper.js +2 -2
  195. package/dist/ui/stepper.js.map +1 -1
  196. package/dist/ui/surface.d.ts.map +1 -1
  197. package/dist/ui/surface.js +2 -2
  198. package/dist/ui/surface.js.map +1 -1
  199. package/dist/ui/switch.js +1 -1
  200. package/dist/ui/switch.js.map +1 -1
  201. package/dist/ui/table.js +1 -1
  202. package/dist/ui/table.js.map +1 -1
  203. package/dist/ui/tabs.d.ts.map +1 -1
  204. package/dist/ui/tabs.js +1 -1
  205. package/dist/ui/tabs.js.map +1 -1
  206. package/dist/ui/textarea.js +5 -5
  207. package/dist/ui/textarea.js.map +1 -1
  208. package/dist/ui/toast.js +1 -1
  209. package/dist/ui/toast.js.map +1 -1
  210. package/dist/ui/toggle.js +3 -3
  211. package/dist/ui/toggle.js.map +1 -1
  212. package/docs/components/composed/avatar-group.md +4 -4
  213. package/docs/components/composed/diff.md +10 -2
  214. package/docs/components/composed/schedule-view.md +1 -1
  215. package/docs/components/shell/app-shell.md +132 -0
  216. package/docs/components/ui/avatar.md +1 -1
  217. package/docs/components/ui/button.md +1 -1
  218. package/docs/components/ui/chat.md +7 -1
  219. package/docs/components/ui/color-swatch.md +1 -1
  220. package/docs/components/ui/data-table-toolbar.md +6 -2
  221. package/docs/components/ui/data-table.md +41 -7
  222. package/docs/components/ui/dot.md +1 -1
  223. package/docs/components/ui/progress.md +1 -0
  224. package/docs/components/ui/surface.md +3 -3
  225. package/docs/components/ui/table.md +2 -2
  226. package/docs/recipes/install-astro.md +1 -0
  227. package/docs/recipes/install-next-app-router.md +1 -0
  228. package/docs/recipes/install-remix.md +1 -0
  229. package/docs/recipes/install-tanstack-start.md +1 -0
  230. package/docs/recipes/install-vite.md +1 -0
  231. package/llms.txt +2 -1
  232. package/make-kit/Guidelines.md +2 -2
  233. package/make-kit/components/button.md +1 -1
  234. package/make-kit/components/card.md +6 -6
  235. package/make-kit/components/surface.md +4 -4
  236. package/make-kit/foundations/color.md +4 -4
  237. package/make-kit/foundations/dark-mode.md +1 -1
  238. package/make-kit/foundations/radius.md +1 -1
  239. package/make-kit/foundations/surfaces.md +9 -9
  240. package/mcp-manifest.json +350 -32
  241. package/package.json +6 -3
  242. package/skill/SKILL.md +12 -6
  243. package/skill/references/components.md +2 -1
  244. package/skill/references/setup-astro.md +1 -0
  245. package/skill/references/setup-next-app-router.md +1 -0
  246. package/skill/references/setup-remix.md +1 -0
  247. package/skill/references/setup-tanstack-start.md +1 -0
  248. package/skill/references/setup-vite.md +1 -0
  249. package/dist/primitives/react-toast.d.ts +0 -120
  250. package/dist/ui/charts/_internal/scales.d.ts +0 -5
  251. package/dist/ui/charts/_internal/scales.d.ts.map +0 -1
  252. package/dist/ui/lib/slot.d.ts +0 -8
  253. package/dist/ui/lib/slot.d.ts.map +0 -1
@@ -15,39 +15,55 @@ import { jsx as v, jsxs as y } from "react/jsx-runtime";
15
15
  import { IconAlertCircle as b, IconSend as x, IconSquare as S, IconTrash as C } from "@tabler/icons-react";
16
16
  import { AnimatePresence as w, motion as T } from "framer-motion";
17
17
  //#region src/ui/chat/date-separator.tsx
18
- function E(e) {
19
- let t = /* @__PURE__ */ new Date(), n = new Date(t.getFullYear(), t.getMonth(), t.getDate()), r = new Date(e.getFullYear(), e.getMonth(), e.getDate()), i = n.getTime() - r.getTime(), a = Math.round(i / (1e3 * 60 * 60 * 24));
20
- if (a === 0) return "Today";
21
- if (a === 1) return "Yesterday";
22
- let o = e.toLocaleString("en-US", { month: "short" }), s = e.getDate();
23
- return e.getFullYear() === t.getFullYear() ? `${o} ${s}` : `${o} ${s}, ${e.getFullYear()}`;
18
+ function E(e, t) {
19
+ let n = new Intl.DateTimeFormat("en-US", {
20
+ timeZone: t,
21
+ year: "numeric",
22
+ month: "2-digit",
23
+ day: "2-digit"
24
+ }).formatToParts(e), r = (e) => Number(n.find((t) => t.type === e)?.value);
25
+ return {
26
+ year: r("year"),
27
+ month: r("month"),
28
+ day: r("day")
29
+ };
24
30
  }
25
- function D({ date: e, format: t, className: n }) {
26
- let r = typeof e == "string" ? new Date(e) : e, a = t ? t(r) : E(r);
31
+ function D(e, t, n) {
32
+ let r = E(/* @__PURE__ */ new Date(), n), i = E(e, n), a = Date.UTC(r.year, r.month - 1, r.day), o = Date.UTC(i.year, i.month - 1, i.day), s = Math.round((a - o) / (1e3 * 60 * 60 * 24));
33
+ if (s === 0) return "Today";
34
+ if (s === 1) return "Yesterday";
35
+ let c = e.toLocaleString(t, {
36
+ month: "short",
37
+ timeZone: n
38
+ });
39
+ return i.year === r.year ? `${c} ${i.day}` : `${c} ${i.day}, ${i.year}`;
40
+ }
41
+ function O({ date: e, format: t, className: n, locale: r = "en-US", timeZone: a }) {
42
+ let o = typeof e == "string" ? new Date(e) : e, s = t ? t(o) : D(o, r, a);
27
43
  return /* @__PURE__ */ y("div", {
28
44
  className: i("flex items-center gap-ds-03 py-ds-03", n),
29
45
  children: [
30
46
  /* @__PURE__ */ v("div", { className: "flex-1 border-t border-surface-border-subtle" }),
31
47
  /* @__PURE__ */ v("span", {
32
- className: "text-label-xs font-medium text-surface-fg-subtle/50 uppercase tracking-wider",
33
- children: a
48
+ className: "text-label-xs font-medium text-surface-fg-subtle uppercase tracking-wider",
49
+ children: s
34
50
  }),
35
51
  /* @__PURE__ */ v("div", { className: "flex-1 border-t border-surface-border-subtle" })
36
52
  ]
37
53
  });
38
54
  }
39
- D.displayName = "DateSeparator";
55
+ O.displayName = "DateSeparator";
40
56
  //#endregion
41
57
  //#region src/ui/chat/message.tsx
42
- var O = _.createContext({
58
+ var k = _.createContext({
43
59
  variant: "flat",
44
60
  placement: "start",
45
61
  grouped: !1
46
62
  });
47
- function k() {
48
- return _.useContext(O);
63
+ function A() {
64
+ return _.useContext(k);
49
65
  }
50
- var A = _.forwardRef(({ children: e, variant: r = "flat", placement: a = "start", highlight: s, grouped: c = !1, deleted: l = !1, deletedText: u = "This message was deleted", className: d, ...f }, p) => {
66
+ var j = _.forwardRef(({ children: e, variant: r = "flat", placement: a = "start", highlight: s, grouped: c = !1, deleted: l = !1, deletedText: u = "This message was deleted", className: d, ...f }, p) => {
51
67
  let m = _.useMemo(() => ({
52
68
  variant: r,
53
69
  placement: a,
@@ -67,13 +83,13 @@ var A = _.forwardRef(({ children: e, variant: r = "flat", placement: a = "start"
67
83
  y: 0
68
84
  },
69
85
  transition: n.snappy,
70
- className: i("flex items-center gap-ds-02 py-ds-02 text-caption text-surface-fg-subtle/50 italic", d),
86
+ className: i("flex items-center gap-ds-02 py-ds-02 text-caption text-surface-fg-subtle italic", d),
71
87
  ...t(f),
72
88
  children: [/* @__PURE__ */ v(o, {
73
89
  icon: C,
74
90
  size: "xs"
75
91
  }), u]
76
- }) : r === "bubble" ? /* @__PURE__ */ v(O.Provider, {
92
+ }) : r === "bubble" ? /* @__PURE__ */ v(k.Provider, {
77
93
  value: m,
78
94
  children: /* @__PURE__ */ v(T.div, {
79
95
  ref: p,
@@ -87,11 +103,11 @@ var A = _.forwardRef(({ children: e, variant: r = "flat", placement: a = "start"
87
103
  className: i("group/message relative flex", a === "end" ? "justify-end" : "justify-start", g, s === "internal" && "bg-warning-2/50 rounded-control-inner", d),
88
104
  ...t(f),
89
105
  children: /* @__PURE__ */ v("div", {
90
- className: i("max-w-[85%] rounded-bubble px-ds-04 py-ds-03", a === "end" ? "bg-accent-3 text-surface-fg" : "bg-surface-raised text-surface-fg"),
106
+ className: i("max-w-[85%] rounded-bubble px-ds-04 py-ds-03", a === "end" ? "bg-accent-3 text-surface-fg" : "bg-surface-panel text-surface-fg"),
91
107
  children: e
92
108
  })
93
109
  })
94
- }) : /* @__PURE__ */ v(O.Provider, {
110
+ }) : /* @__PURE__ */ v(k.Provider, {
95
111
  value: m,
96
112
  children: /* @__PURE__ */ v(T.div, {
97
113
  ref: p,
@@ -108,14 +124,14 @@ var A = _.forwardRef(({ children: e, variant: r = "flat", placement: a = "start"
108
124
  })
109
125
  });
110
126
  });
111
- A.displayName = "Message";
112
- function j({ src: t, fallback: n, icon: r, size: a = "md", children: o }) {
113
- let { grouped: d } = k(), f = a === "sm" ? "w-5" : "w-6";
127
+ j.displayName = "Message";
128
+ function M({ src: t, fallback: n, icon: r, size: a = "md", children: o }) {
129
+ let { grouped: d } = A(), f = a === "sm" ? "w-5" : "w-6";
114
130
  return d ? /* @__PURE__ */ v("div", { className: i(f, a === "sm" ? "h-5" : "h-6", "shrink-0") }) : o ? /* @__PURE__ */ v("div", {
115
131
  className: i(f, "shrink-0 flex items-start"),
116
132
  children: o
117
133
  }) : r ? /* @__PURE__ */ v("div", {
118
- className: i(f, a === "sm" ? "h-5" : "h-6", "shrink-0 flex items-center justify-center rounded-pill bg-surface-raised-hover"),
134
+ className: i(f, a === "sm" ? "h-5" : "h-6", "shrink-0 flex items-center justify-center rounded-pill bg-surface-panel-hover"),
119
135
  children: /* @__PURE__ */ v(e, {
120
136
  size: a === "sm" ? "xs" : "sm",
121
137
  children: u(r)
@@ -131,23 +147,23 @@ function j({ src: t, fallback: n, icon: r, size: a = "md", children: o }) {
131
147
  })
132
148
  });
133
149
  }
134
- j.displayName = "Message.Avatar";
135
- function M({ children: e, className: t, ...n }) {
150
+ M.displayName = "Message.Avatar";
151
+ function N({ children: e, className: t, ...n }) {
136
152
  return /* @__PURE__ */ v("div", {
137
153
  className: i("min-w-0 flex-1 flex flex-col gap-ds-02", t),
138
154
  ...n,
139
155
  children: e
140
156
  });
141
157
  }
142
- M.displayName = "Message.Content";
143
- function N(e) {
158
+ N.displayName = "Message.Content";
159
+ function P(e) {
144
160
  return e.toLocaleTimeString("en-US", {
145
161
  hour: "numeric",
146
162
  minute: "2-digit"
147
163
  });
148
164
  }
149
- function P({ name: e, badge: t, timestamp: n, formattedTimestamp: r, timestampFormat: i = N }) {
150
- let { grouped: a } = k();
165
+ function F({ name: e, badge: t, timestamp: n, formattedTimestamp: r, timestampFormat: i = P }) {
166
+ let { grouped: a } = A();
151
167
  if (a) return null;
152
168
  let o = r ?? (n ? i(n) : void 0);
153
169
  return /* @__PURE__ */ y("div", {
@@ -159,22 +175,22 @@ function P({ name: e, badge: t, timestamp: n, formattedTimestamp: r, timestampFo
159
175
  }),
160
176
  t,
161
177
  o && /* @__PURE__ */ v("span", {
162
- className: "text-body-sm text-surface-fg-subtle/50",
178
+ className: "text-body-sm text-surface-fg-subtle",
163
179
  children: o
164
180
  })
165
181
  ]
166
182
  });
167
183
  }
168
- P.displayName = "Message.Author";
169
- function F({ children: e, className: t, ...n }) {
184
+ F.displayName = "Message.Author";
185
+ function I({ children: e, className: t, ...n }) {
170
186
  return /* @__PURE__ */ v("div", {
171
187
  className: i("text-body-md leading-relaxed text-surface-fg whitespace-pre-wrap", t),
172
188
  ...n,
173
189
  children: e
174
190
  });
175
191
  }
176
- F.displayName = "Message.Body";
177
- function I({ content: e, onSave: t, onCancel: n, canEdit: r = !1, renderContent: a }) {
192
+ I.displayName = "Message.Body";
193
+ function L({ content: e, onSave: t, onCancel: n, canEdit: r = !1, renderContent: a }) {
178
194
  let [o, s] = _.useState(!1), [c, l] = _.useState(e), u = _.useRef(null);
179
195
  _.useEffect(() => {
180
196
  o && u.current && (u.current.focus(), u.current.select());
@@ -201,14 +217,14 @@ function I({ content: e, onSave: t, onCancel: n, canEdit: r = !1, renderContent:
201
217
  onChange: (e) => l(e.target.value),
202
218
  onKeyDown: h,
203
219
  onBlur: p,
204
- className: "resize-none rounded-control-inner bg-surface-raised-hover px-ds-02 py-ds-01 text-body-md leading-relaxed",
220
+ className: "resize-none rounded-control-inner bg-surface-panel-hover px-ds-02 py-ds-01 text-body-md leading-relaxed",
205
221
  rows: 2
206
222
  }), /* @__PURE__ */ v("div", {
207
- className: "mt-ds-01 text-caption text-surface-fg-subtle/50",
223
+ className: "mt-ds-01 text-caption text-surface-fg-subtle",
208
224
  children: "Enter to save · Escape to cancel"
209
225
  })]
210
226
  }) : /* @__PURE__ */ v("div", {
211
- className: i("text-body-md leading-relaxed text-surface-fg whitespace-pre-wrap", r && "cursor-pointer hover:bg-surface-raised-hover rounded-control-inner transition-colors"),
227
+ className: i("text-body-md leading-relaxed text-surface-fg whitespace-pre-wrap", r && "cursor-pointer hover:bg-surface-panel-hover rounded-control-inner transition-colors"),
212
228
  onClick: d,
213
229
  role: r ? "button" : void 0,
214
230
  tabIndex: r ? 0 : void 0,
@@ -218,36 +234,36 @@ function I({ content: e, onSave: t, onCancel: n, canEdit: r = !1, renderContent:
218
234
  children: a ? a(e) : e
219
235
  });
220
236
  }
221
- I.displayName = "Message.EditableBody";
222
- function L({ reactions: e, onReact: t }) {
237
+ L.displayName = "Message.EditableBody";
238
+ function R({ reactions: e, onReact: t }) {
223
239
  return e.length === 0 ? null : /* @__PURE__ */ v("div", {
224
240
  className: "flex flex-wrap gap-ds-02 mt-ds-03",
225
241
  children: e.map((e) => /* @__PURE__ */ y("button", {
226
242
  type: "button",
227
243
  onClick: () => t(e.emoji),
228
244
  "aria-label": `${e.emoji} ${e.count} reaction${e.count === 1 ? "" : "s"}${e.reacted ? ", you reacted" : ""}`,
229
- className: i("inline-flex items-center gap-ds-01 rounded-pill px-ds-02 py-ds-01 text-body-xs transition-colors", e.reacted ? "bg-accent-3 ring-1 ring-accent-6" : "bg-surface-raised-hover hover:bg-surface-raised-active"),
245
+ className: i("inline-flex items-center gap-ds-01 rounded-pill px-ds-02 py-ds-01 text-body-xs transition-colors", e.reacted ? "bg-accent-3 ring-1 ring-accent-6" : "bg-surface-panel-hover hover:bg-surface-panel-active"),
230
246
  children: [/* @__PURE__ */ v("span", { children: e.emoji }), /* @__PURE__ */ v("span", { children: e.count })]
231
247
  }, e.emoji))
232
248
  });
233
249
  }
234
- L.displayName = "Message.Reactions";
235
- function R({ children: e, delay: t = 100 }) {
250
+ R.displayName = "Message.Reactions";
251
+ function z({ children: e, delay: t = 100 }) {
236
252
  return /* @__PURE__ */ v("div", {
237
- className: i("absolute -top-2 right-0 z-10", "flex items-center gap-ds-01 rounded-control bg-surface-raised px-ds-01 py-ds-01 shadow-raised", "opacity-0 group-hover/message:opacity-100 group-focus-within/message:opacity-100 transition-opacity duration-150"),
253
+ className: i("absolute -top-2 right-0 z-10", "flex items-center gap-ds-01 rounded-control bg-surface-panel px-ds-01 py-ds-01 shadow-raised", "opacity-0 group-hover/message:opacity-100 group-focus-within/message:opacity-100 transition-opacity duration-150"),
238
254
  style: { transitionDelay: `${t}ms` },
239
255
  children: e
240
256
  });
241
257
  }
242
- R.displayName = "Message.Actions";
243
- function z({ icon: t, label: n, onClick: r, variant: a = "default" }) {
258
+ z.displayName = "Message.Actions";
259
+ function B({ icon: t, label: n, onClick: r, variant: a = "default" }) {
244
260
  return /* @__PURE__ */ y(p, { children: [/* @__PURE__ */ v(h, {
245
261
  asChild: !0,
246
262
  children: /* @__PURE__ */ v("button", {
247
263
  type: "button",
248
264
  onClick: r,
249
265
  "aria-label": n,
250
- className: i("p-ds-02 rounded-control-inner transition-colors", a === "default" && "text-surface-fg-subtle hover:text-surface-fg hover:bg-surface-raised-hover", a === "danger" && "text-surface-fg-subtle hover:text-error-11 hover:bg-surface-raised-hover"),
266
+ className: i("p-ds-02 rounded-control-inner transition-colors", a === "default" && "text-surface-fg-subtle hover:text-surface-fg hover:bg-surface-panel-hover", a === "danger" && "text-surface-fg-subtle hover:text-error-11 hover:bg-surface-panel-hover"),
251
267
  children: /* @__PURE__ */ v(e, {
252
268
  size: "xs",
253
269
  children: u(t)
@@ -255,17 +271,17 @@ function z({ icon: t, label: n, onClick: r, variant: a = "default" }) {
255
271
  })
256
272
  }), /* @__PURE__ */ v(m, { children: n })] });
257
273
  }
258
- z.displayName = "Message.Action";
259
- var B = Object.assign(A, {
260
- Avatar: j,
261
- Content: M,
262
- Author: P,
263
- Body: F,
264
- EditableBody: I,
265
- Reactions: L,
266
- Actions: R,
267
- Action: z
268
- }), V = _.forwardRef(({ onSubmit: e, placeholder: t = "Type a message...", disabled: n = !1, isStreaming: r = !1, onCancel: a, leadingSlot: s, trailingSlot: c, disclaimer: l, sendIcon: u, className: f, ...p }, m) => {
274
+ B.displayName = "Message.Action";
275
+ var V = Object.assign(j, {
276
+ Avatar: M,
277
+ Content: N,
278
+ Author: F,
279
+ Body: I,
280
+ EditableBody: L,
281
+ Reactions: R,
282
+ Actions: z,
283
+ Action: B
284
+ }), H = _.forwardRef(({ onSubmit: e, placeholder: t = "Type a message...", disabled: n = !1, isStreaming: r = !1, onCancel: a, leadingSlot: s, trailingSlot: c, disclaimer: l, sendIcon: u, className: f, ...p }, m) => {
269
285
  let [h, g] = _.useState(""), b = _.useRef(null), C = _.useCallback(() => {
270
286
  let e = b.current;
271
287
  e && (e.style.height = "auto", e.style.height = `${Math.min(e.scrollHeight, 160)}px`);
@@ -298,7 +314,7 @@ var B = Object.assign(A, {
298
314
  "aria-label": t || "Type a message",
299
315
  disabled: n,
300
316
  rows: 1,
301
- className: "flex-1 resize-none bg-transparent px-ds-02 py-ds-01 text-body-sm text-surface-fg placeholder:text-surface-fg-subtle/50 focus:outline-hidden disabled:opacity-50",
317
+ className: "flex-1 resize-none bg-transparent px-ds-02 py-ds-01 text-body-sm text-surface-fg placeholder:text-surface-fg-muted focus:outline-hidden disabled:opacity-50",
302
318
  style: { maxHeight: 160 }
303
319
  }),
304
320
  r ? /* @__PURE__ */ v(d, {
@@ -325,15 +341,15 @@ var B = Object.assign(A, {
325
341
  c
326
342
  ]
327
343
  }), l && /* @__PURE__ */ v("p", {
328
- className: "mt-ds-02 text-center text-caption text-surface-fg-subtle/50",
344
+ className: "mt-ds-02 text-center text-caption text-surface-fg-subtle",
329
345
  children: l
330
346
  })]
331
347
  });
332
348
  });
333
- V.displayName = "MessageInput";
349
+ H.displayName = "MessageInput";
334
350
  //#endregion
335
351
  //#region src/ui/chat/message-list.tsx
336
- var H = _.forwardRef(({ children: e, autoScroll: t = !0, newMessageCount: n = 0, onScrollToBottom: o, onLoadMore: s, loadingMore: c = !1, emptySlot: l, scrollToBottomSlot: u, headerSlot: d, className: f, ...p }, m) => {
352
+ var U = _.forwardRef(({ children: e, autoScroll: t = !0, newMessageCount: n = 0, onScrollToBottom: o, onLoadMore: s, loadingMore: c = !1, emptySlot: l, scrollToBottomSlot: u, headerSlot: d, className: f, ...p }, m) => {
337
353
  let h = _.useRef(null), g = _.useRef(!0), [b, x] = _.useState(!0), S = _.useRef(!1), C = _.useRef(0), E = _.Children.count(e) === 0 && !c, D = _.useCallback(() => {
338
354
  let e = h.current;
339
355
  if (!e) return;
@@ -411,16 +427,16 @@ var H = _.forwardRef(({ children: e, autoScroll: t = !0, newMessageCount: n = 0,
411
427
  ]
412
428
  });
413
429
  });
414
- H.displayName = "MessageList";
430
+ U.displayName = "MessageList";
415
431
  //#endregion
416
432
  //#region src/ui/chat/system-message.tsx
417
- function U(e) {
433
+ function W(e) {
418
434
  return new Date(e).toLocaleTimeString("en-US", {
419
435
  hour: "numeric",
420
436
  minute: "2-digit"
421
437
  });
422
438
  }
423
- var W = _.forwardRef(({ icon: t, timestamp: n, variant: r = "event", children: a, className: s, ...c }, l) => r === "alert" ? /* @__PURE__ */ v("div", {
439
+ var G = _.forwardRef(({ icon: t, timestamp: n, variant: r = "event", children: a, className: s, ...c }, l) => r === "alert" ? /* @__PURE__ */ v("div", {
424
440
  ref: l,
425
441
  role: "alert",
426
442
  className: i("flex justify-center", s),
@@ -438,13 +454,13 @@ var W = _.forwardRef(({ icon: t, timestamp: n, variant: r = "event", children: a
438
454
  }),
439
455
  n && /* @__PURE__ */ v("span", {
440
456
  className: "text-body-sm text-error-11/60",
441
- children: U(n)
457
+ children: W(n)
442
458
  })
443
459
  ]
444
460
  })
445
461
  }) : /* @__PURE__ */ y("div", {
446
462
  ref: l,
447
- className: i("flex items-center gap-ds-02 rounded-control-inner bg-surface-raised-hover/30 px-ds-02 py-ds-01 -mx-ds-02 text-body-sm text-surface-fg-subtle/60", s),
463
+ className: i("flex items-center gap-ds-02 rounded-control-inner bg-surface-panel-hover/30 px-ds-02 py-ds-01 -mx-ds-02 text-body-sm text-surface-fg-subtle", s),
448
464
  ...c,
449
465
  children: [
450
466
  /* @__PURE__ */ v(e, {
@@ -455,16 +471,16 @@ var W = _.forwardRef(({ icon: t, timestamp: n, variant: r = "event", children: a
455
471
  className: "flex-1",
456
472
  children: a
457
473
  }),
458
- n && /* @__PURE__ */ v("span", { children: U(n) })
474
+ n && /* @__PURE__ */ v("span", { children: W(n) })
459
475
  ]
460
476
  }));
461
- W.displayName = "SystemMessage";
477
+ G.displayName = "SystemMessage";
462
478
  //#endregion
463
479
  //#region src/ui/chat/typing-indicator.tsx
464
- function G(e) {
480
+ function K(e) {
465
481
  return e.length === 1 ? `${e[0].name} is typing...` : e.length === 2 ? `${e[0].name} and ${e[1].name} are typing...` : "Several people are typing...";
466
482
  }
467
- function K({ users: e, className: t }) {
483
+ function q({ users: e, className: t }) {
468
484
  return /* @__PURE__ */ v("div", {
469
485
  className: i("min-h-ds-06 px-ds-05", t),
470
486
  role: "status",
@@ -493,14 +509,14 @@ function K({ users: e, className: t }) {
493
509
  delay: e * .15
494
510
  }
495
511
  }, e))
496
- }), /* @__PURE__ */ v("span", { children: G(e) })]
512
+ }), /* @__PURE__ */ v("span", { children: K(e) })]
497
513
  }) })
498
514
  });
499
515
  }
500
- K.displayName = "TypingIndicator";
516
+ q.displayName = "TypingIndicator";
501
517
  //#endregion
502
518
  //#region src/ui/chat/unread-separator.tsx
503
- function q({ label: e = "NEW", count: t, className: n }) {
519
+ function J({ label: e = "NEW", count: t, className: n }) {
504
520
  return /* @__PURE__ */ y("div", {
505
521
  className: i("relative flex items-center py-ds-02", n),
506
522
  children: [
@@ -513,6 +529,6 @@ function q({ label: e = "NEW", count: t, className: n }) {
513
529
  ]
514
530
  });
515
531
  }
516
- q.displayName = "UnreadSeparator";
532
+ J.displayName = "UnreadSeparator";
517
533
  //#endregion
518
- export { D as DateSeparator, B as Message, V as MessageInput, H as MessageList, W as SystemMessage, K as TypingIndicator, q as UnreadSeparator, k as useMessageContext };
534
+ export { O as DateSeparator, V as Message, H as MessageInput, U as MessageList, G as SystemMessage, q as TypingIndicator, J as UnreadSeparator, A as useMessageContext };
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","names":[],"sources":["../../src/ui/chat/date-separator.tsx","../../src/ui/chat/message.tsx","../../src/ui/chat/message-input.tsx","../../src/ui/chat/message-list.tsx","../../src/ui/chat/system-message.tsx","../../src/ui/chat/typing-indicator.tsx","../../src/ui/chat/unread-separator.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport interface DateSeparatorProps {\n date: Date | string\n format?: (date: Date) => string\n className?: string\n}\n\nfunction defaultFormat(date: Date): string {\n const now = new Date()\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n const target = new Date(date.getFullYear(), date.getMonth(), date.getDate())\n const diffMs = today.getTime() - target.getTime()\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24))\n\n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Yesterday'\n\n const month = date.toLocaleString('en-US', { month: 'short' })\n const day = date.getDate()\n\n if (date.getFullYear() !== now.getFullYear()) {\n return `${month} ${day}, ${date.getFullYear()}`\n }\n\n return `${month} ${day}`\n}\n\nfunction DateSeparator({ date, format, className }: DateSeparatorProps) {\n const d = typeof date === 'string' ? new Date(date) : date\n const label = format ? format(d) : defaultFormat(d)\n\n return (\n <div className={cn('flex items-center gap-ds-03 py-ds-03', className)}>\n <div className=\"flex-1 border-t border-surface-border-subtle\" />\n <span className=\"text-label-xs font-medium text-surface-fg-subtle/50 uppercase tracking-wider\">\n {label}\n </span>\n <div className=\"flex-1 border-t border-surface-border-subtle\" />\n </div>\n )\n}\nDateSeparator.displayName = 'DateSeparator'\n\nexport { DateSeparator }\n","'use client'\n\nimport { IconTrash } from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { Avatar, AvatarFallback,AvatarImage } from '../avatar'\nimport { Icon } from '../icon'\nimport { IconProvider } from '../icon-context'\nimport type { IconInput } from '../lib/icon-input'\nimport { MENTION_TOKEN_CLASS } from '../lib/mention'\nimport { motionProps,springs } from '../lib/motion'\nimport { normalizeIcon } from '../lib/normalize-icon'\nimport { cn } from '../lib/utils'\nimport { Textarea } from '../textarea'\nimport { Tooltip, TooltipContent,TooltipTrigger } from '../tooltip'\n\n// ── Context ──────────────────────────────────────────────────────────────\n\ninterface MessageContextValue {\n variant: 'flat' | 'bubble'\n placement: 'start' | 'end'\n grouped: boolean\n highlight?: 'mention' | 'internal'\n}\n\nconst MessageContext = React.createContext<MessageContextValue>({\n variant: 'flat',\n placement: 'start',\n grouped: false,\n})\n\nfunction useMessageContext() {\n return React.useContext(MessageContext)\n}\n\n// ── Root ─────────────────────────────────────────────────────────────────\n\nexport interface MessageProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: 'flat' | 'bubble'\n placement?: 'start' | 'end'\n highlight?: 'mention' | 'internal'\n grouped?: boolean\n deleted?: boolean\n deletedText?: string\n}\n\nconst MessageRoot = React.forwardRef<HTMLDivElement, MessageProps>(\n (\n {\n children,\n variant = 'flat',\n placement = 'start',\n highlight,\n grouped = false,\n deleted = false,\n deletedText = 'This message was deleted',\n className,\n ...props\n },\n ref,\n ) => {\n const ctx = React.useMemo<MessageContextValue>(\n () => ({ variant, placement, grouped, highlight }),\n [variant, placement, grouped, highlight],\n )\n\n if (deleted) {\n return (\n <motion.div\n ref={ref}\n initial={{ y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={springs.snappy}\n className={cn(\n 'flex items-center gap-ds-02 py-ds-02 text-caption text-surface-fg-subtle/50 italic',\n className,\n )}\n {...motionProps(props)}\n >\n <Icon icon={IconTrash} size=\"xs\" />\n {deletedText}\n </motion.div>\n )\n }\n\n if (variant === 'bubble') {\n return (\n <MessageContext.Provider value={ctx}>\n <motion.div\n ref={ref}\n data-highlight={highlight}\n initial={{ y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={springs.snappy}\n className={cn(\n 'group/message relative flex',\n placement === 'end' ? 'justify-end' : 'justify-start',\n // mention is carried by the styled in-content @token (see MENTION_TOKEN_CLASS), not a row tint/rail\n MENTION_TOKEN_CLASS,\n highlight === 'internal' && 'bg-warning-2/50 rounded-control-inner',\n className,\n )}\n {...motionProps(props)}\n >\n <div\n className={cn(\n 'max-w-[85%] rounded-bubble px-ds-04 py-ds-03',\n placement === 'end'\n ? 'bg-accent-3 text-surface-fg'\n : 'bg-surface-raised text-surface-fg',\n )}\n >\n {children}\n </div>\n </motion.div>\n </MessageContext.Provider>\n )\n }\n\n // flat variant (default)\n return (\n <MessageContext.Provider value={ctx}>\n <motion.div\n ref={ref}\n data-highlight={highlight}\n initial={{ y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={springs.snappy}\n className={cn(\n 'group/message relative flex gap-ds-04',\n grouped && '-mt-ds-01',\n // mention is carried by the styled in-content @token (see MENTION_TOKEN_CLASS), not a row rail/tint\n MENTION_TOKEN_CLASS,\n highlight === 'internal' && 'bg-warning-2/50 rounded-control-inner',\n className,\n )}\n {...motionProps(props)}\n >\n {children}\n </motion.div>\n </MessageContext.Provider>\n )\n },\n)\nMessageRoot.displayName = 'Message'\n\n// ── Avatar ───────────────────────────────────────────────────────────────\n\nexport interface MessageAvatarProps {\n src?: string | null\n fallback?: string\n icon?: IconInput\n size?: 'sm' | 'md'\n children?: React.ReactNode\n}\n\nfunction MessageAvatar({\n src,\n fallback,\n icon,\n size = 'md',\n children,\n}: MessageAvatarProps) {\n const { grouped } = useMessageContext()\n\n const sizeClass = size === 'sm' ? 'w-5' : 'w-6'\n const heightClass = size === 'sm' ? 'h-5' : 'h-6'\n\n if (grouped) {\n return <div className={cn(sizeClass, heightClass, 'shrink-0')} />\n }\n\n if (children) {\n return (\n <div className={cn(sizeClass, 'shrink-0 flex items-start')}>\n {children}\n </div>\n )\n }\n\n if (icon) {\n return (\n <div\n className={cn(\n sizeClass,\n size === 'sm' ? 'h-5' : 'h-6',\n 'shrink-0 flex items-center justify-center rounded-pill bg-surface-raised-hover',\n )}\n >\n <IconProvider size={size === 'sm' ? 'xs' : 'sm'}>{normalizeIcon(icon)}</IconProvider>\n </div>\n )\n }\n\n return (\n <div className={cn(sizeClass, 'shrink-0')}>\n <Avatar size={size === 'sm' ? 'xs' : 'sm'}>\n {src && <AvatarImage src={src} alt={fallback ?? ''} />}\n <AvatarFallback>{fallback ?? ''}</AvatarFallback>\n </Avatar>\n </div>\n )\n}\nMessageAvatar.displayName = 'Message.Avatar'\n\n// ── Content ──────────────────────────────────────────────────────────────\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n}\n\nfunction MessageContent({ children, className, ...props }: MessageContentProps) {\n return (\n <div className={cn('min-w-0 flex-1 flex flex-col gap-ds-02', className)} {...props}>\n {children}\n </div>\n )\n}\nMessageContent.displayName = 'Message.Content'\n\n// ── Author ───────────────────────────────────────────────────────────────\n\nexport interface MessageAuthorProps {\n name: string\n badge?: React.ReactNode\n timestamp?: Date\n formattedTimestamp?: string\n timestampFormat?: (date: Date) => string\n}\n\nfunction defaultTimestampFormat(date: Date): string {\n return date.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })\n}\n\nfunction MessageAuthor({\n name,\n badge,\n timestamp,\n formattedTimestamp,\n timestampFormat = defaultTimestampFormat,\n}: MessageAuthorProps) {\n const { grouped } = useMessageContext()\n\n if (grouped) return null\n\n const timeStr = formattedTimestamp\n ?? (timestamp ? timestampFormat(timestamp) : undefined)\n\n return (\n <div className=\"flex items-baseline gap-ds-02\">\n <span className=\"font-semibold text-body-md text-surface-fg\">{name}</span>\n {badge}\n {timeStr && (\n <span className=\"text-body-sm text-surface-fg-subtle/50\">{timeStr}</span>\n )}\n </div>\n )\n}\nMessageAuthor.displayName = 'Message.Author'\n\n// ── Body ─────────────────────────────────────────────────────────────────\n\nexport interface MessageBodyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n}\n\nfunction MessageBody({ children, className, ...props }: MessageBodyProps) {\n return (\n <div\n className={cn(\n 'text-body-md leading-relaxed text-surface-fg whitespace-pre-wrap',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\nMessageBody.displayName = 'Message.Body'\n\n// ── EditableBody ─────────────────────────────────────────────────────────\n\nexport interface MessageEditableBodyProps {\n content: string\n onSave: (newContent: string) => void\n onCancel?: () => void\n canEdit?: boolean\n renderContent?: (content: string) => React.ReactNode\n}\n\nfunction MessageEditableBody({\n content,\n onSave,\n onCancel,\n canEdit = false,\n renderContent,\n}: MessageEditableBodyProps) {\n const [isEditing, setIsEditing] = React.useState(false)\n const [editDraft, setEditDraft] = React.useState(content)\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n\n React.useEffect(() => {\n if (isEditing && textareaRef.current) {\n textareaRef.current.focus()\n textareaRef.current.select()\n }\n }, [isEditing])\n\n const handleStartEdit = React.useCallback(() => {\n if (!canEdit) return\n setEditDraft(content)\n setIsEditing(true)\n }, [canEdit, content])\n\n const handleSave = React.useCallback(() => {\n const trimmed = editDraft.trim()\n if (trimmed && trimmed !== content) {\n onSave(trimmed)\n }\n setIsEditing(false)\n }, [editDraft, content, onSave])\n\n const handleCancel = React.useCallback(() => {\n setIsEditing(false)\n setEditDraft(content)\n onCancel?.()\n }, [content, onCancel])\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSave()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n handleCancel()\n }\n },\n [handleSave, handleCancel],\n )\n\n if (isEditing) {\n return (\n <div className=\"text-body-md leading-relaxed\">\n <Textarea\n ref={textareaRef}\n value={editDraft}\n onChange={(e) => setEditDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleSave}\n // compact inline-edit overrides on top of the Textarea base\n className=\"resize-none rounded-control-inner bg-surface-raised-hover px-ds-02 py-ds-01 text-body-md leading-relaxed\"\n rows={2}\n />\n <div className=\"mt-ds-01 text-caption text-surface-fg-subtle/50\">\n Enter to save · Escape to cancel\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={cn(\n 'text-body-md leading-relaxed text-surface-fg whitespace-pre-wrap',\n canEdit && 'cursor-pointer hover:bg-surface-raised-hover rounded-control-inner transition-colors',\n )}\n onClick={handleStartEdit}\n role={canEdit ? 'button' : undefined}\n tabIndex={canEdit ? 0 : undefined}\n onKeyDown={\n canEdit\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleStartEdit()\n }\n }\n : undefined\n }\n >\n {renderContent ? renderContent(content) : content}\n </div>\n )\n}\nMessageEditableBody.displayName = 'Message.EditableBody'\n\n// ── Reactions ────────────────────────────────────────────────────────────\n\nexport interface MessageReactionsProps {\n reactions: { emoji: string; count: number; reacted: boolean }[]\n onReact: (emoji: string) => void\n}\n\nfunction MessageReactions({ reactions, onReact }: MessageReactionsProps) {\n if (reactions.length === 0) return null\n\n return (\n <div className=\"flex flex-wrap gap-ds-02 mt-ds-03\">\n {reactions.map((r) => (\n <button\n key={r.emoji}\n type=\"button\"\n onClick={() => onReact(r.emoji)}\n aria-label={`${r.emoji} ${r.count} reaction${r.count !== 1 ? 's' : ''}${r.reacted ? ', you reacted' : ''}`}\n className={cn(\n 'inline-flex items-center gap-ds-01 rounded-pill px-ds-02 py-ds-01 text-body-xs transition-colors',\n r.reacted\n ? 'bg-accent-3 ring-1 ring-accent-6'\n : 'bg-surface-raised-hover hover:bg-surface-raised-active',\n )}\n >\n <span>{r.emoji}</span>\n <span>{r.count}</span>\n </button>\n ))}\n </div>\n )\n}\nMessageReactions.displayName = 'Message.Reactions'\n\n// ── Actions (floating toolbar) ───────────────────────────────────────────\n\nexport interface MessageActionsProps {\n children: React.ReactNode\n delay?: number\n}\n\nfunction MessageActions({ children, delay = 100 }: MessageActionsProps) {\n return (\n <div\n className={cn(\n 'absolute -top-2 right-0 z-10',\n 'flex items-center gap-ds-01 rounded-control bg-surface-raised px-ds-01 py-ds-01 shadow-raised',\n 'opacity-0 group-hover/message:opacity-100 group-focus-within/message:opacity-100 transition-opacity duration-150',\n )}\n style={{ transitionDelay: `${delay}ms` }}\n >\n {children}\n </div>\n )\n}\nMessageActions.displayName = 'Message.Actions'\n\n// ── Action (single icon button) ──────────────────────────────────────────\n\nexport interface MessageActionProps {\n icon: IconInput\n label: string\n onClick: () => void\n variant?: 'default' | 'danger'\n}\n\nfunction MessageAction({\n icon,\n label,\n onClick,\n variant = 'default',\n}: MessageActionProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n className={cn(\n 'p-ds-02 rounded-control-inner transition-colors',\n variant === 'default' &&\n 'text-surface-fg-subtle hover:text-surface-fg hover:bg-surface-raised-hover',\n variant === 'danger' &&\n 'text-surface-fg-subtle hover:text-error-11 hover:bg-surface-raised-hover',\n )}\n >\n <IconProvider size=\"xs\">{normalizeIcon(icon)}</IconProvider>\n </button>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n )\n}\nMessageAction.displayName = 'Message.Action'\n\n// ── Compound Export ──────────────────────────────────────────────────────\n\nexport const Message = Object.assign(MessageRoot, {\n Avatar: MessageAvatar,\n Content: MessageContent,\n Author: MessageAuthor,\n Body: MessageBody,\n EditableBody: MessageEditableBody,\n Reactions: MessageReactions,\n Actions: MessageActions,\n Action: MessageAction,\n})\n\nexport {\n type MessageContextValue,\n useMessageContext,\n}\n","'use client'\n\nimport { IconSend, IconSquare } from '@tabler/icons-react'\nimport * as React from 'react'\n\nimport { Button } from '../button'\nimport { Icon } from '../icon'\nimport { cn } from '../lib/utils'\n\nexport interface MessageInputProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit'> {\n onSubmit: (text: string) => void\n placeholder?: string\n disabled?: boolean\n isStreaming?: boolean\n onCancel?: () => void\n leadingSlot?: React.ReactNode\n trailingSlot?: React.ReactNode\n disclaimer?: string\n sendIcon?: React.ReactNode\n}\n\nconst MessageInput = React.forwardRef<HTMLDivElement, MessageInputProps>(\n (\n {\n onSubmit,\n placeholder = 'Type a message...',\n disabled = false,\n isStreaming = false,\n onCancel,\n leadingSlot,\n trailingSlot,\n disclaimer,\n sendIcon,\n className,\n ...props\n },\n ref,\n ) => {\n const [text, setText] = React.useState('')\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n\n const resize = React.useCallback(() => {\n const el = textareaRef.current\n if (!el) return\n el.style.height = 'auto'\n el.style.height = `${Math.min(el.scrollHeight, 160)}px`\n }, [])\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value)\n resize()\n },\n [resize],\n )\n\n const handleSend = React.useCallback(() => {\n const trimmed = text.trim()\n if (!trimmed || isStreaming) return\n onSubmit(trimmed)\n setText('')\n // Reset height after clearing\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto'\n }\n }, [text, isStreaming, onSubmit])\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (!isStreaming) {\n handleSend()\n }\n }\n },\n [isStreaming, handleSend],\n )\n\n const isEmpty = text.trim().length === 0\n\n return (\n <div\n ref={ref}\n className={cn(\n 'border-t border-surface-border-subtle px-ds-05 py-ds-04',\n className,\n )}\n {...props}\n >\n <div className=\"flex items-end gap-ds-02 rounded-overlay-lg border border-surface-border bg-surface-base p-ds-03\">\n {leadingSlot}\n <textarea\n ref={textareaRef}\n value={text}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n aria-label={placeholder || 'Type a message'}\n disabled={disabled}\n rows={1}\n className=\"flex-1 resize-none bg-transparent px-ds-02 py-ds-01 text-body-sm text-surface-fg placeholder:text-surface-fg-subtle/50 focus:outline-hidden disabled:opacity-50\"\n style={{ maxHeight: 160 }}\n />\n {isStreaming ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n color=\"error\"\n onClick={onCancel}\n aria-label=\"Stop\"\n >\n <Icon icon={IconSquare} size=\"sm\" />\n </Button>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleSend}\n disabled={isEmpty || disabled}\n aria-label=\"Send\"\n >\n {sendIcon ?? <Icon icon={IconSend} size=\"sm\" />}\n </Button>\n )}\n {trailingSlot}\n </div>\n {disclaimer && (\n <p className=\"mt-ds-02 text-center text-caption text-surface-fg-subtle/50\">\n {disclaimer}\n </p>\n )}\n </div>\n )\n },\n)\nMessageInput.displayName = 'MessageInput'\n\nexport { MessageInput }\n","'use client'\n\nimport { AnimatePresence,motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { tweens } from '../lib/motion'\nimport { cn } from '../lib/utils'\nimport { Spinner } from '../spinner'\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /** Auto-scroll to bottom when new content arrives (default true) */\n autoScroll?: boolean\n /** Number of new messages to show in the floating pill */\n newMessageCount?: number\n /** Called when user clicks the \"N new\" pill */\n onScrollToBottom?: () => void\n /** Called when user scrolls near the top — triggers load-more */\n onLoadMore?: () => void\n /** Whether more messages are currently being loaded */\n loadingMore?: boolean\n /** Content to render when there are no children */\n emptySlot?: React.ReactNode\n /** Custom scroll-to-bottom button (unused slot for future override) */\n scrollToBottomSlot?: React.ReactNode\n /** Content rendered above the scroll container (e.g. channel name) */\n headerSlot?: React.ReactNode\n}\n\nconst MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n (\n {\n children,\n autoScroll = true,\n newMessageCount = 0,\n onScrollToBottom,\n onLoadMore,\n loadingMore = false,\n emptySlot,\n scrollToBottomSlot,\n headerSlot,\n className,\n ...props\n },\n ref,\n ) => {\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const isAtBottomRef = React.useRef(true)\n const [isAtBottom, setIsAtBottom] = React.useState(true)\n const loadingMoreRef = React.useRef(false)\n const prevScrollHeightRef = React.useRef(0)\n\n const isEmpty = React.Children.count(children) === 0 && !loadingMore\n\n // ── Scroll handler ────────────────────────────────────────────\n const handleScroll = React.useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40\n isAtBottomRef.current = atBottom\n setIsAtBottom(atBottom)\n\n // Load more when near top\n if (el.scrollTop < 100 && onLoadMore && !loadingMoreRef.current) {\n loadingMoreRef.current = true\n prevScrollHeightRef.current = el.scrollHeight\n onLoadMore()\n }\n }, [onLoadMore])\n\n // ── Auto-scroll to bottom when children change ────────────────\n React.useLayoutEffect(() => {\n const el = scrollRef.current\n if (!el) return\n\n // Scroll preservation after load-more\n if (loadingMoreRef.current) {\n const newScrollHeight = el.scrollHeight\n el.scrollTop = newScrollHeight - prevScrollHeightRef.current\n loadingMoreRef.current = false\n return\n }\n\n // Auto-scroll if user was at bottom\n if (autoScroll && isAtBottomRef.current) {\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' })\n }\n }, [children, autoScroll])\n\n // ── Reset loading flag when loadingMore goes false ──────────\n React.useEffect(() => {\n if (!loadingMore) {\n loadingMoreRef.current = false\n }\n }, [loadingMore])\n\n // ── \"N new\" pill visibility ───────────────────────────────────\n const showNewPill = newMessageCount > 0 && !isAtBottom\n\n const handleScrollToBottom = React.useCallback(() => {\n const el = scrollRef.current\n if (el) {\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' })\n }\n onScrollToBottom?.()\n }, [onScrollToBottom])\n\n return (\n <div\n ref={ref}\n className={cn('relative flex flex-1 flex-col overflow-hidden', className)}\n {...props}\n >\n {headerSlot}\n <div\n ref={scrollRef}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n className=\"flex-1 overflow-y-auto px-ds-05 py-ds-04\"\n style={{\n scrollbarWidth: 'thin',\n scrollbarColor: 'var(--color-surface-border) transparent',\n }}\n onScroll={handleScroll}\n >\n {loadingMore && (\n <div className=\"flex justify-center py-ds-03\">\n <Spinner size=\"sm\" />\n </div>\n )}\n {isEmpty ? (\n emptySlot\n ) : (\n <div className=\"flex flex-col gap-ds-04\">\n <AnimatePresence initial={false}>{children}</AnimatePresence>\n </div>\n )}\n </div>\n\n {/* \"N new\" floating pill */}\n <AnimatePresence>\n {showNewPill && (\n <motion.button\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={tweens.fade}\n onClick={handleScrollToBottom}\n className=\"absolute bottom-ds-04 left-1/2 z-10 -translate-x-1/2 rounded-pill bg-accent-9 px-ds-04 py-ds-02 text-body-xs font-medium text-accent-fg shadow-raised transition-colors hover:bg-accent-10\"\n >\n {newMessageCount} new\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n )\n },\n)\nMessageList.displayName = 'MessageList'\n\nexport { MessageList }\n","'use client'\n\nimport { IconAlertCircle } from '@tabler/icons-react'\nimport * as React from 'react'\n\nimport { Icon } from '../icon'\nimport { IconProvider } from '../icon-context'\nimport type { IconInput } from '../lib/icon-input'\nimport { normalizeIcon } from '../lib/normalize-icon'\nimport { cn } from '../lib/utils'\n\nexport interface SystemMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: IconInput\n timestamp?: string\n variant?: 'event' | 'alert'\n children: React.ReactNode\n}\n\nfunction formatTime(ts: string): string {\n return new Date(ts).toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n })\n}\n\nconst SystemMessage = React.forwardRef<HTMLDivElement, SystemMessageProps>(\n ({ icon, timestamp, variant = 'event', children, className, ...props }, ref) => {\n if (variant === 'alert') {\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={cn('flex justify-center', className)}\n {...props}\n >\n <div className=\"flex items-center gap-ds-03 rounded-surface bg-error-3 px-ds-04 py-ds-03\">\n <IconProvider size=\"sm\">{normalizeIcon(icon) ?? <Icon icon={IconAlertCircle} />}</IconProvider>\n <span className=\"text-body-sm text-error-11\">{children}</span>\n {timestamp && (\n <span className=\"text-body-sm text-error-11/60\">\n {formatTime(timestamp)}\n </span>\n )}\n </div>\n </div>\n )\n }\n\n // event variant (default)\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center gap-ds-02 rounded-control-inner bg-surface-raised-hover/30 px-ds-02 py-ds-01 -mx-ds-02 text-body-sm text-surface-fg-subtle/60',\n className,\n )}\n {...props}\n >\n <IconProvider size=\"xs\">{normalizeIcon(icon)}</IconProvider>\n <span className=\"flex-1\">{children}</span>\n {timestamp && <span>{formatTime(timestamp)}</span>}\n </div>\n )\n },\n)\nSystemMessage.displayName = 'SystemMessage'\n\nexport { SystemMessage }\n","'use client'\n\nimport { AnimatePresence,motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport interface TypingIndicatorProps {\n users: { name: string; image?: string }[]\n className?: string\n}\n\nfunction formatTypingText(users: { name: string }[]): string {\n if (users.length === 1) return `${users[0].name} is typing...`\n if (users.length === 2) return `${users[0].name} and ${users[1].name} are typing...`\n return 'Several people are typing...'\n}\n\nfunction TypingIndicator({ users, className }: TypingIndicatorProps) {\n return (\n <div className={cn('min-h-ds-06 px-ds-05', className)} role=\"status\" aria-live=\"polite\">\n <AnimatePresence>\n {users.length > 0 && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex items-center gap-ds-02 text-caption text-surface-fg-subtle\"\n >\n <span className=\"flex items-center gap-ds-01\">\n {[0, 1, 2].map((i) => (\n <motion.span\n key={i}\n className=\"h-1 w-1 rounded-pill bg-surface-fg-subtle\"\n animate={{ y: [0, -3, 0] }}\n transition={{\n duration: 0.5,\n repeat: Infinity,\n delay: i * 0.15,\n }}\n />\n ))}\n </span>\n <span>{formatTypingText(users)}</span>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )\n}\nTypingIndicator.displayName = 'TypingIndicator'\n\nexport { TypingIndicator }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport interface UnreadSeparatorProps {\n label?: string\n count?: number\n className?: string\n}\n\nfunction UnreadSeparator({\n label = 'NEW',\n count,\n className,\n}: UnreadSeparatorProps) {\n return (\n <div className={cn('relative flex items-center py-ds-02', className)}>\n <div className=\"flex-1 border-t-2 border-accent-7\" />\n <span className=\"px-ds-03 text-body-xs font-semibold text-accent-11\">\n {count ? `${count} ${label}` : label}\n </span>\n <div className=\"flex-1 border-t-2 border-accent-7\" />\n </div>\n )\n}\nUnreadSeparator.displayName = 'UnreadSeparator'\n\nexport { UnreadSeparator }\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat.js","names":[],"sources":["../../src/ui/chat/date-separator.tsx","../../src/ui/chat/message.tsx","../../src/ui/chat/message-input.tsx","../../src/ui/chat/message-list.tsx","../../src/ui/chat/system-message.tsx","../../src/ui/chat/typing-indicator.tsx","../../src/ui/chat/unread-separator.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport interface DateSeparatorProps {\n date: Date | string\n format?: (date: Date) => string\n className?: string\n /** BCP 47 locale for the default label's month name. @default 'en-US' */\n locale?: string\n /**\n * IANA time zone used for the \"Today\"/\"Yesterday\" day-boundary comparison\n * and for formatting. Defaults to the browser's local time zone.\n */\n timeZone?: string\n}\n\n/** Year/month/day of `date` as seen in `timeZone` (or the local zone when omitted). */\nfunction datePartsIn(date: Date, timeZone?: string): { year: number; month: number; day: number } {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(date)\n const get = (type: string) => Number(parts.find((p) => p.type === type)?.value)\n return { year: get('year'), month: get('month'), day: get('day') }\n}\n\nfunction defaultFormat(date: Date, locale: string, timeZone?: string): string {\n const now = new Date()\n const today = datePartsIn(now, timeZone)\n const target = datePartsIn(date, timeZone)\n const todayUTC = Date.UTC(today.year, today.month - 1, today.day)\n const targetUTC = Date.UTC(target.year, target.month - 1, target.day)\n const diffDays = Math.round((todayUTC - targetUTC) / (1000 * 60 * 60 * 24))\n\n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Yesterday'\n\n const month = date.toLocaleString(locale, { month: 'short', timeZone })\n\n if (target.year !== today.year) {\n return `${month} ${target.day}, ${target.year}`\n }\n\n return `${month} ${target.day}`\n}\n\nfunction DateSeparator({ date, format, className, locale = 'en-US', timeZone }: DateSeparatorProps) {\n const d = typeof date === 'string' ? new Date(date) : date\n const label = format ? format(d) : defaultFormat(d, locale, timeZone)\n\n return (\n <div className={cn('flex items-center gap-ds-03 py-ds-03', className)}>\n <div className=\"flex-1 border-t border-surface-border-subtle\" />\n <span className=\"text-label-xs font-medium text-surface-fg-subtle uppercase tracking-wider\">\n {label}\n </span>\n <div className=\"flex-1 border-t border-surface-border-subtle\" />\n </div>\n )\n}\nDateSeparator.displayName = 'DateSeparator'\n\nexport { DateSeparator }\n","'use client'\n\nimport { IconTrash } from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { Avatar, AvatarFallback,AvatarImage } from '../avatar'\nimport { Icon } from '../icon'\nimport { IconProvider } from '../icon-context'\nimport type { IconInput } from '../lib/icon-input'\nimport { MENTION_TOKEN_CLASS } from '../lib/mention'\nimport { motionProps,springs } from '../lib/motion'\nimport { normalizeIcon } from '../lib/normalize-icon'\nimport { cn } from '../lib/utils'\nimport { Textarea } from '../textarea'\nimport { Tooltip, TooltipContent,TooltipTrigger } from '../tooltip'\n\n// ── Context ──────────────────────────────────────────────────────────────\n\ninterface MessageContextValue {\n variant: 'flat' | 'bubble'\n placement: 'start' | 'end'\n grouped: boolean\n highlight?: 'mention' | 'internal'\n}\n\nconst MessageContext = React.createContext<MessageContextValue>({\n variant: 'flat',\n placement: 'start',\n grouped: false,\n})\n\nfunction useMessageContext() {\n return React.useContext(MessageContext)\n}\n\n// ── Root ─────────────────────────────────────────────────────────────────\n\nexport interface MessageProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n variant?: 'flat' | 'bubble'\n placement?: 'start' | 'end'\n highlight?: 'mention' | 'internal'\n grouped?: boolean\n deleted?: boolean\n deletedText?: string\n}\n\nconst MessageRoot = React.forwardRef<HTMLDivElement, MessageProps>(\n (\n {\n children,\n variant = 'flat',\n placement = 'start',\n highlight,\n grouped = false,\n deleted = false,\n deletedText = 'This message was deleted',\n className,\n ...props\n },\n ref,\n ) => {\n const ctx = React.useMemo<MessageContextValue>(\n () => ({ variant, placement, grouped, highlight }),\n [variant, placement, grouped, highlight],\n )\n\n if (deleted) {\n return (\n <motion.div\n ref={ref}\n initial={{ y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={springs.snappy}\n className={cn(\n 'flex items-center gap-ds-02 py-ds-02 text-caption text-surface-fg-subtle italic',\n className,\n )}\n {...motionProps(props)}\n >\n <Icon icon={IconTrash} size=\"xs\" />\n {deletedText}\n </motion.div>\n )\n }\n\n if (variant === 'bubble') {\n return (\n <MessageContext.Provider value={ctx}>\n <motion.div\n ref={ref}\n data-highlight={highlight}\n initial={{ y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={springs.snappy}\n className={cn(\n 'group/message relative flex',\n placement === 'end' ? 'justify-end' : 'justify-start',\n // mention is carried by the styled in-content @token (see MENTION_TOKEN_CLASS), not a row tint/rail\n MENTION_TOKEN_CLASS,\n highlight === 'internal' && 'bg-warning-2/50 rounded-control-inner',\n className,\n )}\n {...motionProps(props)}\n >\n <div\n className={cn(\n 'max-w-[85%] rounded-bubble px-ds-04 py-ds-03',\n placement === 'end'\n ? 'bg-accent-3 text-surface-fg'\n : 'bg-surface-panel text-surface-fg',\n )}\n >\n {children}\n </div>\n </motion.div>\n </MessageContext.Provider>\n )\n }\n\n // flat variant (default)\n return (\n <MessageContext.Provider value={ctx}>\n <motion.div\n ref={ref}\n data-highlight={highlight}\n initial={{ y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={springs.snappy}\n className={cn(\n 'group/message relative flex gap-ds-04',\n grouped && '-mt-ds-01',\n // mention is carried by the styled in-content @token (see MENTION_TOKEN_CLASS), not a row rail/tint\n MENTION_TOKEN_CLASS,\n highlight === 'internal' && 'bg-warning-2/50 rounded-control-inner',\n className,\n )}\n {...motionProps(props)}\n >\n {children}\n </motion.div>\n </MessageContext.Provider>\n )\n },\n)\nMessageRoot.displayName = 'Message'\n\n// ── Avatar ───────────────────────────────────────────────────────────────\n\nexport interface MessageAvatarProps {\n src?: string | null\n fallback?: string\n icon?: IconInput\n size?: 'sm' | 'md'\n children?: React.ReactNode\n}\n\nfunction MessageAvatar({\n src,\n fallback,\n icon,\n size = 'md',\n children,\n}: MessageAvatarProps) {\n const { grouped } = useMessageContext()\n\n const sizeClass = size === 'sm' ? 'w-5' : 'w-6'\n const heightClass = size === 'sm' ? 'h-5' : 'h-6'\n\n if (grouped) {\n return <div className={cn(sizeClass, heightClass, 'shrink-0')} />\n }\n\n if (children) {\n return (\n <div className={cn(sizeClass, 'shrink-0 flex items-start')}>\n {children}\n </div>\n )\n }\n\n if (icon) {\n return (\n <div\n className={cn(\n sizeClass,\n size === 'sm' ? 'h-5' : 'h-6',\n 'shrink-0 flex items-center justify-center rounded-pill bg-surface-panel-hover',\n )}\n >\n <IconProvider size={size === 'sm' ? 'xs' : 'sm'}>{normalizeIcon(icon)}</IconProvider>\n </div>\n )\n }\n\n return (\n <div className={cn(sizeClass, 'shrink-0')}>\n <Avatar size={size === 'sm' ? 'xs' : 'sm'}>\n {src && <AvatarImage src={src} alt={fallback ?? ''} />}\n <AvatarFallback>{fallback ?? ''}</AvatarFallback>\n </Avatar>\n </div>\n )\n}\nMessageAvatar.displayName = 'Message.Avatar'\n\n// ── Content ──────────────────────────────────────────────────────────────\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n}\n\nfunction MessageContent({ children, className, ...props }: MessageContentProps) {\n return (\n <div className={cn('min-w-0 flex-1 flex flex-col gap-ds-02', className)} {...props}>\n {children}\n </div>\n )\n}\nMessageContent.displayName = 'Message.Content'\n\n// ── Author ───────────────────────────────────────────────────────────────\n\nexport interface MessageAuthorProps {\n name: string\n badge?: React.ReactNode\n timestamp?: Date\n formattedTimestamp?: string\n timestampFormat?: (date: Date) => string\n}\n\nfunction defaultTimestampFormat(date: Date): string {\n return date.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })\n}\n\nfunction MessageAuthor({\n name,\n badge,\n timestamp,\n formattedTimestamp,\n timestampFormat = defaultTimestampFormat,\n}: MessageAuthorProps) {\n const { grouped } = useMessageContext()\n\n if (grouped) return null\n\n const timeStr = formattedTimestamp\n ?? (timestamp ? timestampFormat(timestamp) : undefined)\n\n return (\n <div className=\"flex items-baseline gap-ds-02\">\n <span className=\"font-semibold text-body-md text-surface-fg\">{name}</span>\n {badge}\n {timeStr && (\n <span className=\"text-body-sm text-surface-fg-subtle\">{timeStr}</span>\n )}\n </div>\n )\n}\nMessageAuthor.displayName = 'Message.Author'\n\n// ── Body ─────────────────────────────────────────────────────────────────\n\nexport interface MessageBodyProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n}\n\nfunction MessageBody({ children, className, ...props }: MessageBodyProps) {\n return (\n <div\n className={cn(\n 'text-body-md leading-relaxed text-surface-fg whitespace-pre-wrap',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\nMessageBody.displayName = 'Message.Body'\n\n// ── EditableBody ─────────────────────────────────────────────────────────\n\nexport interface MessageEditableBodyProps {\n content: string\n onSave: (newContent: string) => void\n onCancel?: () => void\n canEdit?: boolean\n renderContent?: (content: string) => React.ReactNode\n}\n\nfunction MessageEditableBody({\n content,\n onSave,\n onCancel,\n canEdit = false,\n renderContent,\n}: MessageEditableBodyProps) {\n const [isEditing, setIsEditing] = React.useState(false)\n const [editDraft, setEditDraft] = React.useState(content)\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n\n React.useEffect(() => {\n if (isEditing && textareaRef.current) {\n textareaRef.current.focus()\n textareaRef.current.select()\n }\n }, [isEditing])\n\n const handleStartEdit = React.useCallback(() => {\n if (!canEdit) return\n setEditDraft(content)\n setIsEditing(true)\n }, [canEdit, content])\n\n const handleSave = React.useCallback(() => {\n const trimmed = editDraft.trim()\n if (trimmed && trimmed !== content) {\n onSave(trimmed)\n }\n setIsEditing(false)\n }, [editDraft, content, onSave])\n\n const handleCancel = React.useCallback(() => {\n setIsEditing(false)\n setEditDraft(content)\n onCancel?.()\n }, [content, onCancel])\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSave()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n handleCancel()\n }\n },\n [handleSave, handleCancel],\n )\n\n if (isEditing) {\n return (\n <div className=\"text-body-md leading-relaxed\">\n <Textarea\n ref={textareaRef}\n value={editDraft}\n onChange={(e) => setEditDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleSave}\n // compact inline-edit overrides on top of the Textarea base\n className=\"resize-none rounded-control-inner bg-surface-panel-hover px-ds-02 py-ds-01 text-body-md leading-relaxed\"\n rows={2}\n />\n <div className=\"mt-ds-01 text-caption text-surface-fg-subtle\">\n Enter to save · Escape to cancel\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={cn(\n 'text-body-md leading-relaxed text-surface-fg whitespace-pre-wrap',\n canEdit && 'cursor-pointer hover:bg-surface-panel-hover rounded-control-inner transition-colors',\n )}\n onClick={handleStartEdit}\n role={canEdit ? 'button' : undefined}\n tabIndex={canEdit ? 0 : undefined}\n onKeyDown={\n canEdit\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleStartEdit()\n }\n }\n : undefined\n }\n >\n {renderContent ? renderContent(content) : content}\n </div>\n )\n}\nMessageEditableBody.displayName = 'Message.EditableBody'\n\n// ── Reactions ────────────────────────────────────────────────────────────\n\nexport interface MessageReactionsProps {\n reactions: { emoji: string; count: number; reacted: boolean }[]\n onReact: (emoji: string) => void\n}\n\nfunction MessageReactions({ reactions, onReact }: MessageReactionsProps) {\n if (reactions.length === 0) return null\n\n return (\n <div className=\"flex flex-wrap gap-ds-02 mt-ds-03\">\n {reactions.map((r) => (\n <button\n key={r.emoji}\n type=\"button\"\n onClick={() => onReact(r.emoji)}\n aria-label={`${r.emoji} ${r.count} reaction${r.count !== 1 ? 's' : ''}${r.reacted ? ', you reacted' : ''}`}\n className={cn(\n 'inline-flex items-center gap-ds-01 rounded-pill px-ds-02 py-ds-01 text-body-xs transition-colors',\n r.reacted\n ? 'bg-accent-3 ring-1 ring-accent-6'\n : 'bg-surface-panel-hover hover:bg-surface-panel-active',\n )}\n >\n <span>{r.emoji}</span>\n <span>{r.count}</span>\n </button>\n ))}\n </div>\n )\n}\nMessageReactions.displayName = 'Message.Reactions'\n\n// ── Actions (floating toolbar) ───────────────────────────────────────────\n\nexport interface MessageActionsProps {\n children: React.ReactNode\n delay?: number\n}\n\nfunction MessageActions({ children, delay = 100 }: MessageActionsProps) {\n return (\n <div\n className={cn(\n 'absolute -top-2 right-0 z-10',\n 'flex items-center gap-ds-01 rounded-control bg-surface-panel px-ds-01 py-ds-01 shadow-raised',\n 'opacity-0 group-hover/message:opacity-100 group-focus-within/message:opacity-100 transition-opacity duration-150',\n )}\n style={{ transitionDelay: `${delay}ms` }}\n >\n {children}\n </div>\n )\n}\nMessageActions.displayName = 'Message.Actions'\n\n// ── Action (single icon button) ──────────────────────────────────────────\n\nexport interface MessageActionProps {\n icon: IconInput\n label: string\n onClick: () => void\n variant?: 'default' | 'danger'\n}\n\nfunction MessageAction({\n icon,\n label,\n onClick,\n variant = 'default',\n}: MessageActionProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n className={cn(\n 'p-ds-02 rounded-control-inner transition-colors',\n variant === 'default' &&\n 'text-surface-fg-subtle hover:text-surface-fg hover:bg-surface-panel-hover',\n variant === 'danger' &&\n 'text-surface-fg-subtle hover:text-error-11 hover:bg-surface-panel-hover',\n )}\n >\n <IconProvider size=\"xs\">{normalizeIcon(icon)}</IconProvider>\n </button>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n )\n}\nMessageAction.displayName = 'Message.Action'\n\n// ── Compound Export ──────────────────────────────────────────────────────\n\nexport const Message = Object.assign(MessageRoot, {\n Avatar: MessageAvatar,\n Content: MessageContent,\n Author: MessageAuthor,\n Body: MessageBody,\n EditableBody: MessageEditableBody,\n Reactions: MessageReactions,\n Actions: MessageActions,\n Action: MessageAction,\n})\n\nexport {\n type MessageContextValue,\n useMessageContext,\n}\n","'use client'\n\nimport { IconSend, IconSquare } from '@tabler/icons-react'\nimport * as React from 'react'\n\nimport { Button } from '../button'\nimport { Icon } from '../icon'\nimport { cn } from '../lib/utils'\n\nexport interface MessageInputProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit'> {\n onSubmit: (text: string) => void\n placeholder?: string\n disabled?: boolean\n isStreaming?: boolean\n onCancel?: () => void\n leadingSlot?: React.ReactNode\n trailingSlot?: React.ReactNode\n disclaimer?: string\n sendIcon?: React.ReactNode\n}\n\nconst MessageInput = React.forwardRef<HTMLDivElement, MessageInputProps>(\n (\n {\n onSubmit,\n placeholder = 'Type a message...',\n disabled = false,\n isStreaming = false,\n onCancel,\n leadingSlot,\n trailingSlot,\n disclaimer,\n sendIcon,\n className,\n ...props\n },\n ref,\n ) => {\n const [text, setText] = React.useState('')\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n\n const resize = React.useCallback(() => {\n const el = textareaRef.current\n if (!el) return\n el.style.height = 'auto'\n el.style.height = `${Math.min(el.scrollHeight, 160)}px`\n }, [])\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value)\n resize()\n },\n [resize],\n )\n\n const handleSend = React.useCallback(() => {\n const trimmed = text.trim()\n if (!trimmed || isStreaming) return\n onSubmit(trimmed)\n setText('')\n // Reset height after clearing\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto'\n }\n }, [text, isStreaming, onSubmit])\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (!isStreaming) {\n handleSend()\n }\n }\n },\n [isStreaming, handleSend],\n )\n\n const isEmpty = text.trim().length === 0\n\n return (\n <div\n ref={ref}\n className={cn(\n 'border-t border-surface-border-subtle px-ds-05 py-ds-04',\n className,\n )}\n {...props}\n >\n <div className=\"flex items-end gap-ds-02 rounded-overlay-lg border border-surface-border bg-surface-base p-ds-03\">\n {leadingSlot}\n <textarea\n ref={textareaRef}\n value={text}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n aria-label={placeholder || 'Type a message'}\n disabled={disabled}\n rows={1}\n className=\"flex-1 resize-none bg-transparent px-ds-02 py-ds-01 text-body-sm text-surface-fg placeholder:text-surface-fg-muted focus:outline-hidden disabled:opacity-50\"\n style={{ maxHeight: 160 }}\n />\n {isStreaming ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n color=\"error\"\n onClick={onCancel}\n aria-label=\"Stop\"\n >\n <Icon icon={IconSquare} size=\"sm\" />\n </Button>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleSend}\n disabled={isEmpty || disabled}\n aria-label=\"Send\"\n >\n {sendIcon ?? <Icon icon={IconSend} size=\"sm\" />}\n </Button>\n )}\n {trailingSlot}\n </div>\n {disclaimer && (\n <p className=\"mt-ds-02 text-center text-caption text-surface-fg-subtle\">\n {disclaimer}\n </p>\n )}\n </div>\n )\n },\n)\nMessageInput.displayName = 'MessageInput'\n\nexport { MessageInput }\n","'use client'\n\nimport { AnimatePresence,motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { tweens } from '../lib/motion'\nimport { cn } from '../lib/utils'\nimport { Spinner } from '../spinner'\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /** Auto-scroll to bottom when new content arrives (default true) */\n autoScroll?: boolean\n /** Number of new messages to show in the floating pill */\n newMessageCount?: number\n /** Called when user clicks the \"N new\" pill */\n onScrollToBottom?: () => void\n /** Called when user scrolls near the top — triggers load-more */\n onLoadMore?: () => void\n /** Whether more messages are currently being loaded */\n loadingMore?: boolean\n /** Content to render when there are no children */\n emptySlot?: React.ReactNode\n /** Custom scroll-to-bottom button (unused slot for future override) */\n scrollToBottomSlot?: React.ReactNode\n /** Content rendered above the scroll container (e.g. channel name) */\n headerSlot?: React.ReactNode\n}\n\nconst MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n (\n {\n children,\n autoScroll = true,\n newMessageCount = 0,\n onScrollToBottom,\n onLoadMore,\n loadingMore = false,\n emptySlot,\n scrollToBottomSlot,\n headerSlot,\n className,\n ...props\n },\n ref,\n ) => {\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const isAtBottomRef = React.useRef(true)\n const [isAtBottom, setIsAtBottom] = React.useState(true)\n const loadingMoreRef = React.useRef(false)\n const prevScrollHeightRef = React.useRef(0)\n\n const isEmpty = React.Children.count(children) === 0 && !loadingMore\n\n // ── Scroll handler ────────────────────────────────────────────\n const handleScroll = React.useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40\n isAtBottomRef.current = atBottom\n setIsAtBottom(atBottom)\n\n // Load more when near top\n if (el.scrollTop < 100 && onLoadMore && !loadingMoreRef.current) {\n loadingMoreRef.current = true\n prevScrollHeightRef.current = el.scrollHeight\n onLoadMore()\n }\n }, [onLoadMore])\n\n // ── Auto-scroll to bottom when children change ────────────────\n React.useLayoutEffect(() => {\n const el = scrollRef.current\n if (!el) return\n\n // Scroll preservation after load-more\n if (loadingMoreRef.current) {\n const newScrollHeight = el.scrollHeight\n el.scrollTop = newScrollHeight - prevScrollHeightRef.current\n loadingMoreRef.current = false\n return\n }\n\n // Auto-scroll if user was at bottom\n if (autoScroll && isAtBottomRef.current) {\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' })\n }\n }, [children, autoScroll])\n\n // ── Reset loading flag when loadingMore goes false ──────────\n React.useEffect(() => {\n if (!loadingMore) {\n loadingMoreRef.current = false\n }\n }, [loadingMore])\n\n // ── \"N new\" pill visibility ───────────────────────────────────\n const showNewPill = newMessageCount > 0 && !isAtBottom\n\n const handleScrollToBottom = React.useCallback(() => {\n const el = scrollRef.current\n if (el) {\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' })\n }\n onScrollToBottom?.()\n }, [onScrollToBottom])\n\n return (\n <div\n ref={ref}\n className={cn('relative flex flex-1 flex-col overflow-hidden', className)}\n {...props}\n >\n {headerSlot}\n <div\n ref={scrollRef}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n className=\"flex-1 overflow-y-auto px-ds-05 py-ds-04\"\n style={{\n scrollbarWidth: 'thin',\n scrollbarColor: 'var(--color-surface-border) transparent',\n }}\n onScroll={handleScroll}\n >\n {loadingMore && (\n <div className=\"flex justify-center py-ds-03\">\n <Spinner size=\"sm\" />\n </div>\n )}\n {isEmpty ? (\n emptySlot\n ) : (\n <div className=\"flex flex-col gap-ds-04\">\n <AnimatePresence initial={false}>{children}</AnimatePresence>\n </div>\n )}\n </div>\n\n {/* \"N new\" floating pill */}\n <AnimatePresence>\n {showNewPill && (\n <motion.button\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={tweens.fade}\n onClick={handleScrollToBottom}\n className=\"absolute bottom-ds-04 left-1/2 z-10 -translate-x-1/2 rounded-pill bg-accent-9 px-ds-04 py-ds-02 text-body-xs font-medium text-accent-fg shadow-raised transition-colors hover:bg-accent-10\"\n >\n {newMessageCount} new\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n )\n },\n)\nMessageList.displayName = 'MessageList'\n\nexport { MessageList }\n","'use client'\n\nimport { IconAlertCircle } from '@tabler/icons-react'\nimport * as React from 'react'\n\nimport { Icon } from '../icon'\nimport { IconProvider } from '../icon-context'\nimport type { IconInput } from '../lib/icon-input'\nimport { normalizeIcon } from '../lib/normalize-icon'\nimport { cn } from '../lib/utils'\n\nexport interface SystemMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: IconInput\n timestamp?: string\n variant?: 'event' | 'alert'\n children: React.ReactNode\n}\n\nfunction formatTime(ts: string): string {\n return new Date(ts).toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n })\n}\n\nconst SystemMessage = React.forwardRef<HTMLDivElement, SystemMessageProps>(\n ({ icon, timestamp, variant = 'event', children, className, ...props }, ref) => {\n if (variant === 'alert') {\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={cn('flex justify-center', className)}\n {...props}\n >\n <div className=\"flex items-center gap-ds-03 rounded-surface bg-error-3 px-ds-04 py-ds-03\">\n <IconProvider size=\"sm\">{normalizeIcon(icon) ?? <Icon icon={IconAlertCircle} />}</IconProvider>\n <span className=\"text-body-sm text-error-11\">{children}</span>\n {timestamp && (\n <span className=\"text-body-sm text-error-11/60\">\n {formatTime(timestamp)}\n </span>\n )}\n </div>\n </div>\n )\n }\n\n // event variant (default)\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center gap-ds-02 rounded-control-inner bg-surface-panel-hover/30 px-ds-02 py-ds-01 -mx-ds-02 text-body-sm text-surface-fg-subtle',\n className,\n )}\n {...props}\n >\n <IconProvider size=\"xs\">{normalizeIcon(icon)}</IconProvider>\n <span className=\"flex-1\">{children}</span>\n {timestamp && <span>{formatTime(timestamp)}</span>}\n </div>\n )\n },\n)\nSystemMessage.displayName = 'SystemMessage'\n\nexport { SystemMessage }\n","'use client'\n\nimport { AnimatePresence,motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport interface TypingIndicatorProps {\n users: { name: string; image?: string }[]\n className?: string\n}\n\nfunction formatTypingText(users: { name: string }[]): string {\n if (users.length === 1) return `${users[0].name} is typing...`\n if (users.length === 2) return `${users[0].name} and ${users[1].name} are typing...`\n return 'Several people are typing...'\n}\n\nfunction TypingIndicator({ users, className }: TypingIndicatorProps) {\n return (\n <div className={cn('min-h-ds-06 px-ds-05', className)} role=\"status\" aria-live=\"polite\">\n <AnimatePresence>\n {users.length > 0 && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex items-center gap-ds-02 text-caption text-surface-fg-subtle\"\n >\n <span className=\"flex items-center gap-ds-01\">\n {[0, 1, 2].map((i) => (\n <motion.span\n key={i}\n className=\"h-1 w-1 rounded-pill bg-surface-fg-subtle\"\n animate={{ y: [0, -3, 0] }}\n transition={{\n duration: 0.5,\n repeat: Infinity,\n delay: i * 0.15,\n }}\n />\n ))}\n </span>\n <span>{formatTypingText(users)}</span>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n )\n}\nTypingIndicator.displayName = 'TypingIndicator'\n\nexport { TypingIndicator }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport interface UnreadSeparatorProps {\n label?: string\n count?: number\n className?: string\n}\n\nfunction UnreadSeparator({\n label = 'NEW',\n count,\n className,\n}: UnreadSeparatorProps) {\n return (\n <div className={cn('relative flex items-center py-ds-02', className)}>\n <div className=\"flex-1 border-t-2 border-accent-7\" />\n <span className=\"px-ds-03 text-body-xs font-semibold text-accent-11\">\n {count ? `${count} ${label}` : label}\n </span>\n <div className=\"flex-1 border-t-2 border-accent-7\" />\n </div>\n )\n}\nUnreadSeparator.displayName = 'UnreadSeparator'\n\nexport { UnreadSeparator }\n"],"mappings":"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"}
@@ -88,7 +88,7 @@ function g({ url: g, initialPage: _, onError: v }) {
88
88
  onChange: (e) => w(e.target.value),
89
89
  onKeyDown: A,
90
90
  onBlur: () => w(String(x)),
91
- className: "w-8 bg-transparent text-center font-mono text-surface-fg outline-hidden focus:bg-surface-raised-hover rounded-control-inner",
91
+ className: "w-8 bg-transparent text-center font-mono text-surface-fg outline-hidden focus:bg-surface-panel-hover rounded-control-inner",
92
92
  "aria-label": "Page number"
93
93
  }), /* @__PURE__ */ c("span", { children: ["/ ", y] })]
94
94
  }),