eidotter 0.19.3 → 0.20.1

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.
@@ -4,7 +4,7 @@ A DOS-themed React component library with authentic CGA/amber phosphor aesthetic
4
4
 
5
5
  ## Overview
6
6
 
7
- eidotter provides 33 ready-to-use components with consistent DOS terminal styling:
7
+ eidotter provides 36 ready-to-use components with consistent DOS terminal styling:
8
8
 
9
9
  - **Dark theme only** - Amber-on-black phosphor CRT aesthetic
10
10
  - **CGA color palette** - 16 authentic CGA colors + amber extensions
@@ -18,6 +18,7 @@ eidotter provides 33 ready-to-use components with consistent DOS terminal stylin
18
18
  ```tsx
19
19
  import { Button, Card, Input } from 'eidotter';
20
20
  import 'eidotter/styles'; // All styles: fonts, tokens, components, Tailwind utilities
21
+ // Optional (v0.19.4+): import 'eidotter/utilities'; // .dos-* classes for raw HTML / MDX / prose
21
22
 
22
23
  function App() {
23
24
  return (
@@ -44,12 +45,15 @@ function App() {
44
45
  | ChatInput | Multiline textarea with Enter-to-send |
45
46
  | ChatContainer | Composes ChatHistory + ChatInput |
46
47
  | Checkbox | Boolean form inputs with DOS bracket indicator |
48
+ | CmdPalette | ⌘K / Ctrl+K command palette overlay with scored search + keyboard nav |
47
49
  | CommandPrompt | DOS command line display |
50
+ | DosFigure | Demoscene-style painted-screen media placeholder with scanline sweep |
48
51
  | FilterBar | Multi-select toggle group |
49
52
  | Footer | Site footer with legal links |
50
53
  | Header | Sticky site header with branding + Nav |
51
54
  | Icon | SVG icons backed by pixelarticons (MIT) — authentic DOS pixel art |
52
55
  | InlineExpand | Inline disclosure widget |
56
+ | InlineLink | In-flow navigational anchor — dotted underline, phosphor-invert hover, external variant |
53
57
  | Input | Text entry fields with label and error support |
54
58
  | Modal | Dialog overlays |
55
59
  | Nav | Responsive navigation (desktop + mobile) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eidotter",
3
- "version": "0.19.3",
3
+ "version": "0.20.1",
4
4
  "type": "module",
5
5
  "description": "A DOS Themed Design System",
6
6
  "main": "./dist/index.umd.js",
@@ -12,7 +12,13 @@
12
12
  "import": "./dist/index.es.js",
13
13
  "require": "./dist/index.umd.js"
14
14
  },
15
+ "./brand": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.es.js",
18
+ "require": "./dist/index.umd.js"
19
+ },
15
20
  "./styles": "./dist/eidotter.css",
21
+ "./utilities": "./src/styles/dos-utilities.css",
16
22
  "./tailwind.preset": "./tailwind.preset.cjs",
17
23
  "./tailwind.preset.enhanced": "./tailwind.preset.enhanced.cjs",
18
24
  "./fonts.css": "./src/styles/fonts.css",
@@ -36,6 +42,7 @@
36
42
  "src/styles/fonts/Flexi_IBM_VGA_LICENSE.txt",
37
43
  "src/styles/tokens.css",
38
44
  "src/styles/theme.*.css",
45
+ "src/styles/dos-utilities.css",
39
46
  "guidelines"
40
47
  ],
41
48
  "scripts": {
@@ -44,6 +51,7 @@
44
51
  "prepublishOnly": "npm run build",
45
52
  "build-tokens": "node style-dictionary.config.mjs",
46
53
  "lint": "eslint src/ --report-unused-disable-directives --max-warnings 0",
54
+ "lint-tokens": "node scripts/lint-token-refs.mjs",
47
55
  "preview": "vite preview",
48
56
  "storybook": "storybook dev -p 6006",
49
57
  "build-storybook": "storybook build -o docs",
@@ -133,7 +141,7 @@
133
141
  "vite": "^6.2.0"
134
142
  },
135
143
  "dependencies": {
136
- "pixelarticons": "^2.0.2",
144
+ "pixelarticons": "^2.1.0",
137
145
  "react-aria": "^3.47.0",
138
146
  "react-aria-components": "^1.16.0",
139
147
  "react-stately": "^3.45.0"
@@ -0,0 +1,197 @@
1
+ /* =============================================================================
2
+ * eidotter — .dos-* typography utilities (opt-in)
3
+ *
4
+ * Apply DOS typography to raw HTML in prose, MDX, or CMS output when wrapping
5
+ * every element in a component is overkill.
6
+ *
7
+ * Usage:
8
+ * import 'eidotter/utilities'; // opt-in; not in the default 'eidotter/styles' bundle
9
+ *
10
+ * <div class="dos-page">
11
+ * <h1 class="dos-h1">MAIN TITLE</h1>
12
+ * <p class="dos-body">Body copy.</p>
13
+ * <code class="dos-code">DIR /W</code>
14
+ * </div>
15
+ *
16
+ * All classes resolve through the repo's existing semantic + primitive tokens,
17
+ * so they track the active theme (amber-mono, cga-amber, cga-mode4-*, cga-mode5)
18
+ * automatically.
19
+ *
20
+ * Requires `eidotter/tokens.css` (or the bundled `eidotter/styles`) to be
21
+ * imported at the consumer root so the referenced custom properties resolve.
22
+ * Without tokens.css, every `var()` fallback kicks in and the utilities lose
23
+ * theme tracking.
24
+ *
25
+ * T11 handoff adoption — see CHANGELOG.md for rationale.
26
+ * ========================================================================== */
27
+
28
+ /* Shared font-family + weight, applied at zero specificity via :where() so
29
+ * consumer overrides win without !important. */
30
+ :where(
31
+ .dos-page,
32
+ .dos-hero,
33
+ .dos-h1,
34
+ .dos-h2,
35
+ .dos-h3,
36
+ .dos-h4,
37
+ .dos-h5,
38
+ .dos-body,
39
+ .dos-body-lg,
40
+ .dos-caption,
41
+ .dos-micro,
42
+ .dos-label,
43
+ .dos-code
44
+ ) {
45
+ font-family: var(--typography-font-family-primary), var(--typography-font-family-fallback);
46
+ font-weight: var(--typography-font-weight-regular, 400);
47
+ font-synthesis: none;
48
+ }
49
+
50
+ /* ---- Page shell --------------------------------------------------------- */
51
+
52
+ .dos-page {
53
+ background-color: var(--color-semantic-background-primary);
54
+ color: var(--color-semantic-text-primary);
55
+ font-size: var(--typography-font-size-text-md, 1.375rem);
56
+ line-height: var(--typography-line-height-text-md, 1.5rem);
57
+ -webkit-font-smoothing: none;
58
+ -moz-osx-font-smoothing: grayscale;
59
+ }
60
+
61
+ /* ---- Display tier (display-* tokens) ------------------------------------ */
62
+
63
+ .dos-hero {
64
+ font-size: var(--typography-font-size-display-2xl, 4.875rem);
65
+ line-height: var(--typography-line-height-display-2xl, 5.625rem);
66
+ color: var(--color-semantic-text-accent);
67
+ text-shadow: 0 0 14px var(--color-cga-amber-glow);
68
+ text-transform: uppercase;
69
+ letter-spacing: 0;
70
+ }
71
+
72
+ .dos-h1 {
73
+ font-size: var(--typography-font-size-display-xl, 4.125rem);
74
+ line-height: var(--typography-line-height-display-xl, 4.5rem);
75
+ color: var(--color-semantic-text-accent);
76
+ text-shadow: 0 0 8px var(--color-cga-amber-glow);
77
+ text-transform: uppercase;
78
+ }
79
+
80
+ .dos-h2 {
81
+ font-size: var(--typography-font-size-display-lg, 3.5rem);
82
+ line-height: var(--typography-line-height-display-lg, 3.75rem);
83
+ color: var(--color-semantic-text-accent);
84
+ text-shadow: 0 0 8px var(--color-cga-amber-glow);
85
+ text-transform: uppercase;
86
+ }
87
+
88
+ .dos-h3 {
89
+ font-size: var(--typography-font-size-display-md, 2.625rem);
90
+ line-height: var(--typography-line-height-display-md, 2.75rem);
91
+ color: var(--color-semantic-text-accent);
92
+ text-shadow: 0 0 4px var(--color-cga-amber-glow);
93
+ text-transform: uppercase;
94
+ }
95
+
96
+ .dos-h4 {
97
+ font-size: var(--typography-font-size-display-sm, 2.25rem);
98
+ line-height: var(--typography-line-height-display-sm, 2.375rem);
99
+ color: var(--color-semantic-text-primary);
100
+ text-transform: uppercase;
101
+ }
102
+
103
+ .dos-h5 {
104
+ font-size: var(--typography-font-size-display-xs, 1.875rem);
105
+ line-height: var(--typography-line-height-display-xs, 2rem);
106
+ color: var(--color-semantic-text-primary);
107
+ text-transform: uppercase;
108
+ }
109
+
110
+ /* ---- Body (text-* tokens) ---------------------------------------------- */
111
+
112
+ .dos-body {
113
+ font-size: var(--typography-font-size-text-md, 1.375rem);
114
+ line-height: var(--typography-line-height-text-md, 1.5rem);
115
+ color: var(--color-semantic-text-primary);
116
+ }
117
+
118
+ .dos-body-lg {
119
+ font-size: var(--typography-font-size-text-lg, 1.5rem);
120
+ line-height: var(--typography-line-height-text-lg, 1.75rem);
121
+ color: var(--color-semantic-text-primary);
122
+ }
123
+
124
+ /* ---- Meta rows --------------------------------------------------------- */
125
+
126
+ .dos-caption {
127
+ font-size: var(--typography-font-size-text-sm, 1.25rem);
128
+ line-height: var(--typography-line-height-text-sm, 1.25rem);
129
+ color: var(--color-semantic-text-muted);
130
+ text-transform: uppercase;
131
+ letter-spacing: 0.05em;
132
+ }
133
+
134
+ .dos-micro {
135
+ font-size: var(--typography-font-size-text-xs, 1.125rem);
136
+ line-height: var(--typography-line-height-text-xs, 1.125rem);
137
+ color: var(--color-semantic-text-muted);
138
+ }
139
+
140
+ .dos-label {
141
+ font-size: var(--typography-font-size-text-sm, 1.25rem);
142
+ line-height: var(--typography-line-height-text-sm, 1.25rem);
143
+ color: var(--color-semantic-text-accent);
144
+ text-transform: uppercase;
145
+ letter-spacing: 0.1em;
146
+ }
147
+
148
+ .dos-code {
149
+ font-size: var(--typography-font-size-text-sm, 1.25rem);
150
+ line-height: var(--typography-line-height-text-sm, 1.25rem);
151
+ color: var(--color-semantic-text-accent);
152
+ background-color: var(--color-semantic-background-secondary);
153
+ padding: 0 var(--spacing-1, 4px);
154
+ border: 1px solid var(--color-semantic-border-default);
155
+ border-radius: var(--border-radius-sm, 2px);
156
+ }
157
+
158
+ /* ---- Scanlines overlay -------------------------------------------------- */
159
+
160
+ /* Intended for dark-surface overlays (e.g., `.dos-page` or components on
161
+ * `bg-primary`). `mix-blend-mode: overlay` inverts over light surfaces —
162
+ * document this constraint when consuming. */
163
+ .dos-scanlines {
164
+ position: relative;
165
+ }
166
+
167
+ .dos-scanlines::after {
168
+ content: "";
169
+ position: absolute;
170
+ inset: 0;
171
+ pointer-events: none;
172
+ background: repeating-linear-gradient(
173
+ 0deg,
174
+ var(--effects-scanline-dark, rgba(255,176,0,0.02)) 0px,
175
+ var(--effects-scanline-dark, rgba(255,176,0,0.02)) 1px,
176
+ var(--effects-scanline-light, rgba(255,176,0,0.05)) 1px,
177
+ var(--effects-scanline-light, rgba(255,176,0,0.05)) 3px
178
+ );
179
+ mix-blend-mode: overlay;
180
+ opacity: 0.6;
181
+ }
182
+
183
+ /* =============================================================================
184
+ * Accessibility
185
+ * ========================================================================== */
186
+
187
+ @media (prefers-contrast: high) {
188
+ .dos-hero,
189
+ .dos-h1,
190
+ .dos-h2,
191
+ .dos-h3 {
192
+ text-shadow: none;
193
+ }
194
+ .dos-code {
195
+ border-width: 2px;
196
+ }
197
+ }
@@ -144,6 +144,7 @@
144
144
  --color-semantic-text-secondary: var(--color-cga-black);
145
145
  --color-semantic-text-accent: var(--color-cga-yellow);
146
146
  --color-semantic-text-disabled: var(--color-cga-amber-dim);
147
+ --color-semantic-text-muted: var(--color-cga-light-gray);
147
148
  --color-semantic-border-default: var(--color-cga-amber);
148
149
  --color-semantic-border-focus: var(--color-cga-amber-bright);
149
150
  --color-semantic-border-hover: var(--color-cga-yellow);
@@ -148,6 +148,7 @@
148
148
  --color-semantic-text-secondary: var(--color-cga-black);
149
149
  --color-semantic-text-accent: var(--color-cga-amber);
150
150
  --color-semantic-text-disabled: var(--color-cga-dark-gray);
151
+ --color-semantic-text-muted: var(--color-cga-brown);
151
152
  --color-semantic-border-default: var(--color-cga-light-gray);
152
153
  --color-semantic-border-focus: var(--color-cga-amber);
153
154
  --color-semantic-border-hover: var(--color-cga-amber-bright);
@@ -36,6 +36,7 @@
36
36
  --color-semantic-text-secondary: #050300;
37
37
  --color-semantic-text-accent: #00ff00;
38
38
  --color-semantic-text-disabled: #ff0000;
39
+ --color-semantic-text-muted: rgba(255, 255, 0, 0.65);
39
40
  --color-semantic-border-default: #00ff00;
40
41
  --color-semantic-border-focus: #ffff00;
41
42
  --color-semantic-border-hover: #ff0000;
@@ -36,6 +36,7 @@
36
36
  --color-semantic-text-secondary: #050300;
37
37
  --color-semantic-text-accent: #00ffff;
38
38
  --color-semantic-text-disabled: #ff00ff;
39
+ --color-semantic-text-muted: rgba(255, 252, 247, 0.65);
39
40
  --color-semantic-border-default: #00ffff;
40
41
  --color-semantic-border-focus: #fffcf7;
41
42
  --color-semantic-border-hover: #ff00ff;
@@ -36,6 +36,7 @@
36
36
  --color-semantic-text-secondary: #050300;
37
37
  --color-semantic-text-accent: #00ffff;
38
38
  --color-semantic-text-disabled: #ff0000;
39
+ --color-semantic-text-muted: rgba(255, 252, 247, 0.65);
39
40
  --color-semantic-border-default: #00ffff;
40
41
  --color-semantic-border-focus: #fffcf7;
41
42
  --color-semantic-border-hover: #ff0000;
@@ -148,6 +148,7 @@
148
148
  --color-semantic-text-secondary: var(--color-cga-black);
149
149
  --color-semantic-text-accent: var(--color-cga-yellow);
150
150
  --color-semantic-text-disabled: var(--color-cga-dark-gray);
151
+ --color-semantic-text-muted: var(--color-cga-amber-dim); /** Muted supplementary text — timestamps, counts, footnotes. T10 handoff: dedicated amber-dim hex (in-family with primary), not brown; no opacity coupling. */
151
152
  --color-semantic-border-default: var(--color-cga-light-gray);
152
153
  --color-semantic-border-focus: var(--color-cga-yellow);
153
154
  --color-semantic-border-hover: var(--color-cga-white);
@@ -67,6 +67,7 @@ const preset = {
67
67
  "dos-text-secondary": "var(--color-semantic-text-secondary)",
68
68
  "dos-text-accent": "var(--color-semantic-text-accent)",
69
69
  "dos-text-disabled": "var(--color-semantic-text-disabled)",
70
+ "dos-text-muted": "var(--color-semantic-text-muted)",
70
71
  "dos-border-default": "var(--color-semantic-border-default)",
71
72
  "dos-border-focus": "var(--color-semantic-border-focus)",
72
73
  "dos-border-hover": "var(--color-semantic-border-hover)",