@jfrader/ui 0.6.0 → 0.7.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 (90) hide show
  1. package/README.md +10 -6
  2. package/dist/{avatar-group-DvP8mAE-.js → avatar-group-BlMLNw4J.js} +1 -1
  3. package/dist/avatar-group.js +1 -1
  4. package/dist/avatar-sPxDqFiZ.js +133 -0
  5. package/dist/avatar.js +1 -1
  6. package/dist/{chat-thread-DVa17BRC.js → chat-thread-DkB-WMWJ.js} +1 -1
  7. package/dist/chat-thread.js +1 -1
  8. package/dist/{comment-thread-BnUHxviq.js → comment-thread-DXfqgRNI.js} +1 -1
  9. package/dist/comment-thread.js +1 -1
  10. package/dist/emblem-DnXmpZCh.js +166 -0
  11. package/dist/emblem.js +2 -0
  12. package/dist/game-card-Oeu74giK.js +194 -0
  13. package/dist/game-card.js +2 -0
  14. package/dist/{hover-card-DN1EAlQA.js → hover-card-Dgu2CwMD.js} +1 -1
  15. package/dist/hover-card.js +1 -1
  16. package/dist/in-view-title-BUZCMqge.js +225 -0
  17. package/dist/in-view-title.js +2 -0
  18. package/dist/index.js +69 -65
  19. package/dist/initials-DEdwNe9_.js +18 -0
  20. package/dist/locale-switcher-DTkySKsM.js +375 -0
  21. package/dist/locale-switcher.js +1 -1
  22. package/dist/{thread-parts-DfZNz70v.js → thread-parts-Cpktor6D.js} +1 -1
  23. package/dist/{timeline-DaldDMX7.js → timeline-BcF46lG9.js} +1 -1
  24. package/dist/timeline.js +1 -1
  25. package/dist/types/components/activity-rings/activity-rings.d.ts +7 -9
  26. package/dist/types/components/avatar-group/avatar-group.d.ts +3 -3
  27. package/dist/types/components/button/button.d.ts +7 -7
  28. package/dist/types/components/card/card.d.ts +4 -1
  29. package/dist/types/components/chip-group/chip-group.d.ts +2 -2
  30. package/dist/types/components/combobox/combobox.d.ts +2 -2
  31. package/dist/types/components/command-palette/command-palette.d.ts +1 -1
  32. package/dist/types/components/comment-thread/comment-thread.d.ts +4 -4
  33. package/dist/types/components/copy-button/copy-button.d.ts +6 -6
  34. package/dist/types/components/countdown/countdown.d.ts +2 -2
  35. package/dist/types/components/dialog/dialog.d.ts +18 -20
  36. package/dist/types/components/drawer/drawer.d.ts +2 -2
  37. package/dist/types/components/emblem/emblem.d.ts +59 -0
  38. package/dist/types/components/emblem/index.d.ts +2 -0
  39. package/dist/types/components/empty-state/empty-state.d.ts +2 -2
  40. package/dist/types/components/file-dropzone/file-dropzone.d.ts +3 -4
  41. package/dist/types/components/filter-toolbar/filter-toolbar.d.ts +2 -2
  42. package/dist/types/components/game-card/card-frame.d.ts +16 -0
  43. package/dist/types/components/game-card/decks.d.ts +27 -0
  44. package/dist/types/components/game-card/game-card.d.ts +37 -0
  45. package/dist/types/components/game-card/index.d.ts +4 -0
  46. package/dist/types/components/hold-to-confirm/hold-to-confirm.d.ts +1 -1
  47. package/dist/types/components/hover-card/hover-card.d.ts +5 -5
  48. package/dist/types/components/in-view-title/in-view-title.d.ts +23 -0
  49. package/dist/types/components/in-view-title/index.d.ts +1 -0
  50. package/dist/types/components/inline-edit/inline-edit.d.ts +6 -6
  51. package/dist/types/components/json-viewer/json-viewer.d.ts +7 -9
  52. package/dist/types/components/keycap-keyboard/keycap-keyboard.d.ts +1 -1
  53. package/dist/types/components/link-unfurl/link-unfurl.d.ts +17 -7
  54. package/dist/types/components/locale-switcher/locale-switcher.d.ts +17 -11
  55. package/dist/types/components/mention-input/mention-input.d.ts +7 -7
  56. package/dist/types/components/metric-card/metric-card.d.ts +2 -2
  57. package/dist/types/components/navigation/navigation.d.ts +1 -1
  58. package/dist/types/components/next/emotion-registry.d.ts +3 -5
  59. package/dist/types/components/now-playing/now-playing.d.ts +2 -2
  60. package/dist/types/components/password-field/password-field.d.ts +1 -1
  61. package/dist/types/components/progress/progress.d.ts +1 -1
  62. package/dist/types/components/select/select.d.ts +1 -1
  63. package/dist/types/components/sheet-stack/sheet-stack.d.ts +19 -16
  64. package/dist/types/components/signature-pad/signature-pad.d.ts +2 -2
  65. package/dist/types/components/split-button/split-button.d.ts +3 -4
  66. package/dist/types/components/swipe-actions/swipe-actions.d.ts +1 -2
  67. package/dist/types/components/tag-input/tag-input.d.ts +2 -3
  68. package/dist/types/components/theme-root/theme-root.d.ts +5 -6
  69. package/dist/types/components/theme-switch/theme-switch.d.ts +3 -3
  70. package/dist/types/components/time-picker/time-picker.d.ts +2 -2
  71. package/dist/types/components/timeline/timeline.d.ts +4 -4
  72. package/dist/types/components/toast/toast.d.ts +3 -3
  73. package/dist/types/components/tree-view/tree-view.d.ts +4 -3
  74. package/dist/types/components/typewriter-terminal/index.d.ts +2 -0
  75. package/dist/types/components/typewriter-terminal/typewriter-terminal.d.ts +87 -0
  76. package/dist/types/components/usage-meter/usage-meter.d.ts +4 -4
  77. package/dist/types/components/usage-meter/usage-model.d.ts +1 -1
  78. package/dist/types/components/user-menu/user-menu.d.ts +3 -4
  79. package/dist/types/index.d.ts +4 -0
  80. package/dist/types/styling/motion-timings.d.ts +5 -0
  81. package/dist/types/styling/sx.d.ts +1 -1
  82. package/dist/types/styling/theme.d.ts +10 -0
  83. package/dist/types/utils/initials.d.ts +2 -0
  84. package/dist/typewriter-terminal-BUEsMzo3.js +588 -0
  85. package/dist/typewriter-terminal.js +2 -0
  86. package/dist/{user-menu-DzELTg1x.js → user-menu-MctRu_Lh.js} +1 -1
  87. package/dist/user-menu.js +1 -1
  88. package/package.json +18 -2
  89. package/dist/avatar-B6idYC59.js +0 -146
  90. package/dist/locale-switcher-CZF7XNYG.js +0 -295
@@ -0,0 +1,588 @@
1
+ 'use client';
2
+ import { a as e, i as t } from "./css-BYJhdGh-.js";
3
+ import { n } from "./focus-ring-BK5W5_NY.js";
4
+ import { n as r, r as i } from "./media-8yrN85VT.js";
5
+ import { t as a } from "./sx-BJXJ2xJK.js";
6
+ import { t as o } from "./use-controlled-state-DpeVQZNR.js";
7
+ import { t as s } from "./visually-hidden-DgVO3NaB.js";
8
+ import { t as ee } from "./renderable-DzcIj1Lo.js";
9
+ import { t as c } from "./button-C6OV0C7J.js";
10
+ import { t as te } from "./spinner-CvzajSg9.js";
11
+ import { useEffect as l, useId as ne, useLayoutEffect as re, useMemo as u, useRef as d, useState as f } from "react";
12
+ import { vars as p } from "@jfrader/tokens/vars";
13
+ import { Fragment as ie, jsx as m, jsxs as h } from "@emotion/react/jsx-runtime";
14
+ import { MotionConfig as ae, animate as oe, useMotionValue as se, useReducedMotion as ce } from "motion/react";
15
+ //#region src/components/typewriter-terminal/typewriter-terminal.tsx
16
+ var le = 40, g = 160, ue = 1200, _ = 240, v = 11, y = 10, de = {
17
+ type: "spring",
18
+ stiffness: 180,
19
+ damping: 28,
20
+ mass: 1
21
+ }, fe = {
22
+ play: "Play",
23
+ pause: "Pause",
24
+ replay: "Replay",
25
+ copy: "Copy commands",
26
+ seek: "Seek session",
27
+ copied: "Commands copied",
28
+ copyError: "Could not copy commands",
29
+ playing: "Playing",
30
+ paused: "Paused",
31
+ replayed: "Replayed",
32
+ step: (e, t) => `Step ${e}: ${t}`,
33
+ completed: "Complete",
34
+ tones: {
35
+ neutral: "Output",
36
+ muted: "Note",
37
+ success: "Success",
38
+ warning: "Warning",
39
+ danger: "Error",
40
+ accent: "Output"
41
+ }
42
+ }, b = e({
43
+ "0%, 49%": { opacity: 1 },
44
+ "50%, 100%": { opacity: 0 }
45
+ }), pe = t({
46
+ label: "typewriter-terminal",
47
+ margin: 0,
48
+ minInlineSize: 0,
49
+ maxInlineSize: "100%",
50
+ border: `1px solid ${p.color.border}`,
51
+ borderRadius: p.radius.md,
52
+ boxShadow: p.shadow.raised,
53
+ backgroundColor: p.color.surfaceRaised,
54
+ color: p.color.text,
55
+ fontFamily: p.font.sans,
56
+ fontSize: p.textSize.sm,
57
+ lineHeight: p.lineHeight.base,
58
+ overflow: "hidden",
59
+ [r]: {
60
+ borderColor: "CanvasText",
61
+ boxShadow: "none"
62
+ }
63
+ }), me = t({
64
+ display: "flex",
65
+ alignItems: "center",
66
+ flexWrap: "wrap",
67
+ justifyContent: "space-between",
68
+ gap: p.space[2],
69
+ padding: p.space[3],
70
+ fontWeight: p.fontWeight.medium,
71
+ overflowWrap: "anywhere"
72
+ }), he = t({
73
+ direction: "ltr",
74
+ blockSize: `calc(var(--terminal-rows) * 1em * ${p.lineHeight.base} + ${p.space[6]})`,
75
+ boxSizing: "border-box",
76
+ overflow: "auto",
77
+ padding: p.space[3],
78
+ backgroundColor: p.color.surfaceInset,
79
+ fontFamily: p.font.mono,
80
+ fontSize: p.textSize.sm,
81
+ lineHeight: p.lineHeight.base,
82
+ scrollbarWidth: "thin"
83
+ }), ge = t({
84
+ margin: 0,
85
+ minBlockSize: `calc(1em * ${p.lineHeight.base})`,
86
+ whiteSpace: "pre-wrap",
87
+ overflowWrap: "anywhere",
88
+ font: "inherit",
89
+ "&[data-tone=\"accent\"]": { color: p.color.accentText }
90
+ }), _e = t({ color: p.color.textMuted }), ve = t({ color: p.color.accentText }), ye = t({
91
+ display: "inline-block",
92
+ inlineSize: "0.6ch",
93
+ blockSize: "1em",
94
+ verticalAlign: "text-bottom",
95
+ backgroundColor: "currentColor",
96
+ animation: `${b} calc(${p.motion.duration.slow} * 4) step-end infinite`,
97
+ "&[data-static]": { animation: "none" },
98
+ [i]: { animation: "none" },
99
+ [r]: { backgroundColor: "CanvasText" }
100
+ }), be = t({
101
+ display: "flex",
102
+ flexWrap: "wrap",
103
+ alignItems: "center",
104
+ gap: p.space[2],
105
+ padding: p.space[3]
106
+ }), x = t({
107
+ minBlockSize: p.space[12],
108
+ blockSize: "auto",
109
+ minInlineSize: p.space[12],
110
+ paddingBlock: p.space[2],
111
+ whiteSpace: "normal",
112
+ overflowWrap: "anywhere"
113
+ }), xe = t({
114
+ flex: "1 1 auto",
115
+ minInlineSize: p.space[12],
116
+ inlineSize: "100%",
117
+ minBlockSize: p.space[12],
118
+ accentColor: p.color.accent,
119
+ "&:focus-visible": n,
120
+ [r]: { border: "1px solid ButtonText" }
121
+ }), Se = t({
122
+ flex: "1 1 10em",
123
+ minInlineSize: 0
124
+ }), Ce = t({
125
+ fontVariantNumeric: "tabular-nums",
126
+ whiteSpace: "nowrap"
127
+ }), we = t({
128
+ padding: p.space[3],
129
+ overflowWrap: "anywhere",
130
+ color: p.color.textMuted
131
+ }), Te = t({
132
+ paddingInline: p.space[3],
133
+ paddingBlockEnd: p.space[3],
134
+ minBlockSize: `calc(1em * ${p.lineHeight.base})`,
135
+ overflowWrap: "anywhere"
136
+ }), Ee = t({
137
+ ...s,
138
+ "&:focus-within": {
139
+ position: "static",
140
+ inlineSize: "auto",
141
+ blockSize: "auto",
142
+ clip: "auto",
143
+ clipPath: "none",
144
+ overflow: "visible",
145
+ whiteSpace: "normal",
146
+ margin: p.space[3],
147
+ paddingInlineStart: p.space[6]
148
+ }
149
+ }), De = t({
150
+ display: "inline-flex",
151
+ alignItems: "center",
152
+ minBlockSize: p.space[12],
153
+ color: p.color.accentText,
154
+ overflowWrap: "anywhere",
155
+ "&:focus-visible": n
156
+ }), Oe = t({
157
+ display: "inline-flex",
158
+ alignItems: "center",
159
+ gap: p.space[2]
160
+ }), ke = t({
161
+ display: "inline-block",
162
+ inlineSize: "8ch",
163
+ blockSize: p.space[2],
164
+ border: `1px solid ${p.color.borderControl}`,
165
+ borderRadius: p.radius.full,
166
+ overflow: "hidden",
167
+ [r]: { borderColor: "CanvasText" }
168
+ }), Ae = t({
169
+ display: "block",
170
+ blockSize: "100%",
171
+ inlineSize: "var(--terminal-progress)",
172
+ backgroundColor: p.color.accentText,
173
+ [r]: {
174
+ forcedColorAdjust: "none",
175
+ backgroundColor: "Highlight"
176
+ }
177
+ }), je = {
178
+ neutral: "·",
179
+ muted: "·",
180
+ success: "✓",
181
+ warning: "△",
182
+ danger: "×",
183
+ accent: "◆"
184
+ }, Me = {
185
+ neutral: t({ color: p.color.text }),
186
+ muted: t({ color: p.color.textMuted }),
187
+ success: t({ color: p.color.success }),
188
+ warning: t({ color: p.color.warning }),
189
+ danger: t({ color: p.color.dangerText }),
190
+ accent: t({ color: p.color.accentText })
191
+ };
192
+ function S(e, t) {
193
+ return e !== void 0 && Number.isFinite(e) && e >= 0 ? e : t;
194
+ }
195
+ function C(e, t) {
196
+ return Math.min(t, Math.max(0, Number.isFinite(e) ? e : 0));
197
+ }
198
+ function Ne(e, t, n) {
199
+ let r = new Intl.Segmenter(n, { granularity: "grapheme" }), i = 0, a = t, o = /* @__PURE__ */ new Set();
200
+ return {
201
+ commands: e.map((e) => {
202
+ a = e.cwd ?? a;
203
+ let t = i, n = Array.from(r.segment(e.command), ({ segment: e }) => e);
204
+ for (let e of n) i += le, o.add(i);
205
+ let s = i, ee = (e.output ?? []).map((e) => {
206
+ let t = typeof e == "string" ? g : "kind" in e ? 0 : S(e.delayMs, g);
207
+ i += t;
208
+ let n = i;
209
+ if (o.add(i), typeof e != "string" && "kind" in e) {
210
+ let t = S(e.durationMs, ue);
211
+ for (let e = 1; e <= y; e++) o.add(i + t * e / y);
212
+ i += t;
213
+ }
214
+ return {
215
+ output: e,
216
+ start: n,
217
+ end: i
218
+ };
219
+ });
220
+ return i += S(e.pauseMs, _), o.add(i), {
221
+ step: e,
222
+ cwd: a,
223
+ start: t,
224
+ typedEnd: s,
225
+ end: i,
226
+ graphemes: n,
227
+ outputs: ee
228
+ };
229
+ }),
230
+ ticks: [...o].sort((e, t) => e - t),
231
+ duration: i
232
+ };
233
+ }
234
+ function Pe(e) {
235
+ if (e !== void 0) try {
236
+ let t = new URL(e, "https://terminal.invalid/");
237
+ return ["http:", "https:"].includes(t.protocol) ? e : void 0;
238
+ } catch {
239
+ return;
240
+ }
241
+ }
242
+ function Fe(...e) {
243
+ return e.filter(Boolean).join(" ") || void 0;
244
+ }
245
+ function w({ ref: e, steps: t, title: n = "Terminal", cwd: r = "~", symbol: i = "$", value: s, defaultValue: p = 0, onValueChange: g, paused: ue, defaultPaused: _ = !1, onPausedChange: y, speed: b = 1, loop: S = !1, rows: w = v, copyable: Ie = !0, caption: T, label: Le = "Terminal session", labels: E, locale: D, slotProps: O, className: Re, sx: ze, style: Be, "aria-labelledby": Ve, "aria-describedby": He, ...Ue }) {
246
+ let k = {
247
+ ...fe,
248
+ ...E,
249
+ tones: {
250
+ ...fe.tones,
251
+ ...E?.tones
252
+ }
253
+ }, A = u(() => Ne(t, r, D), [
254
+ t,
255
+ r,
256
+ D
257
+ ]), [We, j] = o(s === void 0 ? void 0 : C(s, A.duration), C(p, A.duration), g), [M, N] = o(ue, _, y), P = C(We ?? 0, A.duration), Ge = ce(), [Ke, qe] = f(null), F = Ke ?? Ge, [Je, I] = f({
258
+ active: !1,
259
+ target: null
260
+ }), [Ye, L] = f(""), [R, z] = f(null), [Xe, B] = f(!1), V = d(null), H = d(0), U = d(!1), W = d(null), [G, Ze] = f(!0), [K, Qe] = f(!0), q = se(0), $e = ne(), et = O?.caption?.id ?? `${$e}-caption`, tt = ee(T), nt = Number.isFinite(b) && b > 0 ? b : 1, rt = Number.isInteger(w) && w > 0 ? w : v, J = u(() => new Intl.NumberFormat(D, { maximumFractionDigits: 1 }), [D]), it = u(() => new Intl.NumberFormat(D, {
261
+ style: "percent",
262
+ maximumFractionDigits: 0
263
+ }), [D]), Y = Math.max(0, A.commands.findLastIndex((e) => e.start <= P)), at = A.commands[Y], ot = `${at ? k.step(Y + 1, at.step.command) : k.completed}; ${J.format(P / 1e3)} / ${J.format(A.duration / 1e3)} s`, X = Je.active || Je.target === P, Z = F ? X ? A.commands[Math.max(0, A.commands.findLastIndex((e) => e.start <= P))]?.end ?? 0 : A.duration : P;
264
+ l(() => (H.current++, U.current = !1, B(!1), I({
265
+ active: !1,
266
+ target: null
267
+ }), () => {
268
+ H.current++, U.current = !1;
269
+ }), [A]), l(() => {
270
+ let e = V.current;
271
+ if (!e) return;
272
+ let t = e.ownerDocument, n = t.defaultView?.matchMedia("(prefers-reduced-motion: reduce)"), r = () => {
273
+ n && (qe(n.matches), n.matches && I({
274
+ active: !1,
275
+ target: null
276
+ }));
277
+ };
278
+ r(), n?.addEventListener("change", r);
279
+ let i = () => Qe(t.visibilityState !== "hidden");
280
+ i(), t.addEventListener("visibilitychange", i);
281
+ let a = t.defaultView?.IntersectionObserver, o = a ? new a(([e]) => {
282
+ e && Ze(e.isIntersecting);
283
+ }) : null;
284
+ return o?.observe(e), () => {
285
+ t.removeEventListener("visibilitychange", i), n?.removeEventListener("change", r), o?.disconnect();
286
+ };
287
+ }, []), l(() => {
288
+ if (M || F || !G || !K || A.duration === 0) return;
289
+ let e = A.ticks.find((e) => e > P);
290
+ if (e === void 0 && W.current !== A) return;
291
+ let t = setTimeout(function() {
292
+ e === void 0 ? (W.current = null, S ? j(0) : N(!0)) : (e === A.duration && (W.current = A), j(e));
293
+ }, e === void 0 ? 0 : (e - P) / nt);
294
+ return () => clearTimeout(t);
295
+ }, [
296
+ P,
297
+ M,
298
+ F,
299
+ G,
300
+ K,
301
+ nt,
302
+ S,
303
+ A,
304
+ j,
305
+ N
306
+ ]), l(() => {
307
+ R && (z(null), (R.position === void 0 || R.position === P) && (R.paused === void 0 || R.paused === M) && L(R.message));
308
+ }, [
309
+ R,
310
+ P,
311
+ M
312
+ ]), re(() => {
313
+ let e = V.current;
314
+ if (!e || M || !G || !K) return;
315
+ let t = Math.max(0, e.scrollHeight - e.clientHeight);
316
+ if (F) {
317
+ e.scrollTop = t, q.set(t);
318
+ return;
319
+ }
320
+ q.set(e.scrollTop);
321
+ let n = q.on("change", (t) => {
322
+ e.scrollTop = t;
323
+ }), r = oe(q, t, de);
324
+ return () => {
325
+ r.stop(), n();
326
+ };
327
+ }, [
328
+ Z,
329
+ M,
330
+ F,
331
+ G,
332
+ K,
333
+ q
334
+ ]);
335
+ function Q(e) {
336
+ let t = C(e, A.duration);
337
+ F && I({
338
+ active: X,
339
+ target: t
340
+ }), t !== P && (j(t), z({
341
+ message: `${k.seek}: ${J.format(t / 1e3)} s`,
342
+ position: t
343
+ }));
344
+ }
345
+ function $() {
346
+ N(!M), z({
347
+ message: M ? k.playing : k.paused,
348
+ paused: !M
349
+ });
350
+ }
351
+ async function st() {
352
+ if (U.current) return;
353
+ U.current = !0, B(!0);
354
+ let e = ++H.current;
355
+ try {
356
+ let n = V.current?.ownerDocument.defaultView?.navigator.clipboard;
357
+ if (!n) throw Error("Clipboard unavailable");
358
+ await n.writeText(t.map(({ command: e }) => e).join("\n")), e === H.current && L(k.copied);
359
+ } catch {
360
+ e === H.current && L(k.copyError);
361
+ } finally {
362
+ e === H.current && (U.current = !1, B(!1));
363
+ }
364
+ }
365
+ function ct(e) {
366
+ return typeof e == "string" ? e : "kind" in e ? e.label : e.text;
367
+ }
368
+ function lt(e, t, n) {
369
+ if (typeof e == "string") return e;
370
+ if (!("kind" in e)) return /* @__PURE__ */ h(ie, { children: [/* @__PURE__ */ h("span", {
371
+ css: Me[e.tone ?? "neutral"],
372
+ children: [je[e.tone ?? "neutral"], " "]
373
+ }), e.text] });
374
+ let r = Z >= n, i = n === t ? 1 : Math.min(1, (Z - t) / (n - t));
375
+ return /* @__PURE__ */ h("span", {
376
+ css: Oe,
377
+ children: [
378
+ e.kind === "task" ? r ? "✓" : /* @__PURE__ */ m(te, {
379
+ size: "sm",
380
+ label: e.label
381
+ }) : /* @__PURE__ */ m("span", {
382
+ css: ke,
383
+ children: /* @__PURE__ */ m("span", {
384
+ css: Ae,
385
+ style: { "--terminal-progress": `${i * 100}%` }
386
+ })
387
+ }),
388
+ r && e.kind === "task" ? e.doneLabel ?? e.label : e.label,
389
+ " ",
390
+ e.kind === "progress" ? it.format(i) : r ? k.completed : ""
391
+ ]
392
+ });
393
+ }
394
+ return /* @__PURE__ */ m(ae, {
395
+ reducedMotion: "user",
396
+ children: /* @__PURE__ */ m(a, {
397
+ className: Re,
398
+ styles: pe,
399
+ sx: ze,
400
+ children: (t) => /* @__PURE__ */ h("figure", {
401
+ ...Ue,
402
+ ref: e,
403
+ className: t,
404
+ "data-ui": "typewriter-terminal",
405
+ "aria-label": Ue["aria-label"] ?? (Ve ? void 0 : Le),
406
+ "aria-labelledby": Ve,
407
+ "aria-describedby": Fe(He, tt ? et : void 0),
408
+ style: {
409
+ ...Be,
410
+ "--terminal-rows": rt
411
+ },
412
+ children: [
413
+ /* @__PURE__ */ h("header", {
414
+ ...O?.header,
415
+ role: "group",
416
+ css: [me, O?.header?.css],
417
+ children: [/* @__PURE__ */ m("span", { children: n }), Ie && /* @__PURE__ */ m(c, {
418
+ ...O?.copyButton,
419
+ css: [x, O?.copyButton?.css],
420
+ variant: "ghost",
421
+ "aria-disabled": Xe || O?.copyButton?.["aria-disabled"],
422
+ onClick: (e) => {
423
+ O?.copyButton?.onClick?.(e), e.defaultPrevented || st();
424
+ },
425
+ children: k.copy
426
+ })]
427
+ }),
428
+ /* @__PURE__ */ m("div", {
429
+ ...O?.screen,
430
+ ref: V,
431
+ css: [he, O?.screen?.css],
432
+ "data-ui": "typewriter-terminal-screen",
433
+ "aria-hidden": "true",
434
+ inert: !0,
435
+ children: A.commands.filter((e, t) => e.start <= Z && (!F || !X || t <= Y)).map((e, t) => {
436
+ let n = F ? e.graphemes.length : Math.min(e.graphemes.length, Math.floor((Z - e.start) / le));
437
+ return /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("pre", {
438
+ css: ge,
439
+ children: [
440
+ /* @__PURE__ */ h("span", {
441
+ css: _e,
442
+ children: [
443
+ e.cwd,
444
+ " ",
445
+ i,
446
+ " "
447
+ ]
448
+ }),
449
+ /* @__PURE__ */ m("span", {
450
+ css: ve,
451
+ children: e.graphemes.slice(0, n).join("")
452
+ }),
453
+ Z < e.typedEnd && /* @__PURE__ */ m("span", {
454
+ css: ye,
455
+ "data-static": M || F ? "" : void 0
456
+ })
457
+ ]
458
+ }), e.outputs.filter((e) => e.start <= Z).map(({ output: e, start: t, end: n }, r) => /* @__PURE__ */ m("pre", {
459
+ css: ge,
460
+ "data-tone": typeof e == "object" && !("kind" in e) ? e.tone : void 0,
461
+ children: lt(e, t, n)
462
+ }, r))] }, t);
463
+ })
464
+ }),
465
+ /* @__PURE__ */ h("div", {
466
+ ...O?.controls,
467
+ css: [be, O?.controls?.css],
468
+ children: [
469
+ /* @__PURE__ */ m(c, {
470
+ ...O?.playButton,
471
+ css: [x, O?.playButton?.css],
472
+ variant: "outline",
473
+ disabled: A.duration === 0 || O?.playButton?.disabled,
474
+ onClick: (e) => {
475
+ O?.playButton?.onClick?.(e), e.defaultPrevented || $();
476
+ },
477
+ children: M ? k.play : k.pause
478
+ }),
479
+ /* @__PURE__ */ m(c, {
480
+ ...O?.replayButton,
481
+ css: [x, O?.replayButton?.css],
482
+ variant: "ghost",
483
+ disabled: A.duration === 0 || O?.replayButton?.disabled,
484
+ onClick: (e) => {
485
+ O?.replayButton?.onClick?.(e), !e.defaultPrevented && (j(0), N(!1), W.current = null, I({
486
+ active: !1,
487
+ target: null
488
+ }), z({
489
+ message: k.replayed,
490
+ position: 0,
491
+ paused: !1
492
+ }));
493
+ },
494
+ children: k.replay
495
+ }),
496
+ /* @__PURE__ */ m("div", {
497
+ css: Se,
498
+ children: /* @__PURE__ */ m("input", {
499
+ ...O?.scrubber,
500
+ css: [xe, O?.scrubber?.css],
501
+ type: "range",
502
+ min: 0,
503
+ max: A.duration,
504
+ step: "any",
505
+ value: P,
506
+ disabled: A.duration === 0 || O?.scrubber?.disabled,
507
+ "aria-label": O?.scrubber?.["aria-label"] ?? k.seek,
508
+ "aria-valuetext": ot,
509
+ onChange: (e) => {
510
+ O?.scrubber?.onChange?.(e), e.defaultPrevented || Q(Number(e.currentTarget.value));
511
+ },
512
+ onKeyDown: (e) => {
513
+ if (O?.scrubber?.onKeyDown?.(e), e.defaultPrevented) return;
514
+ let t = [...A.commands.map(({ start: e }) => e), A.duration], n = {
515
+ ArrowRight: () => Q(t.find((e) => e > P) ?? A.duration),
516
+ ArrowUp: () => Q(t.find((e) => e > P) ?? A.duration),
517
+ PageUp: () => Q(t.find((e) => e > P) ?? A.duration),
518
+ ArrowLeft: () => Q(t.findLast((e) => e < P) ?? 0),
519
+ ArrowDown: () => Q(t.findLast((e) => e < P) ?? 0),
520
+ PageDown: () => Q(t.findLast((e) => e < P) ?? 0),
521
+ Home: () => Q(0),
522
+ End: () => Q(A.duration),
523
+ " ": $,
524
+ k: $,
525
+ K: $
526
+ }[e.key];
527
+ n && (e.preventDefault(), n());
528
+ }
529
+ })
530
+ }),
531
+ /* @__PURE__ */ h("span", {
532
+ css: Ce,
533
+ children: [
534
+ J.format(P / 1e3),
535
+ " / ",
536
+ J.format(A.duration / 1e3),
537
+ " s"
538
+ ]
539
+ })
540
+ ]
541
+ }),
542
+ /* @__PURE__ */ m("ol", {
543
+ ...O?.transcript,
544
+ css: [Ee, O?.transcript?.css],
545
+ "data-ui": "typewriter-terminal-transcript",
546
+ "aria-hidden": void 0,
547
+ inert: !1,
548
+ children: A.commands.map((e, t) => /* @__PURE__ */ h("li", { children: [/* @__PURE__ */ h("span", { children: [
549
+ e.cwd,
550
+ " ",
551
+ i,
552
+ " ",
553
+ e.step.command
554
+ ] }), e.outputs.map(({ output: e }, t) => {
555
+ let n = typeof e == "object" && !("kind" in e) ? Pe(e.href) : void 0, r = ct(e);
556
+ return /* @__PURE__ */ h("div", { children: [
557
+ typeof e == "object" && !("kind" in e) && e.tone ? `${k.tones[e.tone]}: ` : "",
558
+ n === void 0 ? r : /* @__PURE__ */ m("a", {
559
+ css: De,
560
+ href: n,
561
+ children: r
562
+ }),
563
+ typeof e == "object" && "kind" in e ? ` — ${e.kind === "task" ? e.doneLabel ?? k.completed : it.format(1)}` : ""
564
+ ] }, t);
565
+ })] }, t))
566
+ }),
567
+ /* @__PURE__ */ m("div", {
568
+ ...O?.status,
569
+ css: [Te, O?.status?.css],
570
+ role: "status",
571
+ "aria-live": "polite",
572
+ "aria-atomic": "true",
573
+ children: Ye
574
+ }),
575
+ tt && /* @__PURE__ */ m("figcaption", {
576
+ ...O?.caption,
577
+ id: et,
578
+ css: [we, O?.caption?.css],
579
+ children: T
580
+ })
581
+ ]
582
+ })
583
+ })
584
+ });
585
+ }
586
+ w.displayName = "TypewriterTerminal";
587
+ //#endregion
588
+ export { w as t };
@@ -0,0 +1,2 @@
1
+ 'use client';
2
+ export { t as TypewriterTerminal } from "./typewriter-terminal-BUEsMzo3.js";
@@ -8,7 +8,7 @@ import { t as c } from "./use-controlled-state-DpeVQZNR.js";
8
8
  import { t as l } from "./visually-hidden-DgVO3NaB.js";
9
9
  import { t as u } from "./renderable-DzcIj1Lo.js";
10
10
  import { t as d } from "./icon-wrapper-C-zMD0uL.js";
11
- import { t as f } from "./avatar-B6idYC59.js";
11
+ import { t as f } from "./avatar-sPxDqFiZ.js";
12
12
  import { t as p } from "./use-scroll-lock-40gXwwAy.js";
13
13
  import { s as m } from "./listbox-style-DNOxAulu.js";
14
14
  import { t as h } from "./overlay-portal-C9igMHnC.js";
package/dist/user-menu.js CHANGED
@@ -1,2 +1,2 @@
1
1
  'use client';
2
- export { t as UserMenu } from "./user-menu-DzELTg1x.js";
2
+ export { t as UserMenu } from "./user-menu-MctRu_Lh.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jfrader/ui",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "React components styled with Emotion and themed through CSS custom properties.",
5
5
  "keywords": [
6
6
  "react",
@@ -154,6 +154,10 @@
154
154
  "types": "./dist/types/components/drawer/index.d.ts",
155
155
  "import": "./dist/drawer.js"
156
156
  },
157
+ "./emblem": {
158
+ "types": "./dist/types/components/emblem/index.d.ts",
159
+ "import": "./dist/emblem.js"
160
+ },
157
161
  "./empty-state": {
158
162
  "types": "./dist/types/components/empty-state/index.d.ts",
159
163
  "import": "./dist/empty-state.js"
@@ -178,6 +182,10 @@
178
182
  "types": "./dist/types/components/flex/index.d.ts",
179
183
  "import": "./dist/flex.js"
180
184
  },
185
+ "./game-card": {
186
+ "types": "./dist/types/components/game-card/index.d.ts",
187
+ "import": "./dist/game-card.js"
188
+ },
181
189
  "./hold-to-confirm": {
182
190
  "types": "./dist/types/components/hold-to-confirm/index.d.ts",
183
191
  "import": "./dist/hold-to-confirm.js"
@@ -186,6 +194,10 @@
186
194
  "types": "./dist/types/components/image-compare/index.d.ts",
187
195
  "import": "./dist/image-compare.js"
188
196
  },
197
+ "./in-view-title": {
198
+ "types": "./dist/types/components/in-view-title/index.d.ts",
199
+ "import": "./dist/in-view-title.js"
200
+ },
189
201
  "./inline-edit": {
190
202
  "types": "./dist/types/components/inline-edit/index.d.ts",
191
203
  "import": "./dist/inline-edit.js"
@@ -402,6 +414,10 @@
402
414
  "types": "./dist/types/components/tree-view/index.d.ts",
403
415
  "import": "./dist/tree-view.js"
404
416
  },
417
+ "./typewriter-terminal": {
418
+ "types": "./dist/types/components/typewriter-terminal/index.d.ts",
419
+ "import": "./dist/typewriter-terminal.js"
420
+ },
405
421
  "./usage-meter": {
406
422
  "types": "./dist/types/components/usage-meter/index.d.ts",
407
423
  "import": "./dist/usage-meter.js"
@@ -419,7 +435,7 @@
419
435
  "@emotion/styled": "^11.14.0",
420
436
  "@floating-ui/react": "^0.27.20",
421
437
  "motion": "^14.1.0",
422
- "@jfrader/tokens": "0.6.0"
438
+ "@jfrader/tokens": "0.7.0"
423
439
  },
424
440
  "peerDependencies": {
425
441
  "@emotion/cache": "^11.14.0",