@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,67 @@
1
+ /* ── Accessibility layer (opt-in) ──────────────────────────────────────────
2
+ Add the class `cd-a11y` to any container you want bumped for readability.
3
+ It overrides three things, and ONLY inside `.cd-a11y` — defaults are untouched:
4
+ 1. Type scale — captions/body cross the 12px floor (was 10–12px).
5
+ 2. Muted text — low-contrast greys lifted toward AAA (defaults already AA).
6
+ 3. Body glow — text-shadow on small/running text dampened, NOT removed.
7
+ The art stays: neon hues, uppercase, pixel corners, and the big glowing
8
+ stat/gauge/HUD readouts are left alone. */
9
+
10
+ .cd-a11y {
11
+ /* 1 ── Type scale — same ratios, shifted up ~+2px so nothing sits below 12px */
12
+ --cd-text-xs: 0.75rem; /* 10px → 12px */
13
+ --cd-text-sm: 0.8125rem; /* 11px → 13px */
14
+ --cd-text-base: 0.875rem; /* 12px → 14px */
15
+ --cd-text-md: 0.9375rem; /* 13px → 15px */
16
+ --cd-text-lg: 1rem; /* 14px → 16px */
17
+
18
+ /* 2 ── Muted text lifted toward AAA on --cd-bg, keeping the warm/cool tone */
19
+ --cd-text-muted: #b3aaa0;
20
+ --cd-text-muted-alt: #9aa6bd;
21
+ --cd-text-dim: #968d84;
22
+ --cd-text-secondary: #b6c3dd;
23
+ }
24
+
25
+ /* 3 ── Dampen glow on running / small text (keep it, just stop the smear).
26
+ currentColor keeps each glow on its own hue. */
27
+ .cd-a11y .cd-text-glow,
28
+ .cd-a11y .text-glow-orange,
29
+ .cd-a11y .text-glow-amber,
30
+ .cd-a11y .text-glow-magenta,
31
+ .cd-a11y .text-glow-green,
32
+ .cd-a11y .text-glow-red,
33
+ .cd-a11y .text-glow-cyan,
34
+ .cd-a11y .text-glow-blue {
35
+ text-shadow: 0 0 3px color-mix(in srgb, currentColor 32%, transparent);
36
+ }
37
+
38
+ /* Interactive running text: tabs, breadcrumbs, terminal lines — soften only */
39
+ .cd-a11y .cd-tabs__trigger:focus-visible,
40
+ .cd-a11y .cd-tabs__trigger.is-active,
41
+ .cd-a11y .cd-breadcrumb__link:hover,
42
+ .cd-a11y .cd-breadcrumb__link:focus-visible {
43
+ text-shadow: 0 0 3px var(--cd-accent-glow);
44
+ }
45
+ .cd-a11y .cd-terminal__line--error {
46
+ text-shadow: 0 0 2px rgba(255, 69, 108, 0.4);
47
+ }
48
+
49
+ /* Note: .cd-stat__value, gauge centre readouts, HUD values and the glitch
50
+ logo are intentionally left glowing — they're display type, not content. */
51
+
52
+ /* Stronger, always-on focus ring — an offset halo so it reads against busy
53
+ neon borders without relying on colour alone. */
54
+ .cd-a11y :focus-visible {
55
+ outline: 2px solid var(--cd-accent);
56
+ outline-offset: 2px;
57
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--cd-accent) 22%, transparent);
58
+ }
59
+
60
+ /* Respect users who ask for less motion: kill the glitch/scan loops inside
61
+ the a11y scope as a belt-and-braces over the components' own guards. */
62
+ @media (prefers-reduced-motion: reduce) {
63
+ .cd-a11y .cd-glitch-text,
64
+ .cd-a11y [class*="cd-logo-glitch"] {
65
+ animation: none !important;
66
+ }
67
+ }
@@ -0,0 +1,111 @@
1
+ /* ── Keyframes ──────────────────────────────────────────── */
2
+
3
+ @keyframes cd-pulse-glow {
4
+ 0%, 100% { opacity: 1; }
5
+ 50% { opacity: 0.5; }
6
+ }
7
+
8
+ @keyframes cd-flicker {
9
+ 0%, 94%, 96%, 98%, 100% { opacity: 1; }
10
+ 95%, 97% { opacity: 0.1; }
11
+ }
12
+
13
+ @keyframes cd-cursor-blink {
14
+ 0%, 49% { opacity: 1; }
15
+ 50%, 100% { opacity: 0; }
16
+ }
17
+
18
+ @keyframes cd-logo-glitch {
19
+ 0%, 90%, 100% {
20
+ text-shadow:
21
+ 2px 0 0 color-mix(in srgb, var(--cd-accent-secondary) 55%, transparent),
22
+ 0 0 8px color-mix(in srgb, var(--cd-accent) 40%, transparent);
23
+ transform: none;
24
+ }
25
+ 92% {
26
+ text-shadow:
27
+ -3px 0 0 color-mix(in srgb, var(--cd-accent-secondary) 80%, transparent),
28
+ 3px 0 0 color-mix(in srgb, var(--cd-accent) 80%, transparent);
29
+ transform: translateX(2px);
30
+ }
31
+ 94% {
32
+ text-shadow:
33
+ 3px 0 0 color-mix(in srgb, var(--cd-accent-secondary) 80%, transparent),
34
+ -2px 0 0 color-mix(in srgb, var(--cd-accent) 80%, transparent);
35
+ transform: translateX(-1px);
36
+ }
37
+ }
38
+
39
+ @keyframes cd-neon-pulse {
40
+ 0%, 100% {
41
+ box-shadow:
42
+ 0 0 6px color-mix(in srgb, var(--cd-accent) 30%, transparent),
43
+ 0 0 12px color-mix(in srgb, var(--cd-accent) 15%, transparent);
44
+ }
45
+ 50% {
46
+ box-shadow:
47
+ 0 0 12px color-mix(in srgb, var(--cd-accent) 60%, transparent),
48
+ 0 0 24px color-mix(in srgb, var(--cd-accent) 30%, transparent);
49
+ }
50
+ }
51
+
52
+ @keyframes cd-header-sweep {
53
+ 0% { transform: translateX(-100%); opacity: 0; }
54
+ 10% { opacity: 1; }
55
+ 90% { opacity: 1; }
56
+ 100% { transform: translateX(200%); opacity: 0; }
57
+ }
58
+
59
+ @keyframes cd-skel-shimmer {
60
+ 0% { background-position: -200% 0; }
61
+ 100% { background-position: 200% 0; }
62
+ }
63
+
64
+ @keyframes cd-crt-boot {
65
+ 0% { filter: brightness(0); }
66
+ 10% { filter: brightness(3) blur(2px); }
67
+ 30% { filter: brightness(1.2) blur(0); }
68
+ 100% { filter: brightness(1); }
69
+ }
70
+
71
+ /* ── Animation classes ──────────────────────────────────── */
72
+
73
+ .cd-animate-pulse-glow { animation: cd-pulse-glow 2s ease-in-out infinite; }
74
+ .cd-animate-flicker { animation: cd-flicker 3s ease-in-out infinite; }
75
+ .cd-animate-cursor-blink{ animation: cd-cursor-blink 1.2s step-end infinite; }
76
+ .cd-animate-logo-glitch { animation: cd-logo-glitch 9s ease-in-out infinite; }
77
+ .cd-animate-neon-pulse { animation: cd-neon-pulse 2.2s ease-in-out infinite; }
78
+ .cd-animate-sweep { animation: cd-header-sweep 10s ease-in-out infinite; }
79
+ .cd-animate-crt-boot { animation: cd-crt-boot 0.6s ease-out both; }
80
+
81
+ .cd-skel {
82
+ background: linear-gradient(
83
+ 90deg,
84
+ var(--cd-bg-panel) 0%,
85
+ color-mix(in srgb, var(--cd-accent) 6%, var(--cd-bg-panel)) 50%,
86
+ var(--cd-bg-panel) 100%
87
+ );
88
+ background-size: 200% 100%;
89
+ animation: cd-skel-shimmer 1.5s linear infinite;
90
+ }
91
+
92
+ /* Backward-compat aliases for dashboard-app class names */
93
+ .animate-pulse-glow { animation: cd-pulse-glow 2s ease-in-out infinite; }
94
+ .animate-flicker { animation: cd-flicker 3s ease-in-out infinite; }
95
+
96
+ /* Reduced motion */
97
+ @media (prefers-reduced-motion: reduce) {
98
+ .cd-animate-pulse-glow,
99
+ .cd-animate-flicker,
100
+ .cd-animate-cursor-blink,
101
+ .cd-animate-logo-glitch,
102
+ .cd-animate-neon-pulse,
103
+ .cd-animate-sweep,
104
+ .cd-animate-crt-boot,
105
+ .cd-skel,
106
+ .animate-pulse-glow,
107
+ .animate-flicker {
108
+ animation-duration: 0.001ms;
109
+ animation-iteration-count: 1;
110
+ }
111
+ }
@@ -0,0 +1,34 @@
1
+ @font-face {
2
+ font-family: 'JetBrains Mono';
3
+ src: url('./fonts/JetBrainsMono-Variable.woff2') format('woff2');
4
+ font-weight: 100 800;
5
+ font-style: normal;
6
+ font-display: swap;
7
+ }
8
+
9
+ *, *::before, *::after {
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ :root {
14
+ font-family: var(--cd-font-mono);
15
+ background-color: var(--cd-bg);
16
+ color: var(--cd-text);
17
+ -webkit-font-smoothing: antialiased;
18
+ -moz-osx-font-smoothing: grayscale;
19
+ }
20
+
21
+ ::selection {
22
+ background: color-mix(in srgb, var(--cd-accent) 24%, transparent);
23
+ color: var(--cd-text);
24
+ }
25
+
26
+ /* Focus indicators (high priority accessibility fix)
27
+ Visible keyboard focus ring using theme accent. Cyber glow aesthetic.
28
+ Components that use custom focus (e.g. neon box-shadow on inputs) layer
29
+ on top of this. outline:none removed from focusables so this applies.
30
+ See also per-component :focus-visible enhancements. */
31
+ :focus-visible {
32
+ outline: 2px solid var(--cd-accent);
33
+ outline-offset: 2px;
34
+ }
@@ -0,0 +1,148 @@
1
+ /* ── Accordion ────────────────────────────────────────────────────────────── */
2
+ /* Uses native <details>/<summary> for zero-JS open/close semantics. */
3
+ /* Smooth animation via grid-template-rows trick (modern browsers). */
4
+
5
+ .cd-accordion {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 0;
9
+ }
10
+
11
+ /* ── Item (<details>) ─────────────────────────────────────────────────────── */
12
+
13
+ .cd-accordion__item {
14
+ border: 1px solid var(--cd-border-dim);
15
+ border-bottom: none;
16
+ font-family: var(--cd-font-mono);
17
+ overflow: hidden;
18
+ transition: border-color 0.15s;
19
+ }
20
+
21
+ .cd-accordion__item:last-child {
22
+ border-bottom: 1px solid var(--cd-border-dim);
23
+ }
24
+
25
+ .cd-accordion__item[open] {
26
+ border-color: color-mix(in srgb, var(--cd-accent) 25%, transparent);
27
+ }
28
+
29
+ .cd-accordion__item[open]:last-child {
30
+ border-bottom-color: color-mix(in srgb, var(--cd-accent) 25%, transparent);
31
+ }
32
+
33
+ /* ── Trigger (<summary>) ──────────────────────────────────────────────────── */
34
+
35
+ .cd-accordion__trigger {
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: space-between;
39
+ gap: 10px;
40
+ padding: 11px 14px;
41
+ cursor: pointer;
42
+ list-style: none;
43
+ user-select: none;
44
+ font-size: var(--cd-text-sm);
45
+ font-weight: 700;
46
+ text-transform: uppercase;
47
+ letter-spacing: 0.12em;
48
+ color: var(--cd-text-secondary);
49
+ background: var(--cd-bg-panel);
50
+ transition: color 0.15s, background 0.15s;
51
+ }
52
+
53
+ /* Remove default browser disclosure marker */
54
+ .cd-accordion__trigger::-webkit-details-marker { display: none; }
55
+ .cd-accordion__trigger::marker { display: none; }
56
+
57
+ .cd-accordion__trigger:hover {
58
+ background: var(--cd-bg-panel-hover);
59
+ color: var(--cd-text);
60
+ }
61
+
62
+ .cd-accordion__trigger:focus-visible {
63
+ color: var(--cd-accent);
64
+ background: color-mix(in srgb, var(--cd-accent) 4%, var(--cd-bg-panel));
65
+ }
66
+
67
+ .cd-accordion__item[open] > .cd-accordion__trigger {
68
+ color: var(--cd-accent);
69
+ background: color-mix(in srgb, var(--cd-accent) 4%, var(--cd-bg-panel));
70
+ }
71
+
72
+ /* Chevron arrow via ::after */
73
+ .cd-accordion__trigger::after {
74
+ content: '›';
75
+ font-size: 14px;
76
+ font-weight: 400;
77
+ color: var(--cd-text-dim);
78
+ flex-shrink: 0;
79
+ transform: rotate(0deg);
80
+ transition: transform 0.2s ease, color 0.15s;
81
+ line-height: 1;
82
+ }
83
+
84
+ .cd-accordion__item[open] > .cd-accordion__trigger::after {
85
+ transform: rotate(90deg);
86
+ color: var(--cd-accent);
87
+ }
88
+
89
+ /* Optional icon slot before the label */
90
+ .cd-accordion__icon {
91
+ flex-shrink: 0;
92
+ font-size: 12px;
93
+ opacity: 0.6;
94
+ }
95
+
96
+ .cd-accordion__item[open] > .cd-accordion__trigger .cd-accordion__icon {
97
+ opacity: 1;
98
+ color: var(--cd-accent);
99
+ }
100
+
101
+ /* ── Content — smooth height animation ────────────────────────────────────── */
102
+
103
+ .cd-accordion__body {
104
+ display: grid;
105
+ grid-template-rows: 0fr;
106
+ transition: grid-template-rows 0.22s ease;
107
+ }
108
+
109
+ .cd-accordion__item[open] > .cd-accordion__body {
110
+ grid-template-rows: 1fr;
111
+ }
112
+
113
+ .cd-accordion__content {
114
+ overflow: hidden;
115
+ }
116
+
117
+ .cd-accordion__content-inner {
118
+ padding: 12px 14px 14px;
119
+ font-size: var(--cd-text-base);
120
+ color: var(--cd-text-secondary);
121
+ line-height: 1.65;
122
+ border-top: 1px solid var(--cd-border-dim);
123
+ }
124
+
125
+ /* ── Flush variant — no outer border, full-width separators ───────────────── */
126
+
127
+ .cd-accordion--flush .cd-accordion__item {
128
+ border-left: none;
129
+ border-right: none;
130
+ }
131
+
132
+ .cd-accordion--flush .cd-accordion__item:first-child {
133
+ border-top: none;
134
+ }
135
+
136
+ /* ── Separated variant — gaps between items ───────────────────────────────── */
137
+
138
+ .cd-accordion--sep {
139
+ gap: 4px;
140
+ }
141
+
142
+ .cd-accordion--sep .cd-accordion__item {
143
+ border-bottom: 1px solid var(--cd-border-dim);
144
+ }
145
+
146
+ .cd-accordion--sep .cd-accordion__item[open] {
147
+ border-color: color-mix(in srgb, var(--cd-accent) 25%, transparent);
148
+ }
@@ -0,0 +1,116 @@
1
+ /* ── Alert / Banner ──────────────────────────────────────────────────────── */
2
+
3
+ .cd-alert {
4
+ display: flex;
5
+ align-items: flex-start;
6
+ gap: 10px;
7
+ padding: 12px 14px;
8
+ border: 1px solid;
9
+ font-family: var(--cd-font-mono);
10
+ line-height: 1.5;
11
+ position: relative;
12
+ overflow: hidden;
13
+ }
14
+
15
+ /* Left accent bar */
16
+ .cd-alert::before {
17
+ content: '';
18
+ position: absolute;
19
+ left: 0;
20
+ top: 0;
21
+ bottom: 0;
22
+ width: 3px;
23
+ background: currentColor;
24
+ opacity: 0.7;
25
+ }
26
+
27
+ .cd-alert__icon {
28
+ flex-shrink: 0;
29
+ font-size: 14px;
30
+ line-height: 1;
31
+ margin-top: 1px;
32
+ }
33
+
34
+ .cd-alert__content { flex: 1; min-width: 0; }
35
+
36
+ .cd-alert__title {
37
+ font-size: var(--cd-text-sm);
38
+ font-weight: 700;
39
+ text-transform: uppercase;
40
+ letter-spacing: 0.12em;
41
+ margin-bottom: 3px;
42
+ }
43
+
44
+ .cd-alert__body {
45
+ font-size: var(--cd-text-base);
46
+ opacity: 0.8;
47
+ }
48
+
49
+ /* Dismiss button */
50
+ .cd-alert__dismiss {
51
+ flex-shrink: 0;
52
+ background: none;
53
+ border: none;
54
+ cursor: pointer;
55
+ font-size: 12px;
56
+ line-height: 1;
57
+ padding: 0;
58
+ opacity: 0.45;
59
+ font-family: var(--cd-font-mono);
60
+ transition: opacity 0.15s;
61
+ }
62
+
63
+ .cd-alert__dismiss:hover { opacity: 0.9; }
64
+
65
+ /* ── Color variants ───────────────────────────────────────────────────────── */
66
+
67
+ .cd-alert--info {
68
+ background: color-mix(in srgb, var(--cd-blue) 8%, transparent);
69
+ border-color: color-mix(in srgb, var(--cd-blue) 30%, transparent);
70
+ color: var(--cd-blue);
71
+ }
72
+ .cd-alert--info .cd-alert__body { color: var(--cd-text-secondary); }
73
+
74
+ .cd-alert--success {
75
+ background: color-mix(in srgb, var(--cd-green) 7%, transparent);
76
+ border-color: color-mix(in srgb, var(--cd-green) 28%, transparent);
77
+ color: var(--cd-green);
78
+ }
79
+ .cd-alert--success .cd-alert__body { color: var(--cd-text-secondary); }
80
+
81
+ .cd-alert--warning {
82
+ background: color-mix(in srgb, var(--cd-amber) 8%, transparent);
83
+ border-color: color-mix(in srgb, var(--cd-amber) 30%, transparent);
84
+ color: var(--cd-amber);
85
+ }
86
+ .cd-alert--warning .cd-alert__body { color: var(--cd-text-secondary); }
87
+
88
+ .cd-alert--error {
89
+ background: color-mix(in srgb, var(--cd-red) 8%, transparent);
90
+ border-color: color-mix(in srgb, var(--cd-red) 30%, transparent);
91
+ color: var(--cd-red);
92
+ }
93
+ .cd-alert--error .cd-alert__body { color: var(--cd-text-secondary); }
94
+
95
+ /* Accent variant — uses the current theme accent */
96
+ .cd-alert--accent {
97
+ background: var(--cd-accent-subtle);
98
+ border-color: var(--cd-border-glow);
99
+ color: var(--cd-accent);
100
+ }
101
+ .cd-alert--accent .cd-alert__body { color: var(--cd-text-secondary); }
102
+
103
+ /* ── Size variant ─────────────────────────────────────────────────────────── */
104
+
105
+ .cd-alert--sm {
106
+ padding: 8px 12px;
107
+ gap: 8px;
108
+ }
109
+
110
+ .cd-alert--sm .cd-alert__title { font-size: var(--cd-text-xs); margin-bottom: 2px; }
111
+ .cd-alert--sm .cd-alert__body { font-size: var(--cd-text-sm); }
112
+ .cd-alert--sm .cd-alert__icon { font-size: 12px; }
113
+
114
+ /* Inline (no left bar, more compact) */
115
+ .cd-alert--inline { border-left-width: 0; }
116
+ .cd-alert--inline::before { display: none; }