@typecaast/skins 0.1.0 → 0.2.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 (91) hide show
  1. package/dist/chunk-3WKOSJVB.js +320 -0
  2. package/dist/chunk-3WKOSJVB.js.map +1 -0
  3. package/dist/chunk-6K2ANTPJ.cjs +722 -0
  4. package/dist/chunk-6K2ANTPJ.cjs.map +1 -0
  5. package/dist/chunk-7IC3DRCQ.js +718 -0
  6. package/dist/chunk-7IC3DRCQ.js.map +1 -0
  7. package/dist/chunk-AMP2ZMTF.cjs +275 -0
  8. package/dist/chunk-AMP2ZMTF.cjs.map +1 -0
  9. package/dist/chunk-BMB4ZKAU.cjs +32 -0
  10. package/dist/chunk-BMB4ZKAU.cjs.map +1 -0
  11. package/dist/chunk-CAHWYIXY.js +272 -0
  12. package/dist/chunk-CAHWYIXY.js.map +1 -0
  13. package/dist/chunk-CCT33UVA.cjs +591 -0
  14. package/dist/chunk-CCT33UVA.cjs.map +1 -0
  15. package/dist/chunk-E5K2XXQL.cjs +469 -0
  16. package/dist/chunk-E5K2XXQL.cjs.map +1 -0
  17. package/dist/chunk-FEXZ3X5C.cjs +255 -0
  18. package/dist/chunk-FEXZ3X5C.cjs.map +1 -0
  19. package/dist/chunk-JDPMZ572.js +466 -0
  20. package/dist/chunk-JDPMZ572.js.map +1 -0
  21. package/dist/chunk-JZVM4T2A.js +29 -0
  22. package/dist/chunk-JZVM4T2A.js.map +1 -0
  23. package/dist/chunk-KTQVRSDX.cjs +323 -0
  24. package/dist/chunk-KTQVRSDX.cjs.map +1 -0
  25. package/dist/chunk-M54H2ZJJ.js +252 -0
  26. package/dist/chunk-M54H2ZJJ.js.map +1 -0
  27. package/dist/chunk-NCSI7C7I.js +561 -0
  28. package/dist/chunk-NCSI7C7I.js.map +1 -0
  29. package/dist/chunk-OC7WDISK.js +343 -0
  30. package/dist/chunk-OC7WDISK.js.map +1 -0
  31. package/dist/chunk-UC43JQYK.cjs +346 -0
  32. package/dist/chunk-UC43JQYK.cjs.map +1 -0
  33. package/dist/chunk-UFC4ODW5.js +587 -0
  34. package/dist/chunk-UFC4ODW5.js.map +1 -0
  35. package/dist/chunk-UKWBCC7E.cjs +567 -0
  36. package/dist/chunk-UKWBCC7E.cjs.map +1 -0
  37. package/dist/claude-code/index.cjs +19 -0
  38. package/dist/claude-code/index.cjs.map +1 -0
  39. package/dist/claude-code/index.d.cts +6 -0
  40. package/dist/claude-code/index.d.ts +6 -0
  41. package/dist/claude-code/index.js +4 -0
  42. package/dist/claude-code/index.js.map +1 -0
  43. package/dist/cursor/index.cjs +19 -0
  44. package/dist/cursor/index.cjs.map +1 -0
  45. package/dist/cursor/index.d.cts +6 -0
  46. package/dist/cursor/index.d.ts +6 -0
  47. package/dist/cursor/index.js +4 -0
  48. package/dist/cursor/index.js.map +1 -0
  49. package/dist/discord/index.cjs +19 -0
  50. package/dist/discord/index.cjs.map +1 -0
  51. package/dist/discord/index.d.cts +6 -0
  52. package/dist/discord/index.d.ts +6 -0
  53. package/dist/discord/index.js +4 -0
  54. package/dist/discord/index.js.map +1 -0
  55. package/dist/imessage/index.cjs +20 -0
  56. package/dist/imessage/index.cjs.map +1 -0
  57. package/dist/imessage/index.d.cts +6 -0
  58. package/dist/imessage/index.d.ts +6 -0
  59. package/dist/imessage/index.js +5 -0
  60. package/dist/imessage/index.js.map +1 -0
  61. package/dist/index.cjs +52 -2664
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.d.cts +49 -27
  64. package/dist/index.d.ts +49 -27
  65. package/dist/index.js +20 -2656
  66. package/dist/index.js.map +1 -1
  67. package/dist/messages-macos/index.cjs +20 -0
  68. package/dist/messages-macos/index.cjs.map +1 -0
  69. package/dist/messages-macos/index.d.cts +10 -0
  70. package/dist/messages-macos/index.d.ts +10 -0
  71. package/dist/messages-macos/index.js +5 -0
  72. package/dist/messages-macos/index.js.map +1 -0
  73. package/dist/slack/index.cjs +19 -0
  74. package/dist/slack/index.cjs.map +1 -0
  75. package/dist/slack/index.d.cts +6 -0
  76. package/dist/slack/index.d.ts +6 -0
  77. package/dist/slack/index.js +4 -0
  78. package/dist/slack/index.js.map +1 -0
  79. package/dist/telegram/index.cjs +19 -0
  80. package/dist/telegram/index.cjs.map +1 -0
  81. package/dist/telegram/index.d.cts +6 -0
  82. package/dist/telegram/index.d.ts +6 -0
  83. package/dist/telegram/index.js +4 -0
  84. package/dist/telegram/index.js.map +1 -0
  85. package/dist/whatsapp/index.cjs +19 -0
  86. package/dist/whatsapp/index.cjs.map +1 -0
  87. package/dist/whatsapp/index.d.cts +6 -0
  88. package/dist/whatsapp/index.d.ts +6 -0
  89. package/dist/whatsapp/index.js +4 -0
  90. package/dist/whatsapp/index.js.map +1 -0
  91. package/package.json +49 -5
@@ -0,0 +1,591 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var zod = require('zod');
5
+ var skinKit = require('@typecaast/skin-kit');
6
+ var react = require('react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ // src/slack/index.ts
10
+
11
+ // src/slack/tokens.ts
12
+ var SLACK_COLORS = {
13
+ light: {
14
+ bg: "#ffffff",
15
+ text: "#1d1c1d",
16
+ subtle: "#616061",
17
+ border: "#e2e2e2",
18
+ headerBg: "#ffffff",
19
+ link: "#1264a3",
20
+ mentionText: "#1264a3",
21
+ mentionBg: "#e8f5fa",
22
+ codeText: "#e01e5a",
23
+ codeBg: "#f6f6f6",
24
+ codeBorder: "#e2e2e2",
25
+ reactionBg: "#f8f8f8",
26
+ reactionBorder: "#e2e2e2",
27
+ reactionText: "#454245",
28
+ composerBg: "#ffffff",
29
+ composerBorder: "#8d8d8d",
30
+ placeholder: "#8d8d8d",
31
+ primary: "#007a5a",
32
+ primaryText: "#ffffff",
33
+ buttonBorder: "#d1d1d1",
34
+ buttonText: "#1d1c1d",
35
+ appBadgeBg: "#e8e8e8",
36
+ appBadgeText: "#616061",
37
+ cardBar: "#dddddd",
38
+ caret: "#1264a3"
39
+ },
40
+ dark: {
41
+ bg: "#1a1d21",
42
+ text: "#d1d2d3",
43
+ subtle: "#ababad",
44
+ border: "#35373b",
45
+ headerBg: "#1a1d21",
46
+ link: "#1d9bd1",
47
+ mentionText: "#1d9bd1",
48
+ mentionBg: "rgba(29,155,209,0.12)",
49
+ codeText: "#e06c9a",
50
+ codeBg: "#222529",
51
+ codeBorder: "#35373b",
52
+ reactionBg: "#222529",
53
+ reactionBorder: "#35373b",
54
+ reactionText: "#d1d2d3",
55
+ composerBg: "#222529",
56
+ composerBorder: "#565856",
57
+ placeholder: "#9a9b9d",
58
+ primary: "#007a5a",
59
+ primaryText: "#ffffff",
60
+ buttonBorder: "#565856",
61
+ buttonText: "#d1d2d3",
62
+ appBadgeBg: "#35373b",
63
+ appBadgeText: "#ababad",
64
+ cardBar: "#35373b",
65
+ caret: "#1d9bd1"
66
+ }
67
+ };
68
+ var slackTokens = {
69
+ light: { colors: SLACK_COLORS.light },
70
+ dark: { colors: SLACK_COLORS.dark }
71
+ };
72
+
73
+ // src/slack/fonts.ts
74
+ var slackFonts = [
75
+ {
76
+ family: "Lato",
77
+ weights: [400, 700, 900],
78
+ sources: [
79
+ {
80
+ url: "https://fonts.gstatic.com/s/lato/v24/S6uyw4BMUTPHjx4wXiWtFCc.woff2",
81
+ weight: 400,
82
+ format: "woff2"
83
+ },
84
+ {
85
+ url: "https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2",
86
+ weight: 700,
87
+ format: "woff2"
88
+ },
89
+ {
90
+ url: "https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh50XSwiPGQ3q5d0.woff2",
91
+ weight: 900,
92
+ format: "woff2"
93
+ }
94
+ ]
95
+ }
96
+ ];
97
+ var SLACK_FONT_STACK = 'Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif';
98
+ var AVATAR_RADIUS = 8;
99
+ function joinNames(names) {
100
+ if (names.length <= 1) return names[0] ?? "";
101
+ if (names.length === 2) return `${names[0]} and ${names[1]}`;
102
+ return `${names.slice(0, -1).join(", ")}, and ${names[names.length - 1]}`;
103
+ }
104
+ function formatTime(atMs) {
105
+ const base = 9 * 3600 * 1e3;
106
+ const total = Math.floor((base + atMs) / 1e3);
107
+ const h = Math.floor(total / 3600) % 24;
108
+ const m = Math.floor(total % 3600 / 60);
109
+ const ampm = h >= 12 ? "PM" : "AM";
110
+ const hr = h % 12 === 0 ? 12 : h % 12;
111
+ return `${hr}:${String(m).padStart(2, "0")} ${ampm}`;
112
+ }
113
+ function initials(name) {
114
+ return name.split(/\s+/).map((w) => w.charAt(0)).slice(0, 2).join("").toUpperCase();
115
+ }
116
+ function markStyles(c) {
117
+ return {
118
+ link: { color: c.link, textDecoration: "none" },
119
+ mention: {
120
+ color: c.mentionText,
121
+ background: c.mentionBg,
122
+ borderRadius: 3,
123
+ padding: "0 2px",
124
+ fontWeight: 600
125
+ },
126
+ code: {
127
+ color: c.codeText,
128
+ background: c.codeBg,
129
+ border: `1px solid ${c.codeBorder}`,
130
+ borderRadius: 3,
131
+ padding: "1px 4px",
132
+ fontFamily: "Menlo, Monaco, Consolas, monospace",
133
+ fontSize: "0.85em"
134
+ }
135
+ };
136
+ }
137
+ var AppBadge = ({ c }) => /* @__PURE__ */ jsxRuntime.jsx(
138
+ "span",
139
+ {
140
+ style: {
141
+ fontSize: 10,
142
+ fontWeight: 700,
143
+ letterSpacing: 0.4,
144
+ background: c.appBadgeBg,
145
+ color: c.appBadgeText,
146
+ borderRadius: 2,
147
+ padding: "1px 4px"
148
+ },
149
+ children: "APP"
150
+ }
151
+ );
152
+ var Avatar = ({ theme, participant, size = 36 }) => {
153
+ const c = SLACK_COLORS[theme];
154
+ if (participant.avatar) {
155
+ return /* @__PURE__ */ jsxRuntime.jsx(
156
+ "img",
157
+ {
158
+ src: participant.avatar,
159
+ alt: participant.name,
160
+ width: size,
161
+ height: size,
162
+ style: {
163
+ width: size,
164
+ height: size,
165
+ borderRadius: AVATAR_RADIUS,
166
+ objectFit: "cover",
167
+ display: "block"
168
+ }
169
+ }
170
+ );
171
+ }
172
+ return /* @__PURE__ */ jsxRuntime.jsx(
173
+ "div",
174
+ {
175
+ "aria-label": participant.name,
176
+ style: {
177
+ width: size,
178
+ height: size,
179
+ borderRadius: AVATAR_RADIUS,
180
+ background: participant.color ?? "#4a154b",
181
+ color: "#ffffff",
182
+ display: "flex",
183
+ alignItems: "center",
184
+ justifyContent: "center",
185
+ fontWeight: 700,
186
+ fontSize: size * 0.4,
187
+ border: theme === "dark" ? `1px solid ${c.border}` : void 0
188
+ },
189
+ children: initials(participant.name)
190
+ }
191
+ );
192
+ };
193
+ function clippingAncestor(el) {
194
+ let node = el?.parentElement ?? null;
195
+ while (node) {
196
+ const o = getComputedStyle(node).overflow;
197
+ if (o && o !== "visible") return node;
198
+ node = node.parentElement;
199
+ }
200
+ return null;
201
+ }
202
+ var ReactionTooltip = ({
203
+ reaction
204
+ }) => {
205
+ const ref = react.useRef(null);
206
+ const [dx, setDx] = react.useState(0);
207
+ const code = reaction.shortcode;
208
+ react.useLayoutEffect(() => {
209
+ const el = ref.current;
210
+ if (!el) return;
211
+ const bound = clippingAncestor(el)?.getBoundingClientRect();
212
+ if (!bound) return;
213
+ const rect = el.getBoundingClientRect();
214
+ const m = 8;
215
+ let shift = 0;
216
+ if (rect.left < bound.left + m) shift = bound.left + m - rect.left;
217
+ else if (rect.right > bound.right - m) shift = bound.right - m - rect.right;
218
+ setDx(shift);
219
+ }, []);
220
+ return /* @__PURE__ */ jsxRuntime.jsxs(
221
+ "span",
222
+ {
223
+ ref,
224
+ role: "tooltip",
225
+ style: {
226
+ position: "absolute",
227
+ bottom: "calc(100% + 9px)",
228
+ left: "50%",
229
+ transform: `translateX(calc(-50% + ${dx}px))`,
230
+ zIndex: 20,
231
+ width: 220,
232
+ boxSizing: "border-box",
233
+ background: "#1a1d21",
234
+ color: "#e8e8e8",
235
+ borderRadius: 12,
236
+ padding: "16px 16px 14px",
237
+ textAlign: "center",
238
+ fontSize: 15,
239
+ lineHeight: 1.4,
240
+ boxShadow: "0 4px 14px rgba(0,0,0,0.4)",
241
+ pointerEvents: "none"
242
+ },
243
+ children: [
244
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { display: "block", fontSize: 36, marginBottom: 8 }, children: reaction.emoji }),
245
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 700 }, children: joinNames(reaction.byNames) }),
246
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#ababad" }, children: " reacted with " }),
247
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#ababad" }, children: code ? `:${code}:` : reaction.emoji }),
248
+ /* @__PURE__ */ jsxRuntime.jsx(
249
+ "span",
250
+ {
251
+ style: {
252
+ position: "absolute",
253
+ top: "100%",
254
+ left: `calc(50% - ${dx}px)`,
255
+ transform: "translateX(-50%)",
256
+ width: 0,
257
+ height: 0,
258
+ borderLeft: "7px solid transparent",
259
+ borderRight: "7px solid transparent",
260
+ borderTop: "7px solid #1a1d21"
261
+ }
262
+ }
263
+ )
264
+ ]
265
+ }
266
+ );
267
+ };
268
+ var Reaction = ({ theme, reaction }) => {
269
+ const c = SLACK_COLORS[theme];
270
+ const [hover, setHover] = react.useState(false);
271
+ const hasReactors = reaction.byNames.length > 0;
272
+ return /* @__PURE__ */ jsxRuntime.jsxs(
273
+ "span",
274
+ {
275
+ style: {
276
+ position: "relative",
277
+ display: "inline-flex",
278
+ ...skinKit.popIn(reaction.progress)
279
+ },
280
+ onMouseEnter: () => setHover(true),
281
+ onMouseLeave: () => setHover(false),
282
+ children: [
283
+ /* @__PURE__ */ jsxRuntime.jsxs(
284
+ "span",
285
+ {
286
+ style: {
287
+ display: "inline-flex",
288
+ alignItems: "center",
289
+ gap: 4,
290
+ background: c.reactionBg,
291
+ border: `1px solid ${c.reactionBorder}`,
292
+ color: c.reactionText,
293
+ borderRadius: 12,
294
+ padding: "1px 7px",
295
+ height: 22,
296
+ fontSize: 12,
297
+ cursor: hasReactors ? "pointer" : "default"
298
+ },
299
+ children: [
300
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 13 }, children: reaction.emoji }),
301
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontVariantNumeric: "tabular-nums" }, children: reaction.count })
302
+ ]
303
+ }
304
+ ),
305
+ hover && hasReactors ? /* @__PURE__ */ jsxRuntime.jsx(ReactionTooltip, { reaction }) : null
306
+ ]
307
+ }
308
+ );
309
+ };
310
+ var TypingIndicator = ({ theme, author }) => {
311
+ const c = SLACK_COLORS[theme];
312
+ return /* @__PURE__ */ jsxRuntime.jsx(
313
+ "div",
314
+ {
315
+ style: {
316
+ display: "flex",
317
+ alignItems: "center",
318
+ padding: "2px 16px 4px 60px",
319
+ color: c.subtle,
320
+ fontSize: 12,
321
+ fontStyle: "italic"
322
+ },
323
+ children: /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
324
+ author.name,
325
+ " is typing\u2026"
326
+ ] })
327
+ }
328
+ );
329
+ };
330
+ var Caret = ({ color }) => /* @__PURE__ */ jsxRuntime.jsx(
331
+ "span",
332
+ {
333
+ style: {
334
+ display: "inline-block",
335
+ width: 1.5,
336
+ height: "1.05em",
337
+ background: color,
338
+ marginLeft: 1,
339
+ verticalAlign: "text-bottom"
340
+ }
341
+ }
342
+ );
343
+ var Composer = ({ theme, composer }) => {
344
+ const c = SLACK_COLORS[theme];
345
+ const hasText = composer.text.length > 0;
346
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "0 0 auto", padding: "4px 16px 14px" }, children: /* @__PURE__ */ jsxRuntime.jsx(
347
+ "div",
348
+ {
349
+ style: {
350
+ border: `1px solid ${c.composerBorder}`,
351
+ borderRadius: 8,
352
+ background: c.composerBg,
353
+ padding: "9px 12px",
354
+ minHeight: 22,
355
+ fontSize: 15,
356
+ color: c.text
357
+ },
358
+ children: hasText ? /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
359
+ composer.text,
360
+ /* @__PURE__ */ jsxRuntime.jsx(Caret, { color: c.caret })
361
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.placeholder }, children: "Reply\u2026" })
362
+ }
363
+ ) });
364
+ };
365
+ function buttonStyle(c, primary) {
366
+ const base = {
367
+ borderRadius: 4,
368
+ padding: "7px 12px",
369
+ fontWeight: 700,
370
+ fontSize: 13,
371
+ cursor: "default",
372
+ fontFamily: "inherit",
373
+ lineHeight: 1
374
+ };
375
+ return primary ? { ...base, background: c.primary, color: c.primaryText, border: "none" } : {
376
+ ...base,
377
+ background: "transparent",
378
+ color: c.buttonText,
379
+ border: `1px solid ${c.buttonBorder}`
380
+ };
381
+ }
382
+ var SystemMessage = ({ theme, message, author }) => {
383
+ const c = SLACK_COLORS[theme];
384
+ const actions = message.system?.actions ?? [];
385
+ return /* @__PURE__ */ jsxRuntime.jsxs(
386
+ "div",
387
+ {
388
+ style: {
389
+ display: "flex",
390
+ gap: 8,
391
+ padding: "8px 16px 2px",
392
+ ...skinKit.fadeSlideIn(message.revealProgress)
393
+ },
394
+ children: [
395
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "0 0 36px", width: 36 }, children: author ? /* @__PURE__ */ jsxRuntime.jsx(Avatar, { theme, participant: author, size: 36 }) : null }),
396
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
397
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
398
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 700, color: c.text }, children: author?.name ?? "App" }),
399
+ /* @__PURE__ */ jsxRuntime.jsx(AppBadge, { c }),
400
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, color: c.subtle }, children: formatTime(message.atMs) })
401
+ ] }),
402
+ /* @__PURE__ */ jsxRuntime.jsxs(
403
+ "div",
404
+ {
405
+ style: {
406
+ marginTop: 4,
407
+ borderLeft: `4px solid ${c.cardBar}`,
408
+ borderRadius: 2,
409
+ paddingLeft: 12
410
+ },
411
+ children: [
412
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: c.text }, children: /* @__PURE__ */ jsxRuntime.jsx(skinKit.MessageContent, { nodes: message.content, styles: markStyles(c) }) }),
413
+ actions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", gap: 8, marginTop: 8 }, children: actions.map((a, i) => /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", style: buttonStyle(c, i === 0), children: a.label }, i)) }) : null
414
+ ]
415
+ }
416
+ )
417
+ ] })
418
+ ]
419
+ }
420
+ );
421
+ };
422
+ var Message = ({ theme, message, author }) => {
423
+ const c = SLACK_COLORS[theme];
424
+ const grouped = message.isGrouped;
425
+ return /* @__PURE__ */ jsxRuntime.jsxs(
426
+ "div",
427
+ {
428
+ style: {
429
+ display: "flex",
430
+ gap: 8,
431
+ padding: grouped ? "2px 16px" : "8px 16px 2px",
432
+ ...skinKit.fadeSlideIn(message.revealProgress)
433
+ },
434
+ children: [
435
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "0 0 36px", width: 36 }, children: grouped ? null : /* @__PURE__ */ jsxRuntime.jsx(Avatar, { theme, participant: author, size: 36 }) }),
436
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
437
+ grouped ? null : /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: 6 }, children: [
438
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 700, color: c.text }, children: author.name }),
439
+ author.kind === "app" ? /* @__PURE__ */ jsxRuntime.jsx(AppBadge, { c }) : null,
440
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, color: c.subtle, marginLeft: 2 }, children: formatTime(message.atMs) })
441
+ ] }),
442
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: c.text, wordBreak: "break-word" }, children: /* @__PURE__ */ jsxRuntime.jsx(
443
+ skinKit.MessageContent,
444
+ {
445
+ nodes: message.content,
446
+ styles: markStyles(c),
447
+ imageStyle: {
448
+ borderRadius: 8,
449
+ marginTop: 4,
450
+ border: `1px solid ${c.border}`,
451
+ maxWidth: 360
452
+ }
453
+ }
454
+ ) }),
455
+ message.reactions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
456
+ "div",
457
+ {
458
+ style: {
459
+ display: "flex",
460
+ gap: 4,
461
+ marginTop: 4,
462
+ flexWrap: "wrap"
463
+ },
464
+ children: message.reactions.map((r, i) => /* @__PURE__ */ jsxRuntime.jsx(Reaction, { theme, reaction: r }, i))
465
+ }
466
+ ) : null
467
+ ] })
468
+ ]
469
+ }
470
+ );
471
+ };
472
+ var Frame = ({
473
+ theme,
474
+ options,
475
+ children
476
+ }) => {
477
+ const c = SLACK_COLORS[theme];
478
+ const channel = typeof options?.channel === "string" ? options.channel : "#general";
479
+ return /* @__PURE__ */ jsxRuntime.jsxs(
480
+ "div",
481
+ {
482
+ style: {
483
+ fontFamily: SLACK_FONT_STACK,
484
+ background: c.bg,
485
+ color: c.text,
486
+ display: "flex",
487
+ flexDirection: "column",
488
+ height: "100%",
489
+ width: "100%",
490
+ fontSize: 15,
491
+ lineHeight: 1.46668,
492
+ WebkitFontSmoothing: "antialiased"
493
+ },
494
+ children: [
495
+ /* @__PURE__ */ jsxRuntime.jsxs(
496
+ "header",
497
+ {
498
+ style: {
499
+ flex: "0 0 auto",
500
+ padding: "10px 16px",
501
+ borderBottom: `1px solid ${c.border}`,
502
+ display: "flex",
503
+ alignItems: "baseline",
504
+ gap: 8
505
+ },
506
+ children: [
507
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 900, fontSize: 18, color: c.text }, children: "Thread" }),
508
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.subtle, fontSize: 13 }, children: channel })
509
+ ]
510
+ }
511
+ ),
512
+ /* @__PURE__ */ jsxRuntime.jsx(
513
+ "div",
514
+ {
515
+ style: {
516
+ flex: "1 1 auto",
517
+ minHeight: 0,
518
+ display: "flex",
519
+ flexDirection: "column",
520
+ // Breathing room so the last message/card never touches the bottom edge.
521
+ paddingBottom: 12
522
+ },
523
+ children
524
+ }
525
+ )
526
+ ]
527
+ }
528
+ );
529
+ };
530
+ var slackComponents = {
531
+ Frame,
532
+ Message,
533
+ TypingIndicator,
534
+ Reaction,
535
+ Composer,
536
+ SystemMessage,
537
+ Avatar
538
+ };
539
+
540
+ // src/slack/capabilities.ts
541
+ var slackCapabilities = {
542
+ events: {
543
+ message: "native",
544
+ reaction: "native",
545
+ typing: "native",
546
+ // "X is typing…"
547
+ composerType: "native",
548
+ send: "native",
549
+ edit: "native",
550
+ delete: "native",
551
+ readReceipt: "unsupported",
552
+ // Slack has no per-message read receipts in threads
553
+ system: "native",
554
+ // app/PR cards
555
+ beat: "native"
556
+ },
557
+ content: {
558
+ text: true,
559
+ image: true
560
+ },
561
+ reactions: true,
562
+ threads: true,
563
+ readReceipts: false
564
+ };
565
+
566
+ // src/slack/index.ts
567
+ var slackOptionsSchema = zod.z.object({
568
+ /** Channel label shown in the thread header (e.g. `"#alerts"`). */
569
+ channel: zod.z.string().optional(),
570
+ showThreadHeader: zod.z.boolean().optional()
571
+ });
572
+ var slack = skinKit.defineSkin({
573
+ id: "slack",
574
+ meta: {
575
+ name: "Slack",
576
+ defaultCanvas: { width: 880, height: 720 },
577
+ supportsThemes: ["light", "dark"],
578
+ capabilities: slackCapabilities,
579
+ optionsSchema: slackOptionsSchema,
580
+ fonts: slackFonts
581
+ },
582
+ components: slackComponents,
583
+ tokens: slackTokens
584
+ });
585
+ var slack_default = slack;
586
+
587
+ exports.SLACK_COLORS = SLACK_COLORS;
588
+ exports.slack = slack;
589
+ exports.slack_default = slack_default;
590
+ //# sourceMappingURL=chunk-CCT33UVA.cjs.map
591
+ //# sourceMappingURL=chunk-CCT33UVA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/slack/tokens.ts","../src/slack/fonts.ts","../src/slack/components.tsx","../src/slack/capabilities.ts","../src/slack/index.ts"],"names":["jsx","useRef","useState","useLayoutEffect","jsxs","popIn","fadeSlideIn","MessageContent","z","defineSkin"],"mappings":";;;;;;;;;;AAgCO,IAAM,YAAA,GAAmD;AAAA,EAC9D,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,SAAA;AAAA,IACV,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,SAAA,EAAW,SAAA;AAAA,IACX,QAAA,EAAU,SAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,UAAA,EAAY,SAAA;AAAA,IACZ,cAAA,EAAgB,SAAA;AAAA,IAChB,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY,SAAA;AAAA,IACZ,cAAA,EAAgB,SAAA;AAAA,IAChB,WAAA,EAAa,SAAA;AAAA,IACb,OAAA,EAAS,SAAA;AAAA,IACT,WAAA,EAAa,SAAA;AAAA,IACb,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY,SAAA;AAAA,IACZ,UAAA,EAAY,SAAA;AAAA,IACZ,YAAA,EAAc,SAAA;AAAA,IACd,OAAA,EAAS,SAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,SAAA;AAAA,IACV,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,SAAA,EAAW,uBAAA;AAAA,IACX,QAAA,EAAU,SAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,UAAA,EAAY,SAAA;AAAA,IACZ,cAAA,EAAgB,SAAA;AAAA,IAChB,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY,SAAA;AAAA,IACZ,cAAA,EAAgB,SAAA;AAAA,IAChB,WAAA,EAAa,SAAA;AAAA,IACb,OAAA,EAAS,SAAA;AAAA,IACT,WAAA,EAAa,SAAA;AAAA,IACb,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY,SAAA;AAAA,IACZ,UAAA,EAAY,SAAA;AAAA,IACZ,YAAA,EAAc,SAAA;AAAA,IACd,OAAA,EAAS,SAAA;AAAA,IACT,KAAA,EAAO;AAAA;AAEX;AAGO,IAAM,WAAA,GAAuD;AAAA,EAClE,KAAA,EAAO,EAAE,MAAA,EAAQ,YAAA,CAAa,KAAA,EAA2C;AAAA,EACzE,IAAA,EAAM,EAAE,MAAA,EAAQ,YAAA,CAAa,IAAA;AAC/B,CAAA;;;ACtFO,IAAM,UAAA,GAAgC;AAAA,EAC3C;AAAA,IACE,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAA,IACvB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,oEAAA;AAAA,QACL,MAAA,EAAQ,GAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,GAAA,EAAK,wEAAA;AAAA,QACL,MAAA,EAAQ,GAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,GAAA,EAAK,wEAAA;AAAA,QACL,MAAA,EAAQ,GAAA;AAAA,QACR,MAAA,EAAQ;AAAA;AACV;AACF;AAEJ,CAAA;AAGO,IAAM,gBAAA,GACX,2FAAA;ACPF,IAAM,aAAA,GAAgB,CAAA;AAGtB,SAAS,UAAU,KAAA,EAAyB;AAC1C,EAAA,IAAI,MAAM,MAAA,IAAU,CAAA,EAAG,OAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,KAAA,EAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC1D,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,MAAA,EAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AACzE;AAGA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,GAAO,GAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,GAAO,QAAQ,GAAI,CAAA;AAC7C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,IAAI,CAAA,GAAI,EAAA;AACrC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,OAAQ,EAAE,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,CAAA,IAAK,EAAA,GAAK,IAAA,GAAO,IAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,KAAO,CAAA,GAAI,KAAK,CAAA,GAAI,EAAA;AACnC,EAAA,OAAO,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACpD;AAEA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,OAAO,KACJ,KAAA,CAAM,KAAK,EACX,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,CACtB,MAAM,CAAA,EAAG,CAAC,EACV,IAAA,CAAK,EAAE,EACP,WAAA,EAAY;AACjB;AAEA,SAAS,WAAW,CAAA,EAA+B;AACjD,EAAA,OAAO;AAAA,IACL,MAAM,EAAE,KAAA,EAAO,CAAA,CAAE,IAAA,EAAM,gBAAgB,MAAA,EAAO;AAAA,IAC9C,OAAA,EAAS;AAAA,MACP,OAAO,CAAA,CAAE,WAAA;AAAA,MACT,YAAY,CAAA,CAAE,SAAA;AAAA,MACd,YAAA,EAAc,CAAA;AAAA,MACd,OAAA,EAAS,OAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACd;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,OAAO,CAAA,CAAE,QAAA;AAAA,MACT,YAAY,CAAA,CAAE,MAAA;AAAA,MACd,MAAA,EAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,UAAU,CAAA,CAAA;AAAA,MACjC,YAAA,EAAc,CAAA;AAAA,MACd,OAAA,EAAS,SAAA;AAAA,MACT,UAAA,EAAY,oCAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AACF;AAEA,IAAM,QAAA,GAAmC,CAAC,EAAE,CAAA,EAAE,qBAC5CA,cAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAe,GAAA;AAAA,MACf,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,OAAO,CAAA,CAAE,YAAA;AAAA,MACT,YAAA,EAAc,CAAA;AAAA,MACd,OAAA,EAAS;AAAA,KACX;AAAA,IACD,QAAA,EAAA;AAAA;AAED,CAAA;AAGF,IAAM,SAA0B,CAAC,EAAE,OAAO,WAAA,EAAa,IAAA,GAAO,IAAG,KAAM;AACrE,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,uBACEA,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAK,WAAA,CAAY,MAAA;AAAA,QACjB,KAAK,WAAA,CAAY,IAAA;AAAA,QACjB,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAc,aAAA;AAAA,UACd,SAAA,EAAW,OAAA;AAAA,UACX,OAAA,EAAS;AAAA;AACX;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,cAAY,WAAA,CAAY,IAAA;AAAA,MACxB,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAc,aAAA;AAAA,QACd,UAAA,EAAY,YAAY,KAAA,IAAS,SAAA;AAAA,QACjC,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY,GAAA;AAAA,QACZ,UAAU,IAAA,GAAO,GAAA;AAAA,QACjB,QAAQ,KAAA,KAAU,MAAA,GAAS,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA,CAAA,GAAK;AAAA,OACvD;AAAA,MAEC,QAAA,EAAA,QAAA,CAAS,YAAY,IAAI;AAAA;AAAA,GAC5B;AAEJ,CAAA;AAGA,SAAS,iBAAiB,EAAA,EAA4C;AACpE,EAAA,IAAI,IAAA,GAAO,IAAI,aAAA,IAAiB,IAAA;AAChC,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,IAAI,CAAA,CAAE,QAAA;AACjC,IAAA,IAAI,CAAA,IAAK,CAAA,KAAM,SAAA,EAAW,OAAO,IAAA;AACjC,IAAA,IAAA,GAAO,IAAA,CAAK,aAAA;AAAA,EACd;AACA,EAAA,OAAO,IAAA;AACT;AAQA,IAAM,kBAA+D,CAAC;AAAA,EACpE;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAMC,aAAwB,IAAI,CAAA;AACxC,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAIC,eAAS,CAAC,CAAA;AAC9B,EAAA,MAAM,OAAO,QAAA,CAAS,SAAA;AAEtB,EAAAC,qBAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,EAAE,CAAA,EAAG,qBAAA,EAAsB;AAC1D,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA,GAAO,GAAG,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,IAAA;AAAA,SAAA,IACrD,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA,GAAQ,GAAG,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,KAAA;AACtE,IAAA,KAAA,CAAM,KAAK,CAAA;AAAA,EACb,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEC,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,SAAA;AAAA,MACL,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,kBAAA;AAAA,QACR,IAAA,EAAM,KAAA;AAAA,QACN,SAAA,EAAW,0BAA0B,EAAE,CAAA,IAAA,CAAA;AAAA,QACvC,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAO,GAAA;AAAA,QACP,SAAA,EAAW,YAAA;AAAA,QACX,UAAA,EAAY,SAAA;AAAA,QACZ,KAAA,EAAO,SAAA;AAAA,QACP,YAAA,EAAc,EAAA;AAAA,QACd,OAAA,EAAS,gBAAA;AAAA,QACT,SAAA,EAAW,QAAA;AAAA,QACX,QAAA,EAAU,EAAA;AAAA,QACV,UAAA,EAAY,GAAA;AAAA,QACZ,SAAA,EAAW,4BAAA;AAAA,QACX,aAAA,EAAe;AAAA,OACjB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAA,EAAI,YAAA,EAAc,CAAA,EAAE,EAC5D,QAAA,EAAA,QAAA,CAAS,KAAA,EACZ,CAAA;AAAA,wBACAA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,KAAI,EAAI,QAAA,EAAA,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAE,CAAA;AAAA,uCAC9D,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,IAAa,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,wBACjDA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAU,EAC7B,QAAA,EAAA,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA,GAAM,QAAA,CAAS,KAAA,EACjC,CAAA;AAAA,wBAEAA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,QAAA,EAAU,UAAA;AAAA,cACV,GAAA,EAAK,MAAA;AAAA,cACL,IAAA,EAAM,cAAc,EAAE,CAAA,GAAA,CAAA;AAAA,cACtB,SAAA,EAAW,kBAAA;AAAA,cACX,KAAA,EAAO,CAAA;AAAA,cACP,MAAA,EAAQ,CAAA;AAAA,cACR,UAAA,EAAY,uBAAA;AAAA,cACZ,WAAA,EAAa,uBAAA;AAAA,cACb,SAAA,EAAW;AAAA;AACb;AAAA;AACF;AAAA;AAAA,GACF;AAEJ,CAAA;AAEA,IAAM,QAAA,GAA8B,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AAC3D,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,eAAS,KAAK,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,CAAA;AAC9C,EAAA,uBACEE,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,aAAA;AAAA,QACT,GAAGC,aAAA,CAAM,QAAA,CAAS,QAAQ;AAAA,OAC5B;AAAA,MACA,YAAA,EAAc,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,MACjC,YAAA,EAAc,MAAM,QAAA,CAAS,KAAK,CAAA;AAAA,MAElC,QAAA,EAAA;AAAA,wBAAAD,eAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,aAAA;AAAA,cACT,UAAA,EAAY,QAAA;AAAA,cACZ,GAAA,EAAK,CAAA;AAAA,cACL,YAAY,CAAA,CAAE,UAAA;AAAA,cACd,MAAA,EAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,cAAc,CAAA,CAAA;AAAA,cACrC,OAAO,CAAA,CAAE,YAAA;AAAA,cACT,YAAA,EAAc,EAAA;AAAA,cACd,OAAA,EAAS,SAAA;AAAA,cACT,MAAA,EAAQ,EAAA;AAAA,cACR,QAAA,EAAU,EAAA;AAAA,cACV,MAAA,EAAQ,cAAc,SAAA,GAAY;AAAA,aACpC;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAJ,cAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAU,EAAA,EAAG,EAAI,mBAAS,KAAA,EAAM,CAAA;AAAA,8BAC/CA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,KAAK,kBAAA,EAAoB,cAAA,EAAe,EAChE,QAAA,EAAA,QAAA,CAAS,KAAA,EACZ;AAAA;AAAA;AAAA,SACF;AAAA,QACC,KAAA,IAAS,WAAA,mBAAcA,cAAA,CAAC,eAAA,EAAA,EAAgB,UAAoB,CAAA,GAAK;AAAA;AAAA;AAAA,GACpE;AAEJ,CAAA;AAIA,IAAM,eAAA,GAAmC,CAAC,EAAE,KAAA,EAAO,QAAO,KAAM;AAC9D,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,OAAA,EAAS,mBAAA;AAAA,QACT,OAAO,CAAA,CAAE,MAAA;AAAA,QACT,QAAA,EAAU,EAAA;AAAA,QACV,SAAA,EAAW;AAAA,OACb;AAAA,MAEA,0CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,IAAA;AAAA,QAAK;AAAA,OAAA,EAAW;AAAA;AAAA,GAChC;AAEJ,CAAA;AAEA,IAAM,KAAA,GAA+B,CAAC,EAAE,KAAA,EAAM,qBAC5CA,cAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,cAAA;AAAA,MACT,KAAA,EAAO,GAAA;AAAA,MACP,MAAA,EAAQ,QAAA;AAAA,MACR,UAAA,EAAY,KAAA;AAAA,MACZ,UAAA,EAAY,CAAA;AAAA,MACZ,aAAA,EAAe;AAAA;AACjB;AACF,CAAA;AAGF,IAAM,QAAA,GAA8B,CAAC,EAAE,KAAA,EAAO,UAAS,KAAM;AAC3D,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,MAAA,GAAS,CAAA;AACvC,EAAA,uBACEA,cAAA,CAAC,SAAI,KAAA,EAAO,EAAE,MAAM,UAAA,EAAY,OAAA,EAAS,iBAAgB,EACvD,QAAA,kBAAAA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,cAAc,CAAA,CAAA;AAAA,QACrC,YAAA,EAAc,CAAA;AAAA,QACd,YAAY,CAAA,CAAE,UAAA;AAAA,QACd,OAAA,EAAS,UAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,QACX,QAAA,EAAU,EAAA;AAAA,QACV,OAAO,CAAA,CAAE;AAAA,OACX;AAAA,MAEC,QAAA,EAAA,OAAA,mCACE,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,IAAA;AAAA,wBACVA,cAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO;AAAA,OAAA,EACzB,CAAA,kCAEC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,CAAE,WAAA,EAAY,EAAG,QAAA,EAAA,aAAA,EAAM;AAAA;AAAA,GAEjD,EACF,CAAA;AAEJ,CAAA;AAEA,SAAS,WAAA,CAAY,GAAgB,OAAA,EAAiC;AACpE,EAAA,MAAM,IAAA,GAAsB;AAAA,IAC1B,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,GAAA;AAAA,IACZ,QAAA,EAAU,EAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AACA,EAAA,OAAO,OAAA,GACH,EAAE,GAAG,IAAA,EAAM,UAAA,EAAY,CAAA,CAAE,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,WAAA,EAAa,MAAA,EAAQ,MAAA,EAAO,GACvE;AAAA,IACE,GAAG,IAAA;AAAA,IACH,UAAA,EAAY,aAAA;AAAA,IACZ,OAAO,CAAA,CAAE,UAAA;AAAA,IACT,MAAA,EAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,YAAY,CAAA;AAAA,GACrC;AACN;AAEA,IAAM,gBAAiC,CAAC,EAAE,KAAA,EAAO,OAAA,EAAS,QAAO,KAAM;AACrE,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,EAAQ,OAAA,IAAW,EAAC;AAC5C,EAAA,uBACEI,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,GAAA,EAAK,CAAA;AAAA,QACL,OAAA,EAAS,cAAA;AAAA,QACT,GAAGE,mBAAA,CAAY,OAAA,CAAQ,cAAc;AAAA,OACvC;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAN,cAAA,CAAC,SAAI,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,EAAA,EAAG,EACvC,QAAA,EAAA,MAAA,mBACCA,cAAA,CAAC,UAAO,KAAA,EAAc,WAAA,EAAa,QAAQ,IAAA,EAAM,EAAA,EAAI,IACnD,IAAA,EACN,CAAA;AAAA,wBACAI,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,QAAA,EAAU,GAAE,EACjC,QAAA,EAAA;AAAA,0BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC1D,QAAA,EAAA;AAAA,4BAAAJ,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,IAAA,EAAK,EAC3C,QAAA,EAAA,MAAA,EAAQ,IAAA,IAAQ,KAAA,EACnB,CAAA;AAAA,4BACAA,cAAA,CAAC,YAAS,CAAA,EAAM,CAAA;AAAA,4BAChBA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,EAC1C,QAAA,EAAA,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA,EAC1B;AAAA,WAAA,EACF,CAAA;AAAA,0BACAI,eAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,SAAA,EAAW,CAAA;AAAA,gBACX,UAAA,EAAY,CAAA,UAAA,EAAa,CAAA,CAAE,OAAO,CAAA,CAAA;AAAA,gBAClC,YAAA,EAAc,CAAA;AAAA,gBACd,WAAA,EAAa;AAAA,eACf;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAJ,cAAA,CAAC,SAAI,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,CAAE,MAAK,EAC1B,QAAA,kBAAAA,cAAA,CAACO,sBAAA,EAAA,EAAe,KAAA,EAAO,QAAQ,OAAA,EAAS,MAAA,EAAQ,UAAA,CAAW,CAAC,GAAG,CAAA,EACjE,CAAA;AAAA,gBACC,OAAA,CAAQ,MAAA,GAAS,CAAA,mBAChBP,cAAA,CAAC,SAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE,EACjD,kBAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACfA,cAAA,CAAC,QAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,OAAO,WAAA,CAAY,CAAA,EAAG,CAAA,KAAM,CAAC,GACxD,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EADQ,CAEb,CACD,GACH,CAAA,GACE;AAAA;AAAA;AAAA;AACN,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ,CAAA;AAEA,IAAM,UAA4B,CAAC,EAAE,KAAA,EAAO,OAAA,EAAS,QAAO,KAAM;AAChE,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,MAAM,UAAU,OAAA,CAAQ,SAAA;AACxB,EAAA,uBACEI,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,GAAA,EAAK,CAAA;AAAA,QACL,OAAA,EAAS,UAAU,UAAA,GAAa,cAAA;AAAA,QAChC,GAAGE,mBAAA,CAAY,OAAA,CAAQ,cAAc;AAAA,OACvC;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAN,cAAA,CAAC,SAAI,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,EAAA,EAAG,EACvC,QAAA,EAAA,OAAA,GAAU,IAAA,kCACR,MAAA,EAAA,EAAO,KAAA,EAAc,aAAa,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA,EAEzD,CAAA;AAAA,wBACAI,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,QAAA,EAAU,GAAE,EAChC,QAAA,EAAA;AAAA,UAAA,OAAA,GAAU,IAAA,mBACTA,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,GAAA,EAAK,CAAA,EAAE,EAC5D,QAAA,EAAA;AAAA,4BAAAJ,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,OAAO,CAAA,CAAE,IAAA,EAAK,EAC3C,QAAA,EAAA,MAAA,CAAO,IAAA,EACV,CAAA;AAAA,YACC,OAAO,IAAA,KAAS,KAAA,mBAAQA,cAAA,CAAC,QAAA,EAAA,EAAS,GAAM,CAAA,GAAK,IAAA;AAAA,4BAC9CA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,MAAA,EAAQ,YAAY,CAAA,EAAE,EACzD,QAAA,EAAA,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA,EAC1B;AAAA,WAAA,EACF,CAAA;AAAA,0BAEFA,cAAA,CAAC,SAAI,KAAA,EAAO,EAAE,OAAO,CAAA,CAAE,IAAA,EAAM,SAAA,EAAW,YAAA,EAAa,EACnD,QAAA,kBAAAA,cAAA;AAAA,YAACO,sBAAA;AAAA,YAAA;AAAA,cACC,OAAO,OAAA,CAAQ,OAAA;AAAA,cACf,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,cACpB,UAAA,EAAY;AAAA,gBACV,YAAA,EAAc,CAAA;AAAA,gBACd,SAAA,EAAW,CAAA;AAAA,gBACX,MAAA,EAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA,CAAA;AAAA,gBAC7B,QAAA,EAAU;AAAA;AACZ;AAAA,WACF,EACF,CAAA;AAAA,UACC,OAAA,CAAQ,SAAA,CAAU,MAAA,GAAS,CAAA,mBAC1BP,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,OAAA,EAAS,MAAA;AAAA,gBACT,GAAA,EAAK,CAAA;AAAA,gBACL,SAAA,EAAW,CAAA;AAAA,gBACX,QAAA,EAAU;AAAA,eACZ;AAAA,cAEC,QAAA,EAAA,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACzBA,cAAA,CAAC,QAAA,EAAA,EAAiB,KAAA,EAAc,QAAA,EAAU,CAAA,EAAA,EAA3B,CAA8B,CAC9C;AAAA;AAAA,WACH,GACE;AAAA,SAAA,EACN;AAAA;AAAA;AAAA,GACF;AAEJ,CAAA;AAEA,IAAM,QAAmD,CAAC;AAAA,EACxD,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAA,GAAI,aAAa,KAAK,CAAA;AAC5B,EAAA,MAAM,UACJ,OAAO,OAAA,EAAS,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,GAAU,UAAA;AAC3D,EAAA,uBACEI,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,gBAAA;AAAA,QACZ,YAAY,CAAA,CAAE,EAAA;AAAA,QACd,OAAO,CAAA,CAAE,IAAA;AAAA,QACT,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,EAAA;AAAA,QACV,UAAA,EAAY,OAAA;AAAA,QACZ,mBAAA,EAAqB;AAAA,OACvB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,UAAA;AAAA,cACN,OAAA,EAAS,WAAA;AAAA,cACT,YAAA,EAAc,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA,CAAA;AAAA,cACnC,OAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY,UAAA;AAAA,cACZ,GAAA,EAAK;AAAA,aACP;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAJ,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,IAAA,EAAK,EAAG,QAAA,EAAA,QAAA,EAE/D,CAAA;AAAA,8BACAA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,EAAA,EAAG,EAAI,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA;AAAA,SAC3D;AAAA,wBACAA,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,UAAA;AAAA,cACN,SAAA,EAAW,CAAA;AAAA,cACX,OAAA,EAAS,MAAA;AAAA,cACT,aAAA,EAAe,QAAA;AAAA;AAAA,cAEf,aAAA,EAAe;AAAA,aACjB;AAAA,YAEC;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ,CAAA;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;;;ACjgBO,IAAM,iBAAA,GAAkC;AAAA,EAC7C,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,QAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA;AAAA,IACR,YAAA,EAAc,QAAA;AAAA,IACd,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,aAAA;AAAA;AAAA,IACb,MAAA,EAAQ,QAAA;AAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA,SAAA,EAAW,IAAA;AAAA,EACX,OAAA,EAAS,IAAA;AAAA,EACT,YAAA,EAAc;AAChB,CAAA;;;AChBA,IAAM,kBAAA,GAAqBQ,MAAE,MAAA,CAAO;AAAA;AAAA,EAElC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,gBAAA,EAAkBA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAChC,CAAC,CAAA;AAGM,IAAM,QAAQC,kBAAA,CAAW;AAAA,EAC9B,EAAA,EAAI,OAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,aAAA,EAAe,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,IACzC,cAAA,EAAgB,CAAC,OAAA,EAAS,MAAM,CAAA;AAAA,IAChC,YAAA,EAAc,iBAAA;AAAA,IACd,aAAA,EAAe,kBAAA;AAAA,IACf,KAAA,EAAO;AAAA,GACT;AAAA,EACA,UAAA,EAAY,eAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAC;AAGD,IAAO,aAAA,GAAQ","file":"chunk-CCT33UVA.cjs","sourcesContent":["import type { ResolvedTheme } from \"@typecaast/core\";\nimport type { SkinTokens } from \"@typecaast/skin-kit\";\n\n/** The Slack-style palette per theme (matched to the real app's spacing/color). */\nexport interface SlackColors {\n bg: string;\n text: string;\n subtle: string;\n border: string;\n headerBg: string;\n link: string;\n mentionText: string;\n mentionBg: string;\n codeText: string;\n codeBg: string;\n codeBorder: string;\n reactionBg: string;\n reactionBorder: string;\n reactionText: string;\n composerBg: string;\n composerBorder: string;\n placeholder: string;\n primary: string;\n primaryText: string;\n buttonBorder: string;\n buttonText: string;\n appBadgeBg: string;\n appBadgeText: string;\n cardBar: string;\n caret: string;\n}\n\nexport const SLACK_COLORS: Record<ResolvedTheme, SlackColors> = {\n light: {\n bg: \"#ffffff\",\n text: \"#1d1c1d\",\n subtle: \"#616061\",\n border: \"#e2e2e2\",\n headerBg: \"#ffffff\",\n link: \"#1264a3\",\n mentionText: \"#1264a3\",\n mentionBg: \"#e8f5fa\",\n codeText: \"#e01e5a\",\n codeBg: \"#f6f6f6\",\n codeBorder: \"#e2e2e2\",\n reactionBg: \"#f8f8f8\",\n reactionBorder: \"#e2e2e2\",\n reactionText: \"#454245\",\n composerBg: \"#ffffff\",\n composerBorder: \"#8d8d8d\",\n placeholder: \"#8d8d8d\",\n primary: \"#007a5a\",\n primaryText: \"#ffffff\",\n buttonBorder: \"#d1d1d1\",\n buttonText: \"#1d1c1d\",\n appBadgeBg: \"#e8e8e8\",\n appBadgeText: \"#616061\",\n cardBar: \"#dddddd\",\n caret: \"#1264a3\",\n },\n dark: {\n bg: \"#1a1d21\",\n text: \"#d1d2d3\",\n subtle: \"#ababad\",\n border: \"#35373b\",\n headerBg: \"#1a1d21\",\n link: \"#1d9bd1\",\n mentionText: \"#1d9bd1\",\n mentionBg: \"rgba(29,155,209,0.12)\",\n codeText: \"#e06c9a\",\n codeBg: \"#222529\",\n codeBorder: \"#35373b\",\n reactionBg: \"#222529\",\n reactionBorder: \"#35373b\",\n reactionText: \"#d1d2d3\",\n composerBg: \"#222529\",\n composerBorder: \"#565856\",\n placeholder: \"#9a9b9d\",\n primary: \"#007a5a\",\n primaryText: \"#ffffff\",\n buttonBorder: \"#565856\",\n buttonText: \"#d1d2d3\",\n appBadgeBg: \"#35373b\",\n appBadgeText: \"#ababad\",\n cardBar: \"#35373b\",\n caret: \"#1d9bd1\",\n },\n};\n\n/** Pack the color sets into the generic `SkinTokens` shape for the contract. */\nexport const slackTokens: { light: SkinTokens; dark: SkinTokens } = {\n light: { colors: SLACK_COLORS.light as unknown as Record<string, string> },\n dark: { colors: SLACK_COLORS.dark as unknown as Record<string, string> },\n};\n","import type { FontDeclaration } from \"@typecaast/skin-kit\";\n\n/**\n * Slack uses **Lato** (OFL, bundleable) — the real font, not a substitute\n * (PLAN §19). Sources point at the OFL woff2 files; real bundling/pinning of\n * the font assets lands with the font-map gate (M3a / video runtime).\n */\nexport const slackFonts: FontDeclaration[] = [\n {\n family: \"Lato\",\n weights: [400, 700, 900],\n sources: [\n {\n url: \"https://fonts.gstatic.com/s/lato/v24/S6uyw4BMUTPHjx4wXiWtFCc.woff2\",\n weight: 400,\n format: \"woff2\",\n },\n {\n url: \"https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2\",\n weight: 700,\n format: \"woff2\",\n },\n {\n url: \"https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh50XSwiPGQ3q5d0.woff2\",\n weight: 900,\n format: \"woff2\",\n },\n ],\n },\n];\n\n/** The CSS font stack the skin renders with (declared font first). */\nexport const SLACK_FONT_STACK =\n 'Lato, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif';\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type FC,\n type ReactNode,\n} from \"react\";\nimport type {\n AvatarProps,\n ComposerProps,\n FrameProps,\n MessageProps,\n ReactionProps,\n SystemProps,\n TypingProps,\n} from \"@typecaast/core\";\nimport {\n fadeSlideIn,\n MessageContent,\n popIn,\n type ContentStyles,\n} from \"@typecaast/skin-kit\";\nimport { SLACK_COLORS, type SlackColors } from \"./tokens.js\";\nimport { SLACK_FONT_STACK } from \"./fonts.js\";\n\nconst AVATAR_RADIUS = 8;\n\n/** Join reactor names the way Slack does (\"A\", \"A and B\", \"A, B, and C\"). */\nfunction joinNames(names: string[]): string {\n if (names.length <= 1) return names[0] ?? \"\";\n if (names.length === 2) return `${names[0]} and ${names[1]}`;\n return `${names.slice(0, -1).join(\", \")}, and ${names[names.length - 1]}`;\n}\n\n/** Fabricate a stable wall-clock time from a timeline offset (sim starts 9:00am). */\nfunction formatTime(atMs: number): string {\n const base = 9 * 3600 * 1000;\n const total = Math.floor((base + atMs) / 1000);\n const h = Math.floor(total / 3600) % 24;\n const m = Math.floor((total % 3600) / 60);\n const ampm = h >= 12 ? \"PM\" : \"AM\";\n const hr = h % 12 === 0 ? 12 : h % 12;\n return `${hr}:${String(m).padStart(2, \"0\")} ${ampm}`;\n}\n\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .map((w) => w.charAt(0))\n .slice(0, 2)\n .join(\"\")\n .toUpperCase();\n}\n\nfunction markStyles(c: SlackColors): ContentStyles {\n return {\n link: { color: c.link, textDecoration: \"none\" },\n mention: {\n color: c.mentionText,\n background: c.mentionBg,\n borderRadius: 3,\n padding: \"0 2px\",\n fontWeight: 600,\n },\n code: {\n color: c.codeText,\n background: c.codeBg,\n border: `1px solid ${c.codeBorder}`,\n borderRadius: 3,\n padding: \"1px 4px\",\n fontFamily: \"Menlo, Monaco, Consolas, monospace\",\n fontSize: \"0.85em\",\n },\n };\n}\n\nconst AppBadge: FC<{ c: SlackColors }> = ({ c }) => (\n <span\n style={{\n fontSize: 10,\n fontWeight: 700,\n letterSpacing: 0.4,\n background: c.appBadgeBg,\n color: c.appBadgeText,\n borderRadius: 2,\n padding: \"1px 4px\",\n }}\n >\n APP\n </span>\n);\n\nconst Avatar: FC<AvatarProps> = ({ theme, participant, size = 36 }) => {\n const c = SLACK_COLORS[theme];\n if (participant.avatar) {\n return (\n <img\n src={participant.avatar}\n alt={participant.name}\n width={size}\n height={size}\n style={{\n width: size,\n height: size,\n borderRadius: AVATAR_RADIUS,\n objectFit: \"cover\",\n display: \"block\",\n }}\n />\n );\n }\n return (\n <div\n aria-label={participant.name}\n style={{\n width: size,\n height: size,\n borderRadius: AVATAR_RADIUS,\n background: participant.color ?? \"#4a154b\",\n color: \"#ffffff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontWeight: 700,\n fontSize: size * 0.4,\n border: theme === \"dark\" ? `1px solid ${c.border}` : undefined,\n }}\n >\n {initials(participant.name)}\n </div>\n );\n};\n\n/** Nearest ancestor that clips overflow — the bound to keep the tooltip inside. */\nfunction clippingAncestor(el: HTMLElement | null): HTMLElement | null {\n let node = el?.parentElement ?? null;\n while (node) {\n const o = getComputedStyle(node).overflow;\n if (o && o !== \"visible\") return node;\n node = node.parentElement;\n }\n return null;\n}\n\n/**\n * Slack's custom hover tooltip: big emoji over \"<names> reacted with :code:\",\n * with a tail pointing at the reaction. Centered, but **clamped** to stay\n * inside the sim viewport (like Slack clamps to the window) — the tail tracks\n * the reaction so it still points correctly after a shift.\n */\nconst ReactionTooltip: FC<{ reaction: ReactionProps[\"reaction\"] }> = ({\n reaction,\n}) => {\n const ref = useRef<HTMLSpanElement>(null);\n const [dx, setDx] = useState(0);\n const code = reaction.shortcode;\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n const bound = clippingAncestor(el)?.getBoundingClientRect();\n if (!bound) return;\n const rect = el.getBoundingClientRect();\n const m = 8;\n let shift = 0;\n if (rect.left < bound.left + m) shift = bound.left + m - rect.left;\n else if (rect.right > bound.right - m) shift = bound.right - m - rect.right;\n setDx(shift);\n }, []);\n\n return (\n <span\n ref={ref}\n role=\"tooltip\"\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 9px)\",\n left: \"50%\",\n transform: `translateX(calc(-50% + ${dx}px))`,\n zIndex: 20,\n width: 220,\n boxSizing: \"border-box\",\n background: \"#1a1d21\",\n color: \"#e8e8e8\",\n borderRadius: 12,\n padding: \"16px 16px 14px\",\n textAlign: \"center\",\n fontSize: 15,\n lineHeight: 1.4,\n boxShadow: \"0 4px 14px rgba(0,0,0,0.4)\",\n pointerEvents: \"none\",\n }}\n >\n <span style={{ display: \"block\", fontSize: 36, marginBottom: 8 }}>\n {reaction.emoji}\n </span>\n <span style={{ fontWeight: 700 }}>{joinNames(reaction.byNames)}</span>\n <span style={{ color: \"#ababad\" }}> reacted with </span>\n <span style={{ color: \"#ababad\" }}>\n {code ? `:${code}:` : reaction.emoji}\n </span>\n {/* downward tail — offset opposite the clamp shift so it stays on the chip */}\n <span\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: `calc(50% - ${dx}px)`,\n transform: \"translateX(-50%)\",\n width: 0,\n height: 0,\n borderLeft: \"7px solid transparent\",\n borderRight: \"7px solid transparent\",\n borderTop: \"7px solid #1a1d21\",\n }}\n />\n </span>\n );\n};\n\nconst Reaction: FC<ReactionProps> = ({ theme, reaction }) => {\n const c = SLACK_COLORS[theme];\n const [hover, setHover] = useState(false);\n const hasReactors = reaction.byNames.length > 0;\n return (\n <span\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n ...popIn(reaction.progress),\n }}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n background: c.reactionBg,\n border: `1px solid ${c.reactionBorder}`,\n color: c.reactionText,\n borderRadius: 12,\n padding: \"1px 7px\",\n height: 22,\n fontSize: 12,\n cursor: hasReactors ? \"pointer\" : \"default\",\n }}\n >\n <span style={{ fontSize: 13 }}>{reaction.emoji}</span>\n <span style={{ fontWeight: 600, fontVariantNumeric: \"tabular-nums\" }}>\n {reaction.count}\n </span>\n </span>\n {hover && hasReactors ? <ReactionTooltip reaction={reaction} /> : null}\n </span>\n );\n};\n\n// Slack shows a plain italicized \"<name> is typing…\" line — no bouncing dots\n// (those are an iMessage/WhatsApp idiom, not Slack's).\nconst TypingIndicator: FC<TypingProps> = ({ theme, author }) => {\n const c = SLACK_COLORS[theme];\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n padding: \"2px 16px 4px 60px\",\n color: c.subtle,\n fontSize: 12,\n fontStyle: \"italic\",\n }}\n >\n <span>{author.name} is typing…</span>\n </div>\n );\n};\n\nconst Caret: FC<{ color: string }> = ({ color }) => (\n <span\n style={{\n display: \"inline-block\",\n width: 1.5,\n height: \"1.05em\",\n background: color,\n marginLeft: 1,\n verticalAlign: \"text-bottom\",\n }}\n />\n);\n\nconst Composer: FC<ComposerProps> = ({ theme, composer }) => {\n const c = SLACK_COLORS[theme];\n const hasText = composer.text.length > 0;\n return (\n <div style={{ flex: \"0 0 auto\", padding: \"4px 16px 14px\" }}>\n <div\n style={{\n border: `1px solid ${c.composerBorder}`,\n borderRadius: 8,\n background: c.composerBg,\n padding: \"9px 12px\",\n minHeight: 22,\n fontSize: 15,\n color: c.text,\n }}\n >\n {hasText ? (\n <span>\n {composer.text}\n <Caret color={c.caret} />\n </span>\n ) : (\n <span style={{ color: c.placeholder }}>Reply…</span>\n )}\n </div>\n </div>\n );\n};\n\nfunction buttonStyle(c: SlackColors, primary: boolean): CSSProperties {\n const base: CSSProperties = {\n borderRadius: 4,\n padding: \"7px 12px\",\n fontWeight: 700,\n fontSize: 13,\n cursor: \"default\",\n fontFamily: \"inherit\",\n lineHeight: 1,\n };\n return primary\n ? { ...base, background: c.primary, color: c.primaryText, border: \"none\" }\n : {\n ...base,\n background: \"transparent\",\n color: c.buttonText,\n border: `1px solid ${c.buttonBorder}`,\n };\n}\n\nconst SystemMessage: FC<SystemProps> = ({ theme, message, author }) => {\n const c = SLACK_COLORS[theme];\n const actions = message.system?.actions ?? [];\n return (\n <div\n style={{\n display: \"flex\",\n gap: 8,\n padding: \"8px 16px 2px\",\n ...fadeSlideIn(message.revealProgress),\n }}\n >\n <div style={{ flex: \"0 0 36px\", width: 36 }}>\n {author ? (\n <Avatar theme={theme} participant={author} size={36} />\n ) : null}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <span style={{ fontWeight: 700, color: c.text }}>\n {author?.name ?? \"App\"}\n </span>\n <AppBadge c={c} />\n <span style={{ fontSize: 12, color: c.subtle }}>\n {formatTime(message.atMs)}\n </span>\n </div>\n <div\n style={{\n marginTop: 4,\n borderLeft: `4px solid ${c.cardBar}`,\n borderRadius: 2,\n paddingLeft: 12,\n }}\n >\n <div style={{ color: c.text }}>\n <MessageContent nodes={message.content} styles={markStyles(c)} />\n </div>\n {actions.length > 0 ? (\n <div style={{ display: \"flex\", gap: 8, marginTop: 8 }}>\n {actions.map((a, i) => (\n <button key={i} type=\"button\" style={buttonStyle(c, i === 0)}>\n {a.label}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n};\n\nconst Message: FC<MessageProps> = ({ theme, message, author }) => {\n const c = SLACK_COLORS[theme];\n const grouped = message.isGrouped;\n return (\n <div\n style={{\n display: \"flex\",\n gap: 8,\n padding: grouped ? \"2px 16px\" : \"8px 16px 2px\",\n ...fadeSlideIn(message.revealProgress),\n }}\n >\n <div style={{ flex: \"0 0 36px\", width: 36 }}>\n {grouped ? null : (\n <Avatar theme={theme} participant={author} size={36} />\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n {grouped ? null : (\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 6 }}>\n <span style={{ fontWeight: 700, color: c.text }}>\n {author.name}\n </span>\n {author.kind === \"app\" ? <AppBadge c={c} /> : null}\n <span style={{ fontSize: 12, color: c.subtle, marginLeft: 2 }}>\n {formatTime(message.atMs)}\n </span>\n </div>\n )}\n <div style={{ color: c.text, wordBreak: \"break-word\" }}>\n <MessageContent\n nodes={message.content}\n styles={markStyles(c)}\n imageStyle={{\n borderRadius: 8,\n marginTop: 4,\n border: `1px solid ${c.border}`,\n maxWidth: 360,\n }}\n />\n </div>\n {message.reactions.length > 0 ? (\n <div\n style={{\n display: \"flex\",\n gap: 4,\n marginTop: 4,\n flexWrap: \"wrap\",\n }}\n >\n {message.reactions.map((r, i) => (\n <Reaction key={i} theme={theme} reaction={r} />\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n};\n\nconst Frame: FC<FrameProps & { children?: ReactNode }> = ({\n theme,\n options,\n children,\n}) => {\n const c = SLACK_COLORS[theme];\n const channel =\n typeof options?.channel === \"string\" ? options.channel : \"#general\";\n return (\n <div\n style={{\n fontFamily: SLACK_FONT_STACK,\n background: c.bg,\n color: c.text,\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n fontSize: 15,\n lineHeight: 1.46668,\n WebkitFontSmoothing: \"antialiased\",\n }}\n >\n <header\n style={{\n flex: \"0 0 auto\",\n padding: \"10px 16px\",\n borderBottom: `1px solid ${c.border}`,\n display: \"flex\",\n alignItems: \"baseline\",\n gap: 8,\n }}\n >\n <span style={{ fontWeight: 900, fontSize: 18, color: c.text }}>\n Thread\n </span>\n <span style={{ color: c.subtle, fontSize: 13 }}>{channel}</span>\n </header>\n <div\n style={{\n flex: \"1 1 auto\",\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n // Breathing room so the last message/card never touches the bottom edge.\n paddingBottom: 12,\n }}\n >\n {children}\n </div>\n </div>\n );\n};\n\nexport const slackComponents = {\n Frame,\n Message,\n TypingIndicator,\n Reaction,\n Composer,\n SystemMessage,\n Avatar,\n};\n","import type { Capabilities } from \"@typecaast/skin-kit\";\n\n/** What the Slack skin supports and how it represents each event/content type. */\nexport const slackCapabilities: Capabilities = {\n events: {\n message: \"native\",\n reaction: \"native\",\n typing: \"native\", // \"X is typing…\"\n composerType: \"native\",\n send: \"native\",\n edit: \"native\",\n delete: \"native\",\n readReceipt: \"unsupported\", // Slack has no per-message read receipts in threads\n system: \"native\", // app/PR cards\n beat: \"native\",\n },\n content: {\n text: true,\n image: true,\n },\n reactions: true,\n threads: true,\n readReceipts: false,\n};\n","import { z } from \"zod\";\nimport { defineSkin } from \"@typecaast/skin-kit\";\nimport { slackComponents } from \"./components.js\";\nimport { slackCapabilities } from \"./capabilities.js\";\nimport { slackFonts } from \"./fonts.js\";\nimport { slackTokens } from \"./tokens.js\";\n\nconst slackOptionsSchema = z.object({\n /** Channel label shown in the thread header (e.g. `\"#alerts\"`). */\n channel: z.string().optional(),\n showThreadHeader: z.boolean().optional(),\n});\n\n/** A Slack-style thread skin (light + dark). Pixel-faithful, inert chrome. */\nexport const slack = defineSkin({\n id: \"slack\",\n meta: {\n name: \"Slack\",\n defaultCanvas: { width: 880, height: 720 },\n supportsThemes: [\"light\", \"dark\"],\n capabilities: slackCapabilities,\n optionsSchema: slackOptionsSchema,\n fonts: slackFonts,\n },\n components: slackComponents,\n tokens: slackTokens,\n});\n\n/** Default export so `@typecaast/skins/slack` can be lazy-imported uniformly. */\nexport default slack;\n"]}