@typecaast/skins 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,2684 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+ var skinKit = require('@typecaast/skin-kit');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ // src/slack/index.ts
8
+
9
+ // src/slack/tokens.ts
10
+ var SLACK_COLORS = {
11
+ light: {
12
+ bg: "#ffffff",
13
+ text: "#1d1c1d",
14
+ subtle: "#616061",
15
+ border: "#e2e2e2",
16
+ headerBg: "#ffffff",
17
+ link: "#1264a3",
18
+ mentionText: "#1264a3",
19
+ mentionBg: "#e8f5fa",
20
+ codeText: "#e01e5a",
21
+ codeBg: "#f6f6f6",
22
+ codeBorder: "#e2e2e2",
23
+ reactionBg: "#f8f8f8",
24
+ reactionBorder: "#e2e2e2",
25
+ reactionText: "#454245",
26
+ composerBg: "#ffffff",
27
+ composerBorder: "#8d8d8d",
28
+ placeholder: "#8d8d8d",
29
+ primary: "#007a5a",
30
+ primaryText: "#ffffff",
31
+ buttonBorder: "#d1d1d1",
32
+ buttonText: "#1d1c1d",
33
+ appBadgeBg: "#e8e8e8",
34
+ appBadgeText: "#616061",
35
+ cardBar: "#dddddd",
36
+ caret: "#1264a3"
37
+ },
38
+ dark: {
39
+ bg: "#1a1d21",
40
+ text: "#d1d2d3",
41
+ subtle: "#ababad",
42
+ border: "#35373b",
43
+ headerBg: "#1a1d21",
44
+ link: "#1d9bd1",
45
+ mentionText: "#1d9bd1",
46
+ mentionBg: "rgba(29,155,209,0.12)",
47
+ codeText: "#e06c9a",
48
+ codeBg: "#222529",
49
+ codeBorder: "#35373b",
50
+ reactionBg: "#222529",
51
+ reactionBorder: "#35373b",
52
+ reactionText: "#d1d2d3",
53
+ composerBg: "#222529",
54
+ composerBorder: "#565856",
55
+ placeholder: "#9a9b9d",
56
+ primary: "#007a5a",
57
+ primaryText: "#ffffff",
58
+ buttonBorder: "#565856",
59
+ buttonText: "#d1d2d3",
60
+ appBadgeBg: "#35373b",
61
+ appBadgeText: "#ababad",
62
+ cardBar: "#35373b",
63
+ caret: "#1d9bd1"
64
+ }
65
+ };
66
+ var slackTokens = {
67
+ light: { colors: SLACK_COLORS.light },
68
+ dark: { colors: SLACK_COLORS.dark }
69
+ };
70
+
71
+ // src/slack/fonts.ts
72
+ var slackFonts = [
73
+ {
74
+ family: "Lato",
75
+ weights: [400, 700, 900],
76
+ sources: [
77
+ {
78
+ url: "https://fonts.gstatic.com/s/lato/v24/S6uyw4BMUTPHjx4wXiWtFCc.woff2",
79
+ weight: 400,
80
+ format: "woff2"
81
+ },
82
+ {
83
+ url: "https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2",
84
+ weight: 700,
85
+ format: "woff2"
86
+ },
87
+ {
88
+ url: "https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh50XSwiPGQ3q5d0.woff2",
89
+ weight: 900,
90
+ format: "woff2"
91
+ }
92
+ ]
93
+ }
94
+ ];
95
+ var SLACK_FONT_STACK = 'Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif';
96
+ var AVATAR_RADIUS = 8;
97
+ function formatTime(atMs) {
98
+ const base = 9 * 3600 * 1e3;
99
+ const total = Math.floor((base + atMs) / 1e3);
100
+ const h = Math.floor(total / 3600) % 24;
101
+ const m = Math.floor(total % 3600 / 60);
102
+ const ampm = h >= 12 ? "PM" : "AM";
103
+ const hr = h % 12 === 0 ? 12 : h % 12;
104
+ return `${hr}:${String(m).padStart(2, "0")} ${ampm}`;
105
+ }
106
+ function initials(name) {
107
+ return name.split(/\s+/).map((w) => w.charAt(0)).slice(0, 2).join("").toUpperCase();
108
+ }
109
+ function markStyles(c) {
110
+ return {
111
+ link: { color: c.link, textDecoration: "none" },
112
+ mention: {
113
+ color: c.mentionText,
114
+ background: c.mentionBg,
115
+ borderRadius: 3,
116
+ padding: "0 2px",
117
+ fontWeight: 600
118
+ },
119
+ code: {
120
+ color: c.codeText,
121
+ background: c.codeBg,
122
+ border: `1px solid ${c.codeBorder}`,
123
+ borderRadius: 3,
124
+ padding: "1px 4px",
125
+ fontFamily: "Menlo, Monaco, Consolas, monospace",
126
+ fontSize: "0.85em"
127
+ }
128
+ };
129
+ }
130
+ var Avatar = ({ theme, participant, size = 36 }) => {
131
+ const c = SLACK_COLORS[theme];
132
+ if (participant.avatar) {
133
+ return /* @__PURE__ */ jsxRuntime.jsx(
134
+ "img",
135
+ {
136
+ src: participant.avatar,
137
+ alt: participant.name,
138
+ width: size,
139
+ height: size,
140
+ style: {
141
+ width: size,
142
+ height: size,
143
+ borderRadius: AVATAR_RADIUS,
144
+ objectFit: "cover",
145
+ display: "block"
146
+ }
147
+ }
148
+ );
149
+ }
150
+ return /* @__PURE__ */ jsxRuntime.jsx(
151
+ "div",
152
+ {
153
+ "aria-label": participant.name,
154
+ style: {
155
+ width: size,
156
+ height: size,
157
+ borderRadius: AVATAR_RADIUS,
158
+ background: participant.color ?? "#4a154b",
159
+ color: "#ffffff",
160
+ display: "flex",
161
+ alignItems: "center",
162
+ justifyContent: "center",
163
+ fontWeight: 700,
164
+ fontSize: size * 0.4,
165
+ border: theme === "dark" ? `1px solid ${c.border}` : void 0
166
+ },
167
+ children: initials(participant.name)
168
+ }
169
+ );
170
+ };
171
+ var Reaction = ({ theme, reaction }) => {
172
+ const c = SLACK_COLORS[theme];
173
+ return /* @__PURE__ */ jsxRuntime.jsxs(
174
+ "span",
175
+ {
176
+ style: {
177
+ ...skinKit.popIn(reaction.progress),
178
+ display: "inline-flex",
179
+ alignItems: "center",
180
+ gap: 4,
181
+ background: c.reactionBg,
182
+ border: `1px solid ${c.reactionBorder}`,
183
+ color: c.reactionText,
184
+ borderRadius: 12,
185
+ padding: "1px 7px",
186
+ height: 22,
187
+ fontSize: 12
188
+ },
189
+ children: [
190
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 13 }, children: reaction.emoji }),
191
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontVariantNumeric: "tabular-nums" }, children: reaction.count })
192
+ ]
193
+ }
194
+ );
195
+ };
196
+ var TypingIndicator = ({ theme, typing, author }) => {
197
+ const c = SLACK_COLORS[theme];
198
+ return /* @__PURE__ */ jsxRuntime.jsxs(
199
+ "div",
200
+ {
201
+ style: {
202
+ display: "flex",
203
+ alignItems: "center",
204
+ gap: 6,
205
+ padding: "2px 16px 4px 60px",
206
+ color: c.subtle,
207
+ fontSize: 12
208
+ },
209
+ children: [
210
+ /* @__PURE__ */ jsxRuntime.jsx(skinKit.TypingDots, { progress: typing.progress, color: c.subtle, size: 5 }),
211
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
212
+ author.name,
213
+ " is typing\u2026"
214
+ ] })
215
+ ]
216
+ }
217
+ );
218
+ };
219
+ var Caret = ({ color }) => /* @__PURE__ */ jsxRuntime.jsx(
220
+ "span",
221
+ {
222
+ style: {
223
+ display: "inline-block",
224
+ width: 1.5,
225
+ height: "1.05em",
226
+ background: color,
227
+ marginLeft: 1,
228
+ verticalAlign: "text-bottom"
229
+ }
230
+ }
231
+ );
232
+ var Composer = ({ theme, composer }) => {
233
+ const c = SLACK_COLORS[theme];
234
+ const hasText = composer.text.length > 0;
235
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "0 0 auto", padding: "4px 16px 14px" }, children: /* @__PURE__ */ jsxRuntime.jsx(
236
+ "div",
237
+ {
238
+ style: {
239
+ border: `1px solid ${c.composerBorder}`,
240
+ borderRadius: 8,
241
+ background: c.composerBg,
242
+ padding: "9px 12px",
243
+ minHeight: 22,
244
+ fontSize: 15,
245
+ color: c.text
246
+ },
247
+ children: hasText ? /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
248
+ composer.text,
249
+ /* @__PURE__ */ jsxRuntime.jsx(Caret, { color: c.caret })
250
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.placeholder }, children: "Reply\u2026" })
251
+ }
252
+ ) });
253
+ };
254
+ function buttonStyle(c, primary) {
255
+ const base = {
256
+ borderRadius: 4,
257
+ padding: "7px 12px",
258
+ fontWeight: 700,
259
+ fontSize: 13,
260
+ cursor: "default",
261
+ fontFamily: "inherit",
262
+ lineHeight: 1
263
+ };
264
+ return primary ? { ...base, background: c.primary, color: c.primaryText, border: "none" } : {
265
+ ...base,
266
+ background: "transparent",
267
+ color: c.buttonText,
268
+ border: `1px solid ${c.buttonBorder}`
269
+ };
270
+ }
271
+ var SystemMessage = ({ theme, message, author }) => {
272
+ const c = SLACK_COLORS[theme];
273
+ const actions = message.system?.actions ?? [];
274
+ return /* @__PURE__ */ jsxRuntime.jsxs(
275
+ "div",
276
+ {
277
+ style: {
278
+ display: "flex",
279
+ gap: 8,
280
+ padding: "8px 16px 2px",
281
+ ...skinKit.fadeSlideIn(message.revealProgress)
282
+ },
283
+ children: [
284
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "0 0 36px", width: 36 }, children: author ? /* @__PURE__ */ jsxRuntime.jsx(Avatar, { theme, participant: author, size: 36 }) : null }),
285
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
286
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
287
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 700, color: c.text }, children: author?.name ?? "App" }),
288
+ /* @__PURE__ */ jsxRuntime.jsx(
289
+ "span",
290
+ {
291
+ style: {
292
+ fontSize: 10,
293
+ fontWeight: 700,
294
+ letterSpacing: 0.4,
295
+ background: c.appBadgeBg,
296
+ color: c.appBadgeText,
297
+ borderRadius: 2,
298
+ padding: "1px 4px"
299
+ },
300
+ children: "APP"
301
+ }
302
+ ),
303
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, color: c.subtle }, children: formatTime(message.atMs) })
304
+ ] }),
305
+ /* @__PURE__ */ jsxRuntime.jsxs(
306
+ "div",
307
+ {
308
+ style: {
309
+ marginTop: 4,
310
+ borderLeft: `4px solid ${c.cardBar}`,
311
+ borderRadius: 2,
312
+ paddingLeft: 12
313
+ },
314
+ children: [
315
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: c.text }, children: /* @__PURE__ */ jsxRuntime.jsx(skinKit.MessageContent, { nodes: message.content, styles: markStyles(c) }) }),
316
+ 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
317
+ ]
318
+ }
319
+ )
320
+ ] })
321
+ ]
322
+ }
323
+ );
324
+ };
325
+ var Message = ({ theme, message, author }) => {
326
+ const c = SLACK_COLORS[theme];
327
+ const grouped = message.isGrouped;
328
+ return /* @__PURE__ */ jsxRuntime.jsxs(
329
+ "div",
330
+ {
331
+ style: {
332
+ display: "flex",
333
+ gap: 8,
334
+ padding: grouped ? "2px 16px" : "8px 16px 2px",
335
+ ...skinKit.fadeSlideIn(message.revealProgress)
336
+ },
337
+ children: [
338
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "0 0 36px", width: 36 }, children: grouped ? null : /* @__PURE__ */ jsxRuntime.jsx(Avatar, { theme, participant: author, size: 36 }) }),
339
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
340
+ grouped ? null : /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: 8 }, children: [
341
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 700, color: c.text }, children: author.name }),
342
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, color: c.subtle }, children: formatTime(message.atMs) })
343
+ ] }),
344
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: c.text, wordBreak: "break-word" }, children: /* @__PURE__ */ jsxRuntime.jsx(
345
+ skinKit.MessageContent,
346
+ {
347
+ nodes: message.content,
348
+ styles: markStyles(c),
349
+ imageStyle: {
350
+ borderRadius: 8,
351
+ marginTop: 4,
352
+ border: `1px solid ${c.border}`,
353
+ maxWidth: 360
354
+ }
355
+ }
356
+ ) }),
357
+ message.reactions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
358
+ "div",
359
+ {
360
+ style: {
361
+ display: "flex",
362
+ gap: 4,
363
+ marginTop: 4,
364
+ flexWrap: "wrap"
365
+ },
366
+ children: message.reactions.map((r, i) => /* @__PURE__ */ jsxRuntime.jsx(Reaction, { theme, reaction: r }, i))
367
+ }
368
+ ) : null
369
+ ] })
370
+ ]
371
+ }
372
+ );
373
+ };
374
+ var Frame = ({
375
+ theme,
376
+ options,
377
+ children
378
+ }) => {
379
+ const c = SLACK_COLORS[theme];
380
+ const channel = typeof options?.channel === "string" ? options.channel : "#general";
381
+ return /* @__PURE__ */ jsxRuntime.jsxs(
382
+ "div",
383
+ {
384
+ style: {
385
+ fontFamily: SLACK_FONT_STACK,
386
+ background: c.bg,
387
+ color: c.text,
388
+ display: "flex",
389
+ flexDirection: "column",
390
+ height: "100%",
391
+ width: "100%",
392
+ fontSize: 15,
393
+ lineHeight: 1.46668,
394
+ WebkitFontSmoothing: "antialiased"
395
+ },
396
+ children: [
397
+ /* @__PURE__ */ jsxRuntime.jsxs(
398
+ "header",
399
+ {
400
+ style: {
401
+ flex: "0 0 auto",
402
+ padding: "10px 16px",
403
+ borderBottom: `1px solid ${c.border}`,
404
+ display: "flex",
405
+ alignItems: "baseline",
406
+ gap: 8
407
+ },
408
+ children: [
409
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 900, fontSize: 18, color: c.text }, children: "Thread" }),
410
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.subtle, fontSize: 13 }, children: channel })
411
+ ]
412
+ }
413
+ ),
414
+ /* @__PURE__ */ jsxRuntime.jsx(
415
+ "div",
416
+ {
417
+ style: {
418
+ flex: "1 1 auto",
419
+ minHeight: 0,
420
+ display: "flex",
421
+ flexDirection: "column"
422
+ },
423
+ children
424
+ }
425
+ )
426
+ ]
427
+ }
428
+ );
429
+ };
430
+ var slackComponents = {
431
+ Frame,
432
+ Message,
433
+ TypingIndicator,
434
+ Reaction,
435
+ Composer,
436
+ SystemMessage,
437
+ Avatar
438
+ };
439
+
440
+ // src/slack/capabilities.ts
441
+ var slackCapabilities = {
442
+ events: {
443
+ message: "native",
444
+ reaction: "native",
445
+ typing: "native",
446
+ // "X is typing…"
447
+ composerType: "native",
448
+ send: "native",
449
+ edit: "native",
450
+ delete: "native",
451
+ readReceipt: "unsupported",
452
+ // Slack has no per-message read receipts in threads
453
+ system: "native",
454
+ // app/PR cards
455
+ beat: "native"
456
+ },
457
+ content: {
458
+ text: true,
459
+ image: true
460
+ },
461
+ reactions: true,
462
+ threads: true,
463
+ readReceipts: false
464
+ };
465
+
466
+ // src/slack/index.ts
467
+ var slackOptionsSchema = zod.z.object({
468
+ /** Channel label shown in the thread header (e.g. `"#alerts"`). */
469
+ channel: zod.z.string().optional(),
470
+ showThreadHeader: zod.z.boolean().optional()
471
+ });
472
+ var slack = skinKit.defineSkin({
473
+ id: "slack",
474
+ meta: {
475
+ name: "Slack",
476
+ defaultCanvas: { width: 880, height: 720 },
477
+ supportsThemes: ["light", "dark"],
478
+ capabilities: slackCapabilities,
479
+ optionsSchema: slackOptionsSchema,
480
+ fonts: slackFonts
481
+ },
482
+ components: slackComponents,
483
+ tokens: slackTokens
484
+ });
485
+
486
+ // src/claude-code/tokens.ts
487
+ var TUI_COLORS = {
488
+ bg: "#1a1a1a",
489
+ titleBar: "#2a2a2a",
490
+ border: "#3a3a3a",
491
+ text: "#e6e6e6",
492
+ dim: "#8b8b8b",
493
+ prompt: "#d97757",
494
+ // Claude coral
495
+ accent: "#d97757",
496
+ spinner: "#d97757",
497
+ system: "#7aa2f7",
498
+ // tool/blue
499
+ cursor: "#d97757",
500
+ dotRed: "#ff5f56",
501
+ dotYellow: "#ffbd2e",
502
+ dotGreen: "#27c93f"
503
+ };
504
+ var MONO_STACK = '"JetBrains Mono", "SF Mono", Menlo, Monaco, "Cascadia Code", "Roboto Mono", monospace';
505
+ function flatten(content) {
506
+ return content.map((node) => {
507
+ if (node.type === "text") {
508
+ const spans = node.spans;
509
+ return spans.map(
510
+ (s) => typeof s.value === "string" ? s.value : typeof s.label === "string" ? s.label : typeof s.href === "string" ? s.href : ""
511
+ ).join("");
512
+ }
513
+ if (node.type === "image") {
514
+ const alt = node.alt;
515
+ return `[image${alt ? `: ${alt}` : ""}]`;
516
+ }
517
+ return "";
518
+ }).join(" ");
519
+ }
520
+ function streamed(text, progress) {
521
+ if (progress >= 1) return text;
522
+ return text.slice(0, Math.round(progress * text.length));
523
+ }
524
+ var lineStyle = {
525
+ padding: "2px 0",
526
+ whiteSpace: "pre-wrap",
527
+ wordBreak: "break-word"
528
+ };
529
+ var Avatar2 = () => null;
530
+ var Reaction2 = ({ reaction }) => /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: TUI_COLORS.dim }, children: [
531
+ " ",
532
+ reaction.emoji
533
+ ] });
534
+ var SPINNER = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
535
+ var TypingIndicator2 = ({ typing }) => {
536
+ const frame = Math.floor(typing.progress * SPINNER.length * 6) % SPINNER.length;
537
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { ...lineStyle, color: TUI_COLORS.dim }, children: [
538
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: TUI_COLORS.spinner }, children: SPINNER[frame] }),
539
+ " Thinking\u2026"
540
+ ] });
541
+ };
542
+ var Message2 = ({ message }) => {
543
+ const text = streamed(flatten(message.content), message.revealProgress);
544
+ if (message.isSelf) {
545
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { ...lineStyle, display: "flex", gap: 8 }, children: [
546
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: TUI_COLORS.prompt }, children: "\u276F" }),
547
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: TUI_COLORS.text }, children: text })
548
+ ] });
549
+ }
550
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { ...lineStyle, display: "flex", gap: 8 }, children: [
551
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: TUI_COLORS.accent }, children: "\u23FA" }),
552
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: TUI_COLORS.text }, children: text })
553
+ ] });
554
+ };
555
+ var SystemMessage2 = ({ message }) => {
556
+ const text = streamed(flatten(message.content), message.revealProgress);
557
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { ...lineStyle, display: "flex", gap: 8, color: TUI_COLORS.dim }, children: [
558
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: TUI_COLORS.system }, children: "\u23BF" }),
559
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: text })
560
+ ] });
561
+ };
562
+ var Composer2 = ({ composer }) => /* @__PURE__ */ jsxRuntime.jsxs(
563
+ "div",
564
+ {
565
+ style: {
566
+ display: "flex",
567
+ gap: 8,
568
+ padding: "6px 0 2px",
569
+ marginTop: 6,
570
+ borderTop: `1px solid ${TUI_COLORS.border}`
571
+ },
572
+ children: [
573
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: TUI_COLORS.prompt }, children: "\u276F" }),
574
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { whiteSpace: "pre-wrap", color: TUI_COLORS.text }, children: [
575
+ composer.text,
576
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: TUI_COLORS.cursor }, children: "\u2588" })
577
+ ] })
578
+ ]
579
+ }
580
+ );
581
+ var Dot = ({ color }) => /* @__PURE__ */ jsxRuntime.jsx(
582
+ "span",
583
+ {
584
+ style: {
585
+ width: 11,
586
+ height: 11,
587
+ borderRadius: "50%",
588
+ background: color,
589
+ display: "inline-block"
590
+ }
591
+ }
592
+ );
593
+ var Frame2 = ({
594
+ options,
595
+ children
596
+ }) => {
597
+ const title = typeof options?.title === "string" ? options.title : "claude \u2014 typecaast";
598
+ return /* @__PURE__ */ jsxRuntime.jsxs(
599
+ "div",
600
+ {
601
+ style: {
602
+ fontFamily: MONO_STACK,
603
+ background: TUI_COLORS.bg,
604
+ color: TUI_COLORS.text,
605
+ display: "flex",
606
+ flexDirection: "column",
607
+ height: "100%",
608
+ width: "100%",
609
+ fontSize: 13,
610
+ lineHeight: 1.5,
611
+ WebkitFontSmoothing: "antialiased"
612
+ },
613
+ children: [
614
+ /* @__PURE__ */ jsxRuntime.jsxs(
615
+ "div",
616
+ {
617
+ style: {
618
+ flex: "0 0 auto",
619
+ height: 30,
620
+ background: TUI_COLORS.titleBar,
621
+ display: "flex",
622
+ alignItems: "center",
623
+ gap: 8,
624
+ padding: "0 12px",
625
+ borderBottom: `1px solid ${TUI_COLORS.border}`
626
+ },
627
+ children: [
628
+ /* @__PURE__ */ jsxRuntime.jsx(Dot, { color: TUI_COLORS.dotRed }),
629
+ /* @__PURE__ */ jsxRuntime.jsx(Dot, { color: TUI_COLORS.dotYellow }),
630
+ /* @__PURE__ */ jsxRuntime.jsx(Dot, { color: TUI_COLORS.dotGreen }),
631
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { marginLeft: 6, color: TUI_COLORS.dim, fontSize: 12 }, children: title })
632
+ ]
633
+ }
634
+ ),
635
+ /* @__PURE__ */ jsxRuntime.jsx(
636
+ "div",
637
+ {
638
+ style: {
639
+ flex: "1 1 auto",
640
+ minHeight: 0,
641
+ display: "flex",
642
+ flexDirection: "column",
643
+ padding: "10px 14px",
644
+ overflow: "hidden"
645
+ },
646
+ children
647
+ }
648
+ )
649
+ ]
650
+ }
651
+ );
652
+ };
653
+ var tuiComponents = {
654
+ Frame: Frame2,
655
+ Message: Message2,
656
+ TypingIndicator: TypingIndicator2,
657
+ Reaction: Reaction2,
658
+ Composer: Composer2,
659
+ SystemMessage: SystemMessage2,
660
+ Avatar: Avatar2
661
+ };
662
+
663
+ // src/claude-code/capabilities.ts
664
+ var tuiCapabilities = {
665
+ events: {
666
+ message: "native",
667
+ composerType: "native",
668
+ send: "native",
669
+ typing: "native",
670
+ // spinner
671
+ system: "native",
672
+ // tool/output lines
673
+ reaction: "unsupported",
674
+ readReceipt: "unsupported",
675
+ edit: "native",
676
+ delete: "native",
677
+ beat: "native"
678
+ },
679
+ content: {
680
+ text: true,
681
+ image: false
682
+ // terminals don't render images
683
+ },
684
+ reactions: false,
685
+ threads: false,
686
+ readReceipts: false
687
+ };
688
+
689
+ // src/claude-code/fonts.ts
690
+ var tuiFonts = [
691
+ {
692
+ family: "JetBrains Mono",
693
+ weights: [400, 700],
694
+ sources: [
695
+ {
696
+ url: "https://cdn.jsdelivr.net/fontsource/fonts/jetbrains-mono@latest/latin-400-normal.woff2",
697
+ weight: 400,
698
+ format: "woff2"
699
+ },
700
+ {
701
+ url: "https://cdn.jsdelivr.net/fontsource/fonts/jetbrains-mono@latest/latin-700-normal.woff2",
702
+ weight: 700,
703
+ format: "woff2"
704
+ }
705
+ ]
706
+ }
707
+ ];
708
+
709
+ // src/claude-code/index.ts
710
+ var tuiOptionsSchema = zod.z.object({
711
+ /** Title-bar label (e.g. `"claude — zsh"`). */
712
+ title: zod.z.string().optional()
713
+ });
714
+ var claudeCode = skinKit.defineSkin({
715
+ id: "claude-code",
716
+ meta: {
717
+ name: "Claude Code (TUI)",
718
+ defaultCanvas: { width: 720, height: 480 },
719
+ supportsThemes: ["dark"],
720
+ capabilities: tuiCapabilities,
721
+ optionsSchema: tuiOptionsSchema,
722
+ fonts: tuiFonts
723
+ },
724
+ components: tuiComponents
725
+ });
726
+
727
+ // src/imessage/tokens.ts
728
+ var IMESSAGE_COLORS = {
729
+ light: {
730
+ bg: "#ffffff",
731
+ text: "#000000",
732
+ subtle: "#8e8e93",
733
+ selfBubble: "#0b93f6",
734
+ selfText: "#ffffff",
735
+ otherBubble: "#e9e9eb",
736
+ otherText: "#000000",
737
+ navBg: "rgba(249,249,249,0.94)",
738
+ navBorder: "rgba(0,0,0,0.12)",
739
+ statusText: "#000000",
740
+ composerBg: "#ffffff",
741
+ composerBorder: "#d1d1d6",
742
+ placeholder: "#8e8e93",
743
+ keyboardBg: "#d1d4db",
744
+ keyBg: "#ffffff",
745
+ keyText: "#000000",
746
+ keyShadow: "rgba(0,0,0,0.28)",
747
+ tapbackBg: "#e9e9eb",
748
+ link: "#0b93f6"
749
+ },
750
+ dark: {
751
+ bg: "#000000",
752
+ text: "#ffffff",
753
+ subtle: "#8e8e93",
754
+ selfBubble: "#0b93f6",
755
+ selfText: "#ffffff",
756
+ otherBubble: "#26252a",
757
+ otherText: "#ffffff",
758
+ navBg: "rgba(22,22,22,0.92)",
759
+ navBorder: "rgba(255,255,255,0.12)",
760
+ statusText: "#ffffff",
761
+ composerBg: "#1c1c1e",
762
+ composerBorder: "#38383a",
763
+ placeholder: "#8e8e93",
764
+ keyboardBg: "#1c1c1e",
765
+ keyBg: "#6b6b6f",
766
+ keyText: "#ffffff",
767
+ keyShadow: "rgba(0,0,0,0.5)",
768
+ tapbackBg: "#26252a",
769
+ link: "#0b93f6"
770
+ }
771
+ };
772
+ var IMESSAGE_FONT_STACK = 'Inter, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", Roboto, sans-serif';
773
+ var imessageTokens = {
774
+ light: {
775
+ colors: IMESSAGE_COLORS.light
776
+ },
777
+ dark: { colors: IMESSAGE_COLORS.dark }
778
+ };
779
+ var RADIUS = 18;
780
+ var TAIL = 5;
781
+ function initials2(name) {
782
+ return name.split(/\s+/).map((w) => w.charAt(0)).slice(0, 2).join("").toUpperCase();
783
+ }
784
+ function markStyles2(c) {
785
+ return {
786
+ link: { color: c.link, textDecoration: "underline" },
787
+ code: {
788
+ fontFamily: "Menlo, monospace",
789
+ fontSize: "0.9em"
790
+ }
791
+ };
792
+ }
793
+ var StatusBar = ({ theme }) => {
794
+ const c = IMESSAGE_COLORS[theme];
795
+ return /* @__PURE__ */ jsxRuntime.jsxs(
796
+ "div",
797
+ {
798
+ style: {
799
+ flex: "0 0 auto",
800
+ height: 44,
801
+ display: "flex",
802
+ alignItems: "center",
803
+ justifyContent: "space-between",
804
+ padding: "0 24px",
805
+ color: c.statusText,
806
+ fontWeight: 600,
807
+ fontSize: 15
808
+ },
809
+ children: [
810
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "9:41" }),
811
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
812
+ /* @__PURE__ */ jsxRuntime.jsx(
813
+ "span",
814
+ {
815
+ style: { display: "inline-flex", alignItems: "flex-end", gap: 1.5 },
816
+ children: [5, 7, 9, 11].map((h, i) => /* @__PURE__ */ jsxRuntime.jsx(
817
+ "span",
818
+ {
819
+ style: {
820
+ width: 3,
821
+ height: h,
822
+ borderRadius: 1,
823
+ background: c.statusText
824
+ }
825
+ },
826
+ i
827
+ ))
828
+ }
829
+ ),
830
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 13, fontWeight: 600 }, children: "5G" }),
831
+ /* @__PURE__ */ jsxRuntime.jsx(
832
+ "span",
833
+ {
834
+ style: {
835
+ display: "inline-block",
836
+ width: 24,
837
+ height: 12,
838
+ borderRadius: 3,
839
+ border: `1px solid ${c.statusText}`,
840
+ position: "relative",
841
+ opacity: 0.9
842
+ },
843
+ children: /* @__PURE__ */ jsxRuntime.jsx(
844
+ "span",
845
+ {
846
+ style: {
847
+ position: "absolute",
848
+ inset: 1.5,
849
+ width: "70%",
850
+ borderRadius: 1,
851
+ background: c.statusText
852
+ }
853
+ }
854
+ )
855
+ }
856
+ )
857
+ ] })
858
+ ]
859
+ }
860
+ );
861
+ };
862
+ var Avatar3 = ({ participant, size = 30 }) => {
863
+ if (participant.avatar) {
864
+ return /* @__PURE__ */ jsxRuntime.jsx(
865
+ "img",
866
+ {
867
+ src: participant.avatar,
868
+ alt: participant.name,
869
+ width: size,
870
+ height: size,
871
+ style: {
872
+ width: size,
873
+ height: size,
874
+ borderRadius: "50%",
875
+ objectFit: "cover"
876
+ }
877
+ }
878
+ );
879
+ }
880
+ return /* @__PURE__ */ jsxRuntime.jsx(
881
+ "div",
882
+ {
883
+ style: {
884
+ width: size,
885
+ height: size,
886
+ borderRadius: "50%",
887
+ background: participant.color ?? "#a9a9af",
888
+ color: "#fff",
889
+ display: "flex",
890
+ alignItems: "center",
891
+ justifyContent: "center",
892
+ fontSize: size * 0.4,
893
+ fontWeight: 500
894
+ },
895
+ children: initials2(participant.name)
896
+ }
897
+ );
898
+ };
899
+ var NavBar = ({ theme, title, participant }) => {
900
+ const c = IMESSAGE_COLORS[theme];
901
+ return /* @__PURE__ */ jsxRuntime.jsxs(
902
+ "div",
903
+ {
904
+ style: {
905
+ flex: "0 0 auto",
906
+ display: "flex",
907
+ flexDirection: "column",
908
+ alignItems: "center",
909
+ gap: 3,
910
+ padding: "4px 0 8px",
911
+ background: c.navBg,
912
+ borderBottom: `0.5px solid ${c.navBorder}`,
913
+ backdropFilter: "blur(20px)"
914
+ },
915
+ children: [
916
+ participant ? /* @__PURE__ */ jsxRuntime.jsx(Avatar3, { theme, participant, size: 42 }) : null,
917
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: 11, fontWeight: 500, color: c.text }, children: [
918
+ title,
919
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { marginLeft: 3, color: c.subtle }, children: "\u203A" })
920
+ ] })
921
+ ]
922
+ }
923
+ );
924
+ };
925
+ var Reaction3 = ({ theme, reaction }) => {
926
+ const c = IMESSAGE_COLORS[theme];
927
+ return /* @__PURE__ */ jsxRuntime.jsx(
928
+ "span",
929
+ {
930
+ style: {
931
+ ...skinKit.popIn(reaction.progress),
932
+ display: "inline-flex",
933
+ alignItems: "center",
934
+ justifyContent: "center",
935
+ background: c.tapbackBg,
936
+ borderRadius: 12,
937
+ padding: "2px 6px",
938
+ fontSize: 12,
939
+ boxShadow: `0 1px 2px ${theme === "dark" ? "rgba(0,0,0,0.5)" : "rgba(0,0,0,0.15)"}`
940
+ },
941
+ children: reaction.emoji
942
+ }
943
+ );
944
+ };
945
+ var Message3 = ({ theme, message }) => {
946
+ const c = IMESSAGE_COLORS[theme];
947
+ const self = message.isSelf;
948
+ const bubbleStyle = {
949
+ maxWidth: "72%",
950
+ padding: "7px 12px",
951
+ borderRadius: RADIUS,
952
+ background: self ? c.selfBubble : c.otherBubble,
953
+ color: self ? c.selfText : c.otherText,
954
+ fontSize: 16,
955
+ lineHeight: 1.3,
956
+ wordBreak: "break-word",
957
+ ...self ? { borderBottomRightRadius: TAIL } : { borderBottomLeftRadius: TAIL }
958
+ };
959
+ return /* @__PURE__ */ jsxRuntime.jsx(
960
+ "div",
961
+ {
962
+ style: {
963
+ display: "flex",
964
+ justifyContent: self ? "flex-end" : "flex-start",
965
+ padding: message.isGrouped ? "1px 12px" : "3px 12px",
966
+ ...skinKit.fadeSlideIn(message.revealProgress, { distance: 6 })
967
+ },
968
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "relative" }, children: [
969
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: bubbleStyle, children: /* @__PURE__ */ jsxRuntime.jsx(
970
+ skinKit.MessageContent,
971
+ {
972
+ nodes: message.content,
973
+ styles: markStyles2(c),
974
+ imageStyle: { borderRadius: 14, maxWidth: 240, marginTop: 2 }
975
+ }
976
+ ) }),
977
+ message.reactions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
978
+ "div",
979
+ {
980
+ style: {
981
+ position: "absolute",
982
+ top: -14,
983
+ ...self ? { left: -6 } : { right: -6 },
984
+ display: "flex",
985
+ gap: 2
986
+ },
987
+ children: message.reactions.map((r, i) => /* @__PURE__ */ jsxRuntime.jsx(Reaction3, { theme, reaction: r }, i))
988
+ }
989
+ ) : null
990
+ ] })
991
+ }
992
+ );
993
+ };
994
+ var TypingIndicator3 = ({ theme, typing }) => {
995
+ const c = IMESSAGE_COLORS[theme];
996
+ return /* @__PURE__ */ jsxRuntime.jsx(
997
+ "div",
998
+ {
999
+ style: {
1000
+ display: "flex",
1001
+ justifyContent: "flex-start",
1002
+ padding: "3px 12px"
1003
+ },
1004
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1005
+ "div",
1006
+ {
1007
+ style: {
1008
+ background: c.otherBubble,
1009
+ borderRadius: RADIUS,
1010
+ borderBottomLeftRadius: TAIL,
1011
+ padding: "10px 14px"
1012
+ },
1013
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1014
+ skinKit.TypingDots,
1015
+ {
1016
+ progress: typing.progress,
1017
+ color: c.subtle,
1018
+ size: 8,
1019
+ gap: 5
1020
+ }
1021
+ )
1022
+ }
1023
+ )
1024
+ }
1025
+ );
1026
+ };
1027
+ var SystemMessage3 = ({ theme, message }) => {
1028
+ const c = IMESSAGE_COLORS[theme];
1029
+ const text = message.content.map(
1030
+ (n) => n.type === "text" ? n.spans.map((s) => s.value ?? "").join("") : ""
1031
+ ).join(" ");
1032
+ return /* @__PURE__ */ jsxRuntime.jsx(
1033
+ "div",
1034
+ {
1035
+ style: {
1036
+ textAlign: "center",
1037
+ color: c.subtle,
1038
+ fontSize: 12,
1039
+ fontWeight: 500,
1040
+ padding: "8px 0",
1041
+ ...skinKit.fadeSlideIn(message.revealProgress, { distance: 0 })
1042
+ },
1043
+ children: text
1044
+ }
1045
+ );
1046
+ };
1047
+ var Composer3 = ({ theme, composer }) => {
1048
+ const c = IMESSAGE_COLORS[theme];
1049
+ const hasText = composer.text.length > 0;
1050
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1051
+ "div",
1052
+ {
1053
+ style: {
1054
+ flex: "0 0 auto",
1055
+ display: "flex",
1056
+ alignItems: "flex-end",
1057
+ gap: 8,
1058
+ padding: "8px 12px"
1059
+ },
1060
+ children: [
1061
+ /* @__PURE__ */ jsxRuntime.jsx(
1062
+ "span",
1063
+ {
1064
+ style: {
1065
+ width: 30,
1066
+ height: 30,
1067
+ borderRadius: "50%",
1068
+ background: theme === "dark" ? "#1c1c1e" : "#e9e9eb",
1069
+ color: c.subtle,
1070
+ display: "flex",
1071
+ alignItems: "center",
1072
+ justifyContent: "center",
1073
+ fontSize: 20
1074
+ },
1075
+ children: "+"
1076
+ }
1077
+ ),
1078
+ /* @__PURE__ */ jsxRuntime.jsx(
1079
+ "div",
1080
+ {
1081
+ style: {
1082
+ flex: 1,
1083
+ minHeight: 34,
1084
+ display: "flex",
1085
+ alignItems: "center",
1086
+ border: `1px solid ${c.composerBorder}`,
1087
+ borderRadius: 18,
1088
+ padding: "5px 12px",
1089
+ background: c.composerBg,
1090
+ color: c.text,
1091
+ fontSize: 16
1092
+ },
1093
+ children: hasText ? /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1094
+ composer.text,
1095
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.selfBubble }, children: "|" })
1096
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.placeholder }, children: "iMessage" })
1097
+ }
1098
+ ),
1099
+ hasText ? /* @__PURE__ */ jsxRuntime.jsx(
1100
+ "span",
1101
+ {
1102
+ style: {
1103
+ width: 30,
1104
+ height: 30,
1105
+ borderRadius: "50%",
1106
+ background: c.selfBubble,
1107
+ color: "#fff",
1108
+ display: "flex",
1109
+ alignItems: "center",
1110
+ justifyContent: "center",
1111
+ fontSize: 17
1112
+ },
1113
+ children: "\u2191"
1114
+ }
1115
+ ) : null
1116
+ ]
1117
+ }
1118
+ );
1119
+ };
1120
+ var KEY_ROWS = [
1121
+ ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"],
1122
+ ["a", "s", "d", "f", "g", "h", "j", "k", "l"],
1123
+ ["\u21E7", "z", "x", "c", "v", "b", "n", "m", "\u232B"]
1124
+ ];
1125
+ var Keyboard = ({ theme }) => {
1126
+ const c = IMESSAGE_COLORS[theme];
1127
+ const key = (label, wide = false) => /* @__PURE__ */ jsxRuntime.jsx(
1128
+ "span",
1129
+ {
1130
+ style: {
1131
+ flex: wide ? 1.6 : 1,
1132
+ textAlign: "center",
1133
+ padding: "9px 0",
1134
+ borderRadius: 5,
1135
+ background: label === "\u21E7" || label === "\u232B" ? "transparent" : c.keyBg,
1136
+ color: c.keyText,
1137
+ fontSize: 16,
1138
+ fontWeight: 400,
1139
+ boxShadow: label === "\u21E7" || label === "\u232B" ? "none" : `0 1px 0 ${c.keyShadow}`,
1140
+ textTransform: label.length === 1 ? "uppercase" : "none"
1141
+ },
1142
+ children: label
1143
+ },
1144
+ label
1145
+ );
1146
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1147
+ "div",
1148
+ {
1149
+ style: {
1150
+ flex: "0 0 auto",
1151
+ background: c.keyboardBg,
1152
+ padding: "6px 3px 4px",
1153
+ display: "flex",
1154
+ flexDirection: "column",
1155
+ gap: 7
1156
+ },
1157
+ children: [
1158
+ KEY_ROWS.map((row, i) => /* @__PURE__ */ jsxRuntime.jsx(
1159
+ "div",
1160
+ {
1161
+ style: {
1162
+ display: "flex",
1163
+ gap: 5,
1164
+ padding: i === 1 ? "0 18px" : "0 3px"
1165
+ },
1166
+ children: row.map((k) => key(k, k === "\u21E7" || k === "\u232B"))
1167
+ },
1168
+ i
1169
+ )),
1170
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 5, padding: "0 3px" }, children: [
1171
+ key("123", true),
1172
+ key("space", false),
1173
+ key("return", true)
1174
+ ] })
1175
+ ]
1176
+ }
1177
+ );
1178
+ };
1179
+ var Frame3 = ({
1180
+ theme,
1181
+ options,
1182
+ children
1183
+ }) => {
1184
+ const c = IMESSAGE_COLORS[theme];
1185
+ const contact = typeof options?.contact === "string" ? options.contact : "Messages";
1186
+ const showKeyboard = options?.keyboard !== false;
1187
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1188
+ "div",
1189
+ {
1190
+ style: {
1191
+ fontFamily: IMESSAGE_FONT_STACK,
1192
+ background: c.bg,
1193
+ color: c.text,
1194
+ display: "flex",
1195
+ flexDirection: "column",
1196
+ height: "100%",
1197
+ width: "100%",
1198
+ WebkitFontSmoothing: "antialiased"
1199
+ },
1200
+ children: [
1201
+ /* @__PURE__ */ jsxRuntime.jsx(StatusBar, { theme }),
1202
+ /* @__PURE__ */ jsxRuntime.jsx(NavBar, { theme, title: contact }),
1203
+ /* @__PURE__ */ jsxRuntime.jsx(
1204
+ "div",
1205
+ {
1206
+ style: {
1207
+ flex: "1 1 auto",
1208
+ minHeight: 0,
1209
+ display: "flex",
1210
+ flexDirection: "column",
1211
+ justifyContent: "flex-end",
1212
+ overflow: "hidden",
1213
+ paddingBottom: 4
1214
+ },
1215
+ children
1216
+ }
1217
+ ),
1218
+ showKeyboard ? /* @__PURE__ */ jsxRuntime.jsx(Keyboard, { theme }) : null
1219
+ ]
1220
+ }
1221
+ );
1222
+ };
1223
+ var imessageComponents = {
1224
+ Frame: Frame3,
1225
+ Message: Message3,
1226
+ TypingIndicator: TypingIndicator3,
1227
+ Reaction: Reaction3,
1228
+ Composer: Composer3,
1229
+ SystemMessage: SystemMessage3,
1230
+ Avatar: Avatar3
1231
+ };
1232
+
1233
+ // src/imessage/capabilities.ts
1234
+ var imessageCapabilities = {
1235
+ events: {
1236
+ message: "native",
1237
+ composerType: "native",
1238
+ send: "native",
1239
+ typing: "native",
1240
+ // dot bubble
1241
+ reaction: "native",
1242
+ // tapbacks
1243
+ readReceipt: "native",
1244
+ // "Delivered" / "Read"
1245
+ edit: "native",
1246
+ delete: "native",
1247
+ system: "fallback",
1248
+ // rendered as centered grey text, not an app card
1249
+ beat: "native"
1250
+ },
1251
+ content: {
1252
+ text: true,
1253
+ image: true
1254
+ },
1255
+ reactions: true,
1256
+ threads: false,
1257
+ readReceipts: true
1258
+ };
1259
+
1260
+ // src/imessage/fonts.ts
1261
+ var imessageFonts = [
1262
+ {
1263
+ family: "Inter",
1264
+ intended: "SF Pro",
1265
+ weights: [400, 500, 600],
1266
+ sources: [
1267
+ {
1268
+ url: "https://cdn.jsdelivr.net/fontsource/fonts/inter@latest/latin-400-normal.woff2",
1269
+ weight: 400,
1270
+ format: "woff2"
1271
+ },
1272
+ {
1273
+ url: "https://cdn.jsdelivr.net/fontsource/fonts/inter@latest/latin-600-normal.woff2",
1274
+ weight: 600,
1275
+ format: "woff2"
1276
+ }
1277
+ ]
1278
+ }
1279
+ ];
1280
+
1281
+ // src/imessage/index.ts
1282
+ var imessageOptionsSchema = zod.z.object({
1283
+ /** Contact name shown in the nav bar. */
1284
+ contact: zod.z.string().optional(),
1285
+ /** Show the on-screen keyboard (default true). */
1286
+ keyboard: zod.z.boolean().optional()
1287
+ });
1288
+ var imessage = skinKit.defineSkin({
1289
+ id: "imessage",
1290
+ meta: {
1291
+ name: "iMessage (iOS)",
1292
+ defaultCanvas: { width: 390, height: 844 },
1293
+ supportsThemes: ["light", "dark"],
1294
+ capabilities: imessageCapabilities,
1295
+ optionsSchema: imessageOptionsSchema,
1296
+ fonts: imessageFonts
1297
+ },
1298
+ components: imessageComponents,
1299
+ tokens: imessageTokens
1300
+ });
1301
+
1302
+ // src/whatsapp/tokens.ts
1303
+ var WHATSAPP_COLORS = {
1304
+ light: {
1305
+ wallpaper: "#efeae2",
1306
+ header: "#008069",
1307
+ headerText: "#ffffff",
1308
+ headerSubtle: "rgba(255,255,255,0.8)",
1309
+ text: "#111b21",
1310
+ subtle: "#667781",
1311
+ selfBubble: "#d9fdd3",
1312
+ selfText: "#111b21",
1313
+ otherBubble: "#ffffff",
1314
+ otherText: "#111b21",
1315
+ bubbleTime: "#667781",
1316
+ tick: "#53bdeb",
1317
+ composerBar: "#f0f2f5",
1318
+ inputBg: "#ffffff",
1319
+ placeholder: "#8696a0",
1320
+ accent: "#00a884",
1321
+ reactionBg: "#ffffff"
1322
+ },
1323
+ dark: {
1324
+ wallpaper: "#0b141a",
1325
+ header: "#202c33",
1326
+ headerText: "#e9edef",
1327
+ headerSubtle: "#8696a0",
1328
+ text: "#e9edef",
1329
+ subtle: "#8696a0",
1330
+ selfBubble: "#005c4b",
1331
+ selfText: "#e9edef",
1332
+ otherBubble: "#202c33",
1333
+ otherText: "#e9edef",
1334
+ bubbleTime: "#8696a0",
1335
+ tick: "#53bdeb",
1336
+ composerBar: "#202c33",
1337
+ inputBg: "#2a3942",
1338
+ placeholder: "#8696a0",
1339
+ accent: "#00a884",
1340
+ reactionBg: "#2a3942"
1341
+ }
1342
+ };
1343
+ var WHATSAPP_FONT_STACK = '"Helvetica Neue", Helvetica, -apple-system, "Segoe UI", Roboto, Arial, sans-serif';
1344
+ var whatsappTokens = {
1345
+ light: {
1346
+ colors: WHATSAPP_COLORS.light
1347
+ },
1348
+ dark: { colors: WHATSAPP_COLORS.dark }
1349
+ };
1350
+ var RADIUS2 = 8;
1351
+ function formatTime2(atMs) {
1352
+ const base = 9 * 3600 * 1e3;
1353
+ const total = Math.floor((base + atMs) / 1e3);
1354
+ const h = Math.floor(total / 3600) % 24;
1355
+ const m = Math.floor(total % 3600 / 60);
1356
+ const ampm = h >= 12 ? "PM" : "AM";
1357
+ const hr = h % 12 === 0 ? 12 : h % 12;
1358
+ return `${hr}:${String(m).padStart(2, "0")} ${ampm}`;
1359
+ }
1360
+ function initials3(name) {
1361
+ return name.split(/\s+/).map((w) => w.charAt(0)).slice(0, 2).join("").toUpperCase();
1362
+ }
1363
+ var Avatar4 = ({ participant, size = 40 }) => {
1364
+ if (participant.avatar) {
1365
+ return /* @__PURE__ */ jsxRuntime.jsx(
1366
+ "img",
1367
+ {
1368
+ src: participant.avatar,
1369
+ alt: participant.name,
1370
+ width: size,
1371
+ height: size,
1372
+ style: {
1373
+ width: size,
1374
+ height: size,
1375
+ borderRadius: "50%",
1376
+ objectFit: "cover"
1377
+ }
1378
+ }
1379
+ );
1380
+ }
1381
+ return /* @__PURE__ */ jsxRuntime.jsx(
1382
+ "div",
1383
+ {
1384
+ style: {
1385
+ width: size,
1386
+ height: size,
1387
+ borderRadius: "50%",
1388
+ background: participant.color ?? "#6a7175",
1389
+ color: "#fff",
1390
+ display: "flex",
1391
+ alignItems: "center",
1392
+ justifyContent: "center",
1393
+ fontSize: size * 0.4,
1394
+ fontWeight: 500
1395
+ },
1396
+ children: initials3(participant.name)
1397
+ }
1398
+ );
1399
+ };
1400
+ var DoubleTick = ({ color }) => /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color, fontSize: 13, letterSpacing: -3, marginLeft: 3 }, children: "\u2713\u2713" });
1401
+ var Reaction4 = ({ theme, reaction }) => {
1402
+ const c = WHATSAPP_COLORS[theme];
1403
+ return /* @__PURE__ */ jsxRuntime.jsx(
1404
+ "span",
1405
+ {
1406
+ style: {
1407
+ ...skinKit.popIn(reaction.progress),
1408
+ display: "inline-flex",
1409
+ alignItems: "center",
1410
+ background: c.reactionBg,
1411
+ borderRadius: 12,
1412
+ padding: "1px 5px",
1413
+ fontSize: 12,
1414
+ boxShadow: `0 1px 2px rgba(0,0,0,${theme === "dark" ? 0.4 : 0.18})`
1415
+ },
1416
+ children: reaction.emoji
1417
+ }
1418
+ );
1419
+ };
1420
+ var Message4 = ({ theme, message }) => {
1421
+ const c = WHATSAPP_COLORS[theme];
1422
+ const self = message.isSelf;
1423
+ const bubble = {
1424
+ position: "relative",
1425
+ maxWidth: "78%",
1426
+ padding: "6px 8px 5px 9px",
1427
+ borderRadius: RADIUS2,
1428
+ background: self ? c.selfBubble : c.otherBubble,
1429
+ color: self ? c.selfText : c.otherText,
1430
+ fontSize: 14.2,
1431
+ lineHeight: 1.32,
1432
+ wordBreak: "break-word",
1433
+ boxShadow: `0 1px 0.5px rgba(0,0,0,${theme === "dark" ? 0.2 : 0.13})`,
1434
+ ...self ? { borderTopRightRadius: 0 } : { borderTopLeftRadius: 0 }
1435
+ };
1436
+ return /* @__PURE__ */ jsxRuntime.jsx(
1437
+ "div",
1438
+ {
1439
+ style: {
1440
+ display: "flex",
1441
+ justifyContent: self ? "flex-end" : "flex-start",
1442
+ padding: message.isGrouped ? "1px 12px" : "3px 12px",
1443
+ ...skinKit.fadeSlideIn(message.revealProgress, { distance: 5 })
1444
+ },
1445
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "relative" }, children: [
1446
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: bubble, children: [
1447
+ /* @__PURE__ */ jsxRuntime.jsx(
1448
+ skinKit.MessageContent,
1449
+ {
1450
+ nodes: message.content,
1451
+ imageStyle: { borderRadius: 6, maxWidth: 240, marginBottom: 2 }
1452
+ }
1453
+ ),
1454
+ /* @__PURE__ */ jsxRuntime.jsxs(
1455
+ "span",
1456
+ {
1457
+ style: {
1458
+ float: "right",
1459
+ marginLeft: 8,
1460
+ marginTop: 2,
1461
+ fontSize: 11,
1462
+ color: c.bubbleTime,
1463
+ display: "inline-flex",
1464
+ alignItems: "center",
1465
+ whiteSpace: "nowrap"
1466
+ },
1467
+ children: [
1468
+ formatTime2(message.atMs),
1469
+ self ? /* @__PURE__ */ jsxRuntime.jsx(DoubleTick, { color: c.tick }) : null
1470
+ ]
1471
+ }
1472
+ )
1473
+ ] }),
1474
+ message.reactions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
1475
+ "div",
1476
+ {
1477
+ style: {
1478
+ position: "absolute",
1479
+ bottom: -10,
1480
+ ...self ? { right: 8 } : { left: 8 },
1481
+ display: "flex",
1482
+ gap: 2
1483
+ },
1484
+ children: message.reactions.map((r, i) => /* @__PURE__ */ jsxRuntime.jsx(Reaction4, { theme, reaction: r }, i))
1485
+ }
1486
+ ) : null
1487
+ ] })
1488
+ }
1489
+ );
1490
+ };
1491
+ var TypingIndicator4 = ({ theme, typing }) => {
1492
+ const c = WHATSAPP_COLORS[theme];
1493
+ return /* @__PURE__ */ jsxRuntime.jsx(
1494
+ "div",
1495
+ {
1496
+ style: {
1497
+ display: "flex",
1498
+ justifyContent: "flex-start",
1499
+ padding: "3px 12px"
1500
+ },
1501
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1502
+ "div",
1503
+ {
1504
+ style: {
1505
+ background: c.otherBubble,
1506
+ borderRadius: RADIUS2,
1507
+ borderTopLeftRadius: 0,
1508
+ padding: "9px 12px",
1509
+ boxShadow: `0 1px 0.5px rgba(0,0,0,${theme === "dark" ? 0.2 : 0.13})`
1510
+ },
1511
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1512
+ skinKit.TypingDots,
1513
+ {
1514
+ progress: typing.progress,
1515
+ color: c.subtle,
1516
+ size: 7,
1517
+ gap: 4
1518
+ }
1519
+ )
1520
+ }
1521
+ )
1522
+ }
1523
+ );
1524
+ };
1525
+ var SystemMessage4 = ({ theme, message }) => {
1526
+ const c = WHATSAPP_COLORS[theme];
1527
+ const text = message.content.map(
1528
+ (n) => n.type === "text" ? n.spans.map((s) => s.value ?? "").join("") : ""
1529
+ ).join(" ");
1530
+ return /* @__PURE__ */ jsxRuntime.jsx(
1531
+ "div",
1532
+ {
1533
+ style: {
1534
+ display: "flex",
1535
+ justifyContent: "center",
1536
+ padding: "6px 0",
1537
+ ...skinKit.fadeSlideIn(message.revealProgress, { distance: 0 })
1538
+ },
1539
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1540
+ "span",
1541
+ {
1542
+ style: {
1543
+ background: theme === "dark" ? "#182229" : "#ffffff",
1544
+ color: c.subtle,
1545
+ fontSize: 12.5,
1546
+ padding: "5px 12px",
1547
+ borderRadius: 8,
1548
+ boxShadow: `0 1px 0.5px rgba(0,0,0,0.13)`
1549
+ },
1550
+ children: text
1551
+ }
1552
+ )
1553
+ }
1554
+ );
1555
+ };
1556
+ var Composer4 = ({ theme, composer }) => {
1557
+ const c = WHATSAPP_COLORS[theme];
1558
+ const hasText = composer.text.length > 0;
1559
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1560
+ "div",
1561
+ {
1562
+ style: {
1563
+ flex: "0 0 auto",
1564
+ display: "flex",
1565
+ alignItems: "flex-end",
1566
+ gap: 8,
1567
+ padding: "8px 10px",
1568
+ background: c.composerBar
1569
+ },
1570
+ children: [
1571
+ /* @__PURE__ */ jsxRuntime.jsxs(
1572
+ "div",
1573
+ {
1574
+ style: {
1575
+ flex: 1,
1576
+ minHeight: 40,
1577
+ display: "flex",
1578
+ alignItems: "center",
1579
+ gap: 8,
1580
+ background: c.inputBg,
1581
+ borderRadius: 22,
1582
+ padding: "8px 14px",
1583
+ color: c.text,
1584
+ fontSize: 15
1585
+ },
1586
+ children: [
1587
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.subtle, fontSize: 18 }, children: "\u{1F642}" }),
1588
+ hasText ? /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1589
+ composer.text,
1590
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.accent }, children: "|" })
1591
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.placeholder }, children: "Message" })
1592
+ ]
1593
+ }
1594
+ ),
1595
+ /* @__PURE__ */ jsxRuntime.jsx(
1596
+ "span",
1597
+ {
1598
+ style: {
1599
+ width: 40,
1600
+ height: 40,
1601
+ borderRadius: "50%",
1602
+ background: c.accent,
1603
+ color: "#fff",
1604
+ display: "flex",
1605
+ alignItems: "center",
1606
+ justifyContent: "center",
1607
+ fontSize: 18
1608
+ },
1609
+ children: hasText ? "\u27A4" : "\u{1F3A4}"
1610
+ }
1611
+ )
1612
+ ]
1613
+ }
1614
+ );
1615
+ };
1616
+ var Frame4 = ({
1617
+ theme,
1618
+ options,
1619
+ children
1620
+ }) => {
1621
+ const c = WHATSAPP_COLORS[theme];
1622
+ const contact = typeof options?.contact === "string" ? options.contact : "WhatsApp";
1623
+ const status = typeof options?.status === "string" ? options.status : "online";
1624
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1625
+ "div",
1626
+ {
1627
+ style: {
1628
+ fontFamily: WHATSAPP_FONT_STACK,
1629
+ background: c.wallpaper,
1630
+ color: c.text,
1631
+ display: "flex",
1632
+ flexDirection: "column",
1633
+ height: "100%",
1634
+ width: "100%",
1635
+ WebkitFontSmoothing: "antialiased"
1636
+ },
1637
+ children: [
1638
+ /* @__PURE__ */ jsxRuntime.jsxs(
1639
+ "div",
1640
+ {
1641
+ style: {
1642
+ flex: "0 0 auto",
1643
+ display: "flex",
1644
+ alignItems: "center",
1645
+ gap: 10,
1646
+ padding: "8px 12px",
1647
+ background: c.header,
1648
+ color: c.headerText
1649
+ },
1650
+ children: [
1651
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 22, marginRight: -2 }, children: "\u2039" }),
1652
+ /* @__PURE__ */ jsxRuntime.jsx(
1653
+ "div",
1654
+ {
1655
+ style: {
1656
+ width: 38,
1657
+ height: 38,
1658
+ borderRadius: "50%",
1659
+ background: "#6a7175",
1660
+ color: "#fff",
1661
+ display: "flex",
1662
+ alignItems: "center",
1663
+ justifyContent: "center",
1664
+ fontSize: 15,
1665
+ fontWeight: 500
1666
+ },
1667
+ children: initials3(contact)
1668
+ }
1669
+ ),
1670
+ /* @__PURE__ */ jsxRuntime.jsxs(
1671
+ "div",
1672
+ {
1673
+ style: { display: "flex", flexDirection: "column", lineHeight: 1.2 },
1674
+ children: [
1675
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 16, fontWeight: 600 }, children: contact }),
1676
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, color: c.headerSubtle }, children: status })
1677
+ ]
1678
+ }
1679
+ )
1680
+ ]
1681
+ }
1682
+ ),
1683
+ /* @__PURE__ */ jsxRuntime.jsx(
1684
+ "div",
1685
+ {
1686
+ style: {
1687
+ flex: "1 1 auto",
1688
+ minHeight: 0,
1689
+ display: "flex",
1690
+ flexDirection: "column",
1691
+ justifyContent: "flex-end",
1692
+ overflow: "hidden",
1693
+ padding: "6px 0"
1694
+ },
1695
+ children
1696
+ }
1697
+ )
1698
+ ]
1699
+ }
1700
+ );
1701
+ };
1702
+ var whatsappComponents = {
1703
+ Frame: Frame4,
1704
+ Message: Message4,
1705
+ TypingIndicator: TypingIndicator4,
1706
+ Reaction: Reaction4,
1707
+ Composer: Composer4,
1708
+ SystemMessage: SystemMessage4,
1709
+ Avatar: Avatar4
1710
+ };
1711
+
1712
+ // src/whatsapp/capabilities.ts
1713
+ var whatsappCapabilities = {
1714
+ events: {
1715
+ message: "native",
1716
+ composerType: "native",
1717
+ send: "native",
1718
+ typing: "native",
1719
+ reaction: "native",
1720
+ readReceipt: "native",
1721
+ // double ticks
1722
+ edit: "native",
1723
+ delete: "native",
1724
+ system: "fallback",
1725
+ // centred system pill
1726
+ beat: "native"
1727
+ },
1728
+ content: {
1729
+ text: true,
1730
+ image: true
1731
+ },
1732
+ reactions: true,
1733
+ threads: false,
1734
+ readReceipts: true
1735
+ };
1736
+
1737
+ // src/whatsapp/index.ts
1738
+ var whatsappOptionsSchema = zod.z.object({
1739
+ /** Contact / group name in the header. */
1740
+ contact: zod.z.string().optional(),
1741
+ /** Header subtitle (e.g. `"online"`, `"last seen recently"`). */
1742
+ status: zod.z.string().optional()
1743
+ });
1744
+ var whatsapp = skinKit.defineSkin({
1745
+ id: "whatsapp",
1746
+ meta: {
1747
+ name: "WhatsApp",
1748
+ defaultCanvas: { width: 390, height: 760 },
1749
+ supportsThemes: ["light", "dark"],
1750
+ capabilities: whatsappCapabilities,
1751
+ optionsSchema: whatsappOptionsSchema
1752
+ },
1753
+ components: whatsappComponents,
1754
+ tokens: whatsappTokens
1755
+ });
1756
+
1757
+ // src/cursor/tokens.ts
1758
+ var CURSOR_COLORS = {
1759
+ dark: {
1760
+ bg: "#1a1a1a",
1761
+ header: "#1a1a1a",
1762
+ border: "#2d2d2d",
1763
+ text: "#d4d4d4",
1764
+ dim: "#858585",
1765
+ userBg: "#262626",
1766
+ userBorder: "#333333",
1767
+ codeBg: "#2a2a2a",
1768
+ codeText: "#ce9178",
1769
+ accent: "#4d9fff",
1770
+ composerBg: "#202020",
1771
+ composerBorder: "#3a3a3a",
1772
+ placeholder: "#6e6e6e",
1773
+ chipBg: "#2a2a2a",
1774
+ link: "#4d9fff"
1775
+ },
1776
+ light: {
1777
+ bg: "#ffffff",
1778
+ header: "#ffffff",
1779
+ border: "#e8e8e8",
1780
+ text: "#1e1e1e",
1781
+ dim: "#6e6e6e",
1782
+ userBg: "#f4f4f4",
1783
+ userBorder: "#e8e8e8",
1784
+ codeBg: "#f0f0f0",
1785
+ codeText: "#a31515",
1786
+ accent: "#0a72ff",
1787
+ composerBg: "#f9f9f9",
1788
+ composerBorder: "#e2e2e2",
1789
+ placeholder: "#9a9a9a",
1790
+ chipBg: "#f0f0f0",
1791
+ link: "#0a72ff"
1792
+ }
1793
+ };
1794
+ var CURSOR_FONT_STACK = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, sans-serif';
1795
+ var cursorTokens = {
1796
+ light: { colors: CURSOR_COLORS.light },
1797
+ dark: { colors: CURSOR_COLORS.dark }
1798
+ };
1799
+ function markStyles3(c) {
1800
+ return {
1801
+ link: { color: c.link, textDecoration: "none" },
1802
+ code: {
1803
+ fontFamily: "Menlo, Monaco, monospace",
1804
+ fontSize: "0.86em",
1805
+ background: c.codeBg,
1806
+ color: c.codeText,
1807
+ borderRadius: 4,
1808
+ padding: "1px 4px"
1809
+ }
1810
+ };
1811
+ }
1812
+ var Avatar5 = () => null;
1813
+ var Reaction5 = () => null;
1814
+ var Message5 = ({ theme, message }) => {
1815
+ const c = CURSOR_COLORS[theme];
1816
+ const self = message.isSelf;
1817
+ if (self) {
1818
+ return /* @__PURE__ */ jsxRuntime.jsx(
1819
+ "div",
1820
+ {
1821
+ style: { padding: "5px 12px", ...skinKit.fadeSlideIn(message.revealProgress) },
1822
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1823
+ "div",
1824
+ {
1825
+ style: {
1826
+ background: c.userBg,
1827
+ border: `1px solid ${c.userBorder}`,
1828
+ borderRadius: 8,
1829
+ padding: "8px 11px",
1830
+ color: c.text,
1831
+ fontSize: 13,
1832
+ lineHeight: 1.5
1833
+ },
1834
+ children: /* @__PURE__ */ jsxRuntime.jsx(skinKit.MessageContent, { nodes: message.content, styles: markStyles3(c) })
1835
+ }
1836
+ )
1837
+ }
1838
+ );
1839
+ }
1840
+ return /* @__PURE__ */ jsxRuntime.jsx(
1841
+ "div",
1842
+ {
1843
+ style: {
1844
+ padding: "5px 12px 9px",
1845
+ color: c.text,
1846
+ fontSize: 13,
1847
+ lineHeight: 1.6,
1848
+ ...skinKit.fadeSlideIn(message.revealProgress)
1849
+ },
1850
+ children: /* @__PURE__ */ jsxRuntime.jsx(skinKit.MessageContent, { nodes: message.content, styles: markStyles3(c) })
1851
+ }
1852
+ );
1853
+ };
1854
+ var SystemMessage5 = ({ theme, message }) => {
1855
+ const c = CURSOR_COLORS[theme];
1856
+ const text = message.content.map(
1857
+ (n) => n.type === "text" ? n.spans.map((s) => s.value ?? "").join("") : ""
1858
+ ).join(" ");
1859
+ return /* @__PURE__ */ jsxRuntime.jsx(
1860
+ "div",
1861
+ {
1862
+ style: {
1863
+ margin: "4px 12px",
1864
+ padding: "6px 10px",
1865
+ borderLeft: `2px solid ${c.accent}`,
1866
+ background: c.userBg,
1867
+ borderRadius: 4,
1868
+ color: c.dim,
1869
+ fontSize: 12,
1870
+ fontFamily: "Menlo, monospace",
1871
+ ...skinKit.fadeSlideIn(message.revealProgress, { distance: 0 })
1872
+ },
1873
+ children: text
1874
+ }
1875
+ );
1876
+ };
1877
+ var TypingIndicator5 = ({ theme, typing }) => {
1878
+ const c = CURSOR_COLORS[theme];
1879
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1880
+ "div",
1881
+ {
1882
+ style: {
1883
+ display: "flex",
1884
+ alignItems: "center",
1885
+ gap: 7,
1886
+ padding: "5px 12px",
1887
+ color: c.dim,
1888
+ fontSize: 12.5
1889
+ },
1890
+ children: [
1891
+ /* @__PURE__ */ jsxRuntime.jsx(skinKit.TypingDots, { progress: typing.progress, color: c.accent, size: 5 }),
1892
+ "Generating\u2026"
1893
+ ]
1894
+ }
1895
+ );
1896
+ };
1897
+ var Composer5 = ({ theme, composer }) => {
1898
+ const c = CURSOR_COLORS[theme];
1899
+ const hasText = composer.text.length > 0;
1900
+ const chip = {
1901
+ fontSize: 11,
1902
+ color: c.dim,
1903
+ background: c.chipBg,
1904
+ borderRadius: 5,
1905
+ padding: "2px 7px"
1906
+ };
1907
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "0 0 auto", padding: "8px 12px 12px" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
1908
+ "div",
1909
+ {
1910
+ style: {
1911
+ border: `1px solid ${c.composerBorder}`,
1912
+ borderRadius: 10,
1913
+ background: c.composerBg,
1914
+ padding: "9px 11px",
1915
+ color: c.text,
1916
+ fontSize: 13
1917
+ },
1918
+ children: [
1919
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { minHeight: 18 }, children: hasText ? /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1920
+ composer.text,
1921
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.accent }, children: "\u258D" })
1922
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: c.placeholder }, children: "Plan, search, build anything" }) }),
1923
+ /* @__PURE__ */ jsxRuntime.jsxs(
1924
+ "div",
1925
+ {
1926
+ style: {
1927
+ display: "flex",
1928
+ alignItems: "center",
1929
+ justifyContent: "space-between",
1930
+ marginTop: 9
1931
+ },
1932
+ children: [
1933
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 6 }, children: [
1934
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: chip, children: "\u221E Agent" }),
1935
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: chip, children: "claude-4.5-sonnet" })
1936
+ ] }),
1937
+ /* @__PURE__ */ jsxRuntime.jsx(
1938
+ "span",
1939
+ {
1940
+ style: {
1941
+ width: 22,
1942
+ height: 22,
1943
+ borderRadius: 6,
1944
+ background: hasText ? c.accent : c.chipBg,
1945
+ color: hasText ? "#fff" : c.dim,
1946
+ display: "flex",
1947
+ alignItems: "center",
1948
+ justifyContent: "center",
1949
+ fontSize: 13
1950
+ },
1951
+ children: "\u2191"
1952
+ }
1953
+ )
1954
+ ]
1955
+ }
1956
+ )
1957
+ ]
1958
+ }
1959
+ ) });
1960
+ };
1961
+ var Frame5 = ({
1962
+ theme,
1963
+ options,
1964
+ children
1965
+ }) => {
1966
+ const c = CURSOR_COLORS[theme];
1967
+ const title = typeof options?.title === "string" ? options.title : "Chat";
1968
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1969
+ "div",
1970
+ {
1971
+ style: {
1972
+ fontFamily: CURSOR_FONT_STACK,
1973
+ background: c.bg,
1974
+ color: c.text,
1975
+ display: "flex",
1976
+ flexDirection: "column",
1977
+ height: "100%",
1978
+ width: "100%",
1979
+ WebkitFontSmoothing: "antialiased"
1980
+ },
1981
+ children: [
1982
+ /* @__PURE__ */ jsxRuntime.jsxs(
1983
+ "div",
1984
+ {
1985
+ style: {
1986
+ flex: "0 0 auto",
1987
+ display: "flex",
1988
+ alignItems: "center",
1989
+ gap: 8,
1990
+ padding: "8px 12px",
1991
+ borderBottom: `1px solid ${c.border}`,
1992
+ fontSize: 12,
1993
+ color: c.dim
1994
+ },
1995
+ children: [
1996
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, color: c.text }, children: title }),
1997
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { marginLeft: "auto", fontSize: 14 }, children: "\uFF0B" }),
1998
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 14 }, children: "\u22EF" })
1999
+ ]
2000
+ }
2001
+ ),
2002
+ /* @__PURE__ */ jsxRuntime.jsx(
2003
+ "div",
2004
+ {
2005
+ style: {
2006
+ flex: "1 1 auto",
2007
+ minHeight: 0,
2008
+ display: "flex",
2009
+ flexDirection: "column",
2010
+ justifyContent: "flex-end",
2011
+ overflow: "hidden",
2012
+ padding: "6px 0"
2013
+ },
2014
+ children
2015
+ }
2016
+ )
2017
+ ]
2018
+ }
2019
+ );
2020
+ };
2021
+ var cursorComponents = {
2022
+ Frame: Frame5,
2023
+ Message: Message5,
2024
+ TypingIndicator: TypingIndicator5,
2025
+ Reaction: Reaction5,
2026
+ Composer: Composer5,
2027
+ SystemMessage: SystemMessage5,
2028
+ Avatar: Avatar5
2029
+ };
2030
+
2031
+ // src/cursor/index.ts
2032
+ var cursorCapabilities = {
2033
+ events: {
2034
+ message: "native",
2035
+ composerType: "native",
2036
+ send: "native",
2037
+ typing: "native",
2038
+ system: "native",
2039
+ reaction: "unsupported",
2040
+ readReceipt: "unsupported",
2041
+ edit: "native",
2042
+ delete: "native",
2043
+ beat: "native"
2044
+ },
2045
+ content: { text: true, image: true },
2046
+ reactions: false,
2047
+ threads: false,
2048
+ readReceipts: false
2049
+ };
2050
+ var cursorOptionsSchema = zod.z.object({
2051
+ title: zod.z.string().optional()
2052
+ });
2053
+ var cursor = skinKit.defineSkin({
2054
+ id: "cursor",
2055
+ meta: {
2056
+ name: "Cursor panel",
2057
+ defaultCanvas: { width: 400, height: 600 },
2058
+ supportsThemes: ["dark", "light"],
2059
+ capabilities: cursorCapabilities,
2060
+ optionsSchema: cursorOptionsSchema
2061
+ },
2062
+ components: cursorComponents,
2063
+ tokens: cursorTokens
2064
+ });
2065
+ var CHROME = {
2066
+ light: {
2067
+ window: "#ffffff",
2068
+ sidebar: "#f5f5f7",
2069
+ sidebarBorder: "#e0e0e2",
2070
+ titleBar: "#ececee",
2071
+ text: "#1d1d1f",
2072
+ subtle: "#86868b",
2073
+ activeRow: "#0b93f6",
2074
+ activeText: "#ffffff",
2075
+ searchBg: "#e4e4e6"
2076
+ },
2077
+ dark: {
2078
+ window: "#1e1e1e",
2079
+ sidebar: "#28282a",
2080
+ sidebarBorder: "#3a3a3c",
2081
+ titleBar: "#323234",
2082
+ text: "#f5f5f7",
2083
+ subtle: "#98989d",
2084
+ activeRow: "#0b6cff",
2085
+ activeText: "#ffffff",
2086
+ searchBg: "#3a3a3c"
2087
+ }
2088
+ };
2089
+ var TRAFFIC = ["#ff5f56", "#ffbd2e", "#27c93f"];
2090
+ function initials4(name) {
2091
+ return name.split(/\s+/).map((w) => w.charAt(0)).slice(0, 2).join("").toUpperCase();
2092
+ }
2093
+ var SAMPLE_CONVOS = [
2094
+ { name: "Sam Carter", preview: "you're the best, omw \u{1F3C3}", time: "9:41 AM" },
2095
+ { name: "Mum", preview: "call me when you can \u2764\uFE0F", time: "Yesterday" },
2096
+ { name: "Design", preview: "Tap to load preview", time: "Tuesday" },
2097
+ { name: "Alex Rivera", preview: "ship it \u{1F680}", time: "Monday" }
2098
+ ];
2099
+ var SidebarRow = ({ theme, name, preview, time, active }) => {
2100
+ const ch = CHROME[theme];
2101
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2102
+ "div",
2103
+ {
2104
+ style: {
2105
+ display: "flex",
2106
+ gap: 10,
2107
+ padding: "8px 10px",
2108
+ borderRadius: 8,
2109
+ background: active ? ch.activeRow : "transparent",
2110
+ color: active ? ch.activeText : ch.text
2111
+ },
2112
+ children: [
2113
+ /* @__PURE__ */ jsxRuntime.jsx(
2114
+ "div",
2115
+ {
2116
+ style: {
2117
+ width: 40,
2118
+ height: 40,
2119
+ borderRadius: "50%",
2120
+ background: active ? "rgba(255,255,255,0.25)" : "#a9a9af",
2121
+ color: "#fff",
2122
+ display: "flex",
2123
+ alignItems: "center",
2124
+ justifyContent: "center",
2125
+ fontSize: 15,
2126
+ flex: "0 0 40px"
2127
+ },
2128
+ children: initials4(name)
2129
+ }
2130
+ ),
2131
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { minWidth: 0, flex: 1 }, children: [
2132
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between" }, children: [
2133
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 14, fontWeight: 600 }, children: name }),
2134
+ /* @__PURE__ */ jsxRuntime.jsx(
2135
+ "span",
2136
+ {
2137
+ style: {
2138
+ fontSize: 11,
2139
+ color: active ? "rgba(255,255,255,0.8)" : ch.subtle
2140
+ },
2141
+ children: time
2142
+ }
2143
+ )
2144
+ ] }),
2145
+ /* @__PURE__ */ jsxRuntime.jsx(
2146
+ "div",
2147
+ {
2148
+ style: {
2149
+ fontSize: 13,
2150
+ color: active ? "rgba(255,255,255,0.85)" : ch.subtle,
2151
+ whiteSpace: "nowrap",
2152
+ overflow: "hidden",
2153
+ textOverflow: "ellipsis"
2154
+ },
2155
+ children: preview
2156
+ }
2157
+ )
2158
+ ] })
2159
+ ]
2160
+ }
2161
+ );
2162
+ };
2163
+ var Frame6 = ({
2164
+ theme,
2165
+ options,
2166
+ children
2167
+ }) => {
2168
+ const ch = CHROME[theme];
2169
+ const contact = typeof options?.contact === "string" ? options.contact : "Messages";
2170
+ const convos = [
2171
+ { name: contact, preview: "active now", time: "now" },
2172
+ ...SAMPLE_CONVOS.filter((c) => c.name !== contact)
2173
+ ];
2174
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2175
+ "div",
2176
+ {
2177
+ style: {
2178
+ fontFamily: IMESSAGE_FONT_STACK,
2179
+ background: ch.window,
2180
+ color: ch.text,
2181
+ display: "flex",
2182
+ flexDirection: "column",
2183
+ height: "100%",
2184
+ width: "100%",
2185
+ WebkitFontSmoothing: "antialiased"
2186
+ },
2187
+ children: [
2188
+ /* @__PURE__ */ jsxRuntime.jsx(
2189
+ "div",
2190
+ {
2191
+ style: {
2192
+ flex: "0 0 auto",
2193
+ height: 38,
2194
+ background: ch.titleBar,
2195
+ display: "flex",
2196
+ alignItems: "center",
2197
+ gap: 8,
2198
+ padding: "0 13px",
2199
+ borderBottom: `1px solid ${ch.sidebarBorder}`
2200
+ },
2201
+ children: TRAFFIC.map((color) => /* @__PURE__ */ jsxRuntime.jsx(
2202
+ "span",
2203
+ {
2204
+ style: {
2205
+ width: 12,
2206
+ height: 12,
2207
+ borderRadius: "50%",
2208
+ background: color
2209
+ }
2210
+ },
2211
+ color
2212
+ ))
2213
+ }
2214
+ ),
2215
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: "1 1 auto", minHeight: 0, display: "flex" }, children: [
2216
+ /* @__PURE__ */ jsxRuntime.jsxs(
2217
+ "div",
2218
+ {
2219
+ style: {
2220
+ flex: "0 0 250px",
2221
+ background: ch.sidebar,
2222
+ borderRight: `1px solid ${ch.sidebarBorder}`,
2223
+ display: "flex",
2224
+ flexDirection: "column",
2225
+ padding: "8px 8px 0"
2226
+ },
2227
+ children: [
2228
+ /* @__PURE__ */ jsxRuntime.jsx(
2229
+ "div",
2230
+ {
2231
+ style: {
2232
+ background: ch.searchBg,
2233
+ borderRadius: 7,
2234
+ padding: "5px 9px",
2235
+ color: ch.subtle,
2236
+ fontSize: 13,
2237
+ marginBottom: 6
2238
+ },
2239
+ children: "\u{1F50D} Search"
2240
+ }
2241
+ ),
2242
+ convos.slice(0, 5).map((cv, i) => /* @__PURE__ */ jsxRuntime.jsx(
2243
+ SidebarRow,
2244
+ {
2245
+ theme,
2246
+ name: cv.name,
2247
+ preview: cv.preview,
2248
+ time: cv.time,
2249
+ active: i === 0
2250
+ },
2251
+ cv.name
2252
+ ))
2253
+ ]
2254
+ }
2255
+ ),
2256
+ /* @__PURE__ */ jsxRuntime.jsxs(
2257
+ "div",
2258
+ {
2259
+ style: {
2260
+ flex: "1 1 auto",
2261
+ minWidth: 0,
2262
+ display: "flex",
2263
+ flexDirection: "column",
2264
+ background: ch.window
2265
+ },
2266
+ children: [
2267
+ /* @__PURE__ */ jsxRuntime.jsx(
2268
+ "div",
2269
+ {
2270
+ style: {
2271
+ flex: "0 0 auto",
2272
+ textAlign: "center",
2273
+ padding: "8px 0",
2274
+ borderBottom: `1px solid ${ch.sidebarBorder}`,
2275
+ fontSize: 13,
2276
+ fontWeight: 600
2277
+ },
2278
+ children: contact
2279
+ }
2280
+ ),
2281
+ /* @__PURE__ */ jsxRuntime.jsx(
2282
+ "div",
2283
+ {
2284
+ style: {
2285
+ flex: "1 1 auto",
2286
+ minHeight: 0,
2287
+ display: "flex",
2288
+ flexDirection: "column",
2289
+ justifyContent: "flex-end",
2290
+ overflow: "hidden",
2291
+ paddingBottom: 4
2292
+ },
2293
+ children
2294
+ }
2295
+ )
2296
+ ]
2297
+ }
2298
+ )
2299
+ ] })
2300
+ ]
2301
+ }
2302
+ );
2303
+ };
2304
+ var macosComponents = {
2305
+ ...imessageComponents,
2306
+ Frame: Frame6
2307
+ };
2308
+
2309
+ // src/messages-macos/index.ts
2310
+ var macosOptionsSchema = zod.z.object({
2311
+ contact: zod.z.string().optional()
2312
+ });
2313
+ var messagesMacos = skinKit.defineSkin({
2314
+ id: "messages-macos",
2315
+ meta: {
2316
+ name: "Messages (macOS)",
2317
+ defaultCanvas: { width: 900, height: 600 },
2318
+ supportsThemes: ["light", "dark"],
2319
+ capabilities: imessageCapabilities,
2320
+ optionsSchema: macosOptionsSchema,
2321
+ fonts: imessageFonts
2322
+ },
2323
+ components: macosComponents,
2324
+ tokens: imessageTokens
2325
+ });
2326
+
2327
+ // src/discord/tokens.ts
2328
+ var DISCORD = {
2329
+ bg: "#313338",
2330
+ channelBarBorder: "#26282c",
2331
+ text: "#dbdee1",
2332
+ muted: "#949ba4",
2333
+ username: "#f2f3f5",
2334
+ timestamp: "#949ba4",
2335
+ reactionBg: "#2b2d31",
2336
+ reactionBorder: "#3f4147",
2337
+ reactionText: "#dbdee1",
2338
+ composerBg: "#383a40",
2339
+ placeholder: "#6d7079",
2340
+ mentionText: "#c9cdfb",
2341
+ mentionBg: "rgba(88,101,242,0.3)",
2342
+ codeBg: "#2b2d31",
2343
+ codeText: "#dbdee1",
2344
+ link: "#00a8fc",
2345
+ hashtag: "#80848e"
2346
+ };
2347
+ var DISCORD_FONT_STACK = '"gg sans", "Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif';
2348
+ var GUTTER = 56;
2349
+ function formatTime3(atMs) {
2350
+ const base = 9 * 3600 * 1e3;
2351
+ const total = Math.floor((base + atMs) / 1e3);
2352
+ const h = Math.floor(total / 3600) % 24;
2353
+ const m = Math.floor(total % 3600 / 60);
2354
+ const ampm = h >= 12 ? "PM" : "AM";
2355
+ const hr = h % 12 === 0 ? 12 : h % 12;
2356
+ return `Today at ${hr}:${String(m).padStart(2, "0")} ${ampm}`;
2357
+ }
2358
+ function initials5(name) {
2359
+ return name.split(/\s+/).map((w) => w.charAt(0)).slice(0, 2).join("").toUpperCase();
2360
+ }
2361
+ var markStyles4 = {
2362
+ link: { color: DISCORD.link, textDecoration: "none" },
2363
+ mention: {
2364
+ color: DISCORD.mentionText,
2365
+ background: DISCORD.mentionBg,
2366
+ borderRadius: 3,
2367
+ padding: "0 2px",
2368
+ fontWeight: 500
2369
+ },
2370
+ code: {
2371
+ fontFamily: "Menlo, Consolas, monospace",
2372
+ fontSize: "0.85em",
2373
+ background: DISCORD.codeBg,
2374
+ color: DISCORD.codeText,
2375
+ borderRadius: 3,
2376
+ padding: "1px 4px"
2377
+ }
2378
+ };
2379
+ var Avatar6 = ({ participant, size = 40 }) => {
2380
+ if (participant.avatar) {
2381
+ return /* @__PURE__ */ jsxRuntime.jsx(
2382
+ "img",
2383
+ {
2384
+ src: participant.avatar,
2385
+ alt: participant.name,
2386
+ width: size,
2387
+ height: size,
2388
+ style: {
2389
+ width: size,
2390
+ height: size,
2391
+ borderRadius: "50%",
2392
+ objectFit: "cover"
2393
+ }
2394
+ }
2395
+ );
2396
+ }
2397
+ return /* @__PURE__ */ jsxRuntime.jsx(
2398
+ "div",
2399
+ {
2400
+ style: {
2401
+ width: size,
2402
+ height: size,
2403
+ borderRadius: "50%",
2404
+ background: participant.color ?? "#5865f2",
2405
+ color: "#fff",
2406
+ display: "flex",
2407
+ alignItems: "center",
2408
+ justifyContent: "center",
2409
+ fontSize: size * 0.4,
2410
+ fontWeight: 500
2411
+ },
2412
+ children: initials5(participant.name)
2413
+ }
2414
+ );
2415
+ };
2416
+ var Reaction6 = ({ reaction }) => /* @__PURE__ */ jsxRuntime.jsxs(
2417
+ "span",
2418
+ {
2419
+ style: {
2420
+ ...skinKit.popIn(reaction.progress),
2421
+ display: "inline-flex",
2422
+ alignItems: "center",
2423
+ gap: 5,
2424
+ background: DISCORD.reactionBg,
2425
+ border: `1px solid ${DISCORD.reactionBorder}`,
2426
+ borderRadius: 8,
2427
+ padding: "2px 7px",
2428
+ fontSize: 13,
2429
+ color: DISCORD.reactionText
2430
+ },
2431
+ children: [
2432
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: reaction.emoji }),
2433
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontSize: 12 }, children: reaction.count })
2434
+ ]
2435
+ }
2436
+ );
2437
+ var Message6 = ({ message, author }) => {
2438
+ const roleColor = author.color ?? DISCORD.username;
2439
+ const body = /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { color: DISCORD.text, fontSize: 15, lineHeight: 1.375 }, children: [
2440
+ /* @__PURE__ */ jsxRuntime.jsx(
2441
+ skinKit.MessageContent,
2442
+ {
2443
+ nodes: message.content,
2444
+ styles: markStyles4,
2445
+ imageStyle: { borderRadius: 8, marginTop: 4, maxWidth: 320 }
2446
+ }
2447
+ ),
2448
+ message.reactions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
2449
+ "div",
2450
+ {
2451
+ style: { display: "flex", gap: 4, marginTop: 5, flexWrap: "wrap" },
2452
+ children: message.reactions.map((r, i) => /* @__PURE__ */ jsxRuntime.jsx(Reaction6, { theme: "dark", reaction: r }, i))
2453
+ }
2454
+ ) : null
2455
+ ] });
2456
+ if (message.isGrouped) {
2457
+ return /* @__PURE__ */ jsxRuntime.jsx(
2458
+ "div",
2459
+ {
2460
+ style: {
2461
+ padding: `1px 16px 1px ${GUTTER}px`,
2462
+ ...skinKit.fadeSlideIn(message.revealProgress, { distance: 4 })
2463
+ },
2464
+ children: body
2465
+ }
2466
+ );
2467
+ }
2468
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2469
+ "div",
2470
+ {
2471
+ style: {
2472
+ display: "flex",
2473
+ gap: 16,
2474
+ padding: "8px 16px 2px",
2475
+ ...skinKit.fadeSlideIn(message.revealProgress, { distance: 4 })
2476
+ },
2477
+ children: [
2478
+ /* @__PURE__ */ jsxRuntime.jsx(Avatar6, { theme: "dark", participant: author, size: 40 }),
2479
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
2480
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: 8 }, children: [
2481
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: roleColor, fontWeight: 500, fontSize: 15 }, children: author.name }),
2482
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: DISCORD.timestamp, fontSize: 12 }, children: formatTime3(message.atMs) })
2483
+ ] }),
2484
+ body
2485
+ ] })
2486
+ ]
2487
+ }
2488
+ );
2489
+ };
2490
+ var SystemMessage6 = ({ message }) => {
2491
+ const text = message.content.map(
2492
+ (n) => n.type === "text" ? n.spans.map((s) => s.value ?? "").join("") : ""
2493
+ ).join(" ");
2494
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2495
+ "div",
2496
+ {
2497
+ style: {
2498
+ display: "flex",
2499
+ gap: 16,
2500
+ alignItems: "center",
2501
+ padding: "4px 16px 4px 24px",
2502
+ color: DISCORD.muted,
2503
+ fontSize: 14,
2504
+ ...skinKit.fadeSlideIn(message.revealProgress, { distance: 0 })
2505
+ },
2506
+ children: [
2507
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#3ba55c" }, children: "\uFF0B" }),
2508
+ text
2509
+ ]
2510
+ }
2511
+ );
2512
+ };
2513
+ var TypingIndicator6 = ({ typing, author }) => /* @__PURE__ */ jsxRuntime.jsxs(
2514
+ "div",
2515
+ {
2516
+ style: {
2517
+ display: "flex",
2518
+ alignItems: "center",
2519
+ gap: 8,
2520
+ padding: "2px 16px 4px",
2521
+ color: DISCORD.text,
2522
+ fontSize: 13
2523
+ },
2524
+ children: [
2525
+ /* @__PURE__ */ jsxRuntime.jsx(skinKit.TypingDots, { progress: typing.progress, color: DISCORD.muted, size: 5 }),
2526
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
2527
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { children: author.name }),
2528
+ " is typing\u2026"
2529
+ ] })
2530
+ ]
2531
+ }
2532
+ );
2533
+ var Composer6 = ({ composer }) => {
2534
+ const hasText = composer.text.length > 0;
2535
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "0 0 auto", padding: "0 16px 18px" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
2536
+ "div",
2537
+ {
2538
+ style: {
2539
+ background: DISCORD.composerBg,
2540
+ borderRadius: 8,
2541
+ padding: "11px 14px",
2542
+ color: DISCORD.text,
2543
+ fontSize: 15,
2544
+ display: "flex",
2545
+ alignItems: "center",
2546
+ gap: 12
2547
+ },
2548
+ children: [
2549
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: DISCORD.muted, fontSize: 20 }, children: "\uFF0B" }),
2550
+ hasText ? /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
2551
+ composer.text,
2552
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: DISCORD.text }, children: "|" })
2553
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: DISCORD.placeholder }, children: "Message #general" })
2554
+ ]
2555
+ }
2556
+ ) });
2557
+ };
2558
+ var Frame7 = ({
2559
+ options,
2560
+ children
2561
+ }) => {
2562
+ const channel = typeof options?.channel === "string" ? options.channel : "general";
2563
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2564
+ "div",
2565
+ {
2566
+ style: {
2567
+ fontFamily: DISCORD_FONT_STACK,
2568
+ background: DISCORD.bg,
2569
+ color: DISCORD.text,
2570
+ display: "flex",
2571
+ flexDirection: "column",
2572
+ height: "100%",
2573
+ width: "100%",
2574
+ WebkitFontSmoothing: "antialiased"
2575
+ },
2576
+ children: [
2577
+ /* @__PURE__ */ jsxRuntime.jsxs(
2578
+ "div",
2579
+ {
2580
+ style: {
2581
+ flex: "0 0 auto",
2582
+ display: "flex",
2583
+ alignItems: "center",
2584
+ gap: 8,
2585
+ padding: "12px 16px",
2586
+ borderBottom: `1px solid ${DISCORD.channelBarBorder}`,
2587
+ boxShadow: "0 1px 0 rgba(0,0,0,0.2)"
2588
+ },
2589
+ children: [
2590
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: DISCORD.hashtag, fontSize: 22, fontWeight: 600 }, children: "#" }),
2591
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontSize: 16, color: "#f2f3f5" }, children: channel })
2592
+ ]
2593
+ }
2594
+ ),
2595
+ /* @__PURE__ */ jsxRuntime.jsx(
2596
+ "div",
2597
+ {
2598
+ style: {
2599
+ flex: "1 1 auto",
2600
+ minHeight: 0,
2601
+ display: "flex",
2602
+ flexDirection: "column",
2603
+ justifyContent: "flex-end",
2604
+ overflow: "hidden",
2605
+ paddingBottom: 6
2606
+ },
2607
+ children
2608
+ }
2609
+ )
2610
+ ]
2611
+ }
2612
+ );
2613
+ };
2614
+ var discordComponents = {
2615
+ Frame: Frame7,
2616
+ Message: Message6,
2617
+ TypingIndicator: TypingIndicator6,
2618
+ Reaction: Reaction6,
2619
+ Composer: Composer6,
2620
+ SystemMessage: SystemMessage6,
2621
+ Avatar: Avatar6
2622
+ };
2623
+
2624
+ // src/discord/index.ts
2625
+ var discordCapabilities = {
2626
+ events: {
2627
+ message: "native",
2628
+ composerType: "native",
2629
+ send: "native",
2630
+ typing: "native",
2631
+ reaction: "native",
2632
+ system: "native",
2633
+ edit: "native",
2634
+ delete: "native",
2635
+ readReceipt: "unsupported",
2636
+ beat: "native"
2637
+ },
2638
+ content: { text: true, image: true },
2639
+ reactions: true,
2640
+ threads: true,
2641
+ readReceipts: false
2642
+ };
2643
+ var discordOptionsSchema = zod.z.object({
2644
+ /** Channel name (rendered after the `#`). */
2645
+ channel: zod.z.string().optional()
2646
+ });
2647
+ var discord = skinKit.defineSkin({
2648
+ id: "discord",
2649
+ meta: {
2650
+ name: "Discord",
2651
+ defaultCanvas: { width: 600, height: 480 },
2652
+ supportsThemes: ["dark"],
2653
+ capabilities: discordCapabilities,
2654
+ optionsSchema: discordOptionsSchema
2655
+ },
2656
+ components: discordComponents
2657
+ });
2658
+
2659
+ // src/registry.ts
2660
+ var builtinSkins = {
2661
+ slack,
2662
+ "claude-code": claudeCode,
2663
+ imessage,
2664
+ whatsapp,
2665
+ cursor,
2666
+ "messages-macos": messagesMacos,
2667
+ discord
2668
+ };
2669
+ function getSkin(id) {
2670
+ return builtinSkins[id];
2671
+ }
2672
+
2673
+ exports.SLACK_COLORS = SLACK_COLORS;
2674
+ exports.builtinSkins = builtinSkins;
2675
+ exports.claudeCode = claudeCode;
2676
+ exports.cursor = cursor;
2677
+ exports.discord = discord;
2678
+ exports.getSkin = getSkin;
2679
+ exports.imessage = imessage;
2680
+ exports.messagesMacos = messagesMacos;
2681
+ exports.slack = slack;
2682
+ exports.whatsapp = whatsapp;
2683
+ //# sourceMappingURL=index.cjs.map
2684
+ //# sourceMappingURL=index.cjs.map