@devalok/shilp-sutra 0.44.1 → 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.
Files changed (131) hide show
  1. package/AGENTS.md +13 -11
  2. package/BREAKING.json +209 -27
  3. package/MIGRATION.md +34 -0
  4. package/README.md +12 -0
  5. package/dist/_chunks/badge-group.js +1 -0
  6. package/dist/_chunks/badge-group.js.map +1 -1
  7. package/dist/_chunks/block-shell.js +25 -0
  8. package/dist/_chunks/block-shell.js.map +1 -0
  9. package/dist/_chunks/chat.js +4 -2
  10. package/dist/_chunks/chat.js.map +1 -1
  11. package/dist/_chunks/document-preview.js +1 -1
  12. package/dist/_chunks/image-preview.js +4 -4
  13. package/dist/_chunks/shared.js +65 -78
  14. package/dist/_chunks/shared.js.map +1 -1
  15. package/dist/_chunks/success.js +108 -106
  16. package/dist/_chunks/success.js.map +1 -1
  17. package/dist/ai/blocks/block-shell.d.ts +19 -0
  18. package/dist/ai/blocks/block-shell.d.ts.map +1 -0
  19. package/dist/ai/blocks/block-table.d.ts.map +1 -1
  20. package/dist/ai/blocks/confirm.d.ts.map +1 -1
  21. package/dist/ai/blocks/error.d.ts.map +1 -1
  22. package/dist/ai/blocks/error.js +5 -5
  23. package/dist/ai/blocks/error.js.map +1 -1
  24. package/dist/ai/blocks/success.d.ts.map +1 -1
  25. package/dist/ai/blocks/text.d.ts.map +1 -1
  26. package/dist/ai/blocks/text.js +4 -3
  27. package/dist/ai/blocks/text.js.map +1 -1
  28. package/dist/composed/activity-feed.d.ts.map +1 -1
  29. package/dist/composed/activity-feed.js +14 -12
  30. package/dist/composed/activity-feed.js.map +1 -1
  31. package/dist/composed/file-preview/audio-preview.d.ts.map +1 -1
  32. package/dist/composed/file-preview/shared.d.ts +10 -0
  33. package/dist/composed/file-preview/shared.d.ts.map +1 -1
  34. package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
  35. package/dist/composed/file-preview.js +149 -188
  36. package/dist/composed/file-preview.js.map +1 -1
  37. package/dist/composed/master-detail.d.ts.map +1 -1
  38. package/dist/composed/master-detail.js +13 -4
  39. package/dist/composed/master-detail.js.map +1 -1
  40. package/dist/composed/schedule-view.d.ts.map +1 -1
  41. package/dist/composed/schedule-view.js +52 -39
  42. package/dist/composed/schedule-view.js.map +1 -1
  43. package/dist/shell/notification-preferences.d.ts.map +1 -1
  44. package/dist/shell/notification-preferences.js +115 -114
  45. package/dist/shell/notification-preferences.js.map +1 -1
  46. package/dist/ui/badge-group.d.ts.map +1 -1
  47. package/dist/ui/card.d.ts +66 -16
  48. package/dist/ui/card.d.ts.map +1 -1
  49. package/dist/ui/card.js +85 -60
  50. package/dist/ui/card.js.map +1 -1
  51. package/dist/ui/chat/message.d.ts.map +1 -1
  52. package/dist/ui/color-input.d.ts.map +1 -1
  53. package/dist/ui/color-input.js +18 -18
  54. package/dist/ui/color-input.js.map +1 -1
  55. package/dist/ui/data-table-body.d.ts.map +1 -1
  56. package/dist/ui/data-table-body.js +94 -64
  57. package/dist/ui/data-table-body.js.map +1 -1
  58. package/dist/ui/data-table-card.d.ts.map +1 -1
  59. package/dist/ui/data-table-card.js +50 -43
  60. package/dist/ui/data-table-card.js.map +1 -1
  61. package/dist/ui/data-table-context.d.ts +0 -4
  62. package/dist/ui/data-table-context.d.ts.map +1 -1
  63. package/dist/ui/data-table-context.js +8 -12
  64. package/dist/ui/data-table-context.js.map +1 -1
  65. package/dist/ui/data-table-header.d.ts.map +1 -1
  66. package/dist/ui/data-table-header.js +2 -2
  67. package/dist/ui/data-table-header.js.map +1 -1
  68. package/dist/ui/data-table.d.ts.map +1 -1
  69. package/dist/ui/data-table.js +185 -182
  70. package/dist/ui/data-table.js.map +1 -1
  71. package/dist/ui/index.d.ts +3 -2
  72. package/dist/ui/index.d.ts.map +1 -1
  73. package/dist/ui/index.js +59 -58
  74. package/dist/ui/index.js.map +1 -1
  75. package/dist/ui/segmented-control.js +4 -4
  76. package/dist/ui/segmented-control.js.map +1 -1
  77. package/dist/ui/separator.d.ts +6 -5
  78. package/dist/ui/separator.d.ts.map +1 -1
  79. package/dist/ui/separator.js +7 -10
  80. package/dist/ui/separator.js.map +1 -1
  81. package/dist/ui/split-button.d.ts.map +1 -1
  82. package/dist/ui/split-button.js +62 -129
  83. package/dist/ui/split-button.js.map +1 -1
  84. package/dist/ui/stat-card.d.ts +7 -0
  85. package/dist/ui/stat-card.d.ts.map +1 -1
  86. package/dist/ui/stat-card.js +144 -126
  87. package/dist/ui/stat-card.js.map +1 -1
  88. package/dist/ui/table-row-link.d.ts +45 -0
  89. package/dist/ui/table-row-link.d.ts.map +1 -0
  90. package/dist/ui/table-row-link.js +16 -0
  91. package/dist/ui/table-row-link.js.map +1 -0
  92. package/dist/ui/table.d.ts +49 -5
  93. package/dist/ui/table.d.ts.map +1 -1
  94. package/dist/ui/table.js +39 -29
  95. package/dist/ui/table.js.map +1 -1
  96. package/dist/ui/toast-types.d.ts +10 -0
  97. package/dist/ui/toast-types.d.ts.map +1 -1
  98. package/dist/ui/toast.d.ts +6 -2
  99. package/dist/ui/toast.d.ts.map +1 -1
  100. package/dist/ui/toast.js +56 -54
  101. package/dist/ui/toast.js.map +1 -1
  102. package/docs/components/composed/content-card.md +2 -0
  103. package/docs/components/ui/button.md +3 -3
  104. package/docs/components/ui/card.md +27 -10
  105. package/docs/components/ui/color-input.md +2 -2
  106. package/docs/components/ui/data-table.md +8 -1
  107. package/docs/components/ui/segmented-control.md +2 -2
  108. package/docs/components/ui/separator.md +3 -1
  109. package/docs/components/ui/split-button.md +3 -0
  110. package/docs/components/ui/stat-card.md +10 -2
  111. package/docs/components/ui/table-row-link.md +41 -0
  112. package/docs/components/ui/table.md +69 -0
  113. package/docs/components/ui/toast.md +10 -6
  114. package/docs/recipes/install-next-app-router.md +1 -1
  115. package/docs/recipes/troubleshoot.md +1 -1
  116. package/llms.txt +159 -781
  117. package/make-kit/components/card.md +54 -16
  118. package/make-kit/components/table.md +45 -7
  119. package/make-kit/foundations/spacing.md +3 -1
  120. package/make-kit/foundations/surfaces.md +1 -1
  121. package/mcp-manifest.json +12349 -0
  122. package/mcp-manifest.schema.json +232 -0
  123. package/package.json +3 -3
  124. package/skill/README.md +0 -1
  125. package/skill/SKILL.md +9 -8
  126. package/skill/references/components.md +159 -781
  127. package/skill/references/setup-next-app-router.md +1 -1
  128. package/skill/references/troubleshoot.md +1 -1
  129. package/llms-full.txt +0 -7198
  130. package/llms-quick.txt +0 -251
  131. 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 { Select as p, SelectContent as m, SelectItem as h, SelectTrigger as g, SelectValue as _ } from "../ui/select.js";
9
- import { Switch as v } from "../ui/switch.js";
10
- import * as y from "react";
11
- import { useState as b } from "react";
12
- import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
13
- import { IconBell as w, IconMessage as T, IconPlus as E, IconTrash as D } from "@tabler/icons-react";
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 O = {
16
+ var k = {
16
17
  IN_APP: {
17
18
  label: "In-App",
18
- icon: /* @__PURE__ */ S(n, {
19
- icon: w,
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__ */ S(n, {
26
- icon: T,
26
+ icon: /* @__PURE__ */ C(n, {
27
+ icon: E,
27
28
  size: "sm"
28
29
  })
29
30
  }
30
- }, k = {
31
+ }, A = {
31
32
  INFO: "All (Info+)",
32
33
  IMPORTANT: "Important+",
33
34
  CRITICAL: "Critical only"
34
- }, A = y.forwardRef(function({ preferences: y = [], projects: w = [], isLoading: T = !1, onSave: A, onToggleMute: j, onUpdateTier: M, onDelete: N, className: P, ...F }, I) {
35
- let [L, R] = b(!1), [z, B] = b("global"), [V, H] = b("IN_APP"), [U, W] = b("INFO"), [G, K] = b(!1), [q, J] = b(!1), Y = async () => {
36
- if (A) {
37
- J(!0);
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 A({
40
- projectId: z === "global" ? null : z,
41
- channel: V,
42
- minTier: U,
43
- muted: G
44
- }), R(!1), X();
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
- J(!1);
49
+ Y(!1);
49
50
  }
50
51
  }
51
- }, X = () => {
52
- B("global"), H("IN_APP"), W("INFO"), K(!1);
53
- }, Z = (e) => e ? w.find((t) => t.id === e)?.title || "Unknown project" : "Global (all projects)";
54
- return /* @__PURE__ */ C(x, { children: [/* @__PURE__ */ C(i, {
55
- ref: I,
56
- className: P,
57
- ...F,
58
- children: [/* @__PURE__ */ C(o, {
59
- className: "flex flex-row items-center justify-between space-y-0 pb-ds-04",
60
- children: [/* @__PURE__ */ S(s, {
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__ */ C(r, {
64
+ }), /* @__PURE__ */ w(r, {
64
65
  size: "sm",
65
66
  variant: "outline",
66
- onClick: () => R(!0),
67
- children: [/* @__PURE__ */ S(n, {
68
- icon: E,
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__ */ S(a, { children: T ? /* @__PURE__ */ S("div", {
74
+ }), /* @__PURE__ */ C(a, { children: E ? /* @__PURE__ */ C("div", {
74
75
  className: "flex items-center justify-center py-ds-07",
75
- children: /* @__PURE__ */ S(t, {})
76
- }) : y.length === 0 ? /* @__PURE__ */ S("div", {
76
+ children: /* @__PURE__ */ C(t, {})
77
+ }) : b.length === 0 ? /* @__PURE__ */ C("div", {
77
78
  className: "py-ds-07 text-center",
78
- children: /* @__PURE__ */ S("p", {
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__ */ S("div", {
83
+ }) : /* @__PURE__ */ C("div", {
83
84
  className: "flex flex-col",
84
- children: y.map((t, r) => {
85
- let i = O[t.channel] || O.IN_APP;
86
- return /* @__PURE__ */ C("div", {
87
- className: e("flex items-center gap-ds-05 py-ds-04", r < y.length - 1 && "border-b border-surface-border-strong"),
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__ */ S("div", {
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__ */ S("span", {
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__ */ C("div", {
98
+ /* @__PURE__ */ w("div", {
98
99
  className: "min-w-0 flex-1",
99
- children: [/* @__PURE__ */ S("p", {
100
+ children: [/* @__PURE__ */ C("p", {
100
101
  className: "text-ds-md font-medium text-surface-fg",
101
102
  children: i.label
102
- }), /* @__PURE__ */ S("p", {
103
+ }), /* @__PURE__ */ C("p", {
103
104
  className: "text-ds-sm text-surface-fg-subtle",
104
- children: Z(t.projectId)
105
+ children: Q(t.projectId)
105
106
  })]
106
107
  }),
107
- /* @__PURE__ */ C(p, {
108
+ /* @__PURE__ */ w(m, {
108
109
  value: t.minTier,
109
- onValueChange: (e) => M?.(t, e),
110
- children: [/* @__PURE__ */ S(g, {
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__ */ S(_, {})
113
- }), /* @__PURE__ */ S(m, { children: Object.entries(k).map(([e, t]) => /* @__PURE__ */ S(h, {
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__ */ C("div", {
119
+ /* @__PURE__ */ w("div", {
119
120
  className: "flex items-center gap-ds-02b",
120
- children: [/* @__PURE__ */ S("span", {
121
+ children: [/* @__PURE__ */ C("span", {
121
122
  className: "text-ds-sm text-surface-fg-subtle",
122
123
  children: t.muted ? "Muted" : "Active"
123
- }), /* @__PURE__ */ S(v, {
124
+ }), /* @__PURE__ */ C(y, {
124
125
  checked: !t.muted,
125
- onCheckedChange: () => j?.(t)
126
+ onCheckedChange: () => M?.(t)
126
127
  })]
127
128
  }),
128
- /* @__PURE__ */ S("button", {
129
- type: "button",
130
- onClick: () => N?.(t.id),
131
- className: "shrink-0 rounded p-ds-02b text-surface-fg-subtle transition-colors hover:bg-surface-raised hover:text-error-11",
132
- children: /* @__PURE__ */ S(n, {
133
- icon: D,
134
- size: "sm"
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__ */ S(c, {
142
- open: L,
143
- onOpenChange: R,
144
- children: /* @__PURE__ */ C(l, {
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__ */ C(d, { children: [/* @__PURE__ */ S(f, { children: "Add Notification Rule" }), /* @__PURE__ */ S(u, { children: "Customize how you receive notifications for a specific channel and project." })] }), /* @__PURE__ */ C("div", {
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__ */ C("div", {
150
+ /* @__PURE__ */ w("div", {
150
151
  className: "flex flex-col gap-ds-02b",
151
- children: [/* @__PURE__ */ S("label", {
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__ */ C(p, {
156
- value: z,
157
- onValueChange: B,
158
- children: [/* @__PURE__ */ S(g, {
156
+ }), /* @__PURE__ */ w(m, {
157
+ value: B,
158
+ onValueChange: V,
159
+ children: [/* @__PURE__ */ C(_, {
159
160
  id: "pref-scope",
160
- children: /* @__PURE__ */ S(_, { placeholder: "Select scope" })
161
- }), /* @__PURE__ */ C(m, { children: [/* @__PURE__ */ S(h, {
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
- }), w.map((e) => /* @__PURE__ */ S(h, {
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__ */ C("div", {
171
+ /* @__PURE__ */ w("div", {
171
172
  className: "flex flex-col gap-ds-02b",
172
- children: [/* @__PURE__ */ S("label", {
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__ */ C(p, {
177
- value: V,
178
- onValueChange: H,
179
- children: [/* @__PURE__ */ S(g, {
177
+ }), /* @__PURE__ */ w(m, {
178
+ value: H,
179
+ onValueChange: U,
180
+ children: [/* @__PURE__ */ C(_, {
180
181
  id: "pref-channel",
181
- children: /* @__PURE__ */ S(_, {})
182
- }), /* @__PURE__ */ C(m, { children: [/* @__PURE__ */ S(h, {
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__ */ S(h, {
186
+ }), /* @__PURE__ */ C(g, {
186
187
  value: "GOOGLE_CHAT",
187
188
  children: "Google Chat"
188
189
  })] })]
189
190
  })]
190
191
  }),
191
- /* @__PURE__ */ C("div", {
192
+ /* @__PURE__ */ w("div", {
192
193
  className: "flex flex-col gap-ds-02b",
193
- children: [/* @__PURE__ */ S("label", {
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__ */ C(p, {
198
- value: U,
199
- onValueChange: W,
200
- children: [/* @__PURE__ */ S(g, {
198
+ }), /* @__PURE__ */ w(m, {
199
+ value: W,
200
+ onValueChange: G,
201
+ children: [/* @__PURE__ */ C(_, {
201
202
  id: "pref-min-tier",
202
- children: /* @__PURE__ */ S(_, {})
203
- }), /* @__PURE__ */ S(m, { children: Object.entries(k).map(([e, t]) => /* @__PURE__ */ S(h, {
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__ */ C("div", {
210
+ /* @__PURE__ */ w("div", {
210
211
  className: "flex items-center justify-between",
211
- children: [/* @__PURE__ */ S("label", {
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__ */ S(v, {
216
+ }), /* @__PURE__ */ C(y, {
216
217
  id: "pref-muted",
217
- checked: G,
218
- onCheckedChange: K
218
+ checked: K,
219
+ onCheckedChange: q
219
220
  })]
220
221
  }),
221
- /* @__PURE__ */ C("div", {
222
+ /* @__PURE__ */ w("div", {
222
223
  className: "flex justify-end gap-ds-03 pt-ds-03",
223
- children: [/* @__PURE__ */ S(r, {
224
+ children: [/* @__PURE__ */ C(r, {
224
225
  variant: "ghost",
225
226
  onClick: () => {
226
- R(!1), X();
227
+ z(!1), Z();
227
228
  },
228
229
  children: "Cancel"
229
- }), /* @__PURE__ */ S(r, {
230
- onClick: Y,
231
- disabled: q,
232
- children: q ? "Saving..." : "Save Rule"
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
- A.displayName = "NotificationPreferences";
241
+ j.displayName = "NotificationPreferences";
241
242
  //#endregion
242
- export { A as NotificationPreferences };
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":";;;;;;;;;;;;;;AAmFA,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,UAAD;OACE,MAAK;OACL,eAAe,IAAW,EAAK,GAAG;OAClC,WAAU;iBAEV,kBAAC,GAAD;QAAM,MAAM;QAAW,MAAK;QAAO,CAAA;OAC5B,CAAA;MACL;OA1DC,EAAK,GA0DN;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
+ {"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,2CAsBjB;yBA7Be,UAAU"}
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
- * // Elevated card for a dashboard stat widget:
39
- * <Card variant="elevated">
40
- * <CardContent>
41
- * <StatCard label="Revenue" value="$12,400" delta={{ value: "+8%", direction: "up" }} />
42
- * </CardContent>
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
- * // Clickable card in a project grid (interactive hover effect):
47
- * <Card interactive onClick={() => router.push(`/projects/${id}`)}>
48
- * <CardHeader>
49
- * <CardTitle>{project.name}</CardTitle>
50
- * </CardHeader>
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" className="p-ds-05">
56
- * <p className="text-surface-fg-muted text-ds-sm">No recent activity</p>
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
@@ -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;AAK9B,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAIlC,QAAA,MAAM,YAAY;;;;8EAsCjB,CAAA;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;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,kFAoCT,CAAA;AAGD,QAAA,MAAM,UAAU,6GAgBd,CAAA;AAGF,QAAA,MAAM,SAAS,6GASb,CAAA;AAGF,QAAA,MAAM,eAAe,6GASnB,CAAA;AAGF,QAAA,MAAM,WAAW,6GAkBf,CAAA;AAGF,QAAA,MAAM,UAAU,6GAYd,CAAA;AAGF,KAAK,mBAAmB,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,GAAG,aAAa,CAAA;AA0BpF,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,wFAgBf,CAAA;AAGD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAC,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,CAAA;AACzG,YAAY,EAAE,mBAAmB,EAAE,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"}