@devalok/shilp-sutra 0.44.0 → 0.45.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/AGENTS.md +13 -11
- package/BREAKING.json +209 -27
- package/MIGRATION.md +34 -0
- package/README.md +12 -0
- package/dist/_chunks/badge-group.js +1 -0
- package/dist/_chunks/badge-group.js.map +1 -1
- package/dist/_chunks/block-shell.js +25 -0
- package/dist/_chunks/block-shell.js.map +1 -0
- package/dist/_chunks/chat.js +4 -2
- package/dist/_chunks/chat.js.map +1 -1
- package/dist/_chunks/document-preview.js +1 -1
- package/dist/_chunks/image-preview.js +4 -4
- package/dist/_chunks/shared.js +65 -78
- package/dist/_chunks/shared.js.map +1 -1
- package/dist/_chunks/success.js +108 -106
- package/dist/_chunks/success.js.map +1 -1
- package/dist/ai/blocks/block-shell.d.ts +19 -0
- package/dist/ai/blocks/block-shell.d.ts.map +1 -0
- package/dist/ai/blocks/block-table.d.ts.map +1 -1
- package/dist/ai/blocks/confirm.d.ts.map +1 -1
- package/dist/ai/blocks/error.d.ts.map +1 -1
- package/dist/ai/blocks/error.js +5 -5
- package/dist/ai/blocks/error.js.map +1 -1
- package/dist/ai/blocks/success.d.ts.map +1 -1
- package/dist/ai/blocks/text.d.ts.map +1 -1
- package/dist/ai/blocks/text.js +4 -3
- package/dist/ai/blocks/text.js.map +1 -1
- package/dist/composed/activity-feed.d.ts.map +1 -1
- package/dist/composed/activity-feed.js +14 -12
- package/dist/composed/activity-feed.js.map +1 -1
- package/dist/composed/file-preview/audio-preview.d.ts.map +1 -1
- package/dist/composed/file-preview/shared.d.ts +10 -0
- 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 +149 -188
- package/dist/composed/file-preview.js.map +1 -1
- package/dist/composed/master-detail.d.ts.map +1 -1
- package/dist/composed/master-detail.js +13 -4
- package/dist/composed/master-detail.js.map +1 -1
- package/dist/composed/schedule-view.d.ts.map +1 -1
- package/dist/composed/schedule-view.js +52 -39
- package/dist/composed/schedule-view.js.map +1 -1
- package/dist/shell/notification-preferences.d.ts.map +1 -1
- package/dist/shell/notification-preferences.js +115 -114
- package/dist/shell/notification-preferences.js.map +1 -1
- package/dist/ui/badge-group.d.ts.map +1 -1
- package/dist/ui/card.d.ts +66 -16
- package/dist/ui/card.d.ts.map +1 -1
- package/dist/ui/card.js +85 -60
- package/dist/ui/card.js.map +1 -1
- package/dist/ui/chat/message.d.ts.map +1 -1
- package/dist/ui/color-input.d.ts.map +1 -1
- package/dist/ui/color-input.js +18 -18
- package/dist/ui/color-input.js.map +1 -1
- package/dist/ui/data-table-body.d.ts.map +1 -1
- package/dist/ui/data-table-body.js +94 -64
- package/dist/ui/data-table-body.js.map +1 -1
- package/dist/ui/data-table-card.d.ts.map +1 -1
- package/dist/ui/data-table-card.js +50 -43
- package/dist/ui/data-table-card.js.map +1 -1
- package/dist/ui/data-table-context.d.ts +0 -4
- package/dist/ui/data-table-context.d.ts.map +1 -1
- package/dist/ui/data-table-context.js +8 -12
- 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 +2 -2
- package/dist/ui/data-table-header.js.map +1 -1
- package/dist/ui/data-table.d.ts.map +1 -1
- package/dist/ui/data-table.js +185 -182
- package/dist/ui/data-table.js.map +1 -1
- package/dist/ui/index.d.ts +3 -2
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +59 -58
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/segmented-control.js +4 -4
- package/dist/ui/segmented-control.js.map +1 -1
- package/dist/ui/separator.d.ts +6 -5
- package/dist/ui/separator.d.ts.map +1 -1
- package/dist/ui/separator.js +7 -10
- package/dist/ui/separator.js.map +1 -1
- package/dist/ui/split-button.d.ts.map +1 -1
- package/dist/ui/split-button.js +62 -129
- package/dist/ui/split-button.js.map +1 -1
- package/dist/ui/stat-card.d.ts +7 -0
- package/dist/ui/stat-card.d.ts.map +1 -1
- package/dist/ui/stat-card.js +144 -126
- package/dist/ui/stat-card.js.map +1 -1
- package/dist/ui/table-row-link.d.ts +45 -0
- package/dist/ui/table-row-link.d.ts.map +1 -0
- package/dist/ui/table-row-link.js +16 -0
- package/dist/ui/table-row-link.js.map +1 -0
- package/dist/ui/table.d.ts +49 -5
- package/dist/ui/table.d.ts.map +1 -1
- package/dist/ui/table.js +39 -29
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/toast-types.d.ts +10 -0
- package/dist/ui/toast-types.d.ts.map +1 -1
- package/dist/ui/toast.d.ts +6 -2
- package/dist/ui/toast.d.ts.map +1 -1
- package/dist/ui/toast.js +56 -54
- package/dist/ui/toast.js.map +1 -1
- package/docs/components/composed/content-card.md +2 -0
- package/docs/components/ui/button.md +3 -3
- package/docs/components/ui/card.md +27 -10
- package/docs/components/ui/color-input.md +2 -2
- package/docs/components/ui/data-table.md +8 -1
- package/docs/components/ui/segmented-control.md +2 -2
- package/docs/components/ui/separator.md +3 -1
- package/docs/components/ui/split-button.md +3 -0
- package/docs/components/ui/stat-card.md +10 -2
- package/docs/components/ui/table-row-link.md +41 -0
- package/docs/components/ui/table.md +69 -0
- package/docs/components/ui/toast.md +10 -6
- package/docs/recipes/install-next-app-router.md +1 -1
- package/docs/recipes/troubleshoot.md +1 -1
- package/llms.txt +159 -781
- package/make-kit/components/card.md +54 -16
- package/make-kit/components/table.md +45 -7
- package/make-kit/foundations/spacing.md +3 -1
- package/make-kit/foundations/surfaces.md +1 -1
- package/mcp-manifest.json +12349 -0
- package/mcp-manifest.schema.json +232 -0
- package/package.json +8 -3
- package/skill/README.md +0 -1
- package/skill/SKILL.md +9 -8
- package/skill/references/components.md +159 -781
- package/skill/references/setup-next-app-router.md +1 -1
- package/skill/references/troubleshoot.md +1 -1
- package/llms-full.txt +0 -7198
- package/llms-quick.txt +0 -251
- package/skill/references/components-full.md +0 -7200
|
@@ -5,231 +5,232 @@ import { Icon as n } from "../ui/icon.js";
|
|
|
5
5
|
import { Button as r } from "../ui/button.js";
|
|
6
6
|
import { Card as i, CardContent as a, CardHeader as o, CardTitle as s } from "../ui/card.js";
|
|
7
7
|
import { Dialog as c, DialogContent as l, DialogDescription as u, DialogHeader as d, DialogTitle as f } from "../ui/dialog.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
8
|
+
import { IconButton as p } from "../ui/icon-button.js";
|
|
9
|
+
import { Select as m, SelectContent as h, SelectItem as g, SelectTrigger as _, SelectValue as v } from "../ui/select.js";
|
|
10
|
+
import { Switch as y } from "../ui/switch.js";
|
|
11
|
+
import * as b from "react";
|
|
12
|
+
import { useState as x } from "react";
|
|
13
|
+
import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
14
|
+
import { IconBell as T, IconMessage as E, IconPlus as D, IconTrash as O } from "@tabler/icons-react";
|
|
14
15
|
//#region src/shell/notification-preferences.tsx
|
|
15
|
-
var
|
|
16
|
+
var k = {
|
|
16
17
|
IN_APP: {
|
|
17
18
|
label: "In-App",
|
|
18
|
-
icon: /* @__PURE__ */
|
|
19
|
-
icon:
|
|
19
|
+
icon: /* @__PURE__ */ C(n, {
|
|
20
|
+
icon: T,
|
|
20
21
|
size: "sm"
|
|
21
22
|
})
|
|
22
23
|
},
|
|
23
24
|
GOOGLE_CHAT: {
|
|
24
25
|
label: "Google Chat",
|
|
25
|
-
icon: /* @__PURE__ */
|
|
26
|
-
icon:
|
|
26
|
+
icon: /* @__PURE__ */ C(n, {
|
|
27
|
+
icon: E,
|
|
27
28
|
size: "sm"
|
|
28
29
|
})
|
|
29
30
|
}
|
|
30
|
-
},
|
|
31
|
+
}, A = {
|
|
31
32
|
INFO: "All (Info+)",
|
|
32
33
|
IMPORTANT: "Important+",
|
|
33
34
|
CRITICAL: "Critical only"
|
|
34
|
-
},
|
|
35
|
-
let [
|
|
36
|
-
if (
|
|
37
|
-
|
|
35
|
+
}, j = b.forwardRef(function({ preferences: b = [], projects: T = [], isLoading: E = !1, onSave: j, onToggleMute: M, onUpdateTier: N, onDelete: P, className: F, ...I }, L) {
|
|
36
|
+
let [R, z] = x(!1), [B, V] = x("global"), [H, U] = x("IN_APP"), [W, G] = x("INFO"), [K, q] = x(!1), [J, Y] = x(!1), X = async () => {
|
|
37
|
+
if (j) {
|
|
38
|
+
Y(!0);
|
|
38
39
|
try {
|
|
39
|
-
await
|
|
40
|
-
projectId:
|
|
41
|
-
channel:
|
|
42
|
-
minTier:
|
|
43
|
-
muted:
|
|
44
|
-
}),
|
|
40
|
+
await j({
|
|
41
|
+
projectId: B === "global" ? null : B,
|
|
42
|
+
channel: H,
|
|
43
|
+
minTier: W,
|
|
44
|
+
muted: K
|
|
45
|
+
}), z(!1), Z();
|
|
45
46
|
} catch (e) {
|
|
46
47
|
console.error("[Preferences] Failed to save:", e);
|
|
47
48
|
} finally {
|
|
48
|
-
|
|
49
|
+
Y(!1);
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
|
-
},
|
|
52
|
-
|
|
53
|
-
},
|
|
54
|
-
return /* @__PURE__ */
|
|
55
|
-
ref:
|
|
56
|
-
className:
|
|
57
|
-
...
|
|
58
|
-
children: [/* @__PURE__ */
|
|
59
|
-
className: "flex flex-row items-center justify-between
|
|
60
|
-
children: [/* @__PURE__ */
|
|
52
|
+
}, Z = () => {
|
|
53
|
+
V("global"), U("IN_APP"), G("INFO"), q(!1);
|
|
54
|
+
}, Q = (e) => e ? T.find((t) => t.id === e)?.title || "Unknown project" : "Global (all projects)";
|
|
55
|
+
return /* @__PURE__ */ w(S, { children: [/* @__PURE__ */ w(i, {
|
|
56
|
+
ref: L,
|
|
57
|
+
className: F,
|
|
58
|
+
...I,
|
|
59
|
+
children: [/* @__PURE__ */ w(o, {
|
|
60
|
+
className: "flex flex-row items-center justify-between",
|
|
61
|
+
children: [/* @__PURE__ */ C(s, {
|
|
61
62
|
className: "text-ds-md font-semibold",
|
|
62
63
|
children: "Notification Preferences"
|
|
63
|
-
}), /* @__PURE__ */
|
|
64
|
+
}), /* @__PURE__ */ w(r, {
|
|
64
65
|
size: "sm",
|
|
65
66
|
variant: "outline",
|
|
66
|
-
onClick: () =>
|
|
67
|
-
children: [/* @__PURE__ */
|
|
68
|
-
icon:
|
|
67
|
+
onClick: () => z(!0),
|
|
68
|
+
children: [/* @__PURE__ */ C(n, {
|
|
69
|
+
icon: D,
|
|
69
70
|
size: "sm",
|
|
70
71
|
className: "mr-ds-02b"
|
|
71
72
|
}), "Add Rule"]
|
|
72
73
|
})]
|
|
73
|
-
}), /* @__PURE__ */
|
|
74
|
+
}), /* @__PURE__ */ C(a, { children: E ? /* @__PURE__ */ C("div", {
|
|
74
75
|
className: "flex items-center justify-center py-ds-07",
|
|
75
|
-
children: /* @__PURE__ */
|
|
76
|
-
}) :
|
|
76
|
+
children: /* @__PURE__ */ C(t, {})
|
|
77
|
+
}) : b.length === 0 ? /* @__PURE__ */ C("div", {
|
|
77
78
|
className: "py-ds-07 text-center",
|
|
78
|
-
children: /* @__PURE__ */
|
|
79
|
+
children: /* @__PURE__ */ C("p", {
|
|
79
80
|
className: "text-ds-md text-surface-fg-subtle",
|
|
80
81
|
children: "No custom preferences set. All notifications are delivered by default."
|
|
81
82
|
})
|
|
82
|
-
}) : /* @__PURE__ */
|
|
83
|
+
}) : /* @__PURE__ */ C("div", {
|
|
83
84
|
className: "flex flex-col",
|
|
84
|
-
children:
|
|
85
|
-
let i =
|
|
86
|
-
return /* @__PURE__ */
|
|
87
|
-
className: e("flex items-center gap-ds-05 py-ds-04", r <
|
|
85
|
+
children: b.map((t, r) => {
|
|
86
|
+
let i = k[t.channel] || k.IN_APP;
|
|
87
|
+
return /* @__PURE__ */ w("div", {
|
|
88
|
+
className: e("flex items-center gap-ds-05 py-ds-04", r < b.length - 1 && "border-b border-surface-border-strong"),
|
|
88
89
|
children: [
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
+
/* @__PURE__ */ C("div", {
|
|
90
91
|
className: "flex h-ds-sm w-ds-sm shrink-0 items-center justify-center rounded-surface bg-surface-raised",
|
|
91
|
-
children: /* @__PURE__ */
|
|
92
|
+
children: /* @__PURE__ */ C("span", {
|
|
92
93
|
className: "[&>svg]:h-ico-sm [&>svg]:w-ico-sm text-surface-fg-muted",
|
|
93
94
|
"aria-hidden": "true",
|
|
94
95
|
children: i.icon
|
|
95
96
|
})
|
|
96
97
|
}),
|
|
97
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ w("div", {
|
|
98
99
|
className: "min-w-0 flex-1",
|
|
99
|
-
children: [/* @__PURE__ */
|
|
100
|
+
children: [/* @__PURE__ */ C("p", {
|
|
100
101
|
className: "text-ds-md font-medium text-surface-fg",
|
|
101
102
|
children: i.label
|
|
102
|
-
}), /* @__PURE__ */
|
|
103
|
+
}), /* @__PURE__ */ C("p", {
|
|
103
104
|
className: "text-ds-sm text-surface-fg-subtle",
|
|
104
|
-
children:
|
|
105
|
+
children: Q(t.projectId)
|
|
105
106
|
})]
|
|
106
107
|
}),
|
|
107
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ w(m, {
|
|
108
109
|
value: t.minTier,
|
|
109
|
-
onValueChange: (e) =>
|
|
110
|
-
children: [/* @__PURE__ */
|
|
110
|
+
onValueChange: (e) => N?.(t, e),
|
|
111
|
+
children: [/* @__PURE__ */ C(_, {
|
|
111
112
|
className: "h-ds-xs-plus w-[130px] text-ds-sm",
|
|
112
|
-
children: /* @__PURE__ */
|
|
113
|
-
}), /* @__PURE__ */
|
|
113
|
+
children: /* @__PURE__ */ C(v, {})
|
|
114
|
+
}), /* @__PURE__ */ C(h, { children: Object.entries(A).map(([e, t]) => /* @__PURE__ */ C(g, {
|
|
114
115
|
value: e,
|
|
115
116
|
children: t
|
|
116
117
|
}, e)) })]
|
|
117
118
|
}),
|
|
118
|
-
/* @__PURE__ */
|
|
119
|
+
/* @__PURE__ */ w("div", {
|
|
119
120
|
className: "flex items-center gap-ds-02b",
|
|
120
|
-
children: [/* @__PURE__ */
|
|
121
|
+
children: [/* @__PURE__ */ C("span", {
|
|
121
122
|
className: "text-ds-sm text-surface-fg-subtle",
|
|
122
123
|
children: t.muted ? "Muted" : "Active"
|
|
123
|
-
}), /* @__PURE__ */
|
|
124
|
+
}), /* @__PURE__ */ C(y, {
|
|
124
125
|
checked: !t.muted,
|
|
125
|
-
onCheckedChange: () =>
|
|
126
|
+
onCheckedChange: () => M?.(t)
|
|
126
127
|
})]
|
|
127
128
|
}),
|
|
128
|
-
/* @__PURE__ */
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
129
|
+
/* @__PURE__ */ C(p, {
|
|
130
|
+
"aria-label": `Delete ${i.label} notification rule`,
|
|
131
|
+
icon: /* @__PURE__ */ C(n, { icon: O }),
|
|
132
|
+
variant: "ghost",
|
|
133
|
+
color: "error",
|
|
134
|
+
size: "sm",
|
|
135
|
+
onClick: () => P?.(t.id),
|
|
136
|
+
className: "shrink-0"
|
|
136
137
|
})
|
|
137
138
|
]
|
|
138
139
|
}, t.id);
|
|
139
140
|
})
|
|
140
141
|
}) })]
|
|
141
|
-
}), /* @__PURE__ */
|
|
142
|
-
open:
|
|
143
|
-
onOpenChange:
|
|
144
|
-
children: /* @__PURE__ */
|
|
142
|
+
}), /* @__PURE__ */ C(c, {
|
|
143
|
+
open: R,
|
|
144
|
+
onOpenChange: z,
|
|
145
|
+
children: /* @__PURE__ */ w(l, {
|
|
145
146
|
className: "sm:max-w-md",
|
|
146
|
-
children: [/* @__PURE__ */
|
|
147
|
+
children: [/* @__PURE__ */ w(d, { children: [/* @__PURE__ */ C(f, { children: "Add Notification Rule" }), /* @__PURE__ */ C(u, { children: "Customize how you receive notifications for a specific channel and project." })] }), /* @__PURE__ */ w("div", {
|
|
147
148
|
className: "flex flex-col gap-ds-05 pt-ds-03",
|
|
148
149
|
children: [
|
|
149
|
-
/* @__PURE__ */
|
|
150
|
+
/* @__PURE__ */ w("div", {
|
|
150
151
|
className: "flex flex-col gap-ds-02b",
|
|
151
|
-
children: [/* @__PURE__ */
|
|
152
|
+
children: [/* @__PURE__ */ C("label", {
|
|
152
153
|
htmlFor: "pref-scope",
|
|
153
154
|
className: "text-ds-sm font-medium text-surface-fg-muted",
|
|
154
155
|
children: "Scope"
|
|
155
|
-
}), /* @__PURE__ */
|
|
156
|
-
value:
|
|
157
|
-
onValueChange:
|
|
158
|
-
children: [/* @__PURE__ */
|
|
156
|
+
}), /* @__PURE__ */ w(m, {
|
|
157
|
+
value: B,
|
|
158
|
+
onValueChange: V,
|
|
159
|
+
children: [/* @__PURE__ */ C(_, {
|
|
159
160
|
id: "pref-scope",
|
|
160
|
-
children: /* @__PURE__ */
|
|
161
|
-
}), /* @__PURE__ */
|
|
161
|
+
children: /* @__PURE__ */ C(v, { placeholder: "Select scope" })
|
|
162
|
+
}), /* @__PURE__ */ w(h, { children: [/* @__PURE__ */ C(g, {
|
|
162
163
|
value: "global",
|
|
163
164
|
children: "Global (all projects)"
|
|
164
|
-
}),
|
|
165
|
+
}), T.map((e) => /* @__PURE__ */ C(g, {
|
|
165
166
|
value: e.id,
|
|
166
167
|
children: e.title
|
|
167
168
|
}, e.id))] })]
|
|
168
169
|
})]
|
|
169
170
|
}),
|
|
170
|
-
/* @__PURE__ */
|
|
171
|
+
/* @__PURE__ */ w("div", {
|
|
171
172
|
className: "flex flex-col gap-ds-02b",
|
|
172
|
-
children: [/* @__PURE__ */
|
|
173
|
+
children: [/* @__PURE__ */ C("label", {
|
|
173
174
|
htmlFor: "pref-channel",
|
|
174
175
|
className: "text-ds-sm font-medium text-surface-fg-muted",
|
|
175
176
|
children: "Channel"
|
|
176
|
-
}), /* @__PURE__ */
|
|
177
|
-
value:
|
|
178
|
-
onValueChange:
|
|
179
|
-
children: [/* @__PURE__ */
|
|
177
|
+
}), /* @__PURE__ */ w(m, {
|
|
178
|
+
value: H,
|
|
179
|
+
onValueChange: U,
|
|
180
|
+
children: [/* @__PURE__ */ C(_, {
|
|
180
181
|
id: "pref-channel",
|
|
181
|
-
children: /* @__PURE__ */
|
|
182
|
-
}), /* @__PURE__ */
|
|
182
|
+
children: /* @__PURE__ */ C(v, {})
|
|
183
|
+
}), /* @__PURE__ */ w(h, { children: [/* @__PURE__ */ C(g, {
|
|
183
184
|
value: "IN_APP",
|
|
184
185
|
children: "In-App"
|
|
185
|
-
}), /* @__PURE__ */
|
|
186
|
+
}), /* @__PURE__ */ C(g, {
|
|
186
187
|
value: "GOOGLE_CHAT",
|
|
187
188
|
children: "Google Chat"
|
|
188
189
|
})] })]
|
|
189
190
|
})]
|
|
190
191
|
}),
|
|
191
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ w("div", {
|
|
192
193
|
className: "flex flex-col gap-ds-02b",
|
|
193
|
-
children: [/* @__PURE__ */
|
|
194
|
+
children: [/* @__PURE__ */ C("label", {
|
|
194
195
|
htmlFor: "pref-min-tier",
|
|
195
196
|
className: "text-ds-sm font-medium text-surface-fg-muted",
|
|
196
197
|
children: "Minimum Tier"
|
|
197
|
-
}), /* @__PURE__ */
|
|
198
|
-
value:
|
|
199
|
-
onValueChange:
|
|
200
|
-
children: [/* @__PURE__ */
|
|
198
|
+
}), /* @__PURE__ */ w(m, {
|
|
199
|
+
value: W,
|
|
200
|
+
onValueChange: G,
|
|
201
|
+
children: [/* @__PURE__ */ C(_, {
|
|
201
202
|
id: "pref-min-tier",
|
|
202
|
-
children: /* @__PURE__ */
|
|
203
|
-
}), /* @__PURE__ */
|
|
203
|
+
children: /* @__PURE__ */ C(v, {})
|
|
204
|
+
}), /* @__PURE__ */ C(h, { children: Object.entries(A).map(([e, t]) => /* @__PURE__ */ C(g, {
|
|
204
205
|
value: e,
|
|
205
206
|
children: t
|
|
206
207
|
}, e)) })]
|
|
207
208
|
})]
|
|
208
209
|
}),
|
|
209
|
-
/* @__PURE__ */
|
|
210
|
+
/* @__PURE__ */ w("div", {
|
|
210
211
|
className: "flex items-center justify-between",
|
|
211
|
-
children: [/* @__PURE__ */
|
|
212
|
+
children: [/* @__PURE__ */ C("label", {
|
|
212
213
|
htmlFor: "pref-muted",
|
|
213
214
|
className: "text-ds-md text-surface-fg",
|
|
214
215
|
children: "Mute this channel"
|
|
215
|
-
}), /* @__PURE__ */
|
|
216
|
+
}), /* @__PURE__ */ C(y, {
|
|
216
217
|
id: "pref-muted",
|
|
217
|
-
checked:
|
|
218
|
-
onCheckedChange:
|
|
218
|
+
checked: K,
|
|
219
|
+
onCheckedChange: q
|
|
219
220
|
})]
|
|
220
221
|
}),
|
|
221
|
-
/* @__PURE__ */
|
|
222
|
+
/* @__PURE__ */ w("div", {
|
|
222
223
|
className: "flex justify-end gap-ds-03 pt-ds-03",
|
|
223
|
-
children: [/* @__PURE__ */
|
|
224
|
+
children: [/* @__PURE__ */ C(r, {
|
|
224
225
|
variant: "ghost",
|
|
225
226
|
onClick: () => {
|
|
226
|
-
|
|
227
|
+
z(!1), Z();
|
|
227
228
|
},
|
|
228
229
|
children: "Cancel"
|
|
229
|
-
}), /* @__PURE__ */
|
|
230
|
-
onClick:
|
|
231
|
-
disabled:
|
|
232
|
-
children:
|
|
230
|
+
}), /* @__PURE__ */ C(r, {
|
|
231
|
+
onClick: X,
|
|
232
|
+
disabled: J,
|
|
233
|
+
children: J ? "Saving..." : "Save Rule"
|
|
233
234
|
})]
|
|
234
235
|
})
|
|
235
236
|
]
|
|
@@ -237,6 +238,6 @@ var O = {
|
|
|
237
238
|
})
|
|
238
239
|
})] });
|
|
239
240
|
});
|
|
240
|
-
|
|
241
|
+
j.displayName = "NotificationPreferences";
|
|
241
242
|
//#endregion
|
|
242
|
-
export {
|
|
243
|
+
export { j as NotificationPreferences };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-preferences.js","names":[],"sources":["../../src/shell/notification-preferences.tsx"],"sourcesContent":["'use client'\n\n/**\n * NotificationPreferences -- Manage notification rules per channel/project.\n *\n * Props-driven: accepts preferences array, projects, and callbacks.\n * No internal fetching -- the consumer is responsible for data loading.\n */\nimport { IconBell, IconMessage,IconPlus, IconTrash } from '@tabler/icons-react'\nimport * as React from 'react'\nimport { useState } from 'react'\n\nimport { Button } from '../ui/button'\nimport { Card, CardContent,CardHeader, CardTitle } from '../ui/card'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog'\nimport { Icon } from '../ui/icon'\nimport { cn } from '../ui/lib/utils'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { Spinner } from '../ui/spinner'\nimport { Switch } from '../ui/switch'\n\n// -----------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------\n\nexport interface NotificationPreference {\n id: string\n userId?: string\n projectId: string | null\n channel: string\n minTier: string\n muted: boolean\n}\n\nexport interface NotificationProject {\n id: string\n title: string\n}\n\nexport interface NotificationPreferencesProps\n extends Omit<React.ComponentPropsWithRef<'div'>, 'onSave'> {\n /** Current preference rules */\n preferences?: NotificationPreference[]\n /** Available projects for scoping rules */\n projects?: NotificationProject[]\n /** Whether data is loading */\n isLoading?: boolean\n /** Called to add or update a preference */\n onSave?: (preference: {\n projectId: string | null\n channel: string\n minTier: string\n muted: boolean\n }) => void | Promise<void>\n /** Called to toggle mute on a preference */\n onToggleMute?: (preference: NotificationPreference) => void | Promise<void>\n /** Called to update the tier on a preference */\n onUpdateTier?: (\n preference: NotificationPreference,\n newTier: string,\n ) => void | Promise<void>\n /** Called to delete a preference */\n onDelete?: (preferenceId: string) => void | Promise<void>\n /** Additional className */\n className?: string\n}\n\n// -----------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------\n\nconst CHANNEL_LABELS: Record<string, { label: string; icon: React.ReactNode }> = {\n IN_APP: { label: 'In-App', icon: <Icon icon={IconBell} size=\"sm\" /> },\n GOOGLE_CHAT: { label: 'Google Chat', icon: <Icon icon={IconMessage} size=\"sm\" /> },\n}\n\nconst TIER_LABELS: Record<string, string> = {\n INFO: 'All (Info+)',\n IMPORTANT: 'Important+',\n CRITICAL: 'Critical only',\n}\n\n// -----------------------------------------------------------------------\n// NotificationPreferences\n// -----------------------------------------------------------------------\n\nconst NotificationPreferences = React.forwardRef<HTMLDivElement, NotificationPreferencesProps>(\n function NotificationPreferences(\n {\n preferences = [],\n projects = [],\n isLoading = false,\n onSave,\n onToggleMute,\n onUpdateTier,\n onDelete,\n className,\n ...props\n },\n ref,\n ) {\n const [showAddDialog, setShowAddDialog] = useState(false)\n const [newProjectId, setNewProjectId] = useState<string>('global')\n const [newChannel, setNewChannel] = useState<string>('IN_APP')\n const [newMinTier, setNewMinTier] = useState<string>('INFO')\n const [newMuted, setNewMuted] = useState(false)\n const [isSaving, setIsSaving] = useState(false)\n\n const handleAdd = async () => {\n if (!onSave) return\n setIsSaving(true)\n try {\n await onSave({\n projectId: newProjectId === 'global' ? null : newProjectId,\n channel: newChannel,\n minTier: newMinTier,\n muted: newMuted,\n })\n setShowAddDialog(false)\n resetForm()\n } catch (error) {\n console.error('[Preferences] Failed to save:', error)\n } finally {\n setIsSaving(false)\n }\n }\n\n const resetForm = () => {\n setNewProjectId('global')\n setNewChannel('IN_APP')\n setNewMinTier('INFO')\n setNewMuted(false)\n }\n\n const getProjectName = (projectId: string | null) => {\n if (!projectId) return 'Global (all projects)'\n const project = projects.find((p) => p.id === projectId)\n return project?.title || 'Unknown project'\n }\n\n return (\n <>\n <Card ref={ref} className={className} {...(props as Omit<typeof props, 'color'>)}>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-ds-04\">\n <CardTitle className=\"text-ds-md font-semibold\">\n Notification Preferences\n </CardTitle>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setShowAddDialog(true)}\n >\n <Icon icon={IconPlus} size=\"sm\" className=\"mr-ds-02b\" />\n Add Rule\n </Button>\n </CardHeader>\n <CardContent>\n {isLoading ? (\n <div className=\"flex items-center justify-center py-ds-07\">\n <Spinner />\n </div>\n ) : preferences.length === 0 ? (\n <div className=\"py-ds-07 text-center\">\n <p className=\"text-ds-md text-surface-fg-subtle\">\n No custom preferences set. All notifications are delivered by\n default.\n </p>\n </div>\n ) : (\n <div className=\"flex flex-col\">\n {preferences.map((pref, i) => {\n const channelInfo =\n CHANNEL_LABELS[pref.channel] || CHANNEL_LABELS.IN_APP\n return (\n <div\n key={pref.id}\n className={cn(\n 'flex items-center gap-ds-05 py-ds-04',\n i < preferences.length - 1 &&\n 'border-b border-surface-border-strong',\n )}\n >\n {/* Channel icon */}\n <div className=\"flex h-ds-sm w-ds-sm shrink-0 items-center justify-center rounded-surface bg-surface-raised\">\n <span className=\"[&>svg]:h-ico-sm [&>svg]:w-ico-sm text-surface-fg-muted\" aria-hidden=\"true\">{channelInfo.icon}</span>\n </div>\n\n {/* Info */}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-ds-md font-medium text-surface-fg\">\n {channelInfo.label}\n </p>\n <p className=\"text-ds-sm text-surface-fg-subtle\">\n {getProjectName(pref.projectId)}\n </p>\n </div>\n\n {/* Min tier */}\n <Select\n value={pref.minTier}\n onValueChange={(v) => onUpdateTier?.(pref, v)}\n >\n <SelectTrigger className=\"h-ds-xs-plus w-[130px] text-ds-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {Object.entries(TIER_LABELS).map(([key, label]) => (\n <SelectItem key={key} value={key}>\n {label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Muted toggle */}\n <div className=\"flex items-center gap-ds-02b\">\n <span className=\"text-ds-sm text-surface-fg-subtle\">\n {pref.muted ? 'Muted' : 'Active'}\n </span>\n <Switch\n checked={!pref.muted}\n onCheckedChange={() => onToggleMute?.(pref)}\n />\n </div>\n\n {/* Delete */}\n <button\n type=\"button\"\n onClick={() => onDelete?.(pref.id)}\n className=\"shrink-0 rounded p-ds-02b text-surface-fg-subtle transition-colors hover:bg-surface-raised hover:text-error-11\"\n >\n <Icon icon={IconTrash} size=\"sm\" />\n </button>\n </div>\n )\n })}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Add Preference Dialog */}\n <Dialog open={showAddDialog} onOpenChange={setShowAddDialog}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Add Notification Rule</DialogTitle>\n <DialogDescription>\n Customize how you receive notifications for a specific channel\n and project.\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-ds-05 pt-ds-03\">\n <div className=\"flex flex-col gap-ds-02b\">\n <label htmlFor=\"pref-scope\" className=\"text-ds-sm font-medium text-surface-fg-muted\">\n Scope\n </label>\n <Select value={newProjectId} onValueChange={setNewProjectId}>\n <SelectTrigger id=\"pref-scope\">\n <SelectValue placeholder=\"Select scope\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"global\">\n Global (all projects)\n </SelectItem>\n {projects.map((p) => (\n <SelectItem key={p.id} value={p.id}>\n {p.title}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex flex-col gap-ds-02b\">\n <label htmlFor=\"pref-channel\" className=\"text-ds-sm font-medium text-surface-fg-muted\">\n Channel\n </label>\n <Select value={newChannel} onValueChange={setNewChannel}>\n <SelectTrigger id=\"pref-channel\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"IN_APP\">In-App</SelectItem>\n <SelectItem value=\"GOOGLE_CHAT\">Google Chat</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex flex-col gap-ds-02b\">\n <label htmlFor=\"pref-min-tier\" className=\"text-ds-sm font-medium text-surface-fg-muted\">\n Minimum Tier\n </label>\n <Select value={newMinTier} onValueChange={setNewMinTier}>\n <SelectTrigger id=\"pref-min-tier\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {Object.entries(TIER_LABELS).map(([key, label]) => (\n <SelectItem key={key} value={key}>\n {label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-center justify-between\">\n <label htmlFor=\"pref-muted\" className=\"text-ds-md text-surface-fg\">\n Mute this channel\n </label>\n <Switch id=\"pref-muted\" checked={newMuted} onCheckedChange={setNewMuted} />\n </div>\n\n <div className=\"flex justify-end gap-ds-03 pt-ds-03\">\n <Button\n variant=\"ghost\"\n onClick={() => {\n setShowAddDialog(false)\n resetForm()\n }}\n >\n Cancel\n </Button>\n <Button\n onClick={handleAdd}\n disabled={isSaving}\n >\n {isSaving ? 'Saving...' : 'Save Rule'}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </>\n )\n },\n)\n\nNotificationPreferences.displayName = 'NotificationPreferences'\n\nexport { NotificationPreferences }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"notification-preferences.js","names":[],"sources":["../../src/shell/notification-preferences.tsx"],"sourcesContent":["'use client'\n\n/**\n * NotificationPreferences -- Manage notification rules per channel/project.\n *\n * Props-driven: accepts preferences array, projects, and callbacks.\n * No internal fetching -- the consumer is responsible for data loading.\n */\nimport { IconBell, IconMessage,IconPlus, IconTrash } from '@tabler/icons-react'\nimport * as React from 'react'\nimport { useState } from 'react'\n\nimport { Button } from '../ui/button'\nimport { Card, CardContent,CardHeader, CardTitle } from '../ui/card'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '../ui/dialog'\nimport { Icon } from '../ui/icon'\nimport { IconButton } from '../ui/icon-button'\nimport { cn } from '../ui/lib/utils'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { Spinner } from '../ui/spinner'\nimport { Switch } from '../ui/switch'\n\n// -----------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------\n\nexport interface NotificationPreference {\n id: string\n userId?: string\n projectId: string | null\n channel: string\n minTier: string\n muted: boolean\n}\n\nexport interface NotificationProject {\n id: string\n title: string\n}\n\nexport interface NotificationPreferencesProps\n extends Omit<React.ComponentPropsWithRef<'div'>, 'onSave'> {\n /** Current preference rules */\n preferences?: NotificationPreference[]\n /** Available projects for scoping rules */\n projects?: NotificationProject[]\n /** Whether data is loading */\n isLoading?: boolean\n /** Called to add or update a preference */\n onSave?: (preference: {\n projectId: string | null\n channel: string\n minTier: string\n muted: boolean\n }) => void | Promise<void>\n /** Called to toggle mute on a preference */\n onToggleMute?: (preference: NotificationPreference) => void | Promise<void>\n /** Called to update the tier on a preference */\n onUpdateTier?: (\n preference: NotificationPreference,\n newTier: string,\n ) => void | Promise<void>\n /** Called to delete a preference */\n onDelete?: (preferenceId: string) => void | Promise<void>\n /** Additional className */\n className?: string\n}\n\n// -----------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------\n\nconst CHANNEL_LABELS: Record<string, { label: string; icon: React.ReactNode }> = {\n IN_APP: { label: 'In-App', icon: <Icon icon={IconBell} size=\"sm\" /> },\n GOOGLE_CHAT: { label: 'Google Chat', icon: <Icon icon={IconMessage} size=\"sm\" /> },\n}\n\nconst TIER_LABELS: Record<string, string> = {\n INFO: 'All (Info+)',\n IMPORTANT: 'Important+',\n CRITICAL: 'Critical only',\n}\n\n// -----------------------------------------------------------------------\n// NotificationPreferences\n// -----------------------------------------------------------------------\n\nconst NotificationPreferences = React.forwardRef<HTMLDivElement, NotificationPreferencesProps>(\n function NotificationPreferences(\n {\n preferences = [],\n projects = [],\n isLoading = false,\n onSave,\n onToggleMute,\n onUpdateTier,\n onDelete,\n className,\n ...props\n },\n ref,\n ) {\n const [showAddDialog, setShowAddDialog] = useState(false)\n const [newProjectId, setNewProjectId] = useState<string>('global')\n const [newChannel, setNewChannel] = useState<string>('IN_APP')\n const [newMinTier, setNewMinTier] = useState<string>('INFO')\n const [newMuted, setNewMuted] = useState(false)\n const [isSaving, setIsSaving] = useState(false)\n\n const handleAdd = async () => {\n if (!onSave) return\n setIsSaving(true)\n try {\n await onSave({\n projectId: newProjectId === 'global' ? null : newProjectId,\n channel: newChannel,\n minTier: newMinTier,\n muted: newMuted,\n })\n setShowAddDialog(false)\n resetForm()\n } catch (error) {\n console.error('[Preferences] Failed to save:', error)\n } finally {\n setIsSaving(false)\n }\n }\n\n const resetForm = () => {\n setNewProjectId('global')\n setNewChannel('IN_APP')\n setNewMinTier('INFO')\n setNewMuted(false)\n }\n\n const getProjectName = (projectId: string | null) => {\n if (!projectId) return 'Global (all projects)'\n const project = projects.find((p) => p.id === projectId)\n return project?.title || 'Unknown project'\n }\n\n return (\n <>\n <Card ref={ref} className={className} {...(props as Omit<typeof props, 'color'>)}>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle className=\"text-ds-md font-semibold\">\n Notification Preferences\n </CardTitle>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setShowAddDialog(true)}\n >\n <Icon icon={IconPlus} size=\"sm\" className=\"mr-ds-02b\" />\n Add Rule\n </Button>\n </CardHeader>\n <CardContent>\n {isLoading ? (\n <div className=\"flex items-center justify-center py-ds-07\">\n <Spinner />\n </div>\n ) : preferences.length === 0 ? (\n <div className=\"py-ds-07 text-center\">\n <p className=\"text-ds-md text-surface-fg-subtle\">\n No custom preferences set. All notifications are delivered by\n default.\n </p>\n </div>\n ) : (\n <div className=\"flex flex-col\">\n {preferences.map((pref, i) => {\n const channelInfo =\n CHANNEL_LABELS[pref.channel] || CHANNEL_LABELS.IN_APP\n return (\n <div\n key={pref.id}\n className={cn(\n 'flex items-center gap-ds-05 py-ds-04',\n i < preferences.length - 1 &&\n 'border-b border-surface-border-strong',\n )}\n >\n {/* Channel icon */}\n <div className=\"flex h-ds-sm w-ds-sm shrink-0 items-center justify-center rounded-surface bg-surface-raised\">\n <span className=\"[&>svg]:h-ico-sm [&>svg]:w-ico-sm text-surface-fg-muted\" aria-hidden=\"true\">{channelInfo.icon}</span>\n </div>\n\n {/* Info */}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-ds-md font-medium text-surface-fg\">\n {channelInfo.label}\n </p>\n <p className=\"text-ds-sm text-surface-fg-subtle\">\n {getProjectName(pref.projectId)}\n </p>\n </div>\n\n {/* Min tier */}\n <Select\n value={pref.minTier}\n onValueChange={(v) => onUpdateTier?.(pref, v)}\n >\n <SelectTrigger className=\"h-ds-xs-plus w-[130px] text-ds-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {Object.entries(TIER_LABELS).map(([key, label]) => (\n <SelectItem key={key} value={key}>\n {label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Muted toggle */}\n <div className=\"flex items-center gap-ds-02b\">\n <span className=\"text-ds-sm text-surface-fg-subtle\">\n {pref.muted ? 'Muted' : 'Active'}\n </span>\n <Switch\n checked={!pref.muted}\n onCheckedChange={() => onToggleMute?.(pref)}\n />\n </div>\n\n {/* Delete */}\n <IconButton\n aria-label={`Delete ${channelInfo.label} notification rule`}\n icon={<Icon icon={IconTrash} />}\n variant=\"ghost\"\n color=\"error\"\n size=\"sm\"\n onClick={() => onDelete?.(pref.id)}\n className=\"shrink-0\"\n />\n </div>\n )\n })}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Add Preference Dialog */}\n <Dialog open={showAddDialog} onOpenChange={setShowAddDialog}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Add Notification Rule</DialogTitle>\n <DialogDescription>\n Customize how you receive notifications for a specific channel\n and project.\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-ds-05 pt-ds-03\">\n <div className=\"flex flex-col gap-ds-02b\">\n <label htmlFor=\"pref-scope\" className=\"text-ds-sm font-medium text-surface-fg-muted\">\n Scope\n </label>\n <Select value={newProjectId} onValueChange={setNewProjectId}>\n <SelectTrigger id=\"pref-scope\">\n <SelectValue placeholder=\"Select scope\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"global\">\n Global (all projects)\n </SelectItem>\n {projects.map((p) => (\n <SelectItem key={p.id} value={p.id}>\n {p.title}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex flex-col gap-ds-02b\">\n <label htmlFor=\"pref-channel\" className=\"text-ds-sm font-medium text-surface-fg-muted\">\n Channel\n </label>\n <Select value={newChannel} onValueChange={setNewChannel}>\n <SelectTrigger id=\"pref-channel\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"IN_APP\">In-App</SelectItem>\n <SelectItem value=\"GOOGLE_CHAT\">Google Chat</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex flex-col gap-ds-02b\">\n <label htmlFor=\"pref-min-tier\" className=\"text-ds-sm font-medium text-surface-fg-muted\">\n Minimum Tier\n </label>\n <Select value={newMinTier} onValueChange={setNewMinTier}>\n <SelectTrigger id=\"pref-min-tier\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {Object.entries(TIER_LABELS).map(([key, label]) => (\n <SelectItem key={key} value={key}>\n {label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-center justify-between\">\n <label htmlFor=\"pref-muted\" className=\"text-ds-md text-surface-fg\">\n Mute this channel\n </label>\n <Switch id=\"pref-muted\" checked={newMuted} onCheckedChange={setNewMuted} />\n </div>\n\n <div className=\"flex justify-end gap-ds-03 pt-ds-03\">\n <Button\n variant=\"ghost\"\n onClick={() => {\n setShowAddDialog(false)\n resetForm()\n }}\n >\n Cancel\n </Button>\n <Button\n onClick={handleAdd}\n disabled={isSaving}\n >\n {isSaving ? 'Saving...' : 'Save Rule'}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </>\n )\n },\n)\n\nNotificationPreferences.displayName = 'NotificationPreferences'\n\nexport { NotificationPreferences }\n"],"mappings":";;;;;;;;;;;;;;;AAoFA,IAAM,IAA2E;CAC/E,QAAQ;EAAE,OAAO;EAAU,MAAM,kBAAC,GAAD;GAAM,MAAM;GAAU,MAAK;GAAO,CAAA;EAAE;CACrE,aAAa;EAAE,OAAO;EAAe,MAAM,kBAAC,GAAD;GAAM,MAAM;GAAa,MAAK;GAAO,CAAA;EAAE;CACnF,EAEK,IAAsC;CAC1C,MAAM;CACN,WAAW;CACX,UAAU;CACX,EAMK,IAA0B,EAAM,WACpC,SACE,EACE,iBAAc,EAAE,EAChB,cAAW,EAAE,EACb,eAAY,IACZ,WACA,iBACA,iBACA,aACA,cACA,GAAG,KAEL,GACA;CACF,IAAM,CAAC,GAAe,KAAoB,EAAS,GAAM,EACnD,CAAC,GAAc,KAAmB,EAAiB,SAAS,EAC5D,CAAC,GAAY,KAAiB,EAAiB,SAAS,EACxD,CAAC,GAAY,KAAiB,EAAiB,OAAO,EACtD,CAAC,GAAU,KAAe,EAAS,GAAM,EACzC,CAAC,GAAU,KAAe,EAAS,GAAM,EAEzC,IAAY,YAAY;AACvB,SACL;KAAY,GAAK;AACjB,OAAI;AAQF,IAPA,MAAM,EAAO;KACX,WAAW,MAAiB,WAAW,OAAO;KAC9C,SAAS;KACT,SAAS;KACT,OAAO;KACR,CAAC,EACF,EAAiB,GAAM,EACvB,GAAW;YACJ,GAAO;AACd,YAAQ,MAAM,iCAAiC,EAAM;aAC7C;AACR,MAAY,GAAM;;;IAIhB,UAAkB;AAItB,EAHA,EAAgB,SAAS,EACzB,EAAc,SAAS,EACvB,EAAc,OAAO,EACrB,EAAY,GAAM;IAGd,KAAkB,MACjB,IACW,EAAS,MAAM,MAAM,EAAE,OAAO,EAAU,EACxC,SAAS,oBAFF;AAKzB,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EAAW;EAAgB;EAAW,GAAK;YAA3C,CACE,kBAAC,GAAD;GAAY,WAAU;aAAtB,CACE,kBAAC,GAAD;IAAW,WAAU;cAA2B;IAEpC,CAAA,EACZ,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,eAAe,EAAiB,GAAK;cAHvC,CAKE,kBAAC,GAAD;KAAM,MAAM;KAAU,MAAK;KAAK,WAAU;KAAc,CAAA,EAAA,WAEjD;MACE;MACb,kBAAC,GAAD,EAAA,UACG,IACC,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD,EAAW,CAAA;GACP,CAAA,GACJ,EAAY,WAAW,IACzB,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,KAAD;IAAG,WAAU;cAAoC;IAG7C,CAAA;GACA,CAAA,GAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAY,KAAK,GAAM,MAAM;IAC5B,IAAM,IACJ,EAAe,EAAK,YAAY,EAAe;AACjD,WACE,kBAAC,OAAD;KAEE,WAAW,EACT,wCACA,IAAI,EAAY,SAAS,KACvB,wCACH;eANH;MASE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,QAAD;QAAM,WAAU;QAA0D,eAAY;kBAAQ,EAAY;QAAY,CAAA;OAClH,CAAA;MAGN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAY;QACX,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAe,EAAK,UAAU;QAC7B,CAAA,CACA;;MAGN,kBAAC,GAAD;OACE,OAAO,EAAK;OACZ,gBAAgB,MAAM,IAAe,GAAM,EAAE;iBAF/C,CAIE,kBAAC,GAAD;QAAe,WAAU;kBACvB,kBAAC,GAAD,EAAe,CAAA;QACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UACG,OAAO,QAAQ,EAAY,CAAC,KAAK,CAAC,GAAK,OACtC,kBAAC,GAAD;QAAsB,OAAO;kBAC1B;QACU,EAFI,EAEJ,CACb,EACY,CAAA,CACT;;MAGT,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAK,QAAQ,UAAU;QACnB,CAAA,EACP,kBAAC,GAAD;QACE,SAAS,CAAC,EAAK;QACf,uBAAuB,IAAe,EAAK;QAC3C,CAAA,CACE;;MAGN,kBAAC,GAAD;OACE,cAAY,UAAU,EAAY,MAAM;OACxC,MAAM,kBAAC,GAAD,EAAM,MAAM,GAAa,CAAA;OAC/B,SAAQ;OACR,OAAM;OACN,MAAK;OACL,eAAe,IAAW,EAAK,GAAG;OAClC,WAAU;OACV,CAAA;MACE;OA5DC,EAAK,GA4DN;KAER;GACE,CAAA,EAEI,CAAA,CACT;KAGP,kBAAC,GAAD;EAAQ,MAAM;EAAe,cAAc;YACzC,kBAAC,GAAD;GAAe,WAAU;aAAzB,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAa,yBAAmC,CAAA,EAChD,kBAAC,GAAD,EAAA,UAAmB,+EAGC,CAAA,CACP,EAAA,CAAA,EACf,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,SAAQ;OAAa,WAAU;iBAA+C;OAE7E,CAAA,EACR,kBAAC,GAAD;OAAQ,OAAO;OAAc,eAAe;iBAA5C,CACE,kBAAC,GAAD;QAAe,IAAG;kBAChB,kBAAC,GAAD,EAAa,aAAY,gBAAiB,CAAA;QAC5B,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;QAAY,OAAM;kBAAS;QAEd,CAAA,EACZ,EAAS,KAAK,MACb,kBAAC,GAAD;QAAuB,OAAO,EAAE;kBAC7B,EAAE;QACQ,EAFI,EAAE,GAEN,CACb,CACY,EAAA,CAAA,CACT;SACL;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,SAAQ;OAAe,WAAU;iBAA+C;OAE/E,CAAA,EACR,kBAAC,GAAD;OAAQ,OAAO;OAAY,eAAe;iBAA1C,CACE,kBAAC,GAAD;QAAe,IAAG;kBAChB,kBAAC,GAAD,EAAe,CAAA;QACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;QAAY,OAAM;kBAAS;QAAmB,CAAA,EAC9C,kBAAC,GAAD;QAAY,OAAM;kBAAc;QAAwB,CAAA,CAC1C,EAAA,CAAA,CACT;SACL;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,SAAQ;OAAgB,WAAU;iBAA+C;OAEhF,CAAA,EACR,kBAAC,GAAD;OAAQ,OAAO;OAAY,eAAe;iBAA1C,CACE,kBAAC,GAAD;QAAe,IAAG;kBAChB,kBAAC,GAAD,EAAe,CAAA;QACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UACG,OAAO,QAAQ,EAAY,CAAC,KAAK,CAAC,GAAK,OACtC,kBAAC,GAAD;QAAsB,OAAO;kBAC1B;QACU,EAFI,EAEJ,CACb,EACY,CAAA,CACT;SACL;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,SAAQ;OAAa,WAAU;iBAA6B;OAE3D,CAAA,EACR,kBAAC,GAAD;OAAQ,IAAG;OAAa,SAAS;OAAU,iBAAiB;OAAe,CAAA,CACvE;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,SAAQ;OACR,eAAe;AAEb,QADA,EAAiB,GAAM,EACvB,GAAW;;iBAEd;OAEQ,CAAA,EACT,kBAAC,GAAD;OACE,SAAS;OACT,UAAU;iBAET,IAAW,cAAc;OACnB,CAAA,CACL;;KACF;MACQ;;EACT,CAAA,CACR,EAAA,CAAA;EAGN;AAED,EAAwB,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badge-group.d.ts","sourceRoot":"","sources":["../../src/ui/badge-group.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAGhD,QAAA,MAAM,WAAW;;;;CAIP,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,OAAO,WAAW,CAAA;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,GAAe,EACf,IAAI,EACJ,eAAe,EACf,SAAS,EACT,QAAQ,GACT,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"badge-group.d.ts","sourceRoot":"","sources":["../../src/ui/badge-group.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAGhD,QAAA,MAAM,WAAW;;;;CAIP,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,OAAO,WAAW,CAAA;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,GAAe,EACf,IAAI,EACJ,eAAe,EACf,SAAS,EACT,QAAQ,GACT,EAAE,eAAe,2CAyBjB;yBAhCe,UAAU"}
|
package/dist/ui/card.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ declare const cardVariants: (props?: ({
|
|
|
6
6
|
variant?: "flat" | "outline" | "default" | "elevated" | null | undefined;
|
|
7
7
|
color?: "default" | "accent" | "success" | "error" | "info" | "warning" | "neutral" | null | undefined;
|
|
8
8
|
size?: "sm" | "md" | "lg" | null | undefined;
|
|
9
|
+
orientation?: "horizontal" | "vertical" | null | undefined;
|
|
9
10
|
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
10
11
|
/**
|
|
11
12
|
* Props for Card — a general-purpose content container with 4 elevation/style variants and
|
|
@@ -17,7 +18,13 @@ declare const cardVariants: (props?: ({
|
|
|
17
18
|
* variants need no explicit border (make-kit rule #6).
|
|
18
19
|
*
|
|
19
20
|
* **Composition:** Use sub-components `<CardHeader>`, `<CardTitle>`, `<CardDescription>`,
|
|
20
|
-
* `<CardContent>`, and `<CardFooter>` for consistent internal spacing.
|
|
21
|
+
* `<CardContent>`, and `<CardFooter>` for consistent internal spacing. Text content must live
|
|
22
|
+
* inside a slot — raw text as a direct child gets no horizontal inset (direct children span the
|
|
23
|
+
* full card width by design, which is what makes full-width dividers and bands free).
|
|
24
|
+
*
|
|
25
|
+
* **Spacing:** `size` sets `--card-spacing` / `--card-gap` once; container, slots, `CardAction`,
|
|
26
|
+
* and `CardBleed` all read the same pair. Retune a card with a single override:
|
|
27
|
+
* `className="[--card-spacing:var(--spacing-ds-07)]"`.
|
|
21
28
|
*
|
|
22
29
|
* **Interactive:** Pass `interactive` to enable hover shadow lift and pointer cursor —
|
|
23
30
|
* useful for clickable cards in grids.
|
|
@@ -35,27 +42,33 @@ declare const cardVariants: (props?: ({
|
|
|
35
42
|
* </Card>
|
|
36
43
|
*
|
|
37
44
|
* @example
|
|
38
|
-
* //
|
|
39
|
-
* <Card
|
|
40
|
-
* <
|
|
41
|
-
*
|
|
42
|
-
*
|
|
45
|
+
* // Full-bleed cover image + edge-to-edge divider:
|
|
46
|
+
* <Card>
|
|
47
|
+
* <CardBleed side="top"><img src={cover} alt="" /></CardBleed>
|
|
48
|
+
* <CardHeader><CardTitle>Muhurat launch site</CardTitle></CardHeader>
|
|
49
|
+
* <Separator />
|
|
50
|
+
* <CardFooter><Badge color="success">On track</Badge></CardFooter>
|
|
43
51
|
* </Card>
|
|
44
52
|
*
|
|
45
53
|
* @example
|
|
46
|
-
* //
|
|
47
|
-
* <Card
|
|
48
|
-
* <
|
|
49
|
-
* <
|
|
50
|
-
* </
|
|
54
|
+
* // Horizontal media card — media pane owns the left edge, CardSection restores rhythm:
|
|
55
|
+
* <Card orientation="horizontal">
|
|
56
|
+
* <div className="w-32 shrink-0 rounded-l-surface overflow-hidden">
|
|
57
|
+
* <img src={thumb} alt="" className="h-full w-full object-cover" />
|
|
58
|
+
* </div>
|
|
59
|
+
* <CardSection>
|
|
60
|
+
* <CardHeader><CardTitle>Field notes</CardTitle></CardHeader>
|
|
61
|
+
* <CardFooter>edited yesterday</CardFooter>
|
|
62
|
+
* </CardSection>
|
|
51
63
|
* </Card>
|
|
52
64
|
*
|
|
53
65
|
* @example
|
|
54
66
|
* // Flat card for a sidebar panel section (no shadow):
|
|
55
|
-
* <Card variant="flat"
|
|
56
|
-
* <
|
|
67
|
+
* <Card variant="flat">
|
|
68
|
+
* <CardContent>
|
|
69
|
+
* <p className="text-surface-fg-muted text-ds-sm">No recent activity</p>
|
|
70
|
+
* </CardContent>
|
|
57
71
|
* </Card>
|
|
58
|
-
* // These are just a few ways — feel free to combine props creatively!
|
|
59
72
|
*/
|
|
60
73
|
export interface CardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'color'>, VariantProps<typeof cardVariants> {
|
|
61
74
|
interactive?: boolean;
|
|
@@ -67,6 +80,43 @@ declare const CardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HT
|
|
|
67
80
|
declare const CardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
68
81
|
declare const CardContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
69
82
|
declare const CardFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
83
|
+
/**
|
|
84
|
+
* A vertical stack that re-establishes the card's padding + gap rhythm — the text column
|
|
85
|
+
* of a `<Card orientation="horizontal">`. Reads the same `--card-spacing` / `--card-gap`
|
|
86
|
+
* variables the container sets, so the horizontal card's content column matches a vertical
|
|
87
|
+
* card of the same `size` exactly.
|
|
88
|
+
*/
|
|
89
|
+
declare const CardSection: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
90
|
+
type CardBleedSide = 'x' | 'top' | 'bottom' | 'y' | 'all';
|
|
91
|
+
export interface CardBleedProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
92
|
+
/**
|
|
93
|
+
* Which card padding to negate. `top`/`bottom`/`y` are for direct children of Card
|
|
94
|
+
* (full-bleed media, edge bands) and inherit the card's corner radius; `x`/`all` are
|
|
95
|
+
* for content INSIDE a slot that needs to escape the slot's horizontal inset.
|
|
96
|
+
* Direct children of Card already span its full width — don't use `x`/`all` there.
|
|
97
|
+
* @default 'x'
|
|
98
|
+
*/
|
|
99
|
+
side?: CardBleedSide;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Escape hatch from the card's padding — the shilp-sutra equivalent of Radix Themes'
|
|
103
|
+
* `Inset` / Polaris `Bleed`. Negates the same `--card-spacing` variable the padding
|
|
104
|
+
* reads, so it stays exact across sizes and overrides.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* // Cover image touching the card's top + side edges:
|
|
108
|
+
* <Card>
|
|
109
|
+
* <CardBleed side="top"><img src={cover} alt="" /></CardBleed>
|
|
110
|
+
* <CardHeader><CardTitle>Project</CardTitle></CardHeader>
|
|
111
|
+
* </Card>
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* // A tinted band inside CardContent, running edge-to-edge:
|
|
115
|
+
* <CardContent>
|
|
116
|
+
* <CardBleed><div className="bg-accent-2 px-(--card-spacing) py-ds-03">Heads up…</div></CardBleed>
|
|
117
|
+
* </CardContent>
|
|
118
|
+
*/
|
|
119
|
+
declare const CardBleed: React.ForwardRefExoticComponent<CardBleedProps & React.RefAttributes<HTMLDivElement>>;
|
|
70
120
|
type CardActionPlacement = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
|
|
71
121
|
export interface CardActionProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
72
122
|
/** Which corner the action sits in. @default 'top-right' */
|
|
@@ -97,6 +147,6 @@ export interface CardActionProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
97
147
|
* </Card>
|
|
98
148
|
*/
|
|
99
149
|
declare const CardAction: React.ForwardRefExoticComponent<CardActionProps & React.RefAttributes<HTMLDivElement>>;
|
|
100
|
-
export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, cardVariants };
|
|
101
|
-
export type { CardActionPlacement };
|
|
150
|
+
export { Card, CardAction, CardBleed, CardContent, CardDescription, CardFooter, CardHeader, CardSection, CardTitle, cardVariants };
|
|
151
|
+
export type { CardActionPlacement, CardBleedSide };
|
|
102
152
|
//# sourceMappingURL=card.d.ts.map
|
package/dist/ui/card.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/ui/card.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/ui/card.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAElC,QAAA,MAAM,YAAY;;;;;8EAiDjB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,MAAM,WAAW,SACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,EACzD,YAAY,CAAC,OAAO,YAAY,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,YAAY,EAAE,QAAQ,EAAE,CAAA;AAExB,QAAA,MAAM,IAAI,kFAgCT,CAAA;AAGD,QAAA,MAAM,UAAU,6GAYd,CAAA;AAGF,QAAA,MAAM,SAAS,6GASb,CAAA;AAGF,QAAA,MAAM,eAAe,6GASnB,CAAA;AAGF,QAAA,MAAM,WAAW,6GAcf,CAAA;AAGF,QAAA,MAAM,UAAU,6GASd,CAAA;AAGF;;;;;GAKG;AACH,QAAA,MAAM,WAAW,6GASf,CAAA;AAGF,KAAK,aAAa,GAAG,GAAG,GAAG,KAAK,GAAG,QAAQ,GAAG,GAAG,GAAG,KAAK,CAAA;AAczD,MAAM,WAAW,cAAe,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC1E;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,aAAa,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,QAAA,MAAM,SAAS,uFAId,CAAA;AAGD,KAAK,mBAAmB,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,aAAa,CAAA;AAWpF,MAAM,WAAW,eAAgB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC3E,4DAA4D;IAC5D,SAAS,CAAC,EAAE,mBAAmB,CAAA;IAC/B;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,QAAA,MAAM,UAAU,wFAaf,CAAA;AA0BD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,CAAA;AAClI,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,CAAA"}
|