@nukleas/cyberdesign 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.
Files changed (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -0
  3. package/build.ts +286 -0
  4. package/dist/cyberdesign-vars-only.css +116 -0
  5. package/dist/cyberdesign.css +8377 -0
  6. package/dist/fonts/JetBrainsMono-Variable.woff2 +0 -0
  7. package/dist/fonts/OFL.txt +93 -0
  8. package/dist/react/Accordion.d.ts +34 -0
  9. package/dist/react/Accordion.js +13 -0
  10. package/dist/react/Alert.d.ts +19 -0
  11. package/dist/react/Alert.js +6 -0
  12. package/dist/react/AugButton.d.ts +12 -0
  13. package/dist/react/AugButton.js +6 -0
  14. package/dist/react/AugPanel.d.ts +10 -0
  15. package/dist/react/AugPanel.js +6 -0
  16. package/dist/react/Avatar.d.ts +28 -0
  17. package/dist/react/Avatar.js +11 -0
  18. package/dist/react/Badge.d.ts +10 -0
  19. package/dist/react/Badge.js +6 -0
  20. package/dist/react/Breadcrumb.d.ts +19 -0
  21. package/dist/react/Breadcrumb.js +10 -0
  22. package/dist/react/Button.d.ts +12 -0
  23. package/dist/react/Button.js +6 -0
  24. package/dist/react/Checkbox.d.ts +9 -0
  25. package/dist/react/Checkbox.js +9 -0
  26. package/dist/react/Dropdown.d.ts +35 -0
  27. package/dist/react/Dropdown.js +20 -0
  28. package/dist/react/Field.d.ts +13 -0
  29. package/dist/react/Field.js +6 -0
  30. package/dist/react/Gauge.d.ts +19 -0
  31. package/dist/react/Gauge.js +6 -0
  32. package/dist/react/GlowCard.d.ts +12 -0
  33. package/dist/react/GlowCard.js +4 -0
  34. package/dist/react/HudBar.d.ts +34 -0
  35. package/dist/react/HudBar.js +10 -0
  36. package/dist/react/HudFrame.d.ts +19 -0
  37. package/dist/react/HudFrame.js +6 -0
  38. package/dist/react/Input.d.ts +11 -0
  39. package/dist/react/Input.js +6 -0
  40. package/dist/react/Interference.d.ts +18 -0
  41. package/dist/react/Interference.js +6 -0
  42. package/dist/react/Kbd.d.ts +18 -0
  43. package/dist/react/Kbd.js +11 -0
  44. package/dist/react/Label.d.ts +8 -0
  45. package/dist/react/Label.js +6 -0
  46. package/dist/react/Modal.d.ts +19 -0
  47. package/dist/react/Modal.js +9 -0
  48. package/dist/react/Pagination.d.ts +23 -0
  49. package/dist/react/Pagination.js +28 -0
  50. package/dist/react/PanelHeader.d.ts +9 -0
  51. package/dist/react/PanelHeader.js +6 -0
  52. package/dist/react/Progress.d.ts +13 -0
  53. package/dist/react/Progress.js +6 -0
  54. package/dist/react/Radio.d.ts +9 -0
  55. package/dist/react/Radio.js +9 -0
  56. package/dist/react/Scanner.d.ts +11 -0
  57. package/dist/react/Scanner.js +6 -0
  58. package/dist/react/Select.d.ts +13 -0
  59. package/dist/react/Select.js +6 -0
  60. package/dist/react/Separator.d.ts +11 -0
  61. package/dist/react/Separator.js +7 -0
  62. package/dist/react/Skeleton.d.ts +11 -0
  63. package/dist/react/Skeleton.js +13 -0
  64. package/dist/react/Slider.d.ts +9 -0
  65. package/dist/react/Slider.js +9 -0
  66. package/dist/react/Spinner.d.ts +11 -0
  67. package/dist/react/Spinner.js +6 -0
  68. package/dist/react/Stat.d.ts +20 -0
  69. package/dist/react/Stat.js +11 -0
  70. package/dist/react/Switch.d.ts +9 -0
  71. package/dist/react/Switch.js +6 -0
  72. package/dist/react/Table.d.ts +55 -0
  73. package/dist/react/Table.js +36 -0
  74. package/dist/react/Tabs.d.ts +28 -0
  75. package/dist/react/Tabs.js +16 -0
  76. package/dist/react/Terminal.d.ts +33 -0
  77. package/dist/react/Terminal.js +6 -0
  78. package/dist/react/Textarea.d.ts +7 -0
  79. package/dist/react/Textarea.js +6 -0
  80. package/dist/react/Ticker.d.ts +13 -0
  81. package/dist/react/Ticker.js +7 -0
  82. package/dist/react/Toast.d.ts +15 -0
  83. package/dist/react/Toast.js +6 -0
  84. package/dist/react/Tooltip.d.ts +11 -0
  85. package/dist/react/Tooltip.js +6 -0
  86. package/dist/react/index.d.ts +39 -0
  87. package/dist/react/index.js +46 -0
  88. package/dist/tailwind-theme.css +171 -0
  89. package/dist/tokens/base.d.ts +33 -0
  90. package/dist/tokens/base.js +41 -0
  91. package/dist/tokens/index.d.ts +7 -0
  92. package/dist/tokens/index.js +7 -0
  93. package/dist/tokens/semantic.d.ts +1 -0
  94. package/dist/tokens/semantic.js +54 -0
  95. package/dist/tokens/themes/cyan.d.ts +1 -0
  96. package/dist/tokens/themes/cyan.js +15 -0
  97. package/dist/tokens/themes/green.d.ts +1 -0
  98. package/dist/tokens/themes/green.js +15 -0
  99. package/dist/tokens/themes/orange.d.ts +1 -0
  100. package/dist/tokens/themes/orange.js +15 -0
  101. package/dist/tokens/themes/red.d.ts +1 -0
  102. package/dist/tokens/themes/red.js +15 -0
  103. package/dist/tokens/themes/steel.d.ts +1 -0
  104. package/dist/tokens/themes/steel.js +15 -0
  105. package/package.json +73 -0
  106. package/src/css/a11y.css +67 -0
  107. package/src/css/animations.css +111 -0
  108. package/src/css/base.css +34 -0
  109. package/src/css/components/accordion.css +148 -0
  110. package/src/css/components/alert.css +116 -0
  111. package/src/css/components/app-patterns.css +894 -0
  112. package/src/css/components/augmented.css +474 -0
  113. package/src/css/components/avatar.css +105 -0
  114. package/src/css/components/badge.css +46 -0
  115. package/src/css/components/breadcrumb.css +75 -0
  116. package/src/css/components/button.css +130 -0
  117. package/src/css/components/calendar.css +135 -0
  118. package/src/css/components/card.css +68 -0
  119. package/src/css/components/carousel.css +69 -0
  120. package/src/css/components/charts.css +464 -0
  121. package/src/css/components/checkbox.css +136 -0
  122. package/src/css/components/command.css +162 -0
  123. package/src/css/components/dropdown.css +187 -0
  124. package/src/css/components/form.css +280 -0
  125. package/src/css/components/gauge.css +156 -0
  126. package/src/css/components/glow-card.css +32 -0
  127. package/src/css/components/hud.css +165 -0
  128. package/src/css/components/image.css +164 -0
  129. package/src/css/components/input-otp.css +53 -0
  130. package/src/css/components/input.css +182 -0
  131. package/src/css/components/interference.css +217 -0
  132. package/src/css/components/kbd.css +54 -0
  133. package/src/css/components/layout-extras.css +256 -0
  134. package/src/css/components/modal.css +146 -0
  135. package/src/css/components/navigation-extras.css +280 -0
  136. package/src/css/components/pagination.css +122 -0
  137. package/src/css/components/panel-header.css +55 -0
  138. package/src/css/components/popover.css +112 -0
  139. package/src/css/components/scanner.css +125 -0
  140. package/src/css/components/select.css +99 -0
  141. package/src/css/components/sheet.css +149 -0
  142. package/src/css/components/skeleton.css +77 -0
  143. package/src/css/components/slider.css +116 -0
  144. package/src/css/components/spinner.css +101 -0
  145. package/src/css/components/spreadsheet.css +314 -0
  146. package/src/css/components/svg.css +104 -0
  147. package/src/css/components/switch.css +114 -0
  148. package/src/css/components/table.css +115 -0
  149. package/src/css/components/tabs.css +159 -0
  150. package/src/css/components/terminal.css +259 -0
  151. package/src/css/components/ticker.css +100 -0
  152. package/src/css/components/toast.css +137 -0
  153. package/src/css/components/toaster.css +48 -0
  154. package/src/css/components/toggle.css +99 -0
  155. package/src/css/components/typography.css +122 -0
  156. package/src/css/components/vectorbg.css +57 -0
  157. package/src/css/utilities.css +165 -0
  158. package/src/fonts/JetBrainsMono-Variable.woff2 +0 -0
  159. package/src/fonts/OFL.txt +93 -0
  160. package/src/js/charts.js +533 -0
  161. package/src/react/Accordion.tsx +85 -0
  162. package/src/react/Alert.tsx +58 -0
  163. package/src/react/AugButton.tsx +40 -0
  164. package/src/react/AugPanel.tsx +36 -0
  165. package/src/react/Avatar.tsx +69 -0
  166. package/src/react/Badge.tsx +28 -0
  167. package/src/react/Breadcrumb.tsx +63 -0
  168. package/src/react/Button.tsx +39 -0
  169. package/src/react/Checkbox.tsx +31 -0
  170. package/src/react/Dropdown.tsx +104 -0
  171. package/src/react/Field.tsx +36 -0
  172. package/src/react/Gauge.tsx +57 -0
  173. package/src/react/GlowCard.tsx +25 -0
  174. package/src/react/HudBar.tsx +86 -0
  175. package/src/react/HudFrame.tsx +52 -0
  176. package/src/react/Input.tsx +38 -0
  177. package/src/react/Interference.tsx +53 -0
  178. package/src/react/Kbd.tsx +62 -0
  179. package/src/react/Label.tsx +31 -0
  180. package/src/react/Modal.tsx +63 -0
  181. package/src/react/Pagination.tsx +113 -0
  182. package/src/react/PanelHeader.tsx +28 -0
  183. package/src/react/Progress.tsx +47 -0
  184. package/src/react/Radio.tsx +31 -0
  185. package/src/react/Scanner.tsx +37 -0
  186. package/src/react/Select.tsx +43 -0
  187. package/src/react/Separator.tsx +40 -0
  188. package/src/react/Skeleton.tsx +50 -0
  189. package/src/react/Slider.tsx +28 -0
  190. package/src/react/Spinner.tsx +39 -0
  191. package/src/react/Stat.tsx +52 -0
  192. package/src/react/Switch.tsx +25 -0
  193. package/src/react/Table.tsx +144 -0
  194. package/src/react/Tabs.tsx +97 -0
  195. package/src/react/Terminal.tsx +95 -0
  196. package/src/react/Textarea.tsx +20 -0
  197. package/src/react/Ticker.tsx +46 -0
  198. package/src/react/Toast.tsx +43 -0
  199. package/src/react/Tooltip.tsx +32 -0
  200. package/src/react/index.ts +52 -0
  201. package/src/tokens/base.ts +48 -0
  202. package/src/tokens/index.ts +7 -0
  203. package/src/tokens/semantic.ts +63 -0
  204. package/src/tokens/themes/cyan.ts +16 -0
  205. package/src/tokens/themes/green.ts +16 -0
  206. package/src/tokens/themes/orange.ts +16 -0
  207. package/src/tokens/themes/red.ts +16 -0
  208. package/src/tokens/themes/steel.ts +16 -0
@@ -0,0 +1,894 @@
1
+ /* ── App patterns (dashboard + AI-shell app inspiration) ───────────────────────── */
2
+
3
+ /* Section header — dashboard app "▸ METRICS / INTEL FEED" rows */
4
+ .cd-section-header {
5
+ display: flex;
6
+ align-items: center;
7
+ gap: 8px;
8
+ padding: 8px 12px;
9
+ border-bottom: 1px solid var(--cd-border-dim);
10
+ background: color-mix(in srgb, var(--cd-bg-panel) 50%, transparent);
11
+ font-family: var(--cd-font-mono);
12
+ user-select: none;
13
+ }
14
+
15
+ .cd-section-header__caret {
16
+ color: var(--cd-accent);
17
+ font-size: var(--cd-text-xs);
18
+ line-height: 1;
19
+ flex-shrink: 0;
20
+ }
21
+
22
+ .cd-section-header__title {
23
+ margin: 0;
24
+ font-size: var(--cd-text-xs);
25
+ font-weight: 700;
26
+ text-transform: uppercase;
27
+ letter-spacing: 0.18em;
28
+ color: var(--cd-text);
29
+ }
30
+
31
+ .cd-section-header__actions {
32
+ margin-left: auto;
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 6px;
36
+ flex-shrink: 0;
37
+ }
38
+
39
+ /* Chip / filter toggle — dashboard app NEAR / TOP / category filters */
40
+ .cd-chip {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ gap: 4px;
44
+ height: 20px;
45
+ padding: 0 6px;
46
+ border: 1px solid var(--cd-border-dim);
47
+ background: transparent;
48
+ color: var(--cd-text-dim);
49
+ font-family: var(--cd-font-mono);
50
+ font-size: 9px;
51
+ font-weight: 700;
52
+ text-transform: uppercase;
53
+ letter-spacing: 0.1em;
54
+ cursor: pointer;
55
+ white-space: nowrap;
56
+ transition: color 0.12s ease, border-color 0.12s ease, background 0.12s ease;
57
+ }
58
+
59
+ .cd-chip:hover:not(:disabled) {
60
+ color: var(--cd-text-muted);
61
+ border-color: var(--cd-border);
62
+ }
63
+
64
+ .cd-chip[data-active='true'],
65
+ .cd-chip.is-active {
66
+ color: var(--cd-accent);
67
+ border-color: color-mix(in srgb, var(--cd-accent) 50%, transparent);
68
+ background: color-mix(in srgb, var(--cd-accent) 10%, transparent);
69
+ }
70
+
71
+ .cd-chip:disabled {
72
+ opacity: 0.35;
73
+ cursor: not-allowed;
74
+ }
75
+
76
+ .cd-chip--sm {
77
+ height: 18px;
78
+ padding: 0 5px;
79
+ font-size: 8px;
80
+ }
81
+
82
+ .cd-chip-row {
83
+ display: flex;
84
+ flex-wrap: wrap;
85
+ gap: 4px;
86
+ align-items: center;
87
+ }
88
+
89
+ /* Status / live dot — dashboard app SYS.ACTIVE, AI-shell app Live */
90
+ .cd-status-dot {
91
+ display: inline-flex;
92
+ align-items: center;
93
+ gap: 6px;
94
+ font-family: var(--cd-font-mono);
95
+ font-size: var(--cd-text-xs);
96
+ font-weight: 700;
97
+ text-transform: uppercase;
98
+ letter-spacing: 0.1em;
99
+ color: var(--cd-text-muted);
100
+ }
101
+
102
+ .cd-status-dot__orb {
103
+ width: 8px;
104
+ height: 8px;
105
+ border-radius: 50%;
106
+ background: var(--cd-text-dim);
107
+ flex-shrink: 0;
108
+ }
109
+
110
+ .cd-status-dot--live .cd-status-dot__orb,
111
+ .cd-status-dot--success .cd-status-dot__orb {
112
+ background: var(--cd-neon-green);
113
+ box-shadow: 0 0 8px color-mix(in srgb, var(--cd-neon-green) 50%, transparent);
114
+ animation: cd-status-pulse 2s ease-in-out infinite;
115
+ }
116
+
117
+ .cd-status-dot--live {
118
+ color: var(--cd-neon-green);
119
+ }
120
+
121
+ .cd-status-dot--warn .cd-status-dot__orb {
122
+ background: var(--cd-neon-amber);
123
+ box-shadow: 0 0 8px color-mix(in srgb, var(--cd-neon-amber) 45%, transparent);
124
+ }
125
+
126
+ .cd-status-dot--warn {
127
+ color: var(--cd-neon-amber);
128
+ }
129
+
130
+ .cd-status-dot--danger .cd-status-dot__orb {
131
+ background: var(--cd-neon-red);
132
+ box-shadow: 0 0 8px color-mix(in srgb, var(--cd-neon-red) 45%, transparent);
133
+ animation: cd-status-pulse 1.2s ease-in-out infinite;
134
+ }
135
+
136
+ .cd-status-dot--danger {
137
+ color: var(--cd-neon-red);
138
+ }
139
+
140
+ .cd-status-dot--paused .cd-status-dot__orb {
141
+ background: var(--cd-text-muted);
142
+ border-radius: 1px;
143
+ width: 7px;
144
+ height: 7px;
145
+ animation: none;
146
+ }
147
+
148
+ @keyframes cd-status-pulse {
149
+ 0%, 100% { opacity: 1; }
150
+ 50% { opacity: 0.45; }
151
+ }
152
+
153
+ @media (prefers-reduced-motion: reduce) {
154
+ .cd-status-dot__orb { animation: none !important; }
155
+ }
156
+
157
+ /* Status pill — situation DEVELOPING / ACTIVE / RESOLVED */
158
+ .cd-status-pill {
159
+ display: inline-flex;
160
+ align-items: center;
161
+ height: 20px;
162
+ padding: 0 8px;
163
+ border: 1px solid var(--cd-border);
164
+ font-family: var(--cd-font-mono);
165
+ font-size: 10px;
166
+ font-weight: 700;
167
+ letter-spacing: 0.1em;
168
+ text-transform: uppercase;
169
+ color: var(--cd-text-muted);
170
+ background: transparent;
171
+ }
172
+
173
+ .cd-status-pill--active {
174
+ border-color: color-mix(in srgb, var(--cd-neon-red) 60%, transparent);
175
+ color: var(--cd-neon-red);
176
+ animation: cd-status-pulse 2s ease-in-out infinite;
177
+ }
178
+
179
+ .cd-status-pill--developing {
180
+ border-color: color-mix(in srgb, var(--cd-neon-amber) 60%, transparent);
181
+ color: var(--cd-neon-amber);
182
+ }
183
+
184
+ .cd-status-pill--resolved,
185
+ .cd-status-pill--success {
186
+ border-color: color-mix(in srgb, var(--cd-neon-green) 60%, transparent);
187
+ color: var(--cd-neon-green);
188
+ }
189
+
190
+ .cd-status-pill--critical {
191
+ border-color: color-mix(in srgb, var(--cd-neon-red) 70%, transparent);
192
+ color: var(--cd-neon-red);
193
+ background: color-mix(in srgb, var(--cd-neon-red) 8%, transparent);
194
+ }
195
+
196
+ .cd-status-pill--muted {
197
+ border-color: var(--cd-border-dim);
198
+ color: var(--cd-text-dim);
199
+ }
200
+
201
+ /* Feed item — dashboard app intel feed row */
202
+ .cd-feed {
203
+ display: flex;
204
+ flex-direction: column;
205
+ gap: 6px;
206
+ }
207
+
208
+ .cd-feed-item {
209
+ display: flex;
210
+ flex-direction: column;
211
+ gap: 4px;
212
+ padding: 8px 10px;
213
+ border: 1px solid var(--cd-border-dim);
214
+ background: color-mix(in srgb, var(--cd-bg-panel) 70%, transparent);
215
+ font-family: var(--cd-font-mono);
216
+ cursor: pointer;
217
+ text-align: left;
218
+ width: 100%;
219
+ transition: border-color 0.12s ease, background 0.12s ease, box-shadow 0.12s ease;
220
+ color: inherit;
221
+ }
222
+
223
+ .cd-feed-item:hover {
224
+ border-color: color-mix(in srgb, var(--cd-accent) 35%, transparent);
225
+ background: color-mix(in srgb, var(--cd-bg-panel-hover) 70%, transparent);
226
+ }
227
+
228
+ .cd-feed-item.is-selected,
229
+ .cd-feed-item[data-active='true'] {
230
+ border-color: color-mix(in srgb, var(--cd-accent) 50%, transparent);
231
+ box-shadow:
232
+ 0 0 8px color-mix(in srgb, var(--cd-accent) 18%, transparent),
233
+ inset 0 0 0 1px color-mix(in srgb, var(--cd-accent) 8%, transparent);
234
+ }
235
+
236
+ .cd-feed-item__meta {
237
+ display: flex;
238
+ align-items: center;
239
+ gap: 6px;
240
+ flex-wrap: wrap;
241
+ }
242
+
243
+ .cd-feed-item__title {
244
+ font-size: var(--cd-text-sm);
245
+ font-weight: 700;
246
+ color: var(--cd-text);
247
+ line-height: 1.35;
248
+ }
249
+
250
+ .cd-feed-item__subtitle {
251
+ font-size: var(--cd-text-xs);
252
+ color: var(--cd-text-muted);
253
+ line-height: 1.4;
254
+ }
255
+
256
+ .cd-feed-item__time {
257
+ margin-left: auto;
258
+ font-size: 9px;
259
+ color: var(--cd-text-dim);
260
+ letter-spacing: 0.06em;
261
+ text-transform: uppercase;
262
+ flex-shrink: 0;
263
+ }
264
+
265
+ /* Bottom nav — dashboard app mobile tab bar */
266
+ .cd-bottom-nav {
267
+ display: flex;
268
+ align-items: stretch;
269
+ border-top: 1px solid var(--cd-border-dim);
270
+ background: color-mix(in srgb, var(--cd-bg-panel) 95%, transparent);
271
+ backdrop-filter: blur(6px);
272
+ -webkit-backdrop-filter: blur(6px);
273
+ font-family: var(--cd-font-mono);
274
+ }
275
+
276
+ .cd-bottom-nav__item {
277
+ flex: 1;
278
+ display: flex;
279
+ flex-direction: column;
280
+ align-items: center;
281
+ gap: 2px;
282
+ padding: 8px 4px;
283
+ border: none;
284
+ background: transparent;
285
+ color: var(--cd-text-dim);
286
+ font-family: inherit;
287
+ cursor: pointer;
288
+ position: relative;
289
+ transition: color 0.12s ease;
290
+ }
291
+
292
+ .cd-bottom-nav__item:hover {
293
+ color: var(--cd-text-muted);
294
+ }
295
+
296
+ .cd-bottom-nav__item.is-active,
297
+ .cd-bottom-nav__item[data-active='true'] {
298
+ color: var(--cd-accent);
299
+ }
300
+
301
+ .cd-bottom-nav__item.is-active::before,
302
+ .cd-bottom-nav__item[data-active='true']::before {
303
+ content: '';
304
+ position: absolute;
305
+ top: 0;
306
+ left: 25%;
307
+ right: 25%;
308
+ height: 1px;
309
+ background: var(--cd-accent);
310
+ }
311
+
312
+ .cd-bottom-nav__icon {
313
+ font-size: 14px;
314
+ line-height: 1;
315
+ }
316
+
317
+ .cd-bottom-nav__label {
318
+ font-size: 9px;
319
+ font-weight: 700;
320
+ letter-spacing: 0.1em;
321
+ text-transform: uppercase;
322
+ }
323
+
324
+ .cd-bottom-nav__badge {
325
+ position: absolute;
326
+ top: 4px;
327
+ right: 22%;
328
+ font-size: 8px;
329
+ color: var(--cd-accent);
330
+ font-variant-numeric: tabular-nums;
331
+ }
332
+
333
+ /* Status bar — AI-shell app footer strip */
334
+ .cd-status-bar {
335
+ display: flex;
336
+ align-items: center;
337
+ gap: 12px;
338
+ height: 24px;
339
+ padding: 0 12px;
340
+ border-top: 1px solid color-mix(in srgb, var(--cd-accent) 18%, transparent);
341
+ background: color-mix(in srgb, var(--cd-bg-panel) 90%, transparent);
342
+ font-family: var(--cd-font-mono);
343
+ font-size: 9px;
344
+ color: var(--cd-text-muted);
345
+ text-transform: uppercase;
346
+ letter-spacing: 0.1em;
347
+ }
348
+
349
+ .cd-status-bar__message {
350
+ flex: 1;
351
+ min-width: 0;
352
+ white-space: nowrap;
353
+ overflow: hidden;
354
+ text-overflow: ellipsis;
355
+ }
356
+
357
+ .cd-status-bar__message::before {
358
+ content: '> ';
359
+ color: var(--cd-accent);
360
+ text-shadow: 0 0 4px color-mix(in srgb, var(--cd-accent) 50%, transparent);
361
+ }
362
+
363
+ .cd-status-bar__message--cursor::after {
364
+ content: '▊';
365
+ margin-left: 3px;
366
+ color: var(--cd-accent);
367
+ opacity: 0.75;
368
+ animation: cd-cursor-blink 1.2s steps(1) infinite;
369
+ }
370
+
371
+ @keyframes cd-cursor-blink {
372
+ 0%, 49% { opacity: 0.75; }
373
+ 50%, 100% { opacity: 0; }
374
+ }
375
+
376
+ .cd-status-bar__meta {
377
+ margin-left: auto;
378
+ display: flex;
379
+ align-items: center;
380
+ gap: 12px;
381
+ flex-shrink: 0;
382
+ text-transform: none;
383
+ letter-spacing: 0;
384
+ font-variant-numeric: tabular-nums;
385
+ }
386
+
387
+ /* Chat — AI-shell app panel primitives */
388
+ .cd-chat {
389
+ display: flex;
390
+ flex-direction: column;
391
+ min-height: 0;
392
+ height: 100%;
393
+ background: color-mix(in srgb, var(--cd-bg-panel) 80%, transparent);
394
+ border: 1px solid color-mix(in srgb, var(--cd-accent) 18%, transparent);
395
+ font-family: var(--cd-font-mono);
396
+ position: relative;
397
+ }
398
+
399
+ .cd-chat::after {
400
+ content: '';
401
+ position: absolute;
402
+ inset: 0;
403
+ pointer-events: none;
404
+ z-index: 1;
405
+ background:
406
+ repeating-linear-gradient(
407
+ 0deg,
408
+ transparent,
409
+ transparent 2px,
410
+ rgba(0, 0, 0, 0.1) 2px,
411
+ rgba(0, 0, 0, 0.1) 4px
412
+ ),
413
+ linear-gradient(90deg, color-mix(in srgb, var(--cd-accent-secondary) 5%, transparent), transparent 26%);
414
+ opacity: 0.7;
415
+ }
416
+
417
+ .cd-chat__messages {
418
+ flex: 1;
419
+ overflow: auto;
420
+ padding: 10px;
421
+ display: flex;
422
+ flex-direction: column;
423
+ gap: 8px;
424
+ position: relative;
425
+ z-index: 2;
426
+ min-height: 120px;
427
+ }
428
+
429
+ .cd-chat-msg {
430
+ max-width: 92%;
431
+ padding: 6px 8px;
432
+ font-size: 11px;
433
+ line-height: 1.5;
434
+ white-space: pre-wrap;
435
+ word-break: break-word;
436
+ }
437
+
438
+ .cd-chat-msg--user {
439
+ align-self: flex-end;
440
+ background: var(--cd-accent);
441
+ color: #05060a;
442
+ font-weight: 600;
443
+ box-shadow:
444
+ 3px 3px 0 color-mix(in srgb, var(--cd-accent-secondary) 30%, transparent),
445
+ 0 0 12px color-mix(in srgb, var(--cd-accent) 30%, transparent);
446
+ }
447
+
448
+ .cd-chat-msg--assistant {
449
+ align-self: flex-start;
450
+ background: rgba(11, 15, 24, 0.82);
451
+ color: var(--cd-text);
452
+ border: 1px solid var(--cd-border);
453
+ border-left: 2px solid var(--cd-accent);
454
+ }
455
+
456
+ .cd-chat-msg--system {
457
+ align-self: center;
458
+ color: var(--cd-text-dim);
459
+ font-size: 10px;
460
+ padding: 2px 8px;
461
+ max-width: 100%;
462
+ letter-spacing: 0.05em;
463
+ text-transform: uppercase;
464
+ }
465
+
466
+ .cd-chat-msg--error {
467
+ align-self: flex-start;
468
+ border-left: 2px solid var(--cd-neon-red);
469
+ background: rgba(11, 15, 24, 0.82);
470
+ color: var(--cd-text);
471
+ border: 1px solid var(--cd-border);
472
+ border-left-color: var(--cd-neon-red);
473
+ }
474
+
475
+ .cd-chat__prompts {
476
+ display: flex;
477
+ flex-wrap: wrap;
478
+ gap: 4px;
479
+ padding: 0 10px 8px;
480
+ position: relative;
481
+ z-index: 2;
482
+ }
483
+
484
+ .cd-chat__composer {
485
+ display: flex;
486
+ gap: 6px;
487
+ padding: 8px 10px 10px;
488
+ border-top: 1px solid color-mix(in srgb, var(--cd-accent) 15%, transparent);
489
+ position: relative;
490
+ z-index: 2;
491
+ }
492
+
493
+ .cd-chat__composer .cd-input,
494
+ .cd-chat__composer .cd-textarea {
495
+ flex: 1;
496
+ min-width: 0;
497
+ }
498
+
499
+ /* Horizontal bar row — dashboard app category breakdown */
500
+ .cd-hbar-row {
501
+ display: grid;
502
+ grid-template-columns: minmax(48px, 80px) 1fr auto;
503
+ align-items: center;
504
+ gap: 8px;
505
+ font-family: var(--cd-font-mono);
506
+ font-size: 10px;
507
+ }
508
+
509
+ .cd-hbar-row__label {
510
+ color: var(--cd-text-muted);
511
+ text-transform: uppercase;
512
+ letter-spacing: 0.08em;
513
+ white-space: nowrap;
514
+ overflow: hidden;
515
+ text-overflow: ellipsis;
516
+ }
517
+
518
+ .cd-hbar-row__track {
519
+ height: 6px;
520
+ background: var(--cd-bg-panel-hover);
521
+ border: 1px solid var(--cd-border-dim);
522
+ overflow: hidden;
523
+ }
524
+
525
+ .cd-hbar-row__fill {
526
+ height: 100%;
527
+ background: var(--cd-accent);
528
+ box-shadow: 0 0 8px color-mix(in srgb, var(--cd-accent) 35%, transparent);
529
+ transition: width 0.25s ease;
530
+ }
531
+
532
+ .cd-hbar-row__value {
533
+ color: var(--cd-text-dim);
534
+ font-variant-numeric: tabular-nums;
535
+ min-width: 2ch;
536
+ text-align: right;
537
+ }
538
+
539
+ /* Transport strip — AI-shell app play/stop group shell */
540
+ .cd-transport {
541
+ display: inline-flex;
542
+ align-items: center;
543
+ gap: 6px;
544
+ font-family: var(--cd-font-mono);
545
+ }
546
+
547
+ .cd-transport__group {
548
+ display: inline-flex;
549
+ align-items: stretch;
550
+ }
551
+
552
+ .cd-transport__group > .cd-btn:not(:first-child) {
553
+ margin-left: -1px;
554
+ }
555
+
556
+ /* Clock readout — dashboard app header clock */
557
+ .cd-clock {
558
+ display: inline-flex;
559
+ align-items: baseline;
560
+ gap: 6px;
561
+ font-family: var(--cd-font-mono);
562
+ font-variant-numeric: tabular-nums;
563
+ color: var(--cd-text-muted);
564
+ font-size: var(--cd-text-xs);
565
+ }
566
+
567
+ .cd-clock__time {
568
+ color: var(--cd-accent);
569
+ font-weight: 700;
570
+ letter-spacing: 0.06em;
571
+ }
572
+
573
+ .cd-clock__date {
574
+ color: var(--cd-text-dim);
575
+ }
576
+
577
+ /* ── Chat message rows + hover actions (AI chat layout) ────────────────────── */
578
+
579
+ .cd-chat-row {
580
+ position: relative;
581
+ display: flex;
582
+ flex-direction: column;
583
+ max-width: 94%;
584
+ gap: 4px;
585
+ }
586
+
587
+ .cd-chat-row--user {
588
+ align-self: flex-end;
589
+ align-items: flex-end;
590
+ }
591
+
592
+ .cd-chat-row--assistant,
593
+ .cd-chat-row--error {
594
+ align-self: flex-start;
595
+ align-items: flex-start;
596
+ }
597
+
598
+ .cd-chat-row--system {
599
+ align-self: center;
600
+ align-items: center;
601
+ max-width: 100%;
602
+ }
603
+
604
+ .cd-chat-row__meta {
605
+ display: flex;
606
+ align-items: center;
607
+ gap: 8px;
608
+ font-size: 9px;
609
+ letter-spacing: 0.08em;
610
+ text-transform: uppercase;
611
+ color: var(--cd-text-dim);
612
+ padding: 0 2px;
613
+ }
614
+
615
+ .cd-chat-row__meta-right {
616
+ margin-left: auto;
617
+ }
618
+
619
+ /* Hover action toolbar — appears on message hover/focus-within */
620
+ .cd-chat-actions {
621
+ display: flex;
622
+ align-items: center;
623
+ gap: 2px;
624
+ opacity: 0;
625
+ pointer-events: none;
626
+ transform: translateY(2px);
627
+ transition: opacity 0.12s ease, transform 0.12s ease;
628
+ background: var(--cd-bg-panel);
629
+ border: 1px solid color-mix(in srgb, var(--cd-accent) 28%, transparent);
630
+ box-shadow:
631
+ 0 4px 16px rgba(0, 0, 0, 0.45),
632
+ 0 0 12px color-mix(in srgb, var(--cd-accent) 12%, transparent);
633
+ padding: 2px;
634
+ z-index: 5;
635
+ }
636
+
637
+ .cd-chat-row:hover .cd-chat-actions,
638
+ .cd-chat-row:focus-within .cd-chat-actions,
639
+ .cd-chat-actions.is-visible {
640
+ opacity: 1;
641
+ pointer-events: auto;
642
+ transform: translateY(0);
643
+ }
644
+
645
+ .cd-chat-actions--overlay {
646
+ position: absolute;
647
+ top: -12px;
648
+ right: 0;
649
+ }
650
+
651
+ .cd-chat-row--user .cd-chat-actions--overlay {
652
+ right: 0;
653
+ left: auto;
654
+ }
655
+
656
+ .cd-chat-actions--below {
657
+ margin-top: 2px;
658
+ }
659
+
660
+ .cd-chat-action {
661
+ display: inline-flex;
662
+ align-items: center;
663
+ justify-content: center;
664
+ gap: 4px;
665
+ min-width: 26px;
666
+ height: 24px;
667
+ padding: 0 6px;
668
+ border: 1px solid transparent;
669
+ background: transparent;
670
+ color: var(--cd-text-muted);
671
+ font-family: var(--cd-font-mono);
672
+ font-size: 10px;
673
+ font-weight: 700;
674
+ letter-spacing: 0.04em;
675
+ text-transform: uppercase;
676
+ cursor: pointer;
677
+ transition: color 0.1s ease, border-color 0.1s ease, background 0.1s ease, box-shadow 0.1s ease;
678
+ }
679
+
680
+ .cd-chat-action:hover:not(:disabled) {
681
+ color: var(--cd-accent);
682
+ border-color: color-mix(in srgb, var(--cd-accent) 35%, transparent);
683
+ background: var(--cd-accent-subtle);
684
+ box-shadow: 0 0 8px color-mix(in srgb, var(--cd-accent) 15%, transparent);
685
+ }
686
+
687
+ .cd-chat-action:disabled {
688
+ opacity: 0.35;
689
+ cursor: not-allowed;
690
+ }
691
+
692
+ .cd-chat-action.is-active {
693
+ color: var(--cd-accent);
694
+ background: var(--cd-accent-subtle);
695
+ border-color: color-mix(in srgb, var(--cd-accent) 40%, transparent);
696
+ }
697
+
698
+ .cd-chat-action--danger:hover:not(:disabled) {
699
+ color: var(--cd-neon-red);
700
+ border-color: color-mix(in srgb, var(--cd-neon-red) 40%, transparent);
701
+ background: color-mix(in srgb, var(--cd-neon-red) 10%, transparent);
702
+ box-shadow: none;
703
+ }
704
+
705
+ .cd-chat-action__icon {
706
+ font-size: 11px;
707
+ line-height: 1;
708
+ }
709
+
710
+ .cd-chat-action__label {
711
+ font-size: 9px;
712
+ }
713
+
714
+ /* Code block inside assistant messages */
715
+ .cd-chat-code {
716
+ position: relative;
717
+ margin: 6px 0 0;
718
+ background: rgba(5, 6, 10, 0.92);
719
+ border: 1px solid var(--cd-border);
720
+ border-left: 2px solid color-mix(in srgb, var(--cd-accent) 55%, transparent);
721
+ overflow: hidden;
722
+ }
723
+
724
+ .cd-chat-code__header {
725
+ display: flex;
726
+ align-items: center;
727
+ gap: 8px;
728
+ padding: 4px 8px;
729
+ border-bottom: 1px solid var(--cd-border-dim);
730
+ background: color-mix(in srgb, var(--cd-bg-panel) 70%, transparent);
731
+ font-size: 9px;
732
+ font-weight: 700;
733
+ letter-spacing: 0.12em;
734
+ text-transform: uppercase;
735
+ color: var(--cd-text-dim);
736
+ }
737
+
738
+ .cd-chat-code__header-actions {
739
+ margin-left: auto;
740
+ display: flex;
741
+ gap: 2px;
742
+ opacity: 0.55;
743
+ transition: opacity 0.12s ease;
744
+ }
745
+
746
+ .cd-chat-code:hover .cd-chat-code__header-actions,
747
+ .cd-chat-code:focus-within .cd-chat-code__header-actions {
748
+ opacity: 1;
749
+ }
750
+
751
+ .cd-chat-code pre {
752
+ margin: 0;
753
+ padding: 10px;
754
+ overflow: auto;
755
+ font-family: var(--cd-font-mono);
756
+ font-size: 11px;
757
+ line-height: 1.55;
758
+ color: var(--cd-text-secondary);
759
+ white-space: pre;
760
+ }
761
+
762
+ .cd-chat-code code {
763
+ font-family: inherit;
764
+ color: var(--cd-accent);
765
+ }
766
+
767
+ /* Typing / streaming indicator */
768
+ .cd-chat-typing {
769
+ display: inline-flex;
770
+ align-items: center;
771
+ gap: 6px;
772
+ padding: 6px 10px;
773
+ font-size: 10px;
774
+ letter-spacing: 0.1em;
775
+ text-transform: uppercase;
776
+ color: var(--cd-accent);
777
+ border: 1px solid color-mix(in srgb, var(--cd-accent) 25%, transparent);
778
+ background: color-mix(in srgb, var(--cd-bg-panel) 80%, transparent);
779
+ }
780
+
781
+ .cd-chat-typing__dots span {
782
+ display: inline-block;
783
+ width: 4px;
784
+ height: 4px;
785
+ margin-right: 3px;
786
+ border-radius: 50%;
787
+ background: var(--cd-accent);
788
+ animation: cd-chat-dot 1.2s ease-in-out infinite;
789
+ box-shadow: 0 0 6px color-mix(in srgb, var(--cd-accent) 40%, transparent);
790
+ }
791
+
792
+ .cd-chat-typing__dots span:nth-child(2) { animation-delay: 0.15s; }
793
+ .cd-chat-typing__dots span:nth-child(3) { animation-delay: 0.3s; }
794
+
795
+ @keyframes cd-chat-dot {
796
+ 0%, 80%, 100% { opacity: 0.25; transform: translateY(0); }
797
+ 40% { opacity: 1; transform: translateY(-2px); }
798
+ }
799
+
800
+ /* Composer with tools row */
801
+ .cd-chat__composer-wrap {
802
+ display: flex;
803
+ flex-direction: column;
804
+ gap: 0;
805
+ border-top: 1px solid color-mix(in srgb, var(--cd-accent) 15%, transparent);
806
+ background: color-mix(in srgb, var(--cd-bg) 55%, transparent);
807
+ position: relative;
808
+ z-index: 2;
809
+ }
810
+
811
+ .cd-chat__composer-tools {
812
+ display: flex;
813
+ align-items: center;
814
+ gap: 4px;
815
+ padding: 6px 10px 0;
816
+ flex-wrap: wrap;
817
+ }
818
+
819
+ .cd-chat__composer-tools .cd-chat-action {
820
+ height: 22px;
821
+ min-width: 22px;
822
+ opacity: 0.75;
823
+ }
824
+
825
+ .cd-chat__composer-tools .cd-chat-action:hover {
826
+ opacity: 1;
827
+ }
828
+
829
+ .cd-chat .cd-chat__composer {
830
+ border-top: none;
831
+ }
832
+
833
+ /* Full AI workspace layout */
834
+ .cd-ai-layout {
835
+ display: flex;
836
+ width: 100%;
837
+ min-height: 480px;
838
+ height: 100%;
839
+ border: 1px solid color-mix(in srgb, var(--cd-accent) 22%, transparent);
840
+ background: var(--cd-bg);
841
+ font-family: var(--cd-font-mono);
842
+ overflow: hidden;
843
+ }
844
+
845
+ .cd-ai-layout__chat {
846
+ flex: 0 0 340px;
847
+ width: 340px;
848
+ min-width: 280px;
849
+ max-width: 420px;
850
+ border-right: 1px solid color-mix(in srgb, var(--cd-accent) 18%, transparent);
851
+ display: flex;
852
+ flex-direction: column;
853
+ min-height: 0;
854
+ }
855
+
856
+ .cd-ai-layout__chat .cd-chat {
857
+ border: none;
858
+ height: 100%;
859
+ }
860
+
861
+ .cd-ai-layout__main {
862
+ flex: 1;
863
+ min-width: 0;
864
+ display: flex;
865
+ flex-direction: column;
866
+ min-height: 0;
867
+ }
868
+
869
+ .cd-ai-layout__editor {
870
+ flex: 1;
871
+ min-height: 0;
872
+ display: flex;
873
+ flex-direction: column;
874
+ background: color-mix(in srgb, var(--cd-bg-panel) 40%, transparent);
875
+ }
876
+
877
+ .cd-ai-layout__editor-body {
878
+ flex: 1;
879
+ overflow: auto;
880
+ padding: 14px 16px;
881
+ font-size: 12px;
882
+ line-height: 1.6;
883
+ color: var(--cd-text-secondary);
884
+ white-space: pre-wrap;
885
+ }
886
+
887
+ .cd-ai-layout__editor-body .tok-fn { color: var(--cd-accent); }
888
+ .cd-ai-layout__editor-body .tok-str { color: var(--cd-neon-green); }
889
+ .cd-ai-layout__editor-body .tok-cm { color: var(--cd-text-dim); font-style: italic; }
890
+
891
+ @media (prefers-reduced-motion: reduce) {
892
+ .cd-chat-actions { transition: none; }
893
+ .cd-chat-typing__dots span { animation: none; opacity: 0.7; }
894
+ }