@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.
- package/MIGRATION.md +91 -0
- package/dist/_chunks/badge-group.js +75 -188
- package/dist/_chunks/badge-group.js.map +1 -1
- package/dist/_chunks/chat.js +244 -243
- package/dist/_chunks/chat.js.map +1 -1
- package/dist/_chunks/image-preview.js +71 -70
- package/dist/_chunks/image-preview.js.map +1 -1
- package/dist/_chunks/motion-preference.js +15 -0
- package/dist/_chunks/motion-preference.js.map +1 -0
- package/dist/_chunks/motion-provider.js +1 -1
- package/dist/_chunks/motion-provider.js.map +1 -1
- package/dist/_chunks/popover.js +50 -49
- package/dist/_chunks/popover.js.map +1 -1
- package/dist/_chunks/primitives-internal.js +29 -29
- package/dist/_chunks/primitives-internal.js.map +1 -1
- package/dist/_chunks/shared.js +48 -47
- package/dist/_chunks/shared.js.map +1 -1
- package/dist/_chunks/success.js +34 -34
- package/dist/_chunks/tree-view.js +1 -1
- package/dist/_chunks/tree-view.js.map +1 -1
- package/dist/ai/block-renderer.js +8 -8
- package/dist/ai/command-bar.js +65 -65
- package/dist/ai/command-bar.js.map +1 -1
- package/dist/ai/conversation.js +35 -35
- package/dist/ai/conversation.js.map +1 -1
- package/dist/ai/index.js +4 -4
- package/dist/composed/activity-feed.d.ts.map +1 -1
- package/dist/composed/activity-feed.js +108 -107
- package/dist/composed/activity-feed.js.map +1 -1
- package/dist/composed/command-palette.js +137 -137
- package/dist/composed/command-palette.js.map +1 -1
- package/dist/composed/content-card.js +1 -1
- package/dist/composed/content-card.js.map +1 -1
- package/dist/composed/date-picker/index.js +5 -5
- package/dist/composed/date-picker/index.js.map +1 -1
- package/dist/composed/empty-state.js +4 -4
- package/dist/composed/file-preview/image-preview.d.ts.map +1 -1
- package/dist/composed/file-preview/shared.d.ts.map +1 -1
- package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
- package/dist/composed/file-preview.js +151 -150
- package/dist/composed/file-preview.js.map +1 -1
- package/dist/composed/filter-bar.d.ts.map +1 -1
- package/dist/composed/filter-bar.js +53 -52
- package/dist/composed/filter-bar.js.map +1 -1
- package/dist/composed/form-section.d.ts.map +1 -1
- package/dist/composed/form-section.js +38 -37
- package/dist/composed/form-section.js.map +1 -1
- package/dist/composed/master-detail.d.ts.map +1 -1
- package/dist/composed/master-detail.js +1 -1
- package/dist/composed/master-detail.js.map +1 -1
- package/dist/composed/multi-select-popover.d.ts.map +1 -1
- package/dist/composed/multi-select-popover.js +109 -108
- package/dist/composed/multi-select-popover.js.map +1 -1
- package/dist/composed/rich-chat-input/attachment-strip.d.ts.map +1 -1
- package/dist/composed/rich-chat-input/reply-banner.d.ts.map +1 -1
- package/dist/composed/rich-chat-input/schedule-send.d.ts.map +1 -1
- package/dist/composed/rich-chat-input.d.ts.map +1 -1
- package/dist/composed/rich-chat-input.js +467 -466
- package/dist/composed/rich-chat-input.js.map +1 -1
- package/dist/composed/rich-text-editor.js +3 -3
- package/dist/composed/rich-text-editor.js.map +1 -1
- package/dist/composed/schedule-view.js +2 -2
- package/dist/composed/schedule-view.js.map +1 -1
- package/dist/composed/status-badge.d.ts.map +1 -1
- package/dist/composed/status-badge.js +29 -28
- package/dist/composed/status-badge.js.map +1 -1
- package/dist/motion/index.d.ts +1 -0
- package/dist/motion/index.d.ts.map +1 -1
- package/dist/motion/index.js +2 -15
- package/dist/motion/motion-preference.d.ts +36 -0
- package/dist/motion/motion-preference.d.ts.map +1 -0
- package/dist/motion/motion-provider.d.ts +2 -1
- package/dist/motion/motion-provider.d.ts.map +1 -1
- package/dist/motion/primitives-index.js +103 -102
- package/dist/motion/primitives-index.js.map +1 -1
- package/dist/motion/primitives.d.ts.map +1 -1
- package/dist/shell/bottom-navbar.js +19 -19
- package/dist/shell/bottom-navbar.js.map +1 -1
- package/dist/shell/index.d.ts +1 -1
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/notification-center.d.ts +17 -0
- package/dist/shell/notification-center.d.ts.map +1 -1
- package/dist/shell/notification-center.js +109 -104
- package/dist/shell/notification-center.js.map +1 -1
- package/dist/shell/notification-preferences.js +1 -1
- package/dist/shell/notification-preferences.js.map +1 -1
- package/dist/shell/top-bar.js +1 -1
- package/dist/shell/top-bar.js.map +1 -1
- package/dist/tokens/index.css +1 -0
- package/dist/tokens/palettes.css +292 -0
- package/dist/tokens/semantic.css +72 -8
- package/dist/tokens/shilp-sutra.css +1 -0
- package/dist/tokens/utilities.css +10 -7
- package/dist/ui/accordion.d.ts.map +1 -1
- package/dist/ui/accordion.js +27 -26
- package/dist/ui/accordion.js.map +1 -1
- package/dist/ui/alert-dialog.d.ts.map +1 -1
- package/dist/ui/alert-dialog.js +60 -59
- package/dist/ui/alert-dialog.js.map +1 -1
- package/dist/ui/alert.d.ts.map +1 -1
- package/dist/ui/alert.js +55 -113
- package/dist/ui/alert.js.map +1 -1
- package/dist/ui/autocomplete.js +80 -80
- package/dist/ui/autocomplete.js.map +1 -1
- package/dist/ui/avatar.d.ts.map +1 -1
- package/dist/ui/avatar.js +69 -68
- package/dist/ui/avatar.js.map +1 -1
- package/dist/ui/badge-indicator.d.ts +4 -8
- package/dist/ui/badge-indicator.d.ts.map +1 -1
- package/dist/ui/badge-indicator.js +3 -8
- package/dist/ui/badge-indicator.js.map +1 -1
- package/dist/ui/badge.d.ts +8 -1
- package/dist/ui/badge.d.ts.map +1 -1
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +42 -40
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/button-group.d.ts.map +1 -1
- package/dist/ui/button-group.js +3 -23
- package/dist/ui/button-group.js.map +1 -1
- package/dist/ui/button.d.ts +10 -1
- package/dist/ui/button.d.ts.map +1 -1
- package/dist/ui/button.js +79 -212
- package/dist/ui/button.js.map +1 -1
- package/dist/ui/card.d.ts.map +1 -1
- package/dist/ui/card.js +75 -72
- package/dist/ui/card.js.map +1 -1
- package/dist/ui/charts/radar-chart.d.ts.map +1 -1
- package/dist/ui/charts/radar-chart.js +1 -1
- package/dist/ui/charts/radar-chart.js.map +1 -1
- package/dist/ui/chat/message-list.d.ts.map +1 -1
- package/dist/ui/chat/message.d.ts.map +1 -1
- package/dist/ui/chat/typing-indicator.d.ts.map +1 -1
- package/dist/ui/code.js +1 -1
- package/dist/ui/code.js.map +1 -1
- package/dist/ui/color-input.d.ts.map +1 -1
- package/dist/ui/color-input.js +151 -150
- package/dist/ui/color-input.js.map +1 -1
- package/dist/ui/combobox.d.ts +14 -0
- package/dist/ui/combobox.d.ts.map +1 -1
- package/dist/ui/combobox.js +152 -148
- package/dist/ui/combobox.js.map +1 -1
- package/dist/ui/context-menu.d.ts.map +1 -1
- package/dist/ui/context-menu.js +70 -69
- package/dist/ui/context-menu.js.map +1 -1
- package/dist/ui/data-table-body.js +2 -2
- package/dist/ui/data-table-body.js.map +1 -1
- package/dist/ui/data-table-context.js +2 -2
- package/dist/ui/data-table-context.js.map +1 -1
- package/dist/ui/data-table-header.d.ts.map +1 -1
- package/dist/ui/data-table-header.js +41 -40
- package/dist/ui/data-table-header.js.map +1 -1
- package/dist/ui/data-table-pagination.js +2 -2
- package/dist/ui/data-table-pagination.js.map +1 -1
- package/dist/ui/dialog.d.ts.map +1 -1
- package/dist/ui/dialog.js +61 -60
- package/dist/ui/dialog.js.map +1 -1
- package/dist/ui/dot.d.ts.map +1 -1
- package/dist/ui/dot.js +10 -41
- package/dist/ui/dot.js.map +1 -1
- package/dist/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/ui/dropdown-menu.js +79 -78
- package/dist/ui/dropdown-menu.js.map +1 -1
- package/dist/ui/file-upload.d.ts.map +1 -1
- package/dist/ui/file-upload.js +116 -115
- package/dist/ui/file-upload.js.map +1 -1
- package/dist/ui/form.d.ts.map +1 -1
- package/dist/ui/form.js +27 -26
- package/dist/ui/form.js.map +1 -1
- package/dist/ui/hover-card.d.ts.map +1 -1
- package/dist/ui/hover-card.js +26 -25
- package/dist/ui/hover-card.js.map +1 -1
- package/dist/ui/icon.js +7 -7
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +3 -3
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/input.js +1 -1
- package/dist/ui/input.js.map +1 -1
- package/dist/ui/menubar.d.ts.map +1 -1
- package/dist/ui/menubar.js +73 -72
- package/dist/ui/menubar.js.map +1 -1
- package/dist/ui/navigation-menu.d.ts.map +1 -1
- package/dist/ui/navigation-menu.js +80 -79
- package/dist/ui/navigation-menu.js.map +1 -1
- package/dist/ui/popover.d.ts.map +1 -1
- package/dist/ui/progress.d.ts.map +1 -1
- package/dist/ui/progress.js +72 -68
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/radio.d.ts.map +1 -1
- package/dist/ui/radio.js +32 -31
- package/dist/ui/radio.js.map +1 -1
- package/dist/ui/search-input.d.ts.map +1 -1
- package/dist/ui/search-input.js +28 -27
- package/dist/ui/search-input.js.map +1 -1
- package/dist/ui/select.d.ts.map +1 -1
- package/dist/ui/select.js +64 -63
- package/dist/ui/select.js.map +1 -1
- package/dist/ui/sidebar.d.ts.map +1 -1
- package/dist/ui/sidebar.js +4 -4
- package/dist/ui/sidebar.js.map +1 -1
- package/dist/ui/slider.d.ts +63 -9
- package/dist/ui/slider.d.ts.map +1 -1
- package/dist/ui/slider.js +74 -32
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/split-button.d.ts +8 -2
- package/dist/ui/split-button.d.ts.map +1 -1
- package/dist/ui/split-button.js +49 -95
- package/dist/ui/split-button.js.map +1 -1
- package/dist/ui/stat-card.d.ts.map +1 -1
- package/dist/ui/stat-card.js +89 -88
- package/dist/ui/stat-card.js.map +1 -1
- package/dist/ui/stat-flash.js +16 -16
- package/dist/ui/stepper.d.ts.map +1 -1
- package/dist/ui/stepper.js +63 -62
- package/dist/ui/stepper.js.map +1 -1
- package/dist/ui/table.js +3 -3
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/tabs.d.ts.map +1 -1
- package/dist/ui/tabs.js +67 -66
- package/dist/ui/tabs.js.map +1 -1
- package/dist/ui/textarea.js +1 -1
- package/dist/ui/textarea.js.map +1 -1
- package/dist/ui/toast.d.ts.map +1 -1
- package/dist/ui/toast.js +195 -194
- package/dist/ui/toast.js.map +1 -1
- package/dist/ui/toggle.d.ts.map +1 -1
- package/dist/ui/toggle.js +24 -22
- package/dist/ui/toggle.js.map +1 -1
- package/dist/ui/tooltip.d.ts.map +1 -1
- package/dist/ui/tooltip.js +37 -36
- package/dist/ui/tooltip.js.map +1 -1
- package/dist/ui/tree-view/tree-item.d.ts.map +1 -1
- package/docs/recipes/customize-brand.md +58 -0
- package/docs/recipes/install-astro.md +1 -1
- package/docs/recipes/install-next-app-router.md +1 -1
- package/docs/recipes/install-next-pages.md +22 -1
- package/docs/recipes/install-remix.md +1 -1
- package/docs/recipes/install-tanstack-start.md +1 -1
- package/docs/recipes/install-vite.md +2 -1
- package/docs/recipes/server-components.md +7 -4
- package/docs/recipes/troubleshoot.md +1 -0
- package/llms.txt +1 -1
- package/mcp-manifest.json +9 -4
- package/package.json +3 -2
- package/skill/SKILL.md +1 -1
- package/skill/references/components.md +1 -1
- package/skill/references/customize-brand.md +58 -0
- package/skill/references/server-components.md +7 -4
- package/skill/references/setup-astro.md +1 -1
- package/skill/references/setup-next-app-router.md +1 -1
- package/skill/references/setup-next-pages.md +22 -1
- package/skill/references/setup-remix.md +1 -1
- package/skill/references/setup-tanstack-start.md +1 -1
- package/skill/references/setup-vite.md +2 -1
- package/skill/references/troubleshoot.md +1 -0
- package/dist/motion/check-motion-provider.d.ts +0 -2
- package/dist/motion/check-motion-provider.d.ts.map +0 -1
- 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 {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
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
|
|
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
|
-
},
|
|
22
|
+
}, _ = {
|
|
22
23
|
today: "Today",
|
|
23
24
|
yesterday: "Yesterday",
|
|
24
25
|
thisWeek: "This Week",
|
|
25
26
|
older: "Older"
|
|
26
27
|
};
|
|
27
|
-
function
|
|
28
|
+
function v(e, t) {
|
|
28
29
|
let n = {
|
|
29
|
-
...
|
|
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
|
|
52
|
-
return /* @__PURE__ */
|
|
53
|
-
className:
|
|
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((
|
|
59
|
+
].map((t) => /* @__PURE__ */ p("div", {
|
|
59
60
|
className: "flex items-center gap-ds-03",
|
|
60
61
|
children: [
|
|
61
|
-
/* @__PURE__ */
|
|
62
|
-
!e && /* @__PURE__ */
|
|
63
|
-
/* @__PURE__ */
|
|
64
|
-
/* @__PURE__ */
|
|
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
|
-
},
|
|
67
|
+
}, t))
|
|
67
68
|
});
|
|
68
69
|
}
|
|
69
|
-
function
|
|
70
|
-
let [
|
|
71
|
-
return /* @__PURE__ */
|
|
72
|
-
className:
|
|
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__ */
|
|
75
|
-
!
|
|
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__ */
|
|
78
|
+
children: [e.actor.image && /* @__PURE__ */ f(s, {
|
|
78
79
|
src: e.actor.image,
|
|
79
80
|
alt: e.actor.name
|
|
80
|
-
}), /* @__PURE__ */
|
|
81
|
+
}), /* @__PURE__ */ f(o, {
|
|
81
82
|
className: "text-[9px]",
|
|
82
|
-
children:
|
|
83
|
+
children: u(e.actor.name)
|
|
83
84
|
})]
|
|
84
85
|
}),
|
|
85
|
-
/* @__PURE__ */
|
|
86
|
+
/* @__PURE__ */ p("div", {
|
|
86
87
|
className: "flex min-w-0 flex-1 flex-col",
|
|
87
|
-
children: [/* @__PURE__ */
|
|
88
|
+
children: [/* @__PURE__ */ p("div", {
|
|
88
89
|
className: "flex items-center justify-between gap-ds-02",
|
|
89
|
-
children: [/* @__PURE__ */
|
|
90
|
-
className:
|
|
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__ */
|
|
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__ */
|
|
97
|
-
icon:
|
|
97
|
+
e.detail && /* @__PURE__ */ f(r, {
|
|
98
|
+
icon: m,
|
|
98
99
|
size: "xs",
|
|
99
|
-
className:
|
|
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__ */
|
|
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 &&
|
|
106
|
+
e.detail && c((e) => !e);
|
|
106
107
|
},
|
|
107
|
-
"aria-expanded":
|
|
108
|
-
"aria-controls":
|
|
108
|
+
"aria-expanded": i,
|
|
109
|
+
"aria-controls": h,
|
|
109
110
|
children: e.action
|
|
110
|
-
}) : /* @__PURE__ */
|
|
111
|
+
}) : /* @__PURE__ */ f("span", {
|
|
111
112
|
className: "text-surface-fg-muted",
|
|
112
113
|
children: e.action
|
|
113
114
|
})
|
|
114
115
|
]
|
|
115
|
-
}), /* @__PURE__ */
|
|
116
|
-
className:
|
|
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:
|
|
119
|
+
children: l(e.timestamp)
|
|
119
120
|
})]
|
|
120
|
-
}),
|
|
121
|
-
id:
|
|
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
|
|
130
|
+
function x({ item: e, compact: t, children: r }) {
|
|
130
131
|
let i = e.color ?? "default";
|
|
131
|
-
return /* @__PURE__ */
|
|
132
|
-
className:
|
|
133
|
-
children: [/* @__PURE__ */
|
|
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
|
|
140
|
-
return /* @__PURE__ */ f(
|
|
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:
|
|
145
|
+
className: n("flex items-center gap-ds-03", i ? "" : "mt-ds-06", "mb-ds-03"),
|
|
145
146
|
children: [
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
-
/* @__PURE__ */
|
|
148
|
-
className: "bg-surface-
|
|
149
|
-
children:
|
|
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__ */
|
|
152
|
+
/* @__PURE__ */ f("hr", { className: "flex-1 border-surface-border" })
|
|
152
153
|
]
|
|
153
|
-
});
|
|
154
|
+
}) });
|
|
154
155
|
}
|
|
155
|
-
var
|
|
156
|
-
let [
|
|
157
|
-
if (
|
|
158
|
-
ref:
|
|
159
|
-
className:
|
|
160
|
-
...
|
|
161
|
-
children: /* @__PURE__ */
|
|
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 (
|
|
164
|
-
ref:
|
|
165
|
-
className:
|
|
166
|
-
...
|
|
167
|
-
children:
|
|
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
|
|
170
|
-
if (
|
|
171
|
-
let n =
|
|
172
|
-
if (n !== void 0) return /* @__PURE__ */
|
|
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:
|
|
175
|
+
compact: l,
|
|
175
176
|
children: n
|
|
176
177
|
});
|
|
177
178
|
}
|
|
178
|
-
return /* @__PURE__ */
|
|
179
|
+
return /* @__PURE__ */ f(b, {
|
|
179
180
|
item: e,
|
|
180
|
-
compact:
|
|
181
|
+
compact: l
|
|
181
182
|
});
|
|
182
183
|
};
|
|
183
|
-
return /* @__PURE__ */ f("div", {
|
|
184
|
-
ref:
|
|
185
|
-
className:
|
|
186
|
-
...
|
|
184
|
+
return /* @__PURE__ */ f(t, { children: /* @__PURE__ */ p("div", {
|
|
185
|
+
ref: T,
|
|
186
|
+
className: n("relative", C),
|
|
187
|
+
...w,
|
|
187
188
|
children: [
|
|
188
|
-
|
|
189
|
-
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__ */
|
|
192
|
-
className:
|
|
193
|
-
children: [/* @__PURE__ */
|
|
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:
|
|
201
|
+
children: j(t, n)
|
|
201
202
|
}, t.id))]
|
|
202
|
-
})] },
|
|
203
|
-
className:
|
|
204
|
-
children: [/* @__PURE__ */
|
|
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:
|
|
212
|
+
children: j(t, n)
|
|
212
213
|
}, t.id))]
|
|
213
214
|
}),
|
|
214
|
-
|
|
215
|
+
O && /* @__PURE__ */ f("div", {
|
|
215
216
|
className: "relative mt-ds-03 flex justify-center",
|
|
216
|
-
children: /* @__PURE__ */
|
|
217
|
+
children: /* @__PURE__ */ p(c, {
|
|
217
218
|
variant: "ghost",
|
|
218
219
|
size: "sm",
|
|
219
|
-
onClick: () =>
|
|
220
|
+
onClick: () => D(!0),
|
|
220
221
|
children: [
|
|
221
222
|
"Show all (",
|
|
222
|
-
|
|
223
|
+
r.length,
|
|
223
224
|
")"
|
|
224
225
|
]
|
|
225
226
|
})
|
|
226
227
|
}),
|
|
227
|
-
|
|
228
|
+
o && i && !O && /* @__PURE__ */ f("div", {
|
|
228
229
|
className: "relative mt-ds-03 flex justify-center",
|
|
229
|
-
children: /* @__PURE__ */
|
|
230
|
+
children: /* @__PURE__ */ f(c, {
|
|
230
231
|
variant: "ghost",
|
|
231
232
|
size: "sm",
|
|
232
|
-
onClick:
|
|
233
|
+
onClick: i,
|
|
233
234
|
children: "Load more"
|
|
234
235
|
})
|
|
235
236
|
})
|
|
236
237
|
]
|
|
237
|
-
});
|
|
238
|
+
}) });
|
|
238
239
|
});
|
|
239
|
-
|
|
240
|
+
C.displayName = "ActivityFeed";
|
|
240
241
|
//#endregion
|
|
241
|
-
export {
|
|
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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"}
|