@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,182 @@
1
+ /* ── Base input ─────────────────────────────────────────── */
2
+
3
+ .cd-input {
4
+ display: block;
5
+ width: 100%;
6
+ height: 32px;
7
+ padding: 0 10px;
8
+ background: rgba(5, 6, 10, 0.82);
9
+ color: var(--cd-text);
10
+ border: 1px solid var(--cd-border);
11
+ border-radius: 0;
12
+ font-family: var(--cd-font-mono);
13
+ font-size: var(--cd-text-base);
14
+ line-height: 1;
15
+ transition: border-color 150ms ease, box-shadow 150ms ease, background 150ms ease;
16
+ appearance: none;
17
+ -webkit-appearance: none;
18
+ }
19
+
20
+ .cd-input::placeholder {
21
+ color: var(--cd-text-dim);
22
+ font-style: italic;
23
+ }
24
+
25
+ .cd-input:focus {
26
+ border-color: color-mix(in srgb, var(--cd-accent) 55%, transparent);
27
+ outline: 2px solid var(--cd-accent);
28
+ outline-offset: 2px;
29
+ box-shadow:
30
+ 0 0 0 1px color-mix(in srgb, var(--cd-accent) 18%, transparent),
31
+ 0 0 8px color-mix(in srgb, var(--cd-accent) 20%, transparent),
32
+ inset 0 0 4px color-mix(in srgb, var(--cd-accent) 6%, transparent);
33
+ }
34
+
35
+ .cd-input:hover:not(:focus):not(:disabled) {
36
+ border-color: var(--cd-border-mid, #26324c);
37
+ }
38
+
39
+ .cd-input:disabled {
40
+ opacity: 0.3;
41
+ cursor: not-allowed;
42
+ }
43
+
44
+ /* Left-accent variant (AI-shell corpus search pattern) */
45
+ .cd-input--accent {
46
+ border-left: 2px solid var(--cd-accent);
47
+ padding-left: 9px;
48
+ }
49
+
50
+ /* Error state */
51
+ .cd-input--error {
52
+ border-color: rgba(255, 69, 108, 0.55);
53
+ box-shadow: 0 0 6px rgba(255, 69, 108, 0.15);
54
+ }
55
+
56
+ .cd-input--error:focus {
57
+ border-color: rgba(255, 69, 108, 0.80);
58
+ outline: 2px solid var(--cd-accent);
59
+ outline-offset: 2px;
60
+ box-shadow:
61
+ 0 0 0 1px rgba(255, 69, 108, 0.20),
62
+ 0 0 8px rgba(255, 69, 108, 0.25),
63
+ inset 0 0 4px rgba(255, 69, 108, 0.08);
64
+ }
65
+
66
+ /* Small variant */
67
+ .cd-input--sm {
68
+ height: 26px;
69
+ font-size: var(--cd-text-sm);
70
+ padding: 0 8px;
71
+ }
72
+
73
+ /* Large variant */
74
+ .cd-input--lg {
75
+ height: 40px;
76
+ font-size: var(--cd-text-md);
77
+ padding: 0 14px;
78
+ }
79
+
80
+ /* Number — hide spin buttons */
81
+ .cd-input[type="number"]::-webkit-inner-spin-button,
82
+ .cd-input[type="number"]::-webkit-outer-spin-button {
83
+ -webkit-appearance: none;
84
+ margin: 0;
85
+ }
86
+ .cd-input[type="number"] {
87
+ -moz-appearance: textfield;
88
+ }
89
+
90
+ /* ── Textarea ─────────────────────────────────────────── */
91
+
92
+ .cd-textarea {
93
+ display: block;
94
+ width: 100%;
95
+ min-height: 80px;
96
+ padding: 8px 10px;
97
+ background: rgba(5, 6, 10, 0.82);
98
+ color: var(--cd-text);
99
+ border: 1px solid var(--cd-border);
100
+ border-radius: 0;
101
+ font-family: var(--cd-font-mono);
102
+ font-size: var(--cd-text-base);
103
+ line-height: 1.55;
104
+ resize: vertical;
105
+ transition: border-color 150ms ease, box-shadow 150ms ease;
106
+ }
107
+
108
+ .cd-textarea::placeholder {
109
+ color: var(--cd-text-dim);
110
+ font-style: italic;
111
+ }
112
+
113
+ .cd-textarea:focus {
114
+ border-color: color-mix(in srgb, var(--cd-accent) 55%, transparent);
115
+ outline: 2px solid var(--cd-accent);
116
+ outline-offset: 2px;
117
+ box-shadow:
118
+ 0 0 0 1px color-mix(in srgb, var(--cd-accent) 18%, transparent),
119
+ 0 0 8px color-mix(in srgb, var(--cd-accent) 20%, transparent),
120
+ inset 0 0 4px color-mix(in srgb, var(--cd-accent) 6%, transparent);
121
+ }
122
+
123
+ .cd-textarea:disabled {
124
+ opacity: 0.3;
125
+ cursor: not-allowed;
126
+ resize: none;
127
+ }
128
+
129
+ .cd-textarea--error {
130
+ border-color: rgba(255, 69, 108, 0.55);
131
+ }
132
+
133
+ .cd-textarea--error:focus {
134
+ border-color: rgba(255, 69, 108, 0.80);
135
+ outline: 2px solid var(--cd-accent);
136
+ outline-offset: 2px;
137
+ box-shadow:
138
+ 0 0 0 1px rgba(255, 69, 108, 0.20),
139
+ 0 0 8px rgba(255, 69, 108, 0.25);
140
+ }
141
+
142
+ /* ── Input group (prefix / suffix) ─────────────────────── */
143
+
144
+ .cd-input-group {
145
+ display: flex;
146
+ align-items: stretch;
147
+ width: 100%;
148
+ }
149
+
150
+ .cd-input-group .cd-input {
151
+ flex: 1;
152
+ min-width: 0;
153
+ }
154
+
155
+ .cd-input-addon {
156
+ display: flex;
157
+ align-items: center;
158
+ padding: 0 10px;
159
+ background: rgba(5, 6, 10, 0.60);
160
+ border: 1px solid var(--cd-border);
161
+ color: var(--cd-text-muted);
162
+ font-family: var(--cd-font-mono);
163
+ font-size: var(--cd-text-xs);
164
+ white-space: nowrap;
165
+ flex-shrink: 0;
166
+ user-select: none;
167
+ }
168
+
169
+ /* Prefix addon: remove right border so it merges with input */
170
+ .cd-input-group .cd-input-addon:first-child {
171
+ border-right: none;
172
+ }
173
+
174
+ /* Suffix addon: remove left border so it merges with input */
175
+ .cd-input-group .cd-input-addon:last-child {
176
+ border-left: none;
177
+ }
178
+
179
+ /* When the input is focused, light up the whole group border */
180
+ .cd-input-group:focus-within .cd-input-addon {
181
+ border-color: color-mix(in srgb, var(--cd-accent) 55%, transparent);
182
+ }
@@ -0,0 +1,217 @@
1
+ /* ── Interference / Corruption Overlay ─────────────────────────────────────── */
2
+ /*
3
+ Dramatic animated static/noise + data corruption effects for cyberpunk "damaged signal",
4
+ hacked feeds, low-bandwidth, or corrupted data states.
5
+
6
+ Usage (compose freely):
7
+ <div class="cd-interference cd-interference--heavy cd-interference--glitch">
8
+ <div class="cd-interference__noise"></div>
9
+ <div class="cd-interference__content" data-text="CORRUPTED FEED">
10
+ ...your content (text, logs, panels, even images)...
11
+ </div>
12
+ </div>
13
+
14
+ Or direct on text:
15
+ <span class="cd-corrupt-text" data-text="SYSTEM FAILURE">SYSTEM FAILURE</span>
16
+
17
+ Modifiers:
18
+ --light subtle static
19
+ --heavy intense, fast noise + stronger corruption
20
+ --glitch enables the text/data corruption effect (requires data-text attr on child)
21
+ --intense extra aggressive version (combine with heavy)
22
+
23
+ Works great over .cd-terminal, .cd-hud-frame, .cd-glow-card, images, or raw text blocks.
24
+ Noise uses screen blend + theme accent for colored glitch tint.
25
+ */
26
+
27
+ .cd-interference {
28
+ position: relative;
29
+ overflow: hidden;
30
+ }
31
+
32
+ /* The noise layer — multiple moving grain fields for realistic analog/digital static */
33
+ .cd-interference__noise {
34
+ position: absolute;
35
+ inset: 0;
36
+ pointer-events: none;
37
+ z-index: 2;
38
+ background:
39
+ /* fine vertical scan */
40
+ linear-gradient(rgba(255,255,255,0.035) 50%, transparent 50%),
41
+ /* horizontal grain */
42
+ linear-gradient(90deg, rgba(255,255,255,0.025) 50%, transparent 50%),
43
+ /* colored interference tint using theme colors */
44
+ linear-gradient(45deg,
45
+ color-mix(in srgb, var(--cd-accent-secondary) 8%, transparent) 0%,
46
+ transparent 40%,
47
+ color-mix(in srgb, var(--cd-accent) 6%, transparent) 60%,
48
+ transparent 100%);
49
+ background-size: 2px 3px, 3px 2px, 120px 120px;
50
+ animation: cd-interference-noise 65ms steps(3) infinite;
51
+ mix-blend-mode: screen;
52
+ opacity: 0.65;
53
+ filter: contrast(1.15) saturate(0.8);
54
+ }
55
+
56
+ .cd-interference--light .cd-interference__noise {
57
+ opacity: 0.28;
58
+ animation-duration: 120ms;
59
+ filter: contrast(1.05);
60
+ }
61
+
62
+ .cd-interference--heavy .cd-interference__noise {
63
+ opacity: 0.92;
64
+ animation-duration: 42ms;
65
+ background-size: 1.5px 2px, 2px 1.5px, 80px 80px;
66
+ filter: contrast(1.4) saturate(1.1);
67
+ }
68
+
69
+ .cd-interference--intense .cd-interference__noise {
70
+ opacity: 1;
71
+ animation-duration: 28ms;
72
+ filter: contrast(1.6) hue-rotate(8deg);
73
+ }
74
+
75
+ /* Block-level corruption effect (when --glitch modifier is present) */
76
+ .cd-interference--glitch .cd-interference__content,
77
+ .cd-interference--glitch .cd-interference__text {
78
+ position: relative;
79
+ display: block;
80
+ }
81
+
82
+ /* Primary corruption layer — aggressive clipping + offset + color bleed */
83
+ .cd-interference--glitch .cd-interference__content::before,
84
+ .cd-interference--glitch .cd-interference__text::before {
85
+ content: attr(data-text);
86
+ position: absolute;
87
+ left: 0; top: 0;
88
+ width: 100%;
89
+ height: 100%;
90
+ color: var(--cd-accent-secondary);
91
+ overflow: hidden;
92
+ animation: cd-interference-corrupt 1.35s steps(5) infinite;
93
+ opacity: 0.75;
94
+ pointer-events: none;
95
+ mix-blend-mode: difference;
96
+ z-index: 3;
97
+ text-shadow:
98
+ 1px 0 0 var(--cd-accent),
99
+ -1px 0 0 var(--cd-neon-red);
100
+ }
101
+
102
+ /* Secondary echo layer for richer glitch (double vision / RGB split feel) */
103
+ .cd-interference--glitch .cd-interference__content::after,
104
+ .cd-interference--glitch .cd-interference__text::after {
105
+ content: attr(data-text);
106
+ position: absolute;
107
+ left: 0; top: 0;
108
+ width: 100%;
109
+ height: 100%;
110
+ color: var(--cd-accent);
111
+ overflow: hidden;
112
+ animation: cd-interference-corrupt 1.35s steps(5) infinite 0.15s;
113
+ opacity: 0.45;
114
+ pointer-events: none;
115
+ mix-blend-mode: screen;
116
+ z-index: 4;
117
+ transform: translate(1.5px, 0);
118
+ }
119
+
120
+ /* Direct .cd-corrupt-text utility (no wrapper needed) */
121
+ .cd-corrupt-text {
122
+ position: relative;
123
+ display: inline-block;
124
+ }
125
+
126
+ .cd-corrupt-text::before {
127
+ content: attr(data-text);
128
+ position: absolute;
129
+ left: 0; top: 0;
130
+ width: 100%; height: 100%;
131
+ color: var(--cd-neon-red);
132
+ animation: cd-interference-corrupt 1.1s steps(4) infinite;
133
+ opacity: 0.8;
134
+ mix-blend-mode: difference;
135
+ pointer-events: none;
136
+ text-shadow: 2px 0 0 var(--cd-accent-secondary);
137
+ z-index: 1;
138
+ }
139
+
140
+ .cd-corrupt-text::after {
141
+ content: attr(data-text);
142
+ position: absolute;
143
+ left: 0; top: 0;
144
+ width: 100%; height: 100%;
145
+ color: var(--cd-accent-secondary);
146
+ animation: cd-interference-corrupt 1.1s steps(4) infinite 0.08s;
147
+ opacity: 0.55;
148
+ mix-blend-mode: screen;
149
+ pointer-events: none;
150
+ z-index: 2;
151
+ }
152
+
153
+ /* Much more aggressive corruption keyframes */
154
+ @keyframes cd-interference-noise {
155
+ 0% { background-position: 0 0, 0 0, 0 0; }
156
+ 100% { background-position: 2px 3px, 3px 2px, 80px 80px; }
157
+ }
158
+
159
+ @keyframes cd-interference-corrupt {
160
+ 0% {
161
+ -webkit-clip-path: inset(0 0 82% 0);
162
+ clip-path: inset(0 0 82% 0);
163
+ transform: translate(0, -1.5px) scale(1);
164
+ }
165
+ 15% {
166
+ -webkit-clip-path: inset(18% 0 55% 0);
167
+ clip-path: inset(18% 0 55% 0);
168
+ transform: translate(2px, 0.5px) scale(1.01);
169
+ }
170
+ 32% {
171
+ -webkit-clip-path: inset(48% 0 22% 0);
172
+ clip-path: inset(48% 0 22% 0);
173
+ transform: translate(-2.5px, -1px);
174
+ }
175
+ 48% {
176
+ -webkit-clip-path: inset(8% 0 71% 0);
177
+ clip-path: inset(8% 0 71% 0);
178
+ transform: translate(1.5px, 1.5px) scale(0.995);
179
+ }
180
+ 65% {
181
+ -webkit-clip-path: inset(35% 0 38% 0);
182
+ clip-path: inset(35% 0 38% 0);
183
+ transform: translate(-1px, 0);
184
+ }
185
+ 82% {
186
+ -webkit-clip-path: inset(62% 0 12% 0);
187
+ clip-path: inset(62% 0 12% 0);
188
+ transform: translate(3px, -0.5px);
189
+ }
190
+ 100% {
191
+ -webkit-clip-path: inset(0 0 82% 0);
192
+ clip-path: inset(0 0 82% 0);
193
+ transform: translate(0, -1.5px) scale(1);
194
+ }
195
+ }
196
+
197
+ /* Reduced motion — keep subtle static but kill the wild animation */
198
+ @media (prefers-reduced-motion: reduce) {
199
+ .cd-interference__noise {
200
+ animation: none;
201
+ opacity: 0.18;
202
+ background-size: 3px 3px, 4px 4px, 200px 200px;
203
+ }
204
+ .cd-interference--heavy .cd-interference__noise {
205
+ opacity: 0.32;
206
+ }
207
+ .cd-interference--glitch .cd-interference__content::before,
208
+ .cd-interference--glitch .cd-interference__content::after,
209
+ .cd-corrupt-text::before,
210
+ .cd-corrupt-text::after {
211
+ animation: none;
212
+ opacity: 0.25;
213
+ transform: none;
214
+ -webkit-clip-path: none;
215
+ clip-path: none;
216
+ }
217
+ }
@@ -0,0 +1,54 @@
1
+ /* ── Kbd — Keyboard Shortcut ─────────────────────────────────────────────── */
2
+
3
+ .cd-kbd {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ min-width: 20px;
8
+ height: 20px;
9
+ padding: 0 5px;
10
+ font: 700 var(--cd-text-xs)/1 var(--cd-font-mono);
11
+ letter-spacing: 0.05em;
12
+ text-transform: uppercase;
13
+ color: var(--cd-text-secondary);
14
+ background: var(--cd-bg-panel-hover);
15
+ border: 1px solid var(--cd-border-mid);
16
+ border-bottom-width: 2px;
17
+ white-space: nowrap;
18
+ vertical-align: middle;
19
+ user-select: none;
20
+ }
21
+
22
+ /* Accent-highlighted key */
23
+ .cd-kbd--accent {
24
+ color: var(--cd-accent);
25
+ border-color: color-mix(in srgb, var(--cd-accent) 40%, transparent);
26
+ border-bottom-color: color-mix(in srgb, var(--cd-accent) 60%, transparent);
27
+ box-shadow: 0 0 6px var(--cd-accent-glow);
28
+ }
29
+
30
+ /* Larger variant for standalone display */
31
+ .cd-kbd--lg {
32
+ min-width: 28px;
33
+ height: 28px;
34
+ padding: 0 8px;
35
+ font-size: var(--cd-text-base);
36
+ }
37
+
38
+ /* Key combination group — wraps multiple .cd-kbd with a + separator */
39
+ .cd-kbd-group {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ gap: 3px;
43
+ vertical-align: middle;
44
+ }
45
+
46
+ .cd-kbd-group .cd-kbd { vertical-align: baseline; }
47
+
48
+ /* Separator between keys */
49
+ .cd-kbd-group__sep {
50
+ font-size: var(--cd-text-xs);
51
+ color: var(--cd-text-dim);
52
+ font-family: var(--cd-font-mono);
53
+ line-height: 1;
54
+ }
@@ -0,0 +1,256 @@
1
+ /* ── Aspect Ratio / Scroll Area / Empty / Collapsible / Resizable / Item ───── */
2
+
3
+ .cd-aspect-ratio {
4
+ position: relative;
5
+ width: 100%;
6
+ overflow: hidden;
7
+ }
8
+
9
+ .cd-aspect-ratio > * {
10
+ position: absolute;
11
+ inset: 0;
12
+ width: 100%;
13
+ height: 100%;
14
+ object-fit: cover;
15
+ }
16
+
17
+ .cd-scroll-area {
18
+ overflow: auto;
19
+ position: relative;
20
+ }
21
+
22
+ .cd-scroll-area--thin {
23
+ scrollbar-width: thin;
24
+ scrollbar-color: var(--cd-scrollbar-thumb, color-mix(in srgb, var(--cd-accent) 25%, transparent)) transparent;
25
+ }
26
+
27
+ .cd-scroll-area--thin::-webkit-scrollbar { width: 4px; height: 4px; }
28
+ .cd-scroll-area--thin::-webkit-scrollbar-track { background: transparent; }
29
+ .cd-scroll-area--thin::-webkit-scrollbar-thumb {
30
+ background: var(--cd-scrollbar-thumb, color-mix(in srgb, var(--cd-accent) 25%, transparent));
31
+ border-radius: 2px;
32
+ }
33
+
34
+ /* Empty state */
35
+ .cd-empty {
36
+ display: flex;
37
+ flex-direction: column;
38
+ align-items: center;
39
+ justify-content: center;
40
+ gap: 8px;
41
+ padding: 40px 24px;
42
+ text-align: center;
43
+ border: 1px dashed color-mix(in srgb, var(--cd-border) 80%, transparent);
44
+ background: color-mix(in srgb, var(--cd-bg-panel) 50%, transparent);
45
+ font-family: var(--cd-font-mono);
46
+ color: var(--cd-text-muted);
47
+ }
48
+
49
+ .cd-empty__icon {
50
+ font-size: 1.75rem;
51
+ line-height: 1;
52
+ color: var(--cd-accent);
53
+ opacity: 0.85;
54
+ margin-bottom: 4px;
55
+ }
56
+
57
+ .cd-empty__title {
58
+ margin: 0;
59
+ font-size: var(--cd-text-sm);
60
+ font-weight: 700;
61
+ text-transform: uppercase;
62
+ letter-spacing: 0.14em;
63
+ color: var(--cd-text);
64
+ }
65
+
66
+ .cd-empty__description {
67
+ margin: 0;
68
+ max-width: 280px;
69
+ font-size: var(--cd-text-xs);
70
+ color: var(--cd-text-muted);
71
+ line-height: 1.5;
72
+ }
73
+
74
+ .cd-empty__actions {
75
+ display: flex;
76
+ gap: 8px;
77
+ margin-top: 8px;
78
+ }
79
+
80
+ /* Collapsible */
81
+ .cd-collapsible {
82
+ width: 100%;
83
+ }
84
+
85
+ .cd-collapsible__trigger {
86
+ display: flex;
87
+ width: 100%;
88
+ align-items: center;
89
+ justify-content: space-between;
90
+ gap: 8px;
91
+ padding: 8px 0;
92
+ background: none;
93
+ border: none;
94
+ color: var(--cd-text);
95
+ font-family: var(--cd-font-mono);
96
+ font-size: var(--cd-text-sm);
97
+ font-weight: 700;
98
+ text-transform: uppercase;
99
+ letter-spacing: 0.1em;
100
+ cursor: pointer;
101
+ text-align: left;
102
+ }
103
+
104
+ .cd-collapsible__trigger:hover {
105
+ color: var(--cd-accent);
106
+ }
107
+
108
+ .cd-collapsible__chevron {
109
+ color: var(--cd-text-dim);
110
+ transition: transform 0.15s ease;
111
+ font-size: var(--cd-text-xs);
112
+ }
113
+
114
+ .cd-collapsible.is-open .cd-collapsible__chevron {
115
+ transform: rotate(180deg);
116
+ color: var(--cd-accent);
117
+ }
118
+
119
+ .cd-collapsible__content {
120
+ overflow: hidden;
121
+ font-family: var(--cd-font-mono);
122
+ font-size: var(--cd-text-sm);
123
+ color: var(--cd-text-secondary);
124
+ line-height: 1.55;
125
+ }
126
+
127
+ .cd-collapsible:not(.is-open) > .cd-collapsible__content {
128
+ display: none;
129
+ }
130
+
131
+ /* Resizable panels */
132
+ .cd-resizable {
133
+ display: flex;
134
+ width: 100%;
135
+ height: 100%;
136
+ min-height: 120px;
137
+ border: 1px solid var(--cd-border);
138
+ background: var(--cd-bg);
139
+ font-family: var(--cd-font-mono);
140
+ overflow: hidden;
141
+ }
142
+
143
+ .cd-resizable--vertical {
144
+ flex-direction: column;
145
+ }
146
+
147
+ .cd-resizable__panel {
148
+ min-width: 0;
149
+ min-height: 0;
150
+ overflow: auto;
151
+ padding: 12px;
152
+ background: var(--cd-bg-panel);
153
+ }
154
+
155
+ .cd-resizable__handle {
156
+ flex: 0 0 6px;
157
+ background: var(--cd-border-dim);
158
+ position: relative;
159
+ cursor: col-resize;
160
+ transition: background 0.12s ease;
161
+ }
162
+
163
+ .cd-resizable--vertical > .cd-resizable__handle {
164
+ cursor: row-resize;
165
+ flex-basis: 6px;
166
+ }
167
+
168
+ .cd-resizable__handle:hover,
169
+ .cd-resizable__handle:active {
170
+ background: color-mix(in srgb, var(--cd-accent) 45%, transparent);
171
+ }
172
+
173
+ .cd-resizable__handle::after {
174
+ content: '';
175
+ position: absolute;
176
+ inset: 0;
177
+ margin: auto;
178
+ width: 2px;
179
+ height: 24px;
180
+ background: color-mix(in srgb, var(--cd-accent) 40%, transparent);
181
+ }
182
+
183
+ .cd-resizable--vertical > .cd-resizable__handle::after {
184
+ width: 24px;
185
+ height: 2px;
186
+ }
187
+
188
+ /* Item (list row primitive) */
189
+ .cd-item {
190
+ display: flex;
191
+ align-items: center;
192
+ gap: 12px;
193
+ padding: 10px 12px;
194
+ border: 1px solid transparent;
195
+ background: transparent;
196
+ color: var(--cd-text);
197
+ font-family: var(--cd-font-mono);
198
+ text-align: left;
199
+ width: 100%;
200
+ transition: background 0.12s ease, border-color 0.12s ease;
201
+ }
202
+
203
+ .cd-item--bordered {
204
+ border-color: var(--cd-border-dim);
205
+ background: color-mix(in srgb, var(--cd-bg-panel) 60%, transparent);
206
+ }
207
+
208
+ .cd-item--interactive {
209
+ cursor: pointer;
210
+ }
211
+
212
+ .cd-item--interactive:hover {
213
+ background: var(--cd-accent-subtle);
214
+ border-color: color-mix(in srgb, var(--cd-accent) 25%, transparent);
215
+ }
216
+
217
+ .cd-item__media {
218
+ flex-shrink: 0;
219
+ display: flex;
220
+ align-items: center;
221
+ justify-content: center;
222
+ color: var(--cd-accent);
223
+ }
224
+
225
+ .cd-item__content {
226
+ flex: 1;
227
+ min-width: 0;
228
+ display: flex;
229
+ flex-direction: column;
230
+ gap: 2px;
231
+ }
232
+
233
+ .cd-item__title {
234
+ font-size: var(--cd-text-sm);
235
+ font-weight: 700;
236
+ letter-spacing: 0.04em;
237
+ }
238
+
239
+ .cd-item__description {
240
+ font-size: var(--cd-text-xs);
241
+ color: var(--cd-text-muted);
242
+ line-height: 1.4;
243
+ }
244
+
245
+ .cd-item__actions {
246
+ flex-shrink: 0;
247
+ display: flex;
248
+ align-items: center;
249
+ gap: 6px;
250
+ }
251
+
252
+ .cd-item-group {
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: 4px;
256
+ }