@krpkg/ui 0.0.0-stage → 0.3.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 (77) hide show
  1. package/README.md +138 -2
  2. package/assets/android-background-alley.svg +3 -0
  3. package/assets/android-background-clean.svg +3 -0
  4. package/assets/android-background-default.svg +3 -0
  5. package/assets/android-background-mono.svg +3 -0
  6. package/assets/android-background-teal.svg +3 -0
  7. package/assets/android-foreground-alley.svg +3 -0
  8. package/assets/android-foreground-clean.svg +3 -0
  9. package/assets/android-foreground-default.svg +3 -0
  10. package/assets/android-foreground-mono.svg +3 -0
  11. package/assets/android-foreground-teal.svg +3 -0
  12. package/assets/android-icon-background.png +0 -0
  13. package/assets/android-icon-foreground.png +0 -0
  14. package/assets/android-icon-monochrome.png +0 -0
  15. package/assets/apple-touch-icon-120x120.png +0 -0
  16. package/assets/apple-touch-icon-152x152.png +0 -0
  17. package/assets/apple-touch-icon-167x167.png +0 -0
  18. package/assets/apple-touch-icon-180x180.png +0 -0
  19. package/assets/apple-touch-icon.png +0 -0
  20. package/assets/favicon-128x128.png +0 -0
  21. package/assets/favicon-16x16.png +0 -0
  22. package/assets/favicon-32x32.png +0 -0
  23. package/assets/favicon-48x48.png +0 -0
  24. package/assets/favicon-64x64.png +0 -0
  25. package/assets/favicon-96x96.png +0 -0
  26. package/assets/favicon.ico +0 -0
  27. package/assets/favicon.png +0 -0
  28. package/assets/favicon.svg +11 -0
  29. package/assets/icon-alley.png +0 -0
  30. package/assets/icon-teal.png +0 -0
  31. package/assets/icon.png +0 -0
  32. package/assets/logo-alley.svg +11 -0
  33. package/assets/logo-badge.svg +11 -0
  34. package/assets/logo-clean.svg +11 -0
  35. package/assets/logo-default.svg +11 -0
  36. package/assets/logo-icon.svg +3 -0
  37. package/assets/logo-mono.svg +11 -0
  38. package/assets/logo-teal.svg +11 -0
  39. package/assets/logo.svg +3 -0
  40. package/assets/pwa-192x192.png +0 -0
  41. package/assets/pwa-256x256.png +0 -0
  42. package/assets/pwa-384x384.png +0 -0
  43. package/assets/pwa-512x512.png +0 -0
  44. package/assets/pwa-maskable-192x192.png +0 -0
  45. package/assets/pwa-maskable-512x512.png +0 -0
  46. package/assets/splash-icon.png +0 -0
  47. package/dist/chunk-HAD2NPEW.mjs +155 -0
  48. package/dist/chunk-HAD2NPEW.mjs.map +1 -0
  49. package/dist/chunk-ZJSL4I3W.mjs +38 -0
  50. package/dist/chunk-ZJSL4I3W.mjs.map +1 -0
  51. package/dist/index.css +2053 -0
  52. package/dist/index.css.map +1 -0
  53. package/dist/index.d.mts +245 -0
  54. package/dist/index.d.ts +245 -0
  55. package/dist/index.js +1331 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/index.mjs +1110 -0
  58. package/dist/index.mjs.map +1 -0
  59. package/dist/native.d.mts +51 -0
  60. package/dist/native.d.ts +51 -0
  61. package/dist/native.js +514 -0
  62. package/dist/native.js.map +1 -0
  63. package/dist/native.mjs +431 -0
  64. package/dist/native.mjs.map +1 -0
  65. package/dist/tokens.d.mts +183 -0
  66. package/dist/tokens.d.ts +183 -0
  67. package/dist/tokens.js +185 -0
  68. package/dist/tokens.js.map +1 -0
  69. package/dist/tokens.mjs +19 -0
  70. package/dist/tokens.mjs.map +1 -0
  71. package/dist/utils.d.mts +13 -0
  72. package/dist/utils.d.ts +13 -0
  73. package/dist/utils.js +65 -0
  74. package/dist/utils.js.map +1 -0
  75. package/dist/utils.mjs +9 -0
  76. package/dist/utils.mjs.map +1 -0
  77. package/package.json +71 -4
package/dist/index.mjs ADDED
@@ -0,0 +1,1110 @@
1
+ import {
2
+ formatDuration,
3
+ formatRelativeTime
4
+ } from "./chunk-ZJSL4I3W.mjs";
5
+ import {
6
+ borderRadius,
7
+ colors,
8
+ cssTokens,
9
+ spacing,
10
+ themePalettes,
11
+ tokens,
12
+ typography
13
+ } from "./chunk-HAD2NPEW.mjs";
14
+
15
+ // src/components/Button.tsx
16
+ import { forwardRef } from "react";
17
+ import { jsx } from "react/jsx-runtime";
18
+ var Button = forwardRef(
19
+ ({ className = "", variant = "outline", size = "md", children, ...props }, ref) => {
20
+ const classList = [
21
+ "kz-btn",
22
+ `kz-btn-${variant}`,
23
+ size !== "md" ? `kz-btn-${size}` : "",
24
+ className
25
+ ].filter(Boolean).join(" ");
26
+ return /* @__PURE__ */ jsx("button", { ref, className: classList, ...props, children });
27
+ }
28
+ );
29
+ Button.displayName = "Button";
30
+
31
+ // src/components/BracketCard.tsx
32
+ import { forwardRef as forwardRef2 } from "react";
33
+ import { jsx as jsx2 } from "react/jsx-runtime";
34
+ var BracketCard = forwardRef2(
35
+ ({ className = "", children, ...props }, ref) => {
36
+ return /* @__PURE__ */ jsx2(
37
+ "div",
38
+ {
39
+ ref,
40
+ className: `kz-bracket-card ${className}`.trim(),
41
+ ...props,
42
+ children
43
+ }
44
+ );
45
+ }
46
+ );
47
+ BracketCard.displayName = "BracketCard";
48
+
49
+ // src/components/CornerFrame.tsx
50
+ import { forwardRef as forwardRef3 } from "react";
51
+ import { Fragment, jsx as jsx3, jsxs } from "react/jsx-runtime";
52
+ var CornerFrame = forwardRef3(
53
+ ({ showCorners = true, className = "", children, ...props }, ref) => {
54
+ return /* @__PURE__ */ jsxs("div", { ref, className: `kz-corner-frame ${className}`.trim(), ...props, children: [
55
+ showCorners && /* @__PURE__ */ jsxs(Fragment, { children: [
56
+ /* @__PURE__ */ jsx3("span", { className: "kz-corner tl", "aria-hidden": "true" }),
57
+ /* @__PURE__ */ jsx3("span", { className: "kz-corner tr", "aria-hidden": "true" }),
58
+ /* @__PURE__ */ jsx3("span", { className: "kz-corner bl", "aria-hidden": "true" }),
59
+ /* @__PURE__ */ jsx3("span", { className: "kz-corner br", "aria-hidden": "true" })
60
+ ] }),
61
+ children
62
+ ] });
63
+ }
64
+ );
65
+ CornerFrame.displayName = "CornerFrame";
66
+
67
+ // src/components/Badge.tsx
68
+ import { forwardRef as forwardRef4 } from "react";
69
+ import { jsx as jsx4 } from "react/jsx-runtime";
70
+ var Badge = forwardRef4(
71
+ ({ variant = "default", className = "", children, ...props }, ref) => {
72
+ const classList = [
73
+ "kz-badge",
74
+ variant !== "default" ? variant : "",
75
+ className
76
+ ].filter(Boolean).join(" ");
77
+ return /* @__PURE__ */ jsx4("span", { ref, className: classList, ...props, children });
78
+ }
79
+ );
80
+ Badge.displayName = "Badge";
81
+
82
+ // src/components/Dot.tsx
83
+ import { forwardRef as forwardRef5 } from "react";
84
+ import { jsx as jsx5 } from "react/jsx-runtime";
85
+ var Dot = forwardRef5(
86
+ ({ color = "accent", pulse = false, className = "", ...props }, ref) => {
87
+ const classList = [
88
+ "kz-dot",
89
+ color !== "accent" ? color : "",
90
+ pulse ? "pulse" : "",
91
+ className
92
+ ].filter(Boolean).join(" ");
93
+ return /* @__PURE__ */ jsx5("span", { ref, className: classList, "aria-hidden": "true", ...props });
94
+ }
95
+ );
96
+ Dot.displayName = "Dot";
97
+
98
+ // src/components/TechLabel.tsx
99
+ import { forwardRef as forwardRef6 } from "react";
100
+ import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
101
+ var TechLabel = forwardRef6(
102
+ ({ label, jp, coord, className = "", children, ...props }, ref) => {
103
+ return /* @__PURE__ */ jsxs2("div", { ref, className: `kz-tech-label ${className}`.trim(), ...props, children: [
104
+ /* @__PURE__ */ jsx6("span", { children: label }),
105
+ jp && /* @__PURE__ */ jsx6("span", { className: "jp", children: jp }),
106
+ coord && /* @__PURE__ */ jsxs2("span", { className: "kz-coord", children: [
107
+ "[",
108
+ coord,
109
+ "]"
110
+ ] }),
111
+ children
112
+ ] });
113
+ }
114
+ );
115
+ TechLabel.displayName = "TechLabel";
116
+
117
+ // src/components/Vinyl.tsx
118
+ import { forwardRef as forwardRef7 } from "react";
119
+ import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
120
+ var Vinyl = forwardRef7(
121
+ ({
122
+ size = "md",
123
+ variant = "default",
124
+ layout = "disc",
125
+ playing = false,
126
+ coverUrl,
127
+ label = "KRZ",
128
+ showRing = true,
129
+ title,
130
+ artist,
131
+ album,
132
+ rpm = "33",
133
+ controls,
134
+ className = "",
135
+ onClick,
136
+ ...props
137
+ }, ref) => {
138
+ const discElement = /* @__PURE__ */ jsxs3(
139
+ "div",
140
+ {
141
+ className: `kz-vinyl-area kz-vinyl-${size} kz-vinyl-${variant}`,
142
+ onClick,
143
+ children: [
144
+ showRing && /* @__PURE__ */ jsx7("div", { className: "kz-vinyl-ring", "aria-hidden": "true" }),
145
+ /* @__PURE__ */ jsxs3("div", { className: `kz-vinyl ${playing ? "playing" : ""}`, children: [
146
+ /* @__PURE__ */ jsx7("div", { className: "kz-vinyl-grooves", "aria-hidden": "true" }),
147
+ /* @__PURE__ */ jsxs3("div", { className: "kz-vinyl-label", children: [
148
+ coverUrl ? /* @__PURE__ */ jsx7(
149
+ "img",
150
+ {
151
+ src: coverUrl,
152
+ alt: "Vinyl center artwork",
153
+ className: "kz-vinyl-cover"
154
+ }
155
+ ) : /* @__PURE__ */ jsx7("span", { children: label }),
156
+ /* @__PURE__ */ jsx7("div", { className: "kz-vinyl-spindle", "aria-hidden": "true" })
157
+ ] })
158
+ ] })
159
+ ]
160
+ }
161
+ );
162
+ if (layout === "disc") {
163
+ return /* @__PURE__ */ jsx7(
164
+ "div",
165
+ {
166
+ ref,
167
+ className: `kz-vinyl-wrapper kz-layout-disc ${className}`.trim(),
168
+ ...props,
169
+ children: discElement
170
+ }
171
+ );
172
+ }
173
+ if (layout === "mini") {
174
+ return /* @__PURE__ */ jsxs3(
175
+ "div",
176
+ {
177
+ ref,
178
+ className: `kz-vinyl-layout-mini kz-vinyl-${variant} ${playing ? "kz-playing" : ""} ${className}`.trim(),
179
+ ...props,
180
+ children: [
181
+ /* @__PURE__ */ jsx7("div", { className: "kz-vinyl-mini-disc", children: discElement }),
182
+ /* @__PURE__ */ jsxs3("div", { className: "kz-vinyl-mini-info", children: [
183
+ /* @__PURE__ */ jsxs3("div", { className: "kz-vinyl-mini-status", children: [
184
+ /* @__PURE__ */ jsx7("span", { className: `kz-vinyl-pulse ${playing ? "kz-pulse-active" : ""}` }),
185
+ /* @__PURE__ */ jsx7("span", { className: "kz-vinyl-status-text", children: playing ? "NOW PLAYING" : "STANDBY" }),
186
+ /* @__PURE__ */ jsxs3("span", { className: "kz-vinyl-rpm-tag", children: [
187
+ rpm,
188
+ " RPM"
189
+ ] })
190
+ ] }),
191
+ title && /* @__PURE__ */ jsx7("div", { className: "kz-vinyl-mini-title", children: title }),
192
+ (artist || album) && /* @__PURE__ */ jsxs3("div", { className: "kz-vinyl-mini-artist", children: [
193
+ artist,
194
+ album && ` \u2014 [${album}]`
195
+ ] })
196
+ ] }),
197
+ controls && /* @__PURE__ */ jsx7("div", { className: "kz-vinyl-mini-controls", children: controls })
198
+ ]
199
+ }
200
+ );
201
+ }
202
+ if (layout === "card" || layout === "turntable") {
203
+ return /* @__PURE__ */ jsxs3(
204
+ "div",
205
+ {
206
+ ref,
207
+ className: `kz-vinyl-layout-card kz-vinyl-${variant} ${playing ? "kz-playing" : ""} ${className}`.trim(),
208
+ ...props,
209
+ children: [
210
+ /* @__PURE__ */ jsxs3("div", { className: "kz-vinyl-deck-header", children: [
211
+ /* @__PURE__ */ jsxs3("span", { className: "kz-vinyl-deck-tag", children: [
212
+ "HI-FI DECK // ",
213
+ rpm,
214
+ " RPM"
215
+ ] }),
216
+ /* @__PURE__ */ jsxs3("span", { className: "kz-vinyl-deck-status", children: [
217
+ /* @__PURE__ */ jsx7("span", { className: `kz-vinyl-pulse ${playing ? "kz-pulse-active" : ""}` }),
218
+ playing ? "ACTIVE_PLAYBACK" : "IDLE"
219
+ ] })
220
+ ] }),
221
+ /* @__PURE__ */ jsxs3("div", { className: "kz-vinyl-deck-center", children: [
222
+ discElement,
223
+ layout === "turntable" && /* @__PURE__ */ jsxs3("div", { className: `kz-turntable-tonearm ${playing ? "engaged" : ""}`, children: [
224
+ /* @__PURE__ */ jsx7("div", { className: "kz-tonearm-pivot" }),
225
+ /* @__PURE__ */ jsx7("div", { className: "kz-tonearm-rod" }),
226
+ /* @__PURE__ */ jsx7("div", { className: "kz-tonearm-head" })
227
+ ] })
228
+ ] }),
229
+ /* @__PURE__ */ jsxs3("div", { className: "kz-vinyl-deck-footer", children: [
230
+ /* @__PURE__ */ jsxs3("div", { className: "kz-vinyl-deck-meta", children: [
231
+ title && /* @__PURE__ */ jsx7("div", { className: "kz-vinyl-deck-title", children: title }),
232
+ (artist || album) && /* @__PURE__ */ jsxs3("div", { className: "kz-vinyl-deck-artist", children: [
233
+ artist,
234
+ album && ` \u2014 [${album}]`
235
+ ] })
236
+ ] }),
237
+ controls && /* @__PURE__ */ jsx7("div", { className: "kz-vinyl-deck-controls", children: controls })
238
+ ] })
239
+ ]
240
+ }
241
+ );
242
+ }
243
+ return discElement;
244
+ }
245
+ );
246
+ Vinyl.displayName = "Vinyl";
247
+
248
+ // src/components/StickyNote.tsx
249
+ import { forwardRef as forwardRef8 } from "react";
250
+ import { jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
251
+ var StickyNote = forwardRef8(
252
+ ({ colorVariant = 1, title, tape = true, className = "", children, ...props }, ref) => {
253
+ return /* @__PURE__ */ jsxs4(
254
+ "div",
255
+ {
256
+ ref,
257
+ className: `kz-sticky kz-sticky-${colorVariant} ${tape ? "has-tape" : ""} ${className}`.trim(),
258
+ ...props,
259
+ children: [
260
+ title && /* @__PURE__ */ jsx8("div", { className: "kz-sticky-title", children: title }),
261
+ /* @__PURE__ */ jsx8("div", { className: "kz-sticky-body", children })
262
+ ]
263
+ }
264
+ );
265
+ }
266
+ );
267
+ StickyNote.displayName = "StickyNote";
268
+
269
+ // src/components/SpoilerGate.tsx
270
+ import { useState } from "react";
271
+ import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
272
+ function SpoilerGate({
273
+ title = "CLASSIFIED CONTENT // SPOILER GATE",
274
+ description = "This section contains narrative disclosures or classified intel. Proceed with caution.",
275
+ clearanceText = "// clearance: user acknowledgement required",
276
+ buttonText = "Reveal Content",
277
+ children,
278
+ defaultRevealed = false
279
+ }) {
280
+ const [revealed, setRevealed] = useState(defaultRevealed);
281
+ if (revealed) {
282
+ return /* @__PURE__ */ jsx9(Fragment2, { children });
283
+ }
284
+ return /* @__PURE__ */ jsxs5(BracketCard, { className: "kz-spoiler-gate", children: [
285
+ /* @__PURE__ */ jsx9("div", { className: "kz-spoiler-icon", "aria-hidden": "true", children: "\u26A0" }),
286
+ /* @__PURE__ */ jsx9("div", { className: "kz-spoiler-title", children: title }),
287
+ /* @__PURE__ */ jsx9("p", { className: "kz-spoiler-desc", children: description }),
288
+ /* @__PURE__ */ jsx9("div", { className: "kz-spoiler-clearance", children: clearanceText }),
289
+ /* @__PURE__ */ jsx9(
290
+ Button,
291
+ {
292
+ variant: "primary",
293
+ size: "sm",
294
+ onClick: () => setRevealed(true),
295
+ children: buttonText
296
+ }
297
+ )
298
+ ] });
299
+ }
300
+
301
+ // src/components/Logo.tsx
302
+ import { forwardRef as forwardRef9 } from "react";
303
+ import { Fragment as Fragment3, jsx as jsx10, jsxs as jsxs6 } from "react/jsx-runtime";
304
+ var KURZAGIN_EMBLEM_PATH = "M 427.836 313.750 C 407.437 340.731, 394.892 355.256, 374.072 376.002 C 354.040 395.961, 340.283 407.774, 313 428.443 C 304.475 434.901, 297.379 440.507, 297.231 440.899 C 297.083 441.292, 301.161 442.068, 306.293 442.625 C 315.608 443.635, 315.631 443.644, 319.771 448.136 C 322.053 450.611, 326.525 453.914, 329.710 455.475 C 332.894 457.037, 342.025 459.858, 350 461.744 C 372.991 467.182, 394.656 473.443, 409.642 478.980 C 417.264 481.796, 435.650 490.118, 450.500 497.473 C 465.350 504.829, 479.843 511.371, 482.706 512.013 C 485.569 512.654, 489.315 512.870, 491.030 512.493 C 495.063 511.608, 500.400 506.893, 502.055 502.755 C 502.771 500.965, 504.654 497.826, 506.239 495.780 L 509.121 492.059 500.195 477.780 C 482.447 449.389, 470.897 425.848, 461.635 399.191 C 453.474 375.701, 448.375 352.493, 444.016 319 C 442.835 309.925, 441.560 301.262, 441.184 299.750 C 440.541 297.166, 439.733 298.014, 427.836 313.750 M 653.035 367.631 C 630.326 397.968, 609.007 422.929, 590.366 441.009 C 571.099 459.696, 557.105 471.452, 529.623 492.040 C 516.293 502.026, 515.859 502.464, 518.623 503.127 C 520.205 503.507, 524.434 504.108, 528.020 504.464 C 534.161 505.072, 534.824 505.396, 539.427 510.027 C 545.512 516.149, 554.045 519.837, 570.500 523.457 C 597.419 529.379, 620.207 536.452, 641.500 545.492 C 647.550 548.061, 660.747 554.437, 670.826 559.661 C 680.905 564.885, 691.663 570.024, 694.732 571.080 C 705.045 574.628, 713.038 573.043, 717.643 566.536 C 718.664 565.093, 721.423 561.512, 723.773 558.577 L 728.046 553.241 721.158 542.371 C 706.003 518.456, 694.474 496.400, 686.725 476.500 C 681.571 463.266, 675.390 443.922, 672.594 432.275 C 669.515 419.452, 665.566 396.537, 662.660 374.631 L 660.422 357.763 653.035 367.631 M 495 525.305 C 490.875 530.880, 482.805 541.304, 477.066 548.471 C 443.624 590.231, 416.848 615.914, 370.750 650.443 C 364.288 655.284, 359 659.554, 359 659.931 C 359 660.308, 363.190 661.072, 368.312 661.627 C 377.605 662.634, 377.632 662.645, 381.771 667.136 C 384.053 669.611, 388.419 672.860, 391.474 674.356 C 394.529 675.852, 403.885 678.674, 412.264 680.626 C 453.717 690.286, 479.620 699.543, 512.500 716.446 C 523.500 722.101, 534.907 727.515, 537.848 728.477 C 541.471 729.662, 545.147 730.085, 549.239 729.789 C 554.840 729.384, 555.545 729.051, 558.891 725.234 C 565.508 717.684, 570 711.874, 570 710.865 C 570 710.315, 565.859 703.258, 560.797 695.183 C 550.969 679.501, 539.291 657.628, 532.980 643.076 C 527.165 629.669, 518.662 604.130, 515.143 589.500 C 511.412 573.988, 507.612 551.727, 505.413 532.500 C 504.533 524.800, 503.517 517.750, 503.156 516.834 C 502.661 515.577, 500.658 517.657, 495 525.305";
305
+ var Logo = forwardRef9(
306
+ ({
307
+ size = 28,
308
+ color,
309
+ variant = "default",
310
+ withRing,
311
+ className = "",
312
+ style,
313
+ ...props
314
+ }, ref) => {
315
+ let glyphFill = color;
316
+ let ringStroke = color || "currentColor";
317
+ let ringBg = "transparent";
318
+ if (!color) {
319
+ switch (variant) {
320
+ case "accent":
321
+ glyphFill = "var(--kz-accent, #c49368)";
322
+ ringStroke = "var(--kz-accent, #c49368)";
323
+ break;
324
+ case "teal":
325
+ glyphFill = "var(--kz-teal, #50b0b0)";
326
+ ringStroke = "var(--kz-teal, #50b0b0)";
327
+ break;
328
+ case "purple":
329
+ glyphFill = "var(--kz-purple, #b066ff)";
330
+ ringStroke = "var(--kz-purple, #b066ff)";
331
+ break;
332
+ case "minimal":
333
+ glyphFill = "var(--kz-text-1, #b0aca4)";
334
+ ringStroke = "var(--kz-border, #2a2a30)";
335
+ break;
336
+ case "monochrome":
337
+ glyphFill = "var(--kz-text-0, #e2ded6)";
338
+ ringStroke = "var(--kz-border-light, #3a3a42)";
339
+ break;
340
+ case "badge":
341
+ glyphFill = "var(--kz-accent, #c49368)";
342
+ ringStroke = "var(--kz-accent, #c49368)";
343
+ ringBg = "rgba(10, 10, 12, 0.9)";
344
+ break;
345
+ case "default":
346
+ default:
347
+ glyphFill = "var(--kz-accent, #c49368)";
348
+ ringStroke = "var(--kz-border, #2a2a30)";
349
+ break;
350
+ }
351
+ }
352
+ const showRing = withRing !== void 0 ? withRing : variant === "badge";
353
+ return /* @__PURE__ */ jsxs6(
354
+ "svg",
355
+ {
356
+ ref,
357
+ width: size,
358
+ height: size,
359
+ viewBox: "0 0 1024 1024",
360
+ fill: "none",
361
+ xmlns: "http://www.w3.org/2000/svg",
362
+ className: `kz-logo kz-logo-${variant} ${className}`.trim(),
363
+ style: {
364
+ display: "inline-block",
365
+ verticalAlign: "middle",
366
+ flexShrink: 0,
367
+ ...style
368
+ },
369
+ ...props,
370
+ children: [
371
+ showRing && /* @__PURE__ */ jsxs6(Fragment3, { children: [
372
+ ringBg !== "transparent" && /* @__PURE__ */ jsx10("circle", { cx: "512", cy: "512", r: "488", fill: ringBg }),
373
+ /* @__PURE__ */ jsx10(
374
+ "circle",
375
+ {
376
+ cx: "512",
377
+ cy: "512",
378
+ r: "488",
379
+ stroke: ringStroke,
380
+ strokeWidth: "24",
381
+ strokeOpacity: variant === "default" ? 0.4 : 0.8
382
+ }
383
+ ),
384
+ /* @__PURE__ */ jsx10("circle", { cx: "512", cy: "18", r: "8", fill: glyphFill }),
385
+ /* @__PURE__ */ jsx10("circle", { cx: "512", cy: "1006", r: "8", fill: glyphFill }),
386
+ /* @__PURE__ */ jsx10("circle", { cx: "18", cy: "512", r: "8", fill: glyphFill }),
387
+ /* @__PURE__ */ jsx10("circle", { cx: "1006", cy: "512", r: "8", fill: glyphFill })
388
+ ] }),
389
+ /* @__PURE__ */ jsx10(
390
+ "path",
391
+ {
392
+ d: KURZAGIN_EMBLEM_PATH,
393
+ fill: glyphFill || "currentColor",
394
+ fillRule: "evenodd"
395
+ }
396
+ )
397
+ ]
398
+ }
399
+ );
400
+ }
401
+ );
402
+ Logo.displayName = "Logo";
403
+
404
+ // src/components/Input.tsx
405
+ import { forwardRef as forwardRef10 } from "react";
406
+ import { jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
407
+ var Input = forwardRef10(
408
+ ({
409
+ className = "",
410
+ label,
411
+ sublabel,
412
+ prefixSymbol = ">_",
413
+ suffixSymbol,
414
+ error,
415
+ hint,
416
+ inputSize = "md",
417
+ fullWidth = true,
418
+ disabled,
419
+ ...props
420
+ }, ref) => {
421
+ return /* @__PURE__ */ jsxs7(
422
+ "div",
423
+ {
424
+ className: [
425
+ "kz-input-wrapper",
426
+ fullWidth ? "kz-input-full" : "",
427
+ disabled ? "kz-input-disabled" : "",
428
+ error ? "kz-input-has-error" : "",
429
+ className
430
+ ].filter(Boolean).join(" "),
431
+ children: [
432
+ (label || sublabel) && /* @__PURE__ */ jsxs7("div", { className: "kz-input-header", children: [
433
+ label && /* @__PURE__ */ jsx11("label", { className: "kz-input-label", children: label }),
434
+ sublabel && /* @__PURE__ */ jsx11("span", { className: "kz-input-sublabel", children: sublabel })
435
+ ] }),
436
+ /* @__PURE__ */ jsxs7("div", { className: `kz-input-field-container kz-input-${inputSize}`, children: [
437
+ prefixSymbol && /* @__PURE__ */ jsx11("div", { className: "kz-input-prefix", children: prefixSymbol }),
438
+ /* @__PURE__ */ jsx11(
439
+ "input",
440
+ {
441
+ ref,
442
+ disabled,
443
+ className: "kz-input-field",
444
+ ...props
445
+ }
446
+ ),
447
+ suffixSymbol && /* @__PURE__ */ jsx11("div", { className: "kz-input-suffix", children: suffixSymbol }),
448
+ /* @__PURE__ */ jsx11("div", { className: "kz-input-corner-tl" }),
449
+ /* @__PURE__ */ jsx11("div", { className: "kz-input-corner-br" })
450
+ ] }),
451
+ (error || hint) && /* @__PURE__ */ jsx11("div", { className: "kz-input-footer", children: error ? /* @__PURE__ */ jsx11("span", { className: "kz-input-error-msg", children: error }) : /* @__PURE__ */ jsx11("span", { className: "kz-input-hint-msg", children: hint }) })
452
+ ]
453
+ }
454
+ );
455
+ }
456
+ );
457
+ Input.displayName = "Input";
458
+
459
+ // src/components/TelemetryBar.tsx
460
+ import { forwardRef as forwardRef11 } from "react";
461
+ import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
462
+ var TelemetryBar = forwardRef11(
463
+ ({
464
+ className = "",
465
+ value,
466
+ max = 100,
467
+ label,
468
+ coord,
469
+ variant = "accent",
470
+ segmented = false,
471
+ segmentsCount = 20,
472
+ showReadout = true,
473
+ size = "md",
474
+ ...props
475
+ }, ref) => {
476
+ const clampedValue = Math.min(Math.max(value, 0), max);
477
+ const percentage = Math.round(clampedValue / max * 100);
478
+ return /* @__PURE__ */ jsxs8(
479
+ "div",
480
+ {
481
+ ref,
482
+ className: [
483
+ "kz-telemetry-container",
484
+ `kz-telemetry-${size}`,
485
+ `kz-telemetry-${variant}`,
486
+ className
487
+ ].filter(Boolean).join(" "),
488
+ ...props,
489
+ children: [
490
+ (label || coord || showReadout) && /* @__PURE__ */ jsxs8("div", { className: "kz-telemetry-header", children: [
491
+ /* @__PURE__ */ jsxs8("div", { className: "kz-telemetry-label-group", children: [
492
+ label && /* @__PURE__ */ jsx12("span", { className: "kz-telemetry-label", children: label }),
493
+ coord && /* @__PURE__ */ jsxs8("span", { className: "kz-telemetry-coord", children: [
494
+ "[",
495
+ coord,
496
+ "]"
497
+ ] })
498
+ ] }),
499
+ showReadout && /* @__PURE__ */ jsxs8("span", { className: "kz-telemetry-readout", children: [
500
+ percentage,
501
+ "%"
502
+ ] })
503
+ ] }),
504
+ /* @__PURE__ */ jsx12("div", { className: "kz-telemetry-track", children: segmented ? /* @__PURE__ */ jsx12("div", { className: "kz-telemetry-segments", children: Array.from({ length: segmentsCount }).map((_, idx) => {
505
+ const step = 100 / segmentsCount;
506
+ const active = (idx + 1) * step <= percentage || idx * step < percentage && (idx + 1) * step > percentage;
507
+ return /* @__PURE__ */ jsx12(
508
+ "span",
509
+ {
510
+ className: `kz-telemetry-seg ${active ? "active" : ""}`
511
+ },
512
+ idx
513
+ );
514
+ }) }) : /* @__PURE__ */ jsx12(
515
+ "div",
516
+ {
517
+ className: "kz-telemetry-fill",
518
+ style: { width: `${percentage}%` },
519
+ children: /* @__PURE__ */ jsx12("div", { className: "kz-telemetry-glow" })
520
+ }
521
+ ) })
522
+ ]
523
+ }
524
+ );
525
+ }
526
+ );
527
+ TelemetryBar.displayName = "TelemetryBar";
528
+
529
+ // src/components/HudModal.tsx
530
+ import { useEffect } from "react";
531
+ import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
532
+ var HudModal = ({
533
+ isOpen,
534
+ onClose,
535
+ title = "SYS_ALERT",
536
+ jp,
537
+ coord = "NODE-01",
538
+ children,
539
+ footer,
540
+ size = "md",
541
+ className = "",
542
+ closeOnBackdrop = true
543
+ }) => {
544
+ useEffect(() => {
545
+ if (!isOpen) return;
546
+ const handleKeyDown = (e) => {
547
+ if (e.key === "Escape") {
548
+ onClose();
549
+ }
550
+ };
551
+ window.addEventListener("keydown", handleKeyDown);
552
+ return () => window.removeEventListener("keydown", handleKeyDown);
553
+ }, [isOpen, onClose]);
554
+ if (!isOpen) return null;
555
+ return /* @__PURE__ */ jsxs9("div", { className: "kz-modal-portal", children: [
556
+ /* @__PURE__ */ jsx13(
557
+ "div",
558
+ {
559
+ className: "kz-modal-backdrop",
560
+ onClick: closeOnBackdrop ? onClose : void 0
561
+ }
562
+ ),
563
+ /* @__PURE__ */ jsxs9("div", { className: `kz-modal-dialog kz-modal-${size} ${className}`, children: [
564
+ /* @__PURE__ */ jsxs9("div", { className: "kz-modal-header", children: [
565
+ /* @__PURE__ */ jsxs9("div", { className: "kz-modal-title-group", children: [
566
+ /* @__PURE__ */ jsx13("span", { className: "kz-modal-title", children: title }),
567
+ jp && /* @__PURE__ */ jsx13("span", { className: "kz-modal-jp", children: jp }),
568
+ coord && /* @__PURE__ */ jsxs9("span", { className: "kz-modal-coord", children: [
569
+ "// [",
570
+ coord,
571
+ "]"
572
+ ] })
573
+ ] }),
574
+ /* @__PURE__ */ jsx13(
575
+ "button",
576
+ {
577
+ type: "button",
578
+ className: "kz-modal-close-btn",
579
+ onClick: onClose,
580
+ "aria-label": "Close dialog",
581
+ children: "[ESC \u2715]"
582
+ }
583
+ )
584
+ ] }),
585
+ /* @__PURE__ */ jsx13("div", { className: "kz-modal-body", children }),
586
+ footer && /* @__PURE__ */ jsx13("div", { className: "kz-modal-footer", children: footer }),
587
+ /* @__PURE__ */ jsx13("div", { className: "kz-modal-corner-tl" }),
588
+ /* @__PURE__ */ jsx13("div", { className: "kz-modal-corner-tr" }),
589
+ /* @__PURE__ */ jsx13("div", { className: "kz-modal-corner-bl" }),
590
+ /* @__PURE__ */ jsx13("div", { className: "kz-modal-corner-br" })
591
+ ] })
592
+ ] });
593
+ };
594
+ HudModal.displayName = "HudModal";
595
+
596
+ // src/components/TerminalWindow.tsx
597
+ import { forwardRef as forwardRef12, useState as useState2 } from "react";
598
+ import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
599
+ var TerminalWindow = forwardRef12(
600
+ ({
601
+ className = "",
602
+ title = "terminal.sh",
603
+ badge = "ACTIVE",
604
+ code,
605
+ showLineNumbers = true,
606
+ copyable = true,
607
+ ...props
608
+ }, ref) => {
609
+ const [copied, setCopied] = useState2(false);
610
+ const handleCopy = () => {
611
+ navigator.clipboard.writeText(code);
612
+ setCopied(true);
613
+ setTimeout(() => setCopied(false), 2e3);
614
+ };
615
+ const lines = code.trim().split("\n");
616
+ return /* @__PURE__ */ jsxs10(
617
+ "div",
618
+ {
619
+ ref,
620
+ className: ["kz-terminal-window", className].filter(Boolean).join(" "),
621
+ ...props,
622
+ children: [
623
+ /* @__PURE__ */ jsxs10("div", { className: "kz-terminal-header", children: [
624
+ /* @__PURE__ */ jsxs10("div", { className: "kz-terminal-dots", children: [
625
+ /* @__PURE__ */ jsx14("span", { className: "kz-term-dot kz-term-dot-red" }),
626
+ /* @__PURE__ */ jsx14("span", { className: "kz-term-dot kz-term-dot-yellow" }),
627
+ /* @__PURE__ */ jsx14("span", { className: "kz-term-dot kz-term-dot-green" })
628
+ ] }),
629
+ /* @__PURE__ */ jsxs10("div", { className: "kz-terminal-title-box", children: [
630
+ /* @__PURE__ */ jsx14("span", { className: "kz-terminal-title", children: title }),
631
+ badge && /* @__PURE__ */ jsx14("span", { className: "kz-terminal-badge", children: badge })
632
+ ] }),
633
+ /* @__PURE__ */ jsx14("div", { className: "kz-terminal-actions", children: copyable && /* @__PURE__ */ jsx14(
634
+ "button",
635
+ {
636
+ type: "button",
637
+ className: "kz-terminal-copy-btn",
638
+ onClick: handleCopy,
639
+ "aria-label": "Copy code",
640
+ children: copied ? "[COPIED]" : "[COPY]"
641
+ }
642
+ ) })
643
+ ] }),
644
+ /* @__PURE__ */ jsx14("div", { className: "kz-terminal-body", children: /* @__PURE__ */ jsx14("pre", { className: "kz-terminal-pre", children: showLineNumbers ? /* @__PURE__ */ jsx14("code", { children: lines.map((line, idx) => /* @__PURE__ */ jsxs10("div", { className: "kz-terminal-line", children: [
645
+ /* @__PURE__ */ jsx14("span", { className: "kz-terminal-lineno", children: idx + 1 }),
646
+ /* @__PURE__ */ jsx14("span", { className: "kz-terminal-linecontent", children: line || " " })
647
+ ] }, idx)) }) : /* @__PURE__ */ jsx14("code", { children: code }) }) })
648
+ ]
649
+ }
650
+ );
651
+ }
652
+ );
653
+ TerminalWindow.displayName = "TerminalWindow";
654
+
655
+ // src/components/Tooltip.tsx
656
+ import { useState as useState3, useRef } from "react";
657
+ import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
658
+ var Tooltip = ({
659
+ content,
660
+ children,
661
+ position = "top",
662
+ coord,
663
+ className = ""
664
+ }) => {
665
+ const [isVisible, setIsVisible] = useState3(false);
666
+ const timeoutRef = useRef(null);
667
+ const show = () => {
668
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
669
+ setIsVisible(true);
670
+ };
671
+ const hide = () => {
672
+ timeoutRef.current = setTimeout(() => {
673
+ setIsVisible(false);
674
+ }, 100);
675
+ };
676
+ return /* @__PURE__ */ jsxs11(
677
+ "div",
678
+ {
679
+ className: "kz-tooltip-wrapper",
680
+ onMouseEnter: show,
681
+ onMouseLeave: hide,
682
+ onFocus: show,
683
+ onBlur: hide,
684
+ children: [
685
+ children,
686
+ isVisible && /* @__PURE__ */ jsxs11(
687
+ "div",
688
+ {
689
+ role: "tooltip",
690
+ className: `kz-tooltip-box kz-tooltip-${position} ${className}`,
691
+ children: [
692
+ coord && /* @__PURE__ */ jsxs11("span", { className: "kz-tooltip-coord", children: [
693
+ "[",
694
+ coord,
695
+ "]"
696
+ ] }),
697
+ /* @__PURE__ */ jsx15("div", { className: "kz-tooltip-content", children: content }),
698
+ /* @__PURE__ */ jsx15("div", { className: "kz-tooltip-arrow" })
699
+ ]
700
+ }
701
+ )
702
+ ]
703
+ }
704
+ );
705
+ };
706
+ Tooltip.displayName = "Tooltip";
707
+
708
+ // src/components/SegmentedControl.tsx
709
+ import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
710
+ function SegmentedControl({
711
+ options,
712
+ value,
713
+ onChange,
714
+ size = "md",
715
+ fullWidth = false,
716
+ className = "",
717
+ variant = "default"
718
+ }) {
719
+ return /* @__PURE__ */ jsx16(
720
+ "div",
721
+ {
722
+ className: `kz-segmented-control kz-segmented-${size} kz-segmented-${variant} ${fullWidth ? "kz-segmented-full" : ""} ${className}`.trim(),
723
+ role: "tablist",
724
+ children: options.map((option) => {
725
+ const isActive = option.value === value;
726
+ return /* @__PURE__ */ jsxs12(
727
+ "button",
728
+ {
729
+ type: "button",
730
+ role: "tab",
731
+ "aria-selected": isActive,
732
+ disabled: option.disabled,
733
+ className: `kz-segmented-item ${isActive ? "kz-active" : ""} ${option.disabled ? "kz-disabled" : ""}`.trim(),
734
+ onClick: () => !option.disabled && onChange(option.value),
735
+ children: [
736
+ isActive && /* @__PURE__ */ jsx16("span", { className: "kz-segmented-bracket-l" }),
737
+ /* @__PURE__ */ jsxs12("span", { className: "kz-segmented-content", children: [
738
+ /* @__PURE__ */ jsx16("span", { className: "kz-segmented-label", children: option.label }),
739
+ option.sublabel && /* @__PURE__ */ jsx16("span", { className: "kz-segmented-sublabel", children: option.sublabel })
740
+ ] }),
741
+ option.badge !== void 0 && /* @__PURE__ */ jsx16("span", { className: "kz-segmented-badge", children: option.badge }),
742
+ isActive && /* @__PURE__ */ jsx16("span", { className: "kz-segmented-bracket-r" })
743
+ ]
744
+ },
745
+ option.value
746
+ );
747
+ })
748
+ }
749
+ );
750
+ }
751
+
752
+ // src/components/CyberSwitch.tsx
753
+ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
754
+ function CyberSwitch({
755
+ checked,
756
+ onChange,
757
+ label,
758
+ sublabel,
759
+ disabled = false,
760
+ size = "md",
761
+ variant = "default",
762
+ className = ""
763
+ }) {
764
+ return /* @__PURE__ */ jsxs13(
765
+ "label",
766
+ {
767
+ className: `kz-switch-container kz-switch-${size} kz-switch-${variant} ${checked ? "kz-checked" : ""} ${disabled ? "kz-disabled" : ""} ${className}`.trim(),
768
+ onClick: (e) => {
769
+ if (disabled) return;
770
+ e.preventDefault();
771
+ onChange(!checked);
772
+ },
773
+ children: [
774
+ /* @__PURE__ */ jsxs13(
775
+ "div",
776
+ {
777
+ className: "kz-switch-track",
778
+ role: "switch",
779
+ "aria-checked": checked,
780
+ tabIndex: disabled ? -1 : 0,
781
+ onKeyDown: (e) => {
782
+ if (disabled) return;
783
+ if (e.key === " " || e.key === "Enter") {
784
+ e.preventDefault();
785
+ onChange(!checked);
786
+ }
787
+ },
788
+ children: [
789
+ /* @__PURE__ */ jsx17("span", { className: "kz-switch-state-text left", children: checked ? "1" : "" }),
790
+ /* @__PURE__ */ jsx17("div", { className: "kz-switch-thumb", children: /* @__PURE__ */ jsx17("span", { className: "kz-switch-thumb-grip" }) }),
791
+ /* @__PURE__ */ jsx17("span", { className: "kz-switch-state-text right", children: !checked ? "0" : "" })
792
+ ]
793
+ }
794
+ ),
795
+ (label || sublabel) && /* @__PURE__ */ jsxs13("div", { className: "kz-switch-text-group", children: [
796
+ label && /* @__PURE__ */ jsx17("span", { className: "kz-switch-label", children: label }),
797
+ sublabel && /* @__PURE__ */ jsx17("span", { className: "kz-switch-sublabel", children: sublabel })
798
+ ] })
799
+ ]
800
+ }
801
+ );
802
+ }
803
+
804
+ // src/components/KeyValGrid.tsx
805
+ import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
806
+ function KeyValGrid({
807
+ items,
808
+ title,
809
+ coord,
810
+ columns = 1,
811
+ leaderDots = true,
812
+ className = ""
813
+ }) {
814
+ return /* @__PURE__ */ jsxs14(
815
+ "div",
816
+ {
817
+ className: `kz-keyval-grid kz-keyval-cols-${columns} ${className}`.trim(),
818
+ children: [
819
+ (title || coord) && /* @__PURE__ */ jsxs14("div", { className: "kz-keyval-header", children: [
820
+ title && /* @__PURE__ */ jsx18("span", { className: "kz-keyval-title", children: title }),
821
+ coord && /* @__PURE__ */ jsx18("span", { className: "kz-keyval-coord", children: coord })
822
+ ] }),
823
+ /* @__PURE__ */ jsx18("div", { className: "kz-keyval-list", children: items.map((item, idx) => /* @__PURE__ */ jsxs14("div", { className: "kz-keyval-row", children: [
824
+ /* @__PURE__ */ jsxs14("span", { className: "kz-keyval-key", children: [
825
+ item.status && /* @__PURE__ */ jsx18("span", { className: `kz-keyval-dot kz-dot-${item.status}` }),
826
+ item.key
827
+ ] }),
828
+ leaderDots && /* @__PURE__ */ jsx18("span", { className: "kz-keyval-leader" }),
829
+ /* @__PURE__ */ jsxs14("span", { className: "kz-keyval-val", children: [
830
+ /* @__PURE__ */ jsx18("span", { className: "kz-keyval-val-main", children: item.value }),
831
+ item.sub && /* @__PURE__ */ jsx18("span", { className: "kz-keyval-val-sub", children: item.sub })
832
+ ] })
833
+ ] }, idx)) })
834
+ ]
835
+ }
836
+ );
837
+ }
838
+
839
+ // src/components/Breadcrumbs.tsx
840
+ import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
841
+ function Breadcrumbs({
842
+ items,
843
+ prefix = "SYS //",
844
+ separator = "/",
845
+ className = ""
846
+ }) {
847
+ return /* @__PURE__ */ jsxs15(
848
+ "nav",
849
+ {
850
+ "aria-label": "Breadcrumb",
851
+ className: `kz-breadcrumbs ${className}`.trim(),
852
+ children: [
853
+ prefix && /* @__PURE__ */ jsx19("span", { className: "kz-breadcrumb-prefix", children: prefix }),
854
+ /* @__PURE__ */ jsx19("ol", { className: "kz-breadcrumb-list", children: items.map((item, idx) => {
855
+ const isLast = idx === items.length - 1;
856
+ const isActive = item.active || isLast;
857
+ return /* @__PURE__ */ jsxs15(
858
+ "li",
859
+ {
860
+ className: `kz-breadcrumb-item ${isActive ? "kz-active" : ""}`,
861
+ children: [
862
+ idx > 0 && /* @__PURE__ */ jsx19("span", { className: "kz-breadcrumb-separator", "aria-hidden": "true", children: separator }),
863
+ item.href && !isActive ? /* @__PURE__ */ jsx19(
864
+ "a",
865
+ {
866
+ href: item.href,
867
+ className: "kz-breadcrumb-link",
868
+ onClick: item.onClick,
869
+ children: item.label
870
+ }
871
+ ) : item.onClick && !isActive ? /* @__PURE__ */ jsx19(
872
+ "button",
873
+ {
874
+ type: "button",
875
+ className: "kz-breadcrumb-button",
876
+ onClick: item.onClick,
877
+ children: item.label
878
+ }
879
+ ) : /* @__PURE__ */ jsx19(
880
+ "span",
881
+ {
882
+ className: "kz-breadcrumb-current",
883
+ "aria-current": isActive ? "page" : void 0,
884
+ children: item.label
885
+ }
886
+ )
887
+ ]
888
+ },
889
+ idx
890
+ );
891
+ }) })
892
+ ]
893
+ }
894
+ );
895
+ }
896
+
897
+ // src/components/TacticalDrawer.tsx
898
+ import { useEffect as useEffect2 } from "react";
899
+ import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
900
+ function TacticalDrawer({
901
+ isOpen,
902
+ onClose,
903
+ title,
904
+ coord = "DRAWER // 0xAF",
905
+ sublabel,
906
+ children,
907
+ position = "bottom",
908
+ className = ""
909
+ }) {
910
+ useEffect2(() => {
911
+ if (!isOpen) return;
912
+ const handleKeyDown = (e) => {
913
+ if (e.key === "Escape") onClose();
914
+ };
915
+ window.addEventListener("keydown", handleKeyDown);
916
+ return () => window.removeEventListener("keydown", handleKeyDown);
917
+ }, [isOpen, onClose]);
918
+ if (!isOpen) return null;
919
+ return /* @__PURE__ */ jsx20(
920
+ "div",
921
+ {
922
+ className: `kz-drawer-backdrop kz-drawer-${position}`,
923
+ onClick: (e) => {
924
+ if (e.target === e.currentTarget) onClose();
925
+ },
926
+ children: /* @__PURE__ */ jsxs16(
927
+ "div",
928
+ {
929
+ className: `kz-drawer-panel kz-drawer-panel-${position} ${className}`.trim(),
930
+ role: "dialog",
931
+ "aria-modal": "true",
932
+ children: [
933
+ position === "bottom" && /* @__PURE__ */ jsx20("div", { className: "kz-drawer-handle-bar", onClick: onClose, children: /* @__PURE__ */ jsx20("span", { className: "kz-drawer-handle-pill" }) }),
934
+ /* @__PURE__ */ jsxs16("div", { className: "kz-drawer-header", children: [
935
+ /* @__PURE__ */ jsxs16("div", { className: "kz-drawer-title-group", children: [
936
+ coord && /* @__PURE__ */ jsx20("span", { className: "kz-drawer-coord", children: coord }),
937
+ title && /* @__PURE__ */ jsx20("h3", { className: "kz-drawer-title", children: title }),
938
+ sublabel && /* @__PURE__ */ jsx20("span", { className: "kz-drawer-sublabel", children: sublabel })
939
+ ] }),
940
+ /* @__PURE__ */ jsx20(
941
+ "button",
942
+ {
943
+ type: "button",
944
+ className: "kz-drawer-close-btn",
945
+ onClick: onClose,
946
+ "aria-label": "Close drawer",
947
+ children: "\u2715"
948
+ }
949
+ )
950
+ ] }),
951
+ /* @__PURE__ */ jsx20("div", { className: "kz-drawer-body", children })
952
+ ]
953
+ }
954
+ )
955
+ }
956
+ );
957
+ }
958
+
959
+ // src/components/HudToast.tsx
960
+ import { useEffect as useEffect3, useState as useState4 } from "react";
961
+ import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
962
+ function HudToast({
963
+ isOpen,
964
+ onClose,
965
+ title,
966
+ description,
967
+ variant = "default",
968
+ duration = 4e3,
969
+ coord = "HUD // NOTIFY",
970
+ className = ""
971
+ }) {
972
+ const [progress, setProgress] = useState4(100);
973
+ useEffect3(() => {
974
+ if (!isOpen || duration <= 0) return;
975
+ setProgress(100);
976
+ const startTime = Date.now();
977
+ const interval = setInterval(() => {
978
+ const elapsed = Date.now() - startTime;
979
+ const remaining = Math.max(0, 100 - elapsed / duration * 100);
980
+ setProgress(remaining);
981
+ if (elapsed >= duration) {
982
+ clearInterval(interval);
983
+ onClose();
984
+ }
985
+ }, 50);
986
+ return () => clearInterval(interval);
987
+ }, [isOpen, duration, onClose]);
988
+ if (!isOpen) return null;
989
+ return /* @__PURE__ */ jsxs17(
990
+ "div",
991
+ {
992
+ className: `kz-hud-toast kz-toast-${variant} ${className}`.trim(),
993
+ role: "alert",
994
+ children: [
995
+ /* @__PURE__ */ jsxs17("div", { className: "kz-toast-inner", children: [
996
+ /* @__PURE__ */ jsx21("span", { className: "kz-toast-bracket-l" }),
997
+ /* @__PURE__ */ jsxs17("div", { className: "kz-toast-content", children: [
998
+ /* @__PURE__ */ jsxs17("div", { className: "kz-toast-header", children: [
999
+ /* @__PURE__ */ jsx21("span", { className: "kz-toast-dot" }),
1000
+ /* @__PURE__ */ jsx21("span", { className: "kz-toast-coord", children: coord })
1001
+ ] }),
1002
+ /* @__PURE__ */ jsx21("div", { className: "kz-toast-title", children: title }),
1003
+ description && /* @__PURE__ */ jsx21("div", { className: "kz-toast-desc", children: description })
1004
+ ] }),
1005
+ /* @__PURE__ */ jsx21(
1006
+ "button",
1007
+ {
1008
+ type: "button",
1009
+ className: "kz-toast-dismiss",
1010
+ onClick: onClose,
1011
+ "aria-label": "Dismiss notification",
1012
+ children: "\u2715"
1013
+ }
1014
+ ),
1015
+ /* @__PURE__ */ jsx21("span", { className: "kz-toast-bracket-r" })
1016
+ ] }),
1017
+ duration > 0 && /* @__PURE__ */ jsx21("div", { className: "kz-toast-progress-track", children: /* @__PURE__ */ jsx21(
1018
+ "div",
1019
+ {
1020
+ className: "kz-toast-progress-bar",
1021
+ style: { width: `${progress}%` }
1022
+ }
1023
+ ) })
1024
+ ]
1025
+ }
1026
+ );
1027
+ }
1028
+
1029
+ // src/components/BottomBar.tsx
1030
+ import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
1031
+ function BottomBar({
1032
+ items,
1033
+ activeId,
1034
+ onSelect,
1035
+ bordered = true,
1036
+ blur = true,
1037
+ fixed = true,
1038
+ className = "",
1039
+ variant = "default"
1040
+ }) {
1041
+ return /* @__PURE__ */ jsx22(
1042
+ "nav",
1043
+ {
1044
+ className: `kz-bottom-bar kz-bottom-bar-${variant} ${fixed ? "kz-bottom-bar-fixed" : ""} ${blur ? "kz-bottom-bar-blur" : ""} ${bordered ? "kz-bottom-bar-bordered" : ""} ${className}`.trim(),
1045
+ role: "navigation",
1046
+ "aria-label": "Bottom navigation",
1047
+ children: /* @__PURE__ */ jsx22("div", { className: "kz-bottom-bar-track", children: items.map((item) => {
1048
+ const isActive = activeId !== void 0 ? item.id === activeId : item.active;
1049
+ return /* @__PURE__ */ jsxs18(
1050
+ "button",
1051
+ {
1052
+ type: "button",
1053
+ role: "tab",
1054
+ "aria-selected": isActive,
1055
+ disabled: item.disabled,
1056
+ className: `kz-bottom-bar-item ${isActive ? "kz-active" : ""} ${item.disabled ? "kz-disabled" : ""}`.trim(),
1057
+ onClick: () => {
1058
+ if (item.disabled) return;
1059
+ item.onClick?.();
1060
+ onSelect?.(item.id);
1061
+ },
1062
+ children: [
1063
+ isActive && /* @__PURE__ */ jsx22("span", { className: "kz-bottom-bar-active-pip" }),
1064
+ /* @__PURE__ */ jsxs18("div", { className: "kz-bottom-bar-icon-wrap", children: [
1065
+ item.icon,
1066
+ item.badge !== void 0 && /* @__PURE__ */ jsx22("span", { className: "kz-bottom-bar-badge", children: item.badge })
1067
+ ] }),
1068
+ /* @__PURE__ */ jsx22("span", { className: "kz-bottom-bar-label", children: item.label })
1069
+ ]
1070
+ },
1071
+ item.id
1072
+ );
1073
+ }) })
1074
+ }
1075
+ );
1076
+ }
1077
+ export {
1078
+ Badge,
1079
+ BottomBar,
1080
+ BracketCard,
1081
+ Breadcrumbs,
1082
+ Button,
1083
+ CornerFrame,
1084
+ CyberSwitch,
1085
+ Dot,
1086
+ HudModal,
1087
+ HudToast,
1088
+ Input,
1089
+ KeyValGrid,
1090
+ Logo,
1091
+ SegmentedControl,
1092
+ SpoilerGate,
1093
+ StickyNote,
1094
+ TacticalDrawer,
1095
+ TechLabel,
1096
+ TelemetryBar,
1097
+ TerminalWindow,
1098
+ Tooltip,
1099
+ Vinyl,
1100
+ borderRadius,
1101
+ colors,
1102
+ cssTokens,
1103
+ formatDuration,
1104
+ formatRelativeTime,
1105
+ spacing,
1106
+ themePalettes,
1107
+ tokens,
1108
+ typography
1109
+ };
1110
+ //# sourceMappingURL=index.mjs.map