@devalok/shilp-sutra 0.57.0 → 0.59.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 (258) hide show
  1. package/MIGRATION.md +91 -0
  2. package/dist/_chunks/badge-group.js +75 -188
  3. package/dist/_chunks/badge-group.js.map +1 -1
  4. package/dist/_chunks/chat.js +244 -243
  5. package/dist/_chunks/chat.js.map +1 -1
  6. package/dist/_chunks/image-preview.js +71 -70
  7. package/dist/_chunks/image-preview.js.map +1 -1
  8. package/dist/_chunks/motion-preference.js +15 -0
  9. package/dist/_chunks/motion-preference.js.map +1 -0
  10. package/dist/_chunks/motion-provider.js +1 -1
  11. package/dist/_chunks/motion-provider.js.map +1 -1
  12. package/dist/_chunks/popover.js +50 -49
  13. package/dist/_chunks/popover.js.map +1 -1
  14. package/dist/_chunks/primitives-internal.js +29 -29
  15. package/dist/_chunks/primitives-internal.js.map +1 -1
  16. package/dist/_chunks/shared.js +48 -47
  17. package/dist/_chunks/shared.js.map +1 -1
  18. package/dist/_chunks/success.js +34 -34
  19. package/dist/_chunks/tree-view.js +1 -1
  20. package/dist/_chunks/tree-view.js.map +1 -1
  21. package/dist/ai/block-renderer.js +8 -8
  22. package/dist/ai/command-bar.js +65 -65
  23. package/dist/ai/command-bar.js.map +1 -1
  24. package/dist/ai/conversation.js +35 -35
  25. package/dist/ai/conversation.js.map +1 -1
  26. package/dist/ai/index.js +4 -4
  27. package/dist/composed/activity-feed.d.ts.map +1 -1
  28. package/dist/composed/activity-feed.js +108 -107
  29. package/dist/composed/activity-feed.js.map +1 -1
  30. package/dist/composed/command-palette.js +137 -137
  31. package/dist/composed/command-palette.js.map +1 -1
  32. package/dist/composed/content-card.js +1 -1
  33. package/dist/composed/content-card.js.map +1 -1
  34. package/dist/composed/date-picker/index.js +5 -5
  35. package/dist/composed/date-picker/index.js.map +1 -1
  36. package/dist/composed/empty-state.js +4 -4
  37. package/dist/composed/file-preview/image-preview.d.ts.map +1 -1
  38. package/dist/composed/file-preview/shared.d.ts.map +1 -1
  39. package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
  40. package/dist/composed/file-preview.js +151 -150
  41. package/dist/composed/file-preview.js.map +1 -1
  42. package/dist/composed/filter-bar.d.ts.map +1 -1
  43. package/dist/composed/filter-bar.js +53 -52
  44. package/dist/composed/filter-bar.js.map +1 -1
  45. package/dist/composed/form-section.d.ts.map +1 -1
  46. package/dist/composed/form-section.js +38 -37
  47. package/dist/composed/form-section.js.map +1 -1
  48. package/dist/composed/master-detail.d.ts.map +1 -1
  49. package/dist/composed/master-detail.js +1 -1
  50. package/dist/composed/master-detail.js.map +1 -1
  51. package/dist/composed/multi-select-popover.d.ts.map +1 -1
  52. package/dist/composed/multi-select-popover.js +109 -108
  53. package/dist/composed/multi-select-popover.js.map +1 -1
  54. package/dist/composed/rich-chat-input/attachment-strip.d.ts.map +1 -1
  55. package/dist/composed/rich-chat-input/reply-banner.d.ts.map +1 -1
  56. package/dist/composed/rich-chat-input/schedule-send.d.ts.map +1 -1
  57. package/dist/composed/rich-chat-input.d.ts.map +1 -1
  58. package/dist/composed/rich-chat-input.js +467 -466
  59. package/dist/composed/rich-chat-input.js.map +1 -1
  60. package/dist/composed/rich-text-editor.js +3 -3
  61. package/dist/composed/rich-text-editor.js.map +1 -1
  62. package/dist/composed/schedule-view.js +2 -2
  63. package/dist/composed/schedule-view.js.map +1 -1
  64. package/dist/composed/status-badge.d.ts.map +1 -1
  65. package/dist/composed/status-badge.js +29 -28
  66. package/dist/composed/status-badge.js.map +1 -1
  67. package/dist/motion/index.d.ts +1 -0
  68. package/dist/motion/index.d.ts.map +1 -1
  69. package/dist/motion/index.js +2 -15
  70. package/dist/motion/motion-preference.d.ts +36 -0
  71. package/dist/motion/motion-preference.d.ts.map +1 -0
  72. package/dist/motion/motion-provider.d.ts +2 -1
  73. package/dist/motion/motion-provider.d.ts.map +1 -1
  74. package/dist/motion/primitives-index.js +103 -102
  75. package/dist/motion/primitives-index.js.map +1 -1
  76. package/dist/motion/primitives.d.ts.map +1 -1
  77. package/dist/shell/bottom-navbar.js +19 -19
  78. package/dist/shell/bottom-navbar.js.map +1 -1
  79. package/dist/shell/index.d.ts +1 -1
  80. package/dist/shell/index.d.ts.map +1 -1
  81. package/dist/shell/notification-center.d.ts +17 -0
  82. package/dist/shell/notification-center.d.ts.map +1 -1
  83. package/dist/shell/notification-center.js +109 -104
  84. package/dist/shell/notification-center.js.map +1 -1
  85. package/dist/shell/notification-preferences.js +1 -1
  86. package/dist/shell/notification-preferences.js.map +1 -1
  87. package/dist/shell/top-bar.js +1 -1
  88. package/dist/shell/top-bar.js.map +1 -1
  89. package/dist/tokens/index.css +1 -0
  90. package/dist/tokens/palettes.css +292 -0
  91. package/dist/tokens/semantic.css +72 -8
  92. package/dist/tokens/shilp-sutra.css +1 -0
  93. package/dist/tokens/utilities.css +10 -7
  94. package/dist/ui/accordion.d.ts.map +1 -1
  95. package/dist/ui/accordion.js +27 -26
  96. package/dist/ui/accordion.js.map +1 -1
  97. package/dist/ui/alert-dialog.d.ts.map +1 -1
  98. package/dist/ui/alert-dialog.js +60 -59
  99. package/dist/ui/alert-dialog.js.map +1 -1
  100. package/dist/ui/alert.d.ts.map +1 -1
  101. package/dist/ui/alert.js +55 -113
  102. package/dist/ui/alert.js.map +1 -1
  103. package/dist/ui/autocomplete.js +80 -80
  104. package/dist/ui/autocomplete.js.map +1 -1
  105. package/dist/ui/avatar.d.ts.map +1 -1
  106. package/dist/ui/avatar.js +69 -68
  107. package/dist/ui/avatar.js.map +1 -1
  108. package/dist/ui/badge-indicator.d.ts +4 -8
  109. package/dist/ui/badge-indicator.d.ts.map +1 -1
  110. package/dist/ui/badge-indicator.js +3 -8
  111. package/dist/ui/badge-indicator.js.map +1 -1
  112. package/dist/ui/badge.d.ts +8 -1
  113. package/dist/ui/badge.d.ts.map +1 -1
  114. package/dist/ui/banner.d.ts.map +1 -1
  115. package/dist/ui/banner.js +42 -40
  116. package/dist/ui/banner.js.map +1 -1
  117. package/dist/ui/button-group.d.ts.map +1 -1
  118. package/dist/ui/button-group.js +3 -23
  119. package/dist/ui/button-group.js.map +1 -1
  120. package/dist/ui/button.d.ts +10 -1
  121. package/dist/ui/button.d.ts.map +1 -1
  122. package/dist/ui/button.js +79 -212
  123. package/dist/ui/button.js.map +1 -1
  124. package/dist/ui/card.d.ts.map +1 -1
  125. package/dist/ui/card.js +75 -72
  126. package/dist/ui/card.js.map +1 -1
  127. package/dist/ui/charts/radar-chart.d.ts.map +1 -1
  128. package/dist/ui/charts/radar-chart.js +1 -1
  129. package/dist/ui/charts/radar-chart.js.map +1 -1
  130. package/dist/ui/chat/message-list.d.ts.map +1 -1
  131. package/dist/ui/chat/message.d.ts.map +1 -1
  132. package/dist/ui/chat/typing-indicator.d.ts.map +1 -1
  133. package/dist/ui/code.js +1 -1
  134. package/dist/ui/code.js.map +1 -1
  135. package/dist/ui/color-input.d.ts.map +1 -1
  136. package/dist/ui/color-input.js +151 -150
  137. package/dist/ui/color-input.js.map +1 -1
  138. package/dist/ui/combobox.d.ts +14 -0
  139. package/dist/ui/combobox.d.ts.map +1 -1
  140. package/dist/ui/combobox.js +152 -148
  141. package/dist/ui/combobox.js.map +1 -1
  142. package/dist/ui/context-menu.d.ts.map +1 -1
  143. package/dist/ui/context-menu.js +70 -69
  144. package/dist/ui/context-menu.js.map +1 -1
  145. package/dist/ui/data-table-body.js +2 -2
  146. package/dist/ui/data-table-body.js.map +1 -1
  147. package/dist/ui/data-table-context.js +2 -2
  148. package/dist/ui/data-table-context.js.map +1 -1
  149. package/dist/ui/data-table-header.d.ts.map +1 -1
  150. package/dist/ui/data-table-header.js +41 -40
  151. package/dist/ui/data-table-header.js.map +1 -1
  152. package/dist/ui/data-table-pagination.js +2 -2
  153. package/dist/ui/data-table-pagination.js.map +1 -1
  154. package/dist/ui/dialog.d.ts.map +1 -1
  155. package/dist/ui/dialog.js +61 -60
  156. package/dist/ui/dialog.js.map +1 -1
  157. package/dist/ui/dot.d.ts.map +1 -1
  158. package/dist/ui/dot.js +10 -41
  159. package/dist/ui/dot.js.map +1 -1
  160. package/dist/ui/dropdown-menu.d.ts.map +1 -1
  161. package/dist/ui/dropdown-menu.js +79 -78
  162. package/dist/ui/dropdown-menu.js.map +1 -1
  163. package/dist/ui/file-upload.d.ts.map +1 -1
  164. package/dist/ui/file-upload.js +116 -115
  165. package/dist/ui/file-upload.js.map +1 -1
  166. package/dist/ui/form.d.ts.map +1 -1
  167. package/dist/ui/form.js +27 -26
  168. package/dist/ui/form.js.map +1 -1
  169. package/dist/ui/hover-card.d.ts.map +1 -1
  170. package/dist/ui/hover-card.js +26 -25
  171. package/dist/ui/hover-card.js.map +1 -1
  172. package/dist/ui/icon.js +7 -7
  173. package/dist/ui/index.d.ts +2 -2
  174. package/dist/ui/index.d.ts.map +1 -1
  175. package/dist/ui/index.js +3 -3
  176. package/dist/ui/index.js.map +1 -1
  177. package/dist/ui/input.js +1 -1
  178. package/dist/ui/input.js.map +1 -1
  179. package/dist/ui/menubar.d.ts.map +1 -1
  180. package/dist/ui/menubar.js +73 -72
  181. package/dist/ui/menubar.js.map +1 -1
  182. package/dist/ui/navigation-menu.d.ts.map +1 -1
  183. package/dist/ui/navigation-menu.js +80 -79
  184. package/dist/ui/navigation-menu.js.map +1 -1
  185. package/dist/ui/popover.d.ts.map +1 -1
  186. package/dist/ui/progress.d.ts.map +1 -1
  187. package/dist/ui/progress.js +72 -68
  188. package/dist/ui/progress.js.map +1 -1
  189. package/dist/ui/radio.d.ts.map +1 -1
  190. package/dist/ui/radio.js +32 -31
  191. package/dist/ui/radio.js.map +1 -1
  192. package/dist/ui/search-input.d.ts.map +1 -1
  193. package/dist/ui/search-input.js +28 -27
  194. package/dist/ui/search-input.js.map +1 -1
  195. package/dist/ui/select.d.ts.map +1 -1
  196. package/dist/ui/select.js +64 -63
  197. package/dist/ui/select.js.map +1 -1
  198. package/dist/ui/sidebar.d.ts.map +1 -1
  199. package/dist/ui/sidebar.js +4 -4
  200. package/dist/ui/sidebar.js.map +1 -1
  201. package/dist/ui/slider.d.ts +63 -9
  202. package/dist/ui/slider.d.ts.map +1 -1
  203. package/dist/ui/slider.js +74 -32
  204. package/dist/ui/slider.js.map +1 -1
  205. package/dist/ui/split-button.d.ts +8 -2
  206. package/dist/ui/split-button.d.ts.map +1 -1
  207. package/dist/ui/split-button.js +49 -95
  208. package/dist/ui/split-button.js.map +1 -1
  209. package/dist/ui/stat-card.d.ts.map +1 -1
  210. package/dist/ui/stat-card.js +89 -88
  211. package/dist/ui/stat-card.js.map +1 -1
  212. package/dist/ui/stat-flash.js +16 -16
  213. package/dist/ui/stepper.d.ts.map +1 -1
  214. package/dist/ui/stepper.js +63 -62
  215. package/dist/ui/stepper.js.map +1 -1
  216. package/dist/ui/table.js +3 -3
  217. package/dist/ui/table.js.map +1 -1
  218. package/dist/ui/tabs.d.ts.map +1 -1
  219. package/dist/ui/tabs.js +67 -66
  220. package/dist/ui/tabs.js.map +1 -1
  221. package/dist/ui/textarea.js +1 -1
  222. package/dist/ui/textarea.js.map +1 -1
  223. package/dist/ui/toast.d.ts.map +1 -1
  224. package/dist/ui/toast.js +195 -194
  225. package/dist/ui/toast.js.map +1 -1
  226. package/dist/ui/toggle.d.ts.map +1 -1
  227. package/dist/ui/toggle.js +24 -22
  228. package/dist/ui/toggle.js.map +1 -1
  229. package/dist/ui/tooltip.d.ts.map +1 -1
  230. package/dist/ui/tooltip.js +37 -36
  231. package/dist/ui/tooltip.js.map +1 -1
  232. package/dist/ui/tree-view/tree-item.d.ts.map +1 -1
  233. package/docs/recipes/customize-brand.md +58 -0
  234. package/docs/recipes/install-astro.md +1 -1
  235. package/docs/recipes/install-next-app-router.md +1 -1
  236. package/docs/recipes/install-next-pages.md +22 -1
  237. package/docs/recipes/install-remix.md +1 -1
  238. package/docs/recipes/install-tanstack-start.md +1 -1
  239. package/docs/recipes/install-vite.md +2 -1
  240. package/docs/recipes/server-components.md +7 -4
  241. package/docs/recipes/troubleshoot.md +1 -0
  242. package/llms.txt +1 -1
  243. package/mcp-manifest.json +9 -4
  244. package/package.json +3 -2
  245. package/skill/SKILL.md +1 -1
  246. package/skill/references/components.md +1 -1
  247. package/skill/references/customize-brand.md +58 -0
  248. package/skill/references/server-components.md +7 -4
  249. package/skill/references/setup-astro.md +1 -1
  250. package/skill/references/setup-next-app-router.md +1 -1
  251. package/skill/references/setup-next-pages.md +22 -1
  252. package/skill/references/setup-remix.md +1 -1
  253. package/skill/references/setup-tanstack-start.md +1 -1
  254. package/skill/references/setup-vite.md +2 -1
  255. package/skill/references/troubleshoot.md +1 -0
  256. package/dist/motion/check-motion-provider.d.ts +0 -2
  257. package/dist/motion/check-motion-provider.d.ts.map +0 -1
  258. package/dist/motion/index.js.map +0 -1
@@ -1,32 +1,33 @@
1
1
  "use client";
2
2
  import { tweens as e } from "../ui/lib/motion.js";
3
- import { cn as t } from "../ui/lib/utils.js";
4
- import { Icon as n } from "../ui/icon.js";
5
- import { Skeleton as r } from "../ui/skeleton.js";
6
- import { Avatar as i, AvatarFallback as a, AvatarImage as o } from "../ui/avatar.js";
7
- import { Button as s } from "../ui/button.js";
8
- import { formatRelativeTime as c } from "../ui/lib/date-utils.js";
9
- import { getInitials as l } from "./lib/string-utils.js";
10
- import * as u from "react";
11
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
12
- import { IconChevronRight as p } from "@tabler/icons-react";
13
- import { motion as m } from "framer-motion";
3
+ import { MotionPreference as t } from "../_chunks/motion-preference.js";
4
+ import { cn as n } from "../ui/lib/utils.js";
5
+ import { Icon as r } from "../ui/icon.js";
6
+ import { Skeleton as i } from "../ui/skeleton.js";
7
+ import { Avatar as a, AvatarFallback as o, AvatarImage as s } from "../ui/avatar.js";
8
+ import { Button as c } from "../ui/button.js";
9
+ import { formatRelativeTime as l } from "../ui/lib/date-utils.js";
10
+ import { getInitials as u } from "./lib/string-utils.js";
11
+ import * as d from "react";
12
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
13
+ import { IconChevronRight as m } from "@tabler/icons-react";
14
+ import { motion as h } from "framer-motion";
14
15
  //#region src/composed/activity-feed.tsx
15
- var h = {
16
+ var g = {
16
17
  default: "bg-surface-fg-subtle",
17
18
  success: "bg-success-9",
18
19
  warning: "bg-warning-9",
19
20
  error: "bg-error-9",
20
21
  info: "bg-info-9"
21
- }, g = {
22
+ }, _ = {
22
23
  today: "Today",
23
24
  yesterday: "Yesterday",
24
25
  thisWeek: "This Week",
25
26
  older: "Older"
26
27
  };
27
- function _(e, t) {
28
+ function v(e, t) {
28
29
  let n = {
29
- ...g,
30
+ ..._,
30
31
  ...t
31
32
  }, r = /* @__PURE__ */ new Date(), i = new Date(r.getFullYear(), r.getMonth(), r.getDate()), a = /* @__PURE__ */ new Date(i.getTime() - 1440 * 60 * 1e3), o = r.getDay(), s = o === 0 ? 6 : o - 1, c = /* @__PURE__ */ new Date(i.getTime() - s * 24 * 60 * 60 * 1e3), l = [], u = [], d = [], f = [];
32
33
  for (let t of e) {
@@ -48,77 +49,77 @@ function _(e, t) {
48
49
  items: f
49
50
  }), p;
50
51
  }
51
- function v({ compact: e }) {
52
- return /* @__PURE__ */ d("div", {
53
- className: t("flex flex-col", e ? "gap-1" : "gap-3"),
52
+ function y({ compact: e }) {
53
+ return /* @__PURE__ */ f("div", {
54
+ className: n("flex flex-col", e ? "gap-1" : "gap-3"),
54
55
  children: [
55
56
  0,
56
57
  1,
57
58
  2
58
- ].map((n) => /* @__PURE__ */ f("div", {
59
+ ].map((t) => /* @__PURE__ */ p("div", {
59
60
  className: "flex items-center gap-ds-03",
60
61
  children: [
61
- /* @__PURE__ */ d(r, { className: "h-2 w-2 shrink-0 rounded-pill" }),
62
- !e && /* @__PURE__ */ d(r, { className: "h-4 w-4 shrink-0 rounded-pill" }),
63
- /* @__PURE__ */ d(r, { className: t("flex-1", e ? "h-3" : "h-4") }),
64
- /* @__PURE__ */ d(r, { className: "h-3 w-12" })
62
+ /* @__PURE__ */ f(i, { className: "h-2 w-2 shrink-0 rounded-pill" }),
63
+ !e && /* @__PURE__ */ f(i, { className: "h-4 w-4 shrink-0 rounded-pill" }),
64
+ /* @__PURE__ */ f(i, { className: n("flex-1", e ? "h-3" : "h-4") }),
65
+ /* @__PURE__ */ f(i, { className: "h-3 w-12" })
65
66
  ]
66
- }, n))
67
+ }, t))
67
68
  });
68
69
  }
69
- function y({ item: e, compact: r }) {
70
- let [s, m] = u.useState(!1), g = u.useId(), _ = e.color ?? "default";
71
- return /* @__PURE__ */ f("div", {
72
- className: t("relative flex items-start", r ? "gap-ds-02" : "gap-ds-03"),
70
+ function b({ item: e, compact: t }) {
71
+ let [i, c] = d.useState(!1), h = d.useId(), _ = e.color ?? "default";
72
+ return /* @__PURE__ */ p("div", {
73
+ className: n("relative flex items-start", t ? "gap-ds-02" : "gap-ds-03"),
73
74
  children: [
74
- /* @__PURE__ */ d("div", { className: t("relative z-10 mt-1.5 h-2 w-2 shrink-0 rounded-pill ring-2 ring-surface-base", h[_]) }),
75
- !r && e.actor && /* @__PURE__ */ f(i, {
75
+ /* @__PURE__ */ f("div", { className: n("relative z-10 mt-1.5 h-2 w-2 shrink-0 rounded-pill ring-2 ring-surface-panel", g[_]) }),
76
+ !t && e.actor && /* @__PURE__ */ p(a, {
76
77
  className: "h-5 w-5 shrink-0 text-[9px]",
77
- children: [e.actor.image && /* @__PURE__ */ d(o, {
78
+ children: [e.actor.image && /* @__PURE__ */ f(s, {
78
79
  src: e.actor.image,
79
80
  alt: e.actor.name
80
- }), /* @__PURE__ */ d(a, {
81
+ }), /* @__PURE__ */ f(o, {
81
82
  className: "text-[9px]",
82
- children: l(e.actor.name)
83
+ children: u(e.actor.name)
83
84
  })]
84
85
  }),
85
- /* @__PURE__ */ f("div", {
86
+ /* @__PURE__ */ p("div", {
86
87
  className: "flex min-w-0 flex-1 flex-col",
87
- children: [/* @__PURE__ */ f("div", {
88
+ children: [/* @__PURE__ */ p("div", {
88
89
  className: "flex items-center justify-between gap-ds-02",
89
- children: [/* @__PURE__ */ f("div", {
90
- className: t("min-w-0 flex-1 flex items-center gap-ds-01 flex-wrap", r ? "text-body-xs" : "text-body-sm"),
90
+ children: [/* @__PURE__ */ p("div", {
91
+ className: n("min-w-0 flex-1 flex items-center gap-ds-01 flex-wrap", t ? "text-body-xs" : "text-body-sm"),
91
92
  children: [
92
- e.actor && /* @__PURE__ */ f("span", {
93
+ e.actor && /* @__PURE__ */ p("span", {
93
94
  className: "font-medium text-surface-fg",
94
95
  children: [e.actor.name, " "]
95
96
  }),
96
- e.detail && /* @__PURE__ */ d(n, {
97
- icon: p,
97
+ e.detail && /* @__PURE__ */ f(r, {
98
+ icon: m,
98
99
  size: "xs",
99
- className: t("shrink-0 text-surface-fg-subtle transition-transform duration-fast-02 ease-productive-standard", s && "rotate-90")
100
+ className: n("shrink-0 text-surface-fg-subtle transition-transform duration-fast-02 ease-productive-standard", i && "rotate-90")
100
101
  }),
101
- e.detail ? /* @__PURE__ */ d("button", {
102
+ e.detail ? /* @__PURE__ */ f("button", {
102
103
  type: "button",
103
104
  className: "rounded-control text-surface-fg-muted hover:underline hover:bg-surface-panel-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9",
104
105
  onClick: () => {
105
- e.detail && m((e) => !e);
106
+ e.detail && c((e) => !e);
106
107
  },
107
- "aria-expanded": s,
108
- "aria-controls": g,
108
+ "aria-expanded": i,
109
+ "aria-controls": h,
109
110
  children: e.action
110
- }) : /* @__PURE__ */ d("span", {
111
+ }) : /* @__PURE__ */ f("span", {
111
112
  className: "text-surface-fg-muted",
112
113
  children: e.action
113
114
  })
114
115
  ]
115
- }), /* @__PURE__ */ d("time", {
116
- className: t("shrink-0 whitespace-nowrap text-surface-fg-subtle", r ? "text-body-xs" : "text-body-sm"),
116
+ }), /* @__PURE__ */ f("time", {
117
+ className: n("shrink-0 whitespace-nowrap text-surface-fg-subtle", t ? "text-body-xs" : "text-body-sm"),
117
118
  dateTime: (typeof e.timestamp == "string" ? new Date(e.timestamp) : e.timestamp).toISOString(),
118
- children: c(e.timestamp)
119
+ children: l(e.timestamp)
119
120
  })]
120
- }), s && e.detail && /* @__PURE__ */ d("div", {
121
- id: g,
121
+ }), i && e.detail && /* @__PURE__ */ f("div", {
122
+ id: h,
122
123
  className: "mt-ds-02 animate-in fade-in slide-in-from-top-1 text-body-sm text-surface-fg-muted",
123
124
  children: e.detail
124
125
  })]
@@ -126,116 +127,116 @@ function y({ item: e, compact: r }) {
126
127
  ]
127
128
  });
128
129
  }
129
- function b({ item: e, compact: n, children: r }) {
130
+ function x({ item: e, compact: t, children: r }) {
130
131
  let i = e.color ?? "default";
131
- return /* @__PURE__ */ f("div", {
132
- className: t("relative flex items-start", n ? "gap-ds-02" : "gap-ds-03"),
133
- children: [/* @__PURE__ */ d("div", { className: t("relative z-10 mt-1.5 h-2 w-2 shrink-0 rounded-pill ring-2 ring-surface-base", h[i]) }), /* @__PURE__ */ d("div", {
132
+ return /* @__PURE__ */ p("div", {
133
+ className: n("relative flex items-start", t ? "gap-ds-02" : "gap-ds-03"),
134
+ children: [/* @__PURE__ */ f("div", { className: n("relative z-10 mt-1.5 h-2 w-2 shrink-0 rounded-pill ring-2 ring-surface-panel", g[i]) }), /* @__PURE__ */ f("div", {
134
135
  className: "min-w-0 flex-1",
135
136
  children: r
136
137
  })]
137
138
  });
138
139
  }
139
- function x({ label: n, isFirst: r }) {
140
- return /* @__PURE__ */ f(m.div, {
140
+ function S({ label: r, isFirst: i }) {
141
+ return /* @__PURE__ */ f(t, { children: /* @__PURE__ */ p(h.div, {
141
142
  initial: !1,
142
143
  animate: { opacity: 1 },
143
144
  transition: e.fade,
144
- className: t("flex items-center gap-ds-03", r ? "" : "mt-ds-06", "mb-ds-03"),
145
+ className: n("flex items-center gap-ds-03", i ? "" : "mt-ds-06", "mb-ds-03"),
145
146
  children: [
146
- /* @__PURE__ */ d("hr", { className: "flex-1 border-surface-border" }),
147
- /* @__PURE__ */ d("span", {
148
- className: "bg-surface-base px-ds-03 text-label-xs font-medium uppercase tracking-wider text-surface-fg-subtle",
149
- children: n
147
+ /* @__PURE__ */ f("hr", { className: "flex-1 border-surface-border" }),
148
+ /* @__PURE__ */ f("span", {
149
+ className: "bg-surface-panel px-ds-03 text-label-xs font-medium uppercase tracking-wider text-surface-fg-subtle",
150
+ children: r
150
151
  }),
151
- /* @__PURE__ */ d("hr", { className: "flex-1 border-surface-border" })
152
+ /* @__PURE__ */ f("hr", { className: "flex-1 border-surface-border" })
152
153
  ]
153
- });
154
+ }) });
154
155
  }
155
- var S = u.forwardRef(({ items: n, onLoadMore: r, loading: i = !1, hasMore: a = !1, emptyState: o, compact: c = !1, maxInitialItems: l, groupBy: p = "none", groupLabels: h, renderItem: g, className: S, ...C }, w) => {
156
- let [T, E] = u.useState(!1);
157
- if (i) return /* @__PURE__ */ d("div", {
158
- ref: w,
159
- className: t("relative", S),
160
- ...C,
161
- children: /* @__PURE__ */ d(v, { compact: c })
156
+ var C = d.forwardRef(({ items: r, onLoadMore: i, loading: a = !1, hasMore: o = !1, emptyState: s, compact: l = !1, maxInitialItems: u, groupBy: m = "none", groupLabels: g, renderItem: _, className: C, ...w }, T) => {
157
+ let [E, D] = d.useState(!1);
158
+ if (a) return /* @__PURE__ */ f("div", {
159
+ ref: T,
160
+ className: n("relative", C),
161
+ ...w,
162
+ children: /* @__PURE__ */ f(y, { compact: l })
162
163
  });
163
- if (n.length === 0) return o ? /* @__PURE__ */ d("div", {
164
- ref: w,
165
- className: S,
166
- ...C,
167
- children: o
164
+ if (r.length === 0) return s ? /* @__PURE__ */ f("div", {
165
+ ref: T,
166
+ className: C,
167
+ ...w,
168
+ children: s
168
169
  }) : null;
169
- let D = l != null && !T && n.length > l, O = D ? n.slice(0, l) : n, k = p === "time", A = (e, t) => {
170
- if (g) {
171
- let n = g(e, t);
172
- if (n !== void 0) return /* @__PURE__ */ d(b, {
170
+ let O = u != null && !E && r.length > u, k = O ? r.slice(0, u) : r, A = m === "time", j = (e, t) => {
171
+ if (_) {
172
+ let n = _(e, t);
173
+ if (n !== void 0) return /* @__PURE__ */ f(x, {
173
174
  item: e,
174
- compact: c,
175
+ compact: l,
175
176
  children: n
176
177
  });
177
178
  }
178
- return /* @__PURE__ */ d(y, {
179
+ return /* @__PURE__ */ f(b, {
179
180
  item: e,
180
- compact: c
181
+ compact: l
181
182
  });
182
183
  };
183
- return /* @__PURE__ */ f("div", {
184
- ref: w,
185
- className: t("relative", S),
186
- ...C,
184
+ return /* @__PURE__ */ f(t, { children: /* @__PURE__ */ p("div", {
185
+ ref: T,
186
+ className: n("relative", C),
187
+ ...w,
187
188
  children: [
188
- k ? /* @__PURE__ */ d("div", { children: _(O, h).map((n, r) => /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d(x, {
189
- label: n.label,
189
+ A ? /* @__PURE__ */ f("div", { children: v(k, g).map((t, r) => /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f(S, {
190
+ label: t.label,
190
191
  isFirst: r === 0
191
- }), /* @__PURE__ */ f("div", {
192
- className: t("relative flex flex-col", c ? "gap-1" : "gap-3"),
193
- children: [/* @__PURE__ */ d("div", { className: "absolute bottom-0 left-[3px] top-0 w-px bg-surface-border" }), n.items.map((t, n) => /* @__PURE__ */ d(m.div, {
192
+ }), /* @__PURE__ */ p("div", {
193
+ className: n("relative flex flex-col", l ? "gap-1" : "gap-3"),
194
+ children: [/* @__PURE__ */ f("div", { className: "absolute bottom-0 left-[3px] top-0 w-px bg-surface-border" }), t.items.map((t, n) => /* @__PURE__ */ f(h.div, {
194
195
  initial: !1,
195
196
  animate: { opacity: 1 },
196
197
  transition: {
197
198
  ...e.fade,
198
199
  delay: n * .03
199
200
  },
200
- children: A(t, n)
201
+ children: j(t, n)
201
202
  }, t.id))]
202
- })] }, n.label)) }) : /* @__PURE__ */ f("div", {
203
- className: t("relative flex flex-col", c ? "gap-1" : "gap-3"),
204
- children: [/* @__PURE__ */ d("div", { className: "absolute bottom-0 left-[3px] top-0 w-px bg-surface-border" }), O.map((t, n) => /* @__PURE__ */ d(m.div, {
203
+ })] }, t.label)) }) : /* @__PURE__ */ p("div", {
204
+ className: n("relative flex flex-col", l ? "gap-1" : "gap-3"),
205
+ children: [/* @__PURE__ */ f("div", { className: "absolute bottom-0 left-[3px] top-0 w-px bg-surface-border" }), k.map((t, n) => /* @__PURE__ */ f(h.div, {
205
206
  initial: !1,
206
207
  animate: { opacity: 1 },
207
208
  transition: {
208
209
  ...e.fade,
209
210
  delay: n * .03
210
211
  },
211
- children: A(t, n)
212
+ children: j(t, n)
212
213
  }, t.id))]
213
214
  }),
214
- D && /* @__PURE__ */ d("div", {
215
+ O && /* @__PURE__ */ f("div", {
215
216
  className: "relative mt-ds-03 flex justify-center",
216
- children: /* @__PURE__ */ f(s, {
217
+ children: /* @__PURE__ */ p(c, {
217
218
  variant: "ghost",
218
219
  size: "sm",
219
- onClick: () => E(!0),
220
+ onClick: () => D(!0),
220
221
  children: [
221
222
  "Show all (",
222
- n.length,
223
+ r.length,
223
224
  ")"
224
225
  ]
225
226
  })
226
227
  }),
227
- a && r && !D && /* @__PURE__ */ d("div", {
228
+ o && i && !O && /* @__PURE__ */ f("div", {
228
229
  className: "relative mt-ds-03 flex justify-center",
229
- children: /* @__PURE__ */ d(s, {
230
+ children: /* @__PURE__ */ f(c, {
230
231
  variant: "ghost",
231
232
  size: "sm",
232
- onClick: r,
233
+ onClick: i,
233
234
  children: "Load more"
234
235
  })
235
236
  })
236
237
  ]
237
- });
238
+ }) });
238
239
  });
239
- S.displayName = "ActivityFeed";
240
+ C.displayName = "ActivityFeed";
240
241
  //#endregion
241
- export { S as ActivityFeed, _ as groupItemsByTime };
242
+ export { C as ActivityFeed, v as groupItemsByTime };
@@ -1 +1 @@
1
- {"version":3,"file":"activity-feed.js","names":[],"sources":["../../src/composed/activity-feed.tsx"],"sourcesContent":["'use client'\n\nimport { IconChevronRight } from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport { Button } from '../ui/button'\nimport { Icon } from '../ui/icon'\nimport { formatRelativeTime } from '../ui/lib/date-utils'\nimport type { IconInput } from '../ui/lib/icon-input'\nimport { tweens } from '../ui/lib/motion'\nimport { cn } from '../ui/lib/utils'\nimport { Skeleton } from '../ui/skeleton'\nimport { getInitials } from './lib/string-utils'\n\nexport interface ActivityItem {\n id: string\n actor?: { name: string; image?: string }\n action: string | React.ReactNode\n timestamp: Date | string\n icon?: IconInput\n color?: 'default' | 'success' | 'warning' | 'error' | 'info'\n detail?: React.ReactNode\n}\n\nexport interface GroupLabels {\n today?: string\n yesterday?: string\n thisWeek?: string\n older?: string\n}\n\nexport interface ActivityFeedProps extends React.HTMLAttributes<HTMLDivElement> {\n items: ActivityItem[]\n onLoadMore?: () => void\n loading?: boolean\n hasMore?: boolean\n emptyState?: React.ReactNode\n compact?: boolean\n maxInitialItems?: number\n groupBy?: 'time' | 'none'\n groupLabels?: GroupLabels\n /** Custom renderer per item. Return ReactNode for custom rendering, undefined to use default ActivityEntry. */\n renderItem?: (item: ActivityItem, index: number) => React.ReactNode | undefined\n}\n\nconst dotColorMap = {\n default: 'bg-surface-fg-subtle',\n success: 'bg-success-9',\n warning: 'bg-warning-9',\n error: 'bg-error-9',\n info: 'bg-info-9',\n} as const\n\nconst DEFAULT_GROUP_LABELS: Required<GroupLabels> = {\n today: 'Today',\n yesterday: 'Yesterday',\n thisWeek: 'This Week',\n older: 'Older',\n}\n\n/**\n * Buckets items into time-based groups: today, yesterday, earlier this week (since Monday), older.\n * Skips empty groups.\n */\nexport function groupItemsByTime(\n items: ActivityItem[],\n labels?: GroupLabels,\n): { label: string; items: ActivityItem[] }[] {\n const l = { ...DEFAULT_GROUP_LABELS, ...labels }\n const now = new Date()\n\n // Start of today (midnight local)\n const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n // Start of yesterday\n const startOfYesterday = new Date(startOfToday.getTime() - 24 * 60 * 60 * 1000)\n // Start of this week (Monday)\n const dayOfWeek = now.getDay() // 0=Sun, 1=Mon, ...\n const daysSinceMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1\n const startOfWeek = new Date(\n startOfToday.getTime() - daysSinceMonday * 24 * 60 * 60 * 1000,\n )\n\n const today: ActivityItem[] = []\n const yesterday: ActivityItem[] = []\n const thisWeek: ActivityItem[] = []\n const older: ActivityItem[] = []\n\n for (const item of items) {\n const ts =\n typeof item.timestamp === 'string'\n ? new Date(item.timestamp)\n : item.timestamp\n const t = ts.getTime()\n\n if (t >= startOfToday.getTime()) {\n today.push(item)\n } else if (t >= startOfYesterday.getTime()) {\n yesterday.push(item)\n } else if (t >= startOfWeek.getTime()) {\n thisWeek.push(item)\n } else {\n older.push(item)\n }\n }\n\n const groups: { label: string; items: ActivityItem[] }[] = []\n if (today.length > 0) groups.push({ label: l.today, items: today })\n if (yesterday.length > 0) groups.push({ label: l.yesterday, items: yesterday })\n if (thisWeek.length > 0) groups.push({ label: l.thisWeek, items: thisWeek })\n if (older.length > 0) groups.push({ label: l.older, items: older })\n\n return groups\n}\n\nfunction LoadingSkeleton({ compact }: { compact: boolean }) {\n return (\n <div className={cn('flex flex-col', compact ? 'gap-1' : 'gap-3')}>\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"flex items-center gap-ds-03\">\n <Skeleton className=\"h-2 w-2 shrink-0 rounded-pill\" />\n {!compact && <Skeleton className=\"h-4 w-4 shrink-0 rounded-pill\" />}\n <Skeleton className={cn('flex-1', compact ? 'h-3' : 'h-4')} />\n <Skeleton className=\"h-3 w-12\" />\n </div>\n ))}\n </div>\n )\n}\n\nfunction ActivityEntry({\n item,\n compact,\n}: {\n item: ActivityItem\n compact: boolean\n}) {\n const [expandedDetail, setExpandedDetail] = React.useState(false)\n const detailId = React.useId()\n const color = item.color ?? 'default'\n\n const handleActionClick = () => {\n if (item.detail) {\n setExpandedDetail((prev) => !prev)\n }\n }\n\n return (\n <div className={cn('relative flex items-start', compact ? 'gap-ds-02' : 'gap-ds-03')}>\n {/* Dot */}\n <div\n className={cn(\n 'relative z-10 mt-1.5 h-2 w-2 shrink-0 rounded-pill ring-2 ring-surface-base',\n dotColorMap[color],\n )}\n />\n\n {/* Avatar (non-compact only) */}\n {!compact && item.actor && (\n <Avatar className=\"h-5 w-5 shrink-0 text-[9px]\">\n {item.actor.image && (\n <AvatarImage src={item.actor.image} alt={item.actor.name} />\n )}\n <AvatarFallback className=\"text-[9px]\">\n {getInitials(item.actor.name)}\n </AvatarFallback>\n </Avatar>\n )}\n\n {/* Content */}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex items-center justify-between gap-ds-02\">\n <div className={cn('min-w-0 flex-1 flex items-center gap-ds-01 flex-wrap', compact ? 'text-body-xs' : 'text-body-sm')}>\n {item.actor && (\n <span className=\"font-medium text-surface-fg\">{item.actor.name} </span>\n )}\n {item.detail && (\n <Icon icon={IconChevronRight} size=\"xs\" className={cn('shrink-0 text-surface-fg-subtle transition-transform duration-fast-02 ease-productive-standard', expandedDetail && 'rotate-90')} />\n )}\n {item.detail ? (\n <button\n type=\"button\"\n className=\"rounded-control text-surface-fg-muted hover:underline hover:bg-surface-panel-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9\"\n onClick={handleActionClick}\n aria-expanded={expandedDetail}\n aria-controls={detailId}\n >\n {item.action}\n </button>\n ) : (\n <span className=\"text-surface-fg-muted\">{item.action}</span>\n )}\n </div>\n\n <time\n className={cn(\n 'shrink-0 whitespace-nowrap text-surface-fg-subtle',\n compact ? 'text-body-xs' : 'text-body-sm',\n )}\n dateTime={\n (typeof item.timestamp === 'string'\n ? new Date(item.timestamp)\n : item.timestamp\n ).toISOString()\n }\n >\n {formatRelativeTime(item.timestamp)}\n </time>\n </div>\n\n {/* Expandable detail */}\n {expandedDetail && item.detail && (\n <div id={detailId} className=\"mt-ds-02 animate-in fade-in slide-in-from-top-1 text-body-sm text-surface-fg-muted\">\n {item.detail}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Wraps custom renderItem content with the same dot + layout container\n * that ActivityEntry uses, keeping vertical rhythm consistent.\n */\nfunction CustomEntry({\n item,\n compact,\n children,\n}: {\n item: ActivityItem\n compact: boolean\n children: React.ReactNode\n}) {\n const color = item.color ?? 'default'\n return (\n <div className={cn('relative flex items-start', compact ? 'gap-ds-02' : 'gap-ds-03')}>\n {/* Dot — same as ActivityEntry */}\n <div\n className={cn(\n 'relative z-10 mt-1.5 h-2 w-2 shrink-0 rounded-pill ring-2 ring-surface-base',\n dotColorMap[color],\n )}\n />\n {/* Custom content in the same flex slot as ActivityEntry's content area */}\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n )\n}\n\nfunction GroupHeader({\n label,\n isFirst,\n}: {\n label: string\n isFirst: boolean\n}) {\n return (\n <motion.div\n initial={false}\n animate={{ opacity: 1 }}\n transition={tweens.fade}\n className={cn(\n 'flex items-center gap-ds-03',\n !isFirst ? 'mt-ds-06' : '',\n 'mb-ds-03',\n )}\n >\n <hr className=\"flex-1 border-surface-border\" />\n <span className=\"bg-surface-base px-ds-03 text-label-xs font-medium uppercase tracking-wider text-surface-fg-subtle\">\n {label}\n </span>\n <hr className=\"flex-1 border-surface-border\" />\n </motion.div>\n )\n}\n\nconst ActivityFeed = React.forwardRef<HTMLDivElement, ActivityFeedProps>(\n (\n {\n items,\n onLoadMore,\n loading = false,\n hasMore = false,\n emptyState,\n compact = false,\n maxInitialItems,\n groupBy = 'none',\n groupLabels,\n renderItem,\n className,\n ...props\n },\n ref,\n ) => {\n const [showAll, setShowAll] = React.useState(false)\n\n if (loading) {\n return (\n <div ref={ref} className={cn('relative', className)} {...props}>\n <LoadingSkeleton compact={compact} />\n </div>\n )\n }\n\n if (items.length === 0) {\n if (emptyState) {\n return (\n <div ref={ref} className={className} {...props}>\n {emptyState}\n </div>\n )\n }\n return null\n }\n\n // maxInitialItems applies to the flat list BEFORE grouping\n const truncated =\n maxInitialItems != null && !showAll && items.length > maxInitialItems\n const visibleItems = truncated ? items.slice(0, maxInitialItems) : items\n\n const useGrouping = groupBy === 'time'\n\n /** Resolve what to render for a single item, respecting renderItem. */\n const resolveEntry = (item: ActivityItem, index: number) => {\n if (renderItem) {\n const custom = renderItem(item, index)\n if (custom !== undefined) {\n return <CustomEntry item={item} compact={compact}>{custom}</CustomEntry>\n }\n }\n return <ActivityEntry item={item} compact={compact} />\n }\n\n return (\n <div ref={ref} className={cn('relative', className)} {...props}>\n {/* Items */}\n {useGrouping ? (\n <div>\n {groupItemsByTime(visibleItems, groupLabels).map((group, gi) => (\n <div key={group.label}>\n <GroupHeader label={group.label} isFirst={gi === 0} />\n {/* Timeline line scoped to this group */}\n <div className={cn('relative flex flex-col', compact ? 'gap-1' : 'gap-3')}>\n <div className=\"absolute bottom-0 left-[3px] top-0 w-px bg-surface-border\" />\n {group.items.map((item, index) => (\n <motion.div key={item.id} initial={false} animate={{ opacity: 1 }} transition={{ ...tweens.fade, delay: index * 0.03 }}>\n {resolveEntry(item, index)}\n </motion.div>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className={cn('relative flex flex-col', compact ? 'gap-1' : 'gap-3')}>\n {/* Timeline line */}\n <div className=\"absolute bottom-0 left-[3px] top-0 w-px bg-surface-border\" />\n {visibleItems.map((item, index) => (\n <motion.div key={item.id} initial={false} animate={{ opacity: 1 }} transition={{ ...tweens.fade, delay: index * 0.03 }}>\n {resolveEntry(item, index)}\n </motion.div>\n ))}\n </div>\n )}\n\n {/* Show all button */}\n {truncated && (\n <div className=\"relative mt-ds-03 flex justify-center\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowAll(true)}\n >\n Show all ({items.length})\n </Button>\n </div>\n )}\n\n {/* Load more button */}\n {hasMore && onLoadMore && !truncated && (\n <div className=\"relative mt-ds-03 flex justify-center\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onLoadMore}>\n Load more\n </Button>\n </div>\n )}\n </div>\n )\n },\n)\nActivityFeed.displayName = 'ActivityFeed'\n\nexport { ActivityFeed }\n"],"mappings":"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"}
1
+ {"version":3,"file":"activity-feed.js","names":[],"sources":["../../src/composed/activity-feed.tsx"],"sourcesContent":["'use client'\n\nimport { IconChevronRight } from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { MotionPreference } from '../motion/motion-preference'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport { Button } from '../ui/button'\nimport { Icon } from '../ui/icon'\nimport { formatRelativeTime } from '../ui/lib/date-utils'\nimport type { IconInput } from '../ui/lib/icon-input'\nimport { tweens } from '../ui/lib/motion'\nimport { cn } from '../ui/lib/utils'\nimport { Skeleton } from '../ui/skeleton'\nimport { getInitials } from './lib/string-utils'\n\nexport interface ActivityItem {\n id: string\n actor?: { name: string; image?: string }\n action: string | React.ReactNode\n timestamp: Date | string\n icon?: IconInput\n color?: 'default' | 'success' | 'warning' | 'error' | 'info'\n detail?: React.ReactNode\n}\n\nexport interface GroupLabels {\n today?: string\n yesterday?: string\n thisWeek?: string\n older?: string\n}\n\nexport interface ActivityFeedProps extends React.HTMLAttributes<HTMLDivElement> {\n items: ActivityItem[]\n onLoadMore?: () => void\n loading?: boolean\n hasMore?: boolean\n emptyState?: React.ReactNode\n compact?: boolean\n maxInitialItems?: number\n groupBy?: 'time' | 'none'\n groupLabels?: GroupLabels\n /** Custom renderer per item. Return ReactNode for custom rendering, undefined to use default ActivityEntry. */\n renderItem?: (item: ActivityItem, index: number) => React.ReactNode | undefined\n}\n\nconst dotColorMap = {\n default: 'bg-surface-fg-subtle',\n success: 'bg-success-9',\n warning: 'bg-warning-9',\n error: 'bg-error-9',\n info: 'bg-info-9',\n} as const\n\nconst DEFAULT_GROUP_LABELS: Required<GroupLabels> = {\n today: 'Today',\n yesterday: 'Yesterday',\n thisWeek: 'This Week',\n older: 'Older',\n}\n\n/**\n * Buckets items into time-based groups: today, yesterday, earlier this week (since Monday), older.\n * Skips empty groups.\n */\nexport function groupItemsByTime(\n items: ActivityItem[],\n labels?: GroupLabels,\n): { label: string; items: ActivityItem[] }[] {\n const l = { ...DEFAULT_GROUP_LABELS, ...labels }\n const now = new Date()\n\n // Start of today (midnight local)\n const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n // Start of yesterday\n const startOfYesterday = new Date(startOfToday.getTime() - 24 * 60 * 60 * 1000)\n // Start of this week (Monday)\n const dayOfWeek = now.getDay() // 0=Sun, 1=Mon, ...\n const daysSinceMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1\n const startOfWeek = new Date(\n startOfToday.getTime() - daysSinceMonday * 24 * 60 * 60 * 1000,\n )\n\n const today: ActivityItem[] = []\n const yesterday: ActivityItem[] = []\n const thisWeek: ActivityItem[] = []\n const older: ActivityItem[] = []\n\n for (const item of items) {\n const ts =\n typeof item.timestamp === 'string'\n ? new Date(item.timestamp)\n : item.timestamp\n const t = ts.getTime()\n\n if (t >= startOfToday.getTime()) {\n today.push(item)\n } else if (t >= startOfYesterday.getTime()) {\n yesterday.push(item)\n } else if (t >= startOfWeek.getTime()) {\n thisWeek.push(item)\n } else {\n older.push(item)\n }\n }\n\n const groups: { label: string; items: ActivityItem[] }[] = []\n if (today.length > 0) groups.push({ label: l.today, items: today })\n if (yesterday.length > 0) groups.push({ label: l.yesterday, items: yesterday })\n if (thisWeek.length > 0) groups.push({ label: l.thisWeek, items: thisWeek })\n if (older.length > 0) groups.push({ label: l.older, items: older })\n\n return groups\n}\n\nfunction LoadingSkeleton({ compact }: { compact: boolean }) {\n return (\n <div className={cn('flex flex-col', compact ? 'gap-1' : 'gap-3')}>\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"flex items-center gap-ds-03\">\n <Skeleton className=\"h-2 w-2 shrink-0 rounded-pill\" />\n {!compact && <Skeleton className=\"h-4 w-4 shrink-0 rounded-pill\" />}\n <Skeleton className={cn('flex-1', compact ? 'h-3' : 'h-4')} />\n <Skeleton className=\"h-3 w-12\" />\n </div>\n ))}\n </div>\n )\n}\n\nfunction ActivityEntry({\n item,\n compact,\n}: {\n item: ActivityItem\n compact: boolean\n}) {\n const [expandedDetail, setExpandedDetail] = React.useState(false)\n const detailId = React.useId()\n const color = item.color ?? 'default'\n\n const handleActionClick = () => {\n if (item.detail) {\n setExpandedDetail((prev) => !prev)\n }\n }\n\n return (\n <div className={cn('relative flex items-start', compact ? 'gap-ds-02' : 'gap-ds-03')}>\n {/* Dot */}\n <div\n className={cn(\n 'relative z-10 mt-1.5 h-2 w-2 shrink-0 rounded-pill ring-2 ring-surface-panel',\n dotColorMap[color],\n )}\n />\n\n {/* Avatar (non-compact only) */}\n {!compact && item.actor && (\n <Avatar className=\"h-5 w-5 shrink-0 text-[9px]\">\n {item.actor.image && (\n <AvatarImage src={item.actor.image} alt={item.actor.name} />\n )}\n <AvatarFallback className=\"text-[9px]\">\n {getInitials(item.actor.name)}\n </AvatarFallback>\n </Avatar>\n )}\n\n {/* Content */}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex items-center justify-between gap-ds-02\">\n <div className={cn('min-w-0 flex-1 flex items-center gap-ds-01 flex-wrap', compact ? 'text-body-xs' : 'text-body-sm')}>\n {item.actor && (\n <span className=\"font-medium text-surface-fg\">{item.actor.name} </span>\n )}\n {item.detail && (\n <Icon icon={IconChevronRight} size=\"xs\" className={cn('shrink-0 text-surface-fg-subtle transition-transform duration-fast-02 ease-productive-standard', expandedDetail && 'rotate-90')} />\n )}\n {item.detail ? (\n <button\n type=\"button\"\n className=\"rounded-control text-surface-fg-muted hover:underline hover:bg-surface-panel-hover focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9\"\n onClick={handleActionClick}\n aria-expanded={expandedDetail}\n aria-controls={detailId}\n >\n {item.action}\n </button>\n ) : (\n <span className=\"text-surface-fg-muted\">{item.action}</span>\n )}\n </div>\n\n <time\n className={cn(\n 'shrink-0 whitespace-nowrap text-surface-fg-subtle',\n compact ? 'text-body-xs' : 'text-body-sm',\n )}\n dateTime={\n (typeof item.timestamp === 'string'\n ? new Date(item.timestamp)\n : item.timestamp\n ).toISOString()\n }\n >\n {formatRelativeTime(item.timestamp)}\n </time>\n </div>\n\n {/* Expandable detail */}\n {expandedDetail && item.detail && (\n <div id={detailId} className=\"mt-ds-02 animate-in fade-in slide-in-from-top-1 text-body-sm text-surface-fg-muted\">\n {item.detail}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Wraps custom renderItem content with the same dot + layout container\n * that ActivityEntry uses, keeping vertical rhythm consistent.\n */\nfunction CustomEntry({\n item,\n compact,\n children,\n}: {\n item: ActivityItem\n compact: boolean\n children: React.ReactNode\n}) {\n const color = item.color ?? 'default'\n return (\n <div className={cn('relative flex items-start', compact ? 'gap-ds-02' : 'gap-ds-03')}>\n {/* Dot — same as ActivityEntry */}\n <div\n className={cn(\n 'relative z-10 mt-1.5 h-2 w-2 shrink-0 rounded-pill ring-2 ring-surface-panel',\n dotColorMap[color],\n )}\n />\n {/* Custom content in the same flex slot as ActivityEntry's content area */}\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n )\n}\n\nfunction GroupHeader({\n label,\n isFirst,\n}: {\n label: string\n isFirst: boolean\n}) {\n return (\n <MotionPreference>\n <motion.div\n initial={false}\n animate={{ opacity: 1 }}\n transition={tweens.fade}\n className={cn(\n 'flex items-center gap-ds-03',\n !isFirst ? 'mt-ds-06' : '',\n 'mb-ds-03',\n )}\n >\n <hr className=\"flex-1 border-surface-border\" />\n <span className=\"bg-surface-panel px-ds-03 text-label-xs font-medium uppercase tracking-wider text-surface-fg-subtle\">\n {label}\n </span>\n <hr className=\"flex-1 border-surface-border\" />\n </motion.div>\n </MotionPreference>\n )\n}\n\nconst ActivityFeed = React.forwardRef<HTMLDivElement, ActivityFeedProps>(\n (\n {\n items,\n onLoadMore,\n loading = false,\n hasMore = false,\n emptyState,\n compact = false,\n maxInitialItems,\n groupBy = 'none',\n groupLabels,\n renderItem,\n className,\n ...props\n },\n ref,\n ) => {\n const [showAll, setShowAll] = React.useState(false)\n\n if (loading) {\n return (\n <div ref={ref} className={cn('relative', className)} {...props}>\n <LoadingSkeleton compact={compact} />\n </div>\n )\n }\n\n if (items.length === 0) {\n if (emptyState) {\n return (\n <div ref={ref} className={className} {...props}>\n {emptyState}\n </div>\n )\n }\n return null\n }\n\n // maxInitialItems applies to the flat list BEFORE grouping\n const truncated =\n maxInitialItems != null && !showAll && items.length > maxInitialItems\n const visibleItems = truncated ? items.slice(0, maxInitialItems) : items\n\n const useGrouping = groupBy === 'time'\n\n /** Resolve what to render for a single item, respecting renderItem. */\n const resolveEntry = (item: ActivityItem, index: number) => {\n if (renderItem) {\n const custom = renderItem(item, index)\n if (custom !== undefined) {\n return <CustomEntry item={item} compact={compact}>{custom}</CustomEntry>\n }\n }\n return <ActivityEntry item={item} compact={compact} />\n }\n\n return (\n <MotionPreference>\n <div ref={ref} className={cn('relative', className)} {...props}>\n {/* Items */}\n {useGrouping ? (\n <div>\n {groupItemsByTime(visibleItems, groupLabels).map((group, gi) => (\n <div key={group.label}>\n <GroupHeader label={group.label} isFirst={gi === 0} />\n {/* Timeline line scoped to this group */}\n <div className={cn('relative flex flex-col', compact ? 'gap-1' : 'gap-3')}>\n <div className=\"absolute bottom-0 left-[3px] top-0 w-px bg-surface-border\" />\n {group.items.map((item, index) => (\n <motion.div key={item.id} initial={false} animate={{ opacity: 1 }} transition={{ ...tweens.fade, delay: index * 0.03 }}>\n {resolveEntry(item, index)}\n </motion.div>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className={cn('relative flex flex-col', compact ? 'gap-1' : 'gap-3')}>\n {/* Timeline line */}\n <div className=\"absolute bottom-0 left-[3px] top-0 w-px bg-surface-border\" />\n {visibleItems.map((item, index) => (\n <motion.div key={item.id} initial={false} animate={{ opacity: 1 }} transition={{ ...tweens.fade, delay: index * 0.03 }}>\n {resolveEntry(item, index)}\n </motion.div>\n ))}\n </div>\n )}\n\n {/* Show all button */}\n {truncated && (\n <div className=\"relative mt-ds-03 flex justify-center\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowAll(true)}\n >\n Show all ({items.length})\n </Button>\n </div>\n )}\n\n {/* Load more button */}\n {hasMore && onLoadMore && !truncated && (\n <div className=\"relative mt-ds-03 flex justify-center\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onLoadMore}>\n Load more\n </Button>\n </div>\n )}\n </div>\n </MotionPreference>\n )\n },\n)\nActivityFeed.displayName = 'ActivityFeed'\n\nexport { ActivityFeed }\n"],"mappings":"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"}