@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,162 @@
1
+ /* ── Command palette / Combobox list ───────────────────────────────────────── */
2
+
3
+ .cd-command {
4
+ display: flex;
5
+ flex-direction: column;
6
+ width: 100%;
7
+ max-width: 520px;
8
+ background: var(--cd-bg-panel);
9
+ border: 1px solid color-mix(in srgb, var(--cd-accent) 30%, transparent);
10
+ font-family: var(--cd-font-mono);
11
+ box-shadow:
12
+ 0 12px 40px rgba(0, 0, 0, 0.55),
13
+ 0 0 20px color-mix(in srgb, var(--cd-accent) 15%, transparent);
14
+ overflow: hidden;
15
+ }
16
+
17
+ .cd-command__input-wrap {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: 8px;
21
+ padding: 10px 12px;
22
+ border-bottom: 1px solid color-mix(in srgb, var(--cd-accent) 18%, transparent);
23
+ }
24
+
25
+ .cd-command__input-wrap::before {
26
+ content: '›';
27
+ color: var(--cd-accent);
28
+ font-weight: 700;
29
+ }
30
+
31
+ .cd-command__input {
32
+ flex: 1;
33
+ min-width: 0;
34
+ background: transparent;
35
+ border: none;
36
+ outline: none;
37
+ color: var(--cd-text);
38
+ font-family: var(--cd-font-mono);
39
+ font-size: var(--cd-text-sm);
40
+ }
41
+
42
+ .cd-command__input::placeholder {
43
+ color: var(--cd-text-dim);
44
+ font-style: italic;
45
+ }
46
+
47
+ .cd-command__list {
48
+ max-height: 280px;
49
+ overflow: auto;
50
+ padding: 6px;
51
+ }
52
+
53
+ .cd-command__group-label {
54
+ padding: 6px 8px 4px;
55
+ font-size: var(--cd-text-xs);
56
+ font-weight: 700;
57
+ text-transform: uppercase;
58
+ letter-spacing: 0.14em;
59
+ color: var(--cd-text-dim);
60
+ }
61
+
62
+ .cd-command__item {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 8px;
66
+ width: 100%;
67
+ padding: 8px 10px;
68
+ border: 1px solid transparent;
69
+ background: transparent;
70
+ color: var(--cd-text-secondary);
71
+ font-family: var(--cd-font-mono);
72
+ font-size: var(--cd-text-sm);
73
+ text-align: left;
74
+ cursor: pointer;
75
+ }
76
+
77
+ .cd-command__item:hover,
78
+ .cd-command__item[data-selected='true'],
79
+ .cd-command__item.is-selected {
80
+ background: var(--cd-accent-subtle);
81
+ border-color: color-mix(in srgb, var(--cd-accent) 25%, transparent);
82
+ color: var(--cd-accent);
83
+ }
84
+
85
+ .cd-command__item:disabled,
86
+ .cd-command__item[aria-disabled='true'] {
87
+ opacity: 0.35;
88
+ cursor: not-allowed;
89
+ }
90
+
91
+ .cd-command__item-kbd {
92
+ margin-left: auto;
93
+ font-size: var(--cd-text-xs);
94
+ color: var(--cd-text-dim);
95
+ }
96
+
97
+ .cd-command__empty {
98
+ padding: 24px 12px;
99
+ text-align: center;
100
+ font-size: var(--cd-text-xs);
101
+ color: var(--cd-text-muted);
102
+ text-transform: uppercase;
103
+ letter-spacing: 0.1em;
104
+ }
105
+
106
+ .cd-command__sep {
107
+ height: 1px;
108
+ margin: 6px 4px;
109
+ background: var(--cd-border-dim);
110
+ }
111
+
112
+ /* Combobox host reuses popover + command list */
113
+ .cd-combobox {
114
+ position: relative;
115
+ display: inline-flex;
116
+ flex-direction: column;
117
+ gap: 0;
118
+ width: 100%;
119
+ max-width: 320px;
120
+ }
121
+
122
+ .cd-combobox__menu {
123
+ position: absolute;
124
+ top: calc(100% + 4px);
125
+ left: 0;
126
+ right: 0;
127
+ z-index: 500;
128
+ background: var(--cd-bg-panel);
129
+ border: 1px solid color-mix(in srgb, var(--cd-accent) 28%, transparent);
130
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
131
+ max-height: 220px;
132
+ overflow: auto;
133
+ opacity: 0;
134
+ pointer-events: none;
135
+ transform: translateY(-4px);
136
+ transition: opacity 0.12s ease, transform 0.12s ease;
137
+ }
138
+
139
+ .cd-combobox.is-open > .cd-combobox__menu {
140
+ opacity: 1;
141
+ pointer-events: auto;
142
+ transform: translateY(0);
143
+ }
144
+
145
+ .cd-combobox__option {
146
+ display: block;
147
+ width: 100%;
148
+ padding: 8px 10px;
149
+ border: none;
150
+ background: transparent;
151
+ color: var(--cd-text-secondary);
152
+ font-family: var(--cd-font-mono);
153
+ font-size: var(--cd-text-sm);
154
+ text-align: left;
155
+ cursor: pointer;
156
+ }
157
+
158
+ .cd-combobox__option:hover,
159
+ .cd-combobox__option[aria-selected='true'] {
160
+ background: var(--cd-accent-subtle);
161
+ color: var(--cd-accent);
162
+ }
@@ -0,0 +1,187 @@
1
+ /* ── Dropdown Menu ────────────────────────────────────────────────────────── */
2
+
3
+ .cd-dropdown {
4
+ position: relative;
5
+ display: inline-block;
6
+ }
7
+
8
+ /* ── Menu panel ───────────────────────────────────────────────────────────── */
9
+
10
+ .cd-dropdown__menu {
11
+ position: absolute;
12
+ top: calc(100% + 4px);
13
+ left: 0;
14
+ z-index: 500;
15
+ min-width: 180px;
16
+ background: var(--cd-bg-panel);
17
+ border: 1px solid color-mix(in srgb, var(--cd-accent) 25%, transparent);
18
+ padding: 4px 0;
19
+ font-family: var(--cd-font-mono);
20
+ box-shadow: 0 8px 24px rgba(0,0,0,0.5), 0 0 16px var(--cd-accent-glow);
21
+ -webkit-clip-path: polygon(
22
+ var(--cd-clip-sm) 0%,
23
+ 100% 0%,
24
+ 100% calc(100% - var(--cd-clip-sm)),
25
+ calc(100% - var(--cd-clip-sm)) 100%,
26
+ 0% 100%,
27
+ 0% var(--cd-clip-sm)
28
+ );
29
+ clip-path: polygon(
30
+ var(--cd-clip-sm) 0%,
31
+ 100% 0%,
32
+ 100% calc(100% - var(--cd-clip-sm)),
33
+ calc(100% - var(--cd-clip-sm)) 100%,
34
+ 0% 100%,
35
+ 0% var(--cd-clip-sm)
36
+ );
37
+ opacity: 0;
38
+ transform: translateY(-6px) scale(0.97);
39
+ pointer-events: none;
40
+ transform-origin: top left;
41
+ transition: opacity 0.15s ease, transform 0.15s ease;
42
+ }
43
+
44
+ /* Right-aligned variant */
45
+ .cd-dropdown__menu--right {
46
+ left: auto;
47
+ right: 0;
48
+ -webkit-clip-path: polygon(
49
+ var(--cd-clip-sm) 0%,
50
+ 100% 0%,
51
+ 100% calc(100% - var(--cd-clip-sm)),
52
+ calc(100% - var(--cd-clip-sm)) 100%,
53
+ 0% 100%,
54
+ 0% var(--cd-clip-sm)
55
+ );
56
+ clip-path: polygon(
57
+ var(--cd-clip-sm) 0%,
58
+ 100% 0%,
59
+ 100% calc(100% - var(--cd-clip-sm)),
60
+ calc(100% - var(--cd-clip-sm)) 100%,
61
+ 0% 100%,
62
+ 0% var(--cd-clip-sm)
63
+ );
64
+ transform-origin: top right;
65
+ }
66
+
67
+ /* Open state — toggled by JS or :focus-within */
68
+ .cd-dropdown.is-open > .cd-dropdown__menu,
69
+ .cd-dropdown:focus-within > .cd-dropdown__menu {
70
+ opacity: 1;
71
+ transform: translateY(0) scale(1);
72
+ pointer-events: auto;
73
+ }
74
+
75
+ /* ── Trigger ──────────────────────────────────────────────────────────────── */
76
+
77
+ .cd-dropdown__trigger {
78
+ display: inline-flex;
79
+ align-items: center;
80
+ gap: 6px;
81
+ }
82
+
83
+ /* Chevron indicator */
84
+ .cd-dropdown__trigger::after {
85
+ content: '▾';
86
+ font-size: var(--cd-text-sm);
87
+ color: var(--cd-text-dim);
88
+ transition: transform 0.15s, color 0.15s;
89
+ line-height: 1;
90
+ }
91
+
92
+ .cd-dropdown.is-open .cd-dropdown__trigger::after {
93
+ transform: rotate(180deg);
94
+ color: var(--cd-accent);
95
+ }
96
+
97
+ /* ── Menu items ───────────────────────────────────────────────────────────── */
98
+
99
+ .cd-dropdown__item {
100
+ display: flex;
101
+ align-items: center;
102
+ gap: 8px;
103
+ width: 100%;
104
+ padding: 9px 14px; /* larger tap target */
105
+ background: none;
106
+ border: none;
107
+ font: 700 var(--cd-text-xs)/1 var(--cd-font-mono);
108
+ letter-spacing: 0.1em;
109
+ text-transform: uppercase;
110
+ color: var(--cd-text-secondary);
111
+ text-decoration: none;
112
+ cursor: pointer;
113
+ white-space: nowrap;
114
+ transition: background 0.1s, color 0.1s;
115
+ text-align: left;
116
+ }
117
+
118
+ .cd-dropdown__item:hover {
119
+ background: var(--cd-accent-subtle);
120
+ color: var(--cd-accent);
121
+ }
122
+
123
+ .cd-dropdown__item:focus-visible {
124
+ background: var(--cd-accent-subtle);
125
+ color: var(--cd-accent);
126
+ outline-offset: 0; /* tighter for menu items */
127
+ }
128
+
129
+ .cd-dropdown__item:active {
130
+ background: color-mix(in srgb, var(--cd-accent) 15%, transparent);
131
+ }
132
+
133
+ /* Danger item */
134
+ .cd-dropdown__item--danger { color: var(--cd-text-muted); }
135
+ .cd-dropdown__item--danger:hover {
136
+ background: color-mix(in srgb, var(--cd-red) 10%, transparent);
137
+ color: var(--cd-red);
138
+ }
139
+
140
+ /* Disabled item */
141
+ .cd-dropdown__item:disabled,
142
+ .cd-dropdown__item[aria-disabled="true"] {
143
+ opacity: 0.35;
144
+ pointer-events: none;
145
+ }
146
+
147
+ /* Item icon slot */
148
+ .cd-dropdown__item-icon {
149
+ flex-shrink: 0;
150
+ font-size: 11px;
151
+ opacity: 0.6;
152
+ width: 14px;
153
+ text-align: center;
154
+ }
155
+
156
+ /* Item shortcut hint — right-aligned */
157
+ .cd-dropdown__item-kbd {
158
+ margin-left: auto;
159
+ font-size: var(--cd-text-xs);
160
+ color: var(--cd-text-dim);
161
+ letter-spacing: 0.05em;
162
+ }
163
+
164
+ /* ── Separator ────────────────────────────────────────────────────────────── */
165
+
166
+ .cd-dropdown__sep {
167
+ height: 1px;
168
+ background: var(--cd-border-dim);
169
+ margin: 4px 0;
170
+ }
171
+
172
+ /* ── Section label ────────────────────────────────────────────────────────── */
173
+
174
+ .cd-dropdown__label {
175
+ padding: 6px 14px 3px;
176
+ font-size: var(--cd-text-xs);
177
+ font-weight: 700;
178
+ text-transform: uppercase;
179
+ letter-spacing: 0.18em;
180
+ color: var(--cd-text-dim);
181
+ cursor: default;
182
+ }
183
+
184
+ /* Reduced motion */
185
+ @media (prefers-reduced-motion: reduce) {
186
+ .cd-dropdown__menu { transition: none; }
187
+ }
@@ -0,0 +1,280 @@
1
+ /* ── Form label ─────────────────────────────────────────── */
2
+
3
+ .cd-form-label {
4
+ display: block;
5
+ font-family: var(--cd-font-mono);
6
+ font-size: var(--cd-text-sm);
7
+ font-weight: 700;
8
+ text-transform: uppercase;
9
+ letter-spacing: 0.12em;
10
+ color: var(--cd-text-secondary);
11
+ user-select: none;
12
+ }
13
+
14
+ /* Required asterisk */
15
+ .cd-form-label[data-required]::after,
16
+ .cd-form-label--required::after {
17
+ content: ' *';
18
+ color: var(--cd-neon-red);
19
+ }
20
+
21
+ /* ── Form field wrapper ─────────────────────────────────── */
22
+ /*
23
+ Usage:
24
+ <div class="cd-field">
25
+ <label class="cd-label">Field Name</label>
26
+ <input class="cd-input">
27
+ <p class="cd-field-desc">Helper text</p>
28
+ <p class="cd-field-error">Error message</p>
29
+ </div>
30
+ */
31
+
32
+ .cd-field {
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 5px;
36
+ width: 100%;
37
+ }
38
+
39
+ /* Inline layout: label left, control right */
40
+ .cd-field--inline {
41
+ flex-direction: row;
42
+ align-items: center;
43
+ justify-content: space-between;
44
+ gap: 12px;
45
+ }
46
+
47
+ .cd-field--inline .cd-label {
48
+ flex-shrink: 0;
49
+ white-space: nowrap;
50
+ }
51
+
52
+ .cd-field--inline > *:last-child:not(.cd-label) {
53
+ flex: 1;
54
+ min-width: 0;
55
+ }
56
+
57
+ .cd-field-desc {
58
+ font-family: var(--cd-font-mono);
59
+ font-size: var(--cd-text-xs);
60
+ color: var(--cd-text-muted);
61
+ line-height: 1.5;
62
+ letter-spacing: 0.04em;
63
+ margin: 0;
64
+ }
65
+
66
+ .cd-field-error {
67
+ font-family: var(--cd-font-mono);
68
+ font-size: var(--cd-text-xs);
69
+ color: var(--cd-neon-red);
70
+ letter-spacing: 0.04em;
71
+ margin: 0;
72
+ display: flex;
73
+ align-items: center;
74
+ gap: 4px;
75
+ }
76
+
77
+ .cd-field-error::before {
78
+ content: '⚠';
79
+ font-size: var(--cd-text-xs);
80
+ }
81
+
82
+ /* ── Form section ───────────────────────────────────────── */
83
+
84
+ .cd-form-section {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 14px;
88
+ }
89
+
90
+ /* ── Separator ──────────────────────────────────────────── */
91
+
92
+ .cd-separator {
93
+ display: flex;
94
+ align-items: center;
95
+ gap: 10px;
96
+ width: 100%;
97
+ }
98
+
99
+ .cd-separator::before,
100
+ .cd-separator::after {
101
+ content: '';
102
+ flex: 1;
103
+ height: 1px;
104
+ background: var(--cd-border-dim);
105
+ }
106
+
107
+ /* With content (e.g. "OR") */
108
+ .cd-separator--label {
109
+ font-family: var(--cd-font-mono);
110
+ font-size: var(--cd-text-xs);
111
+ font-weight: 700;
112
+ text-transform: uppercase;
113
+ letter-spacing: 0.15em;
114
+ color: var(--cd-text-dim);
115
+ white-space: nowrap;
116
+ }
117
+
118
+ /* No content — pure line */
119
+ .cd-separator--plain::before { flex: 1; }
120
+ .cd-separator--plain::after { display: none; }
121
+
122
+ /* Neon variant */
123
+ .cd-separator--neon::before,
124
+ .cd-separator--neon::after {
125
+ background: linear-gradient(
126
+ 90deg,
127
+ transparent,
128
+ color-mix(in srgb, var(--cd-accent) 35%, transparent) 40%,
129
+ color-mix(in srgb, var(--cd-accent-secondary) 25%, transparent) 60%,
130
+ transparent
131
+ );
132
+ }
133
+
134
+ /* Vertical */
135
+ .cd-separator--vertical {
136
+ flex-direction: column;
137
+ width: 1px;
138
+ height: 100%;
139
+ gap: 6px;
140
+ }
141
+
142
+ .cd-separator--vertical::before,
143
+ .cd-separator--vertical::after {
144
+ flex: 1;
145
+ width: 1px;
146
+ height: auto;
147
+ }
148
+
149
+ /* ── Tooltip (CSS-only) ─────────────────────────────────── */
150
+ /*
151
+ Usage: <span class="cd-tooltip" data-tip="Helpful hint">hover me</span>
152
+ */
153
+
154
+ .cd-tooltip {
155
+ position: relative;
156
+ cursor: help;
157
+ }
158
+
159
+ .cd-tooltip::after {
160
+ content: attr(data-tip);
161
+ position: absolute;
162
+ bottom: calc(100% + 8px);
163
+ left: 50%;
164
+ transform: translateX(-50%);
165
+ white-space: nowrap;
166
+ font-family: var(--cd-font-mono);
167
+ font-size: var(--cd-text-xs);
168
+ font-weight: 700;
169
+ text-transform: uppercase;
170
+ letter-spacing: 0.08em;
171
+ color: var(--cd-text);
172
+ background: var(--cd-bg-panel);
173
+ border: 1px solid color-mix(in srgb, var(--cd-accent) 45%, transparent);
174
+ padding: 4px 8px;
175
+ box-shadow:
176
+ 0 0 8px color-mix(in srgb, var(--cd-accent) 20%, transparent),
177
+ 2px 2px 0 color-mix(in srgb, var(--cd-accent-secondary) 20%, transparent);
178
+ pointer-events: none;
179
+ opacity: 0;
180
+ transition: opacity 120ms ease;
181
+ z-index: 9998;
182
+ }
183
+
184
+ /* Arrow */
185
+ .cd-tooltip::before {
186
+ content: '';
187
+ position: absolute;
188
+ bottom: calc(100% + 3px);
189
+ left: 50%;
190
+ transform: translateX(-50%);
191
+ width: 0;
192
+ height: 0;
193
+ border-left: 5px solid transparent;
194
+ border-right: 5px solid transparent;
195
+ border-top: 5px solid color-mix(in srgb, var(--cd-accent) 45%, transparent);
196
+ pointer-events: none;
197
+ opacity: 0;
198
+ transition: opacity 120ms ease;
199
+ z-index: 9999;
200
+ }
201
+
202
+ .cd-tooltip:hover::after,
203
+ .cd-tooltip:hover::before {
204
+ opacity: 1;
205
+ }
206
+
207
+ /* Tooltip below */
208
+ .cd-tooltip--below::after {
209
+ bottom: auto;
210
+ top: calc(100% + 8px);
211
+ }
212
+
213
+ .cd-tooltip--below::before {
214
+ bottom: auto;
215
+ top: calc(100% + 3px);
216
+ border-top: none;
217
+ border-bottom: 5px solid color-mix(in srgb, var(--cd-accent) 45%, transparent);
218
+ }
219
+
220
+ /* ── Progress bar ───────────────────────────────────────── */
221
+ /*
222
+ Usage:
223
+ <div class="cd-progress">
224
+ <div class="cd-progress__bar" style="width: 65%"></div>
225
+ </div>
226
+ */
227
+
228
+ .cd-progress {
229
+ width: 100%;
230
+ height: 4px;
231
+ background: var(--cd-bg-panel-hover);
232
+ border: 1px solid var(--cd-border-dim);
233
+ overflow: hidden;
234
+ position: relative;
235
+ }
236
+
237
+ .cd-progress__bar {
238
+ height: 100%;
239
+ background: var(--cd-accent);
240
+ transition: width 300ms ease;
241
+ position: relative;
242
+ }
243
+
244
+ .cd-progress__bar::after {
245
+ content: '';
246
+ position: absolute;
247
+ right: 0;
248
+ top: 0;
249
+ bottom: 0;
250
+ width: 8px;
251
+ background: color-mix(in srgb, var(--cd-accent-bright, var(--cd-accent)) 80%, white);
252
+ filter: blur(2px);
253
+ }
254
+
255
+ /* Indeterminate / scanning */
256
+ .cd-progress--indeterminate .cd-progress__bar {
257
+ width: 40% !important;
258
+ animation: cd-progress-scan 1.8s ease-in-out infinite;
259
+ }
260
+
261
+ @keyframes cd-progress-scan {
262
+ 0% { transform: translateX(-150%); }
263
+ 100% { transform: translateX(350%); }
264
+ }
265
+
266
+ /* Color variants */
267
+ .cd-progress--danger .cd-progress__bar { background: var(--cd-neon-red); }
268
+ .cd-progress--success .cd-progress__bar { background: var(--cd-neon-green); }
269
+ .cd-progress--warning .cd-progress__bar { background: var(--cd-neon-amber); }
270
+
271
+ /* Thick variant */
272
+ .cd-progress--thick {
273
+ height: 8px;
274
+ }
275
+
276
+ @media (prefers-reduced-motion: reduce) {
277
+ .cd-progress--indeterminate .cd-progress__bar {
278
+ animation-duration: 0.001ms;
279
+ }
280
+ }