eidotter 0.40.2 → 0.41.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 (97) hide show
  1. package/README.md +13 -5
  2. package/dist/components/Accordion/components/AccordionFill.js +1 -1
  3. package/dist/components/Accordion/components/Section.js +1 -1
  4. package/dist/components/Alert/components/Alert.js +3 -2
  5. package/dist/components/Brand/components/Logo.d.ts +7 -7
  6. package/dist/components/Brand/components/Logo.js +10 -15
  7. package/dist/components/Brand/components/LogoGeometry.d.ts +28 -0
  8. package/dist/components/Brand/components/LogoGeometry.js +78 -0
  9. package/dist/components/Brand/components/Mark.d.ts +13 -6
  10. package/dist/components/Brand/components/Mark.js +14 -10
  11. package/dist/components/Brand/components/Wordmark.js +1 -1
  12. package/dist/components/Brand/components/markGeometry.d.ts +15 -0
  13. package/dist/components/Brand/components/markGeometry.js +20 -7
  14. package/dist/components/Breadcrumb/components/Breadcrumb.js +2 -2
  15. package/dist/components/Button/components/Button.js +1 -1
  16. package/dist/components/Card/components/Card.d.ts +5 -0
  17. package/dist/components/Card/components/Card.js +8 -2
  18. package/dist/components/CmdPalette/components/CmdPalette.d.ts +4 -3
  19. package/dist/components/CmdPalette/components/CmdPalette.js +17 -12
  20. package/dist/components/DecayStrip/components/DecayStrip.js +6 -1
  21. package/dist/components/DosDialog/components/DosDialog.d.ts +77 -0
  22. package/dist/components/DosDialog/components/DosDialog.js +59 -0
  23. package/dist/components/DosDialog/components/index.d.ts +2 -0
  24. package/dist/components/DosDialog/components/index.js +1 -0
  25. package/dist/components/DosDialog/index.d.ts +2 -0
  26. package/dist/components/DosDialog/index.js +1 -0
  27. package/dist/components/DosFigure/components/DosFigure.d.ts +2 -2
  28. package/dist/components/DosFigure/components/DosFigure.js +14 -7
  29. package/dist/components/DosWindow/components/DosWindow.d.ts +39 -0
  30. package/dist/components/DosWindow/components/DosWindow.js +23 -0
  31. package/dist/components/DosWindow/components/index.d.ts +2 -0
  32. package/dist/components/DosWindow/components/index.js +1 -0
  33. package/dist/components/DosWindow/index.d.ts +2 -0
  34. package/dist/components/DosWindow/index.js +1 -0
  35. package/dist/components/FilterBar/components/FilterBar.d.ts +7 -4
  36. package/dist/components/Footer/components/Footer.js +1 -1
  37. package/dist/components/Gauge/components/Gauge.js +19 -2
  38. package/dist/components/Header/components/Header.d.ts +29 -1
  39. package/dist/components/Header/components/Header.js +20 -5
  40. package/dist/components/Icon/components/Icon.d.ts +2 -0
  41. package/dist/components/Icon/components/Icon.js +5 -1
  42. package/dist/components/IconButton/components/IconButton.d.ts +44 -0
  43. package/dist/components/IconButton/components/IconButton.js +19 -0
  44. package/dist/components/IconButton/components/index.d.ts +2 -0
  45. package/dist/components/IconButton/components/index.js +1 -0
  46. package/dist/components/IconButton/index.d.ts +2 -0
  47. package/dist/components/IconButton/index.js +1 -0
  48. package/dist/components/Input/components/Input.js +1 -1
  49. package/dist/components/Lightbox/components/Lightbox.d.ts +10 -4
  50. package/dist/components/Lightbox/components/Lightbox.js +19 -11
  51. package/dist/components/Meter/components/Meter.js +7 -3
  52. package/dist/components/Meter/components/MeterGroup.js +3 -3
  53. package/dist/components/Modal/components/Modal.d.ts +18 -6
  54. package/dist/components/Modal/components/Modal.js +18 -9
  55. package/dist/components/Nav/components/Nav.js +5 -4
  56. package/dist/components/Notification/components/Notification.js +3 -2
  57. package/dist/components/Progress/components/Progress.js +8 -6
  58. package/dist/components/SeriesBars/components/SeriesBars.js +9 -8
  59. package/dist/components/Tag/components/Tag.d.ts +8 -1
  60. package/dist/components/Tag/components/Tag.js +5 -5
  61. package/dist/components/VitalsStrip/components/VitalsStrip.js +10 -7
  62. package/dist/components/registry.js +221 -19
  63. package/dist/eidotter.css +1 -1
  64. package/dist/hooks/useAnimatedDismiss.js +5 -0
  65. package/dist/index.d.ts +8 -1
  66. package/dist/index.es.js +2174 -1600
  67. package/dist/index.umd.js +1 -1
  68. package/llms.txt +15 -7
  69. package/migrations/0.41.0.md +881 -0
  70. package/migrations/README.md +46 -0
  71. package/package.json +10 -2
  72. package/public/favicon.svg +1 -1
  73. package/src/styles/dos-utilities.css +6 -1
  74. package/src/styles/shadcn.css +52 -17
  75. package/src/styles/theme.amber-mono.css +4 -2
  76. package/src/styles/theme.amber-paper.css +106 -0
  77. package/src/styles/theme.cga-amber.css +3 -1
  78. package/src/styles/theme.cga-mode4-p0.css +3 -1
  79. package/src/styles/theme.cga-mode4-p1.css +3 -1
  80. package/src/styles/theme.cga-mode5.css +3 -1
  81. package/src/styles/theme.light.css +3 -1
  82. package/src/styles/tokens.css +5 -1
  83. package/tailwind.preset.cjs +23 -1
  84. package/dist/components/Brand/components/markGeometry.test.d.ts +0 -1
  85. package/dist/components/Connector/components/connectorGeometry.test.d.ts +0 -1
  86. package/dist/components/DecayStrip/components/resample.test.d.ts +0 -1
  87. package/dist/components/TimelineContainer/components/timelineUtils.test.d.ts +0 -1
  88. package/dist/components/TimelineContainer/components/useDrillDown.test.d.ts +0 -1
  89. package/dist/components/TimelineContainer/components/useSelection.test.d.ts +0 -1
  90. package/dist/components/TimelineContainer/components/useZoom.test.d.ts +0 -1
  91. package/dist/hooks/useTextScramble.test.d.ts +0 -1
  92. package/dist/hooks/useThemePortal.test.d.ts +0 -1
  93. package/dist/utils/health/formatValue.test.d.ts +0 -1
  94. package/dist/utils/health/healthPatterns.test.d.ts +0 -1
  95. package/dist/utils/health/resolveBand.test.d.ts +0 -1
  96. package/dist/utils/isSafeHref.test.d.ts +0 -1
  97. package/dist/utils/isSafeUrl.test.d.ts +0 -1
@@ -0,0 +1,46 @@
1
+ # eidotter migration guides
2
+
3
+ This folder holds one upgrade guide per eidotter release that has breaking or
4
+ visible changes for consumers. The guides are written for developers and AI
5
+ agents working in a consuming app who have not seen the eidotter repository.
6
+
7
+ ## Naming
8
+
9
+ - `<version>.md`, for example `0.41.0.md`: one guide per minor (or major) whose
10
+ changes a consumer can see or must act on.
11
+ - Patch releases and purely additive minors get no guide. Their notes are in
12
+ the [CHANGELOG](https://github.com/CinimoDY/eiDotter/blob/main/CHANGELOG.md).
13
+ - A guide is written before its release is published, so it ships in that
14
+ version's npm package.
15
+
16
+ ## How to use them
17
+
18
+ 1. Find your installed version (`npm ls eidotter`) and your target version.
19
+ 2. Read every guide whose version is greater than your installed version and
20
+ less than or equal to your target, oldest first. Each guide covers only the
21
+ step from the previous minor.
22
+ 3. Each guide has the same shape: who must act, how to bump, breaking and
23
+ visible changes (each with what changed, how to find it, what to do, how to
24
+ verify), new pieces to adopt, an ordered checklist, and pointers for
25
+ consumers jumping several versions.
26
+
27
+ Remember the 0.x caret rule: `^0.40.2` never resolves to 0.41.0. Bump the range
28
+ explicitly.
29
+
30
+ ## Where to find them
31
+
32
+ The folder ships in the npm package:
33
+
34
+ ```
35
+ node_modules/eidotter/migrations/README.md
36
+ node_modules/eidotter/migrations/0.41.0.md
37
+ ```
38
+
39
+ It is also exported, so tooling can resolve a guide by path:
40
+ `require.resolve('eidotter/migrations/0.41.0.md')`.
41
+
42
+ ## Guides
43
+
44
+ | Version | Summary |
45
+ |---|---|
46
+ | [0.41.0](./0.41.0.md) | 16px floor, CSS reset and unused utilities no longer leak, `text-secondary` meaning change, Header lockup default, overlays on `DosDialog` (removed classes), focus rings; adopt `IconButton`, `DosDialog`, `DosWindow`, the favicon export and the `amber-paper` theme |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eidotter",
3
- "version": "0.40.2",
3
+ "version": "0.41.0",
4
4
  "type": "module",
5
5
  "description": "A DOS Themed Design System",
6
6
  "main": "./dist/index.umd.js",
@@ -29,6 +29,7 @@
29
29
  "./utilities": "./src/styles/dos-utilities.css",
30
30
  "./tailwind.preset": "./tailwind.preset.cjs",
31
31
  "./favicon.svg": "./public/favicon.svg",
32
+ "./migrations/*": "./migrations/*",
32
33
  "./fonts.css": "./src/styles/fonts.css",
33
34
  "./tokens.css": "./src/styles/tokens.css",
34
35
  "./shadcn.css": "./src/styles/shadcn.css",
@@ -38,6 +39,7 @@
38
39
  "./themes/cga-mode4-p1.css": "./src/styles/theme.cga-mode4-p1.css",
39
40
  "./themes/cga-mode5.css": "./src/styles/theme.cga-mode5.css",
40
41
  "./themes/light.css": "./src/styles/theme.light.css",
42
+ "./themes/amber-paper.css": "./src/styles/theme.amber-paper.css",
41
43
  "./icons": {
42
44
  "types": "./dist/icons/published.d.ts",
43
45
  "import": "./dist/icons/published.js"
@@ -75,6 +77,7 @@
75
77
  "src/styles/shadcn.css",
76
78
  "src/styles/dos-utilities.css",
77
79
  "guidelines",
80
+ "migrations",
78
81
  "llms.txt"
79
82
  ],
80
83
  "scripts": {
@@ -100,7 +103,10 @@
100
103
  "sync-figma-to-swift": "ts-node scripts/sync-figma-to-swift.ts",
101
104
  "fetch-figma-snapshot": "ts-node scripts/fetch-figma-snapshot.ts",
102
105
  "publish-figma-library": "ts-node scripts/publish-figma-library.ts",
103
- "validate-tokens": "node scripts/validate-tokens.cjs"
106
+ "validate-tokens": "node scripts/validate-tokens.cjs",
107
+ "extract-code-contract": "tsx scripts/contracts/extract-code-contract.cli.ts",
108
+ "extract-figma-contract": "tsx scripts/contracts/extract-figma-contract.cli.ts",
109
+ "diff-contracts": "tsx scripts/contracts/diff-contracts.cli.ts"
104
110
  },
105
111
  "repository": {
106
112
  "type": "git",
@@ -180,7 +186,9 @@
180
186
  "tailwindcss": "^4.3.0",
181
187
  "tailwindcss-react-aria-components": "^2.0.1",
182
188
  "ts-jest": "^29.4.0",
189
+ "ts-morph": "^28.0.0",
183
190
  "ts-node": "^10.9.2",
191
+ "tsx": "^4.23.1",
184
192
  "typescript": "^5.7.3",
185
193
  "typescript-eslint": "^8.54.0",
186
194
  "vite": "^8.0.10"
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="8 7 22 22" width="32" height="32"><defs> <radialGradient id="h" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(19 19.1) scale(13.2)"> <stop stop-color="#FFB000" stop-opacity="0.3" /> <stop offset="1" stop-color="#020003" stop-opacity="0" /> </radialGradient> <radialGradient id="c" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(19 18.9) scale(9.9)"> <stop stop-color="#FFB000" stop-opacity="0.45" /> <stop offset="0.6" stop-color="#9A5700" stop-opacity="0.22" /> <stop offset="1" stop-color="#020003" stop-opacity="0" /> </radialGradient> </defs> <path d="M19 29C25.0751 29 30 24.0751 30 18C30 11.9249 25.0751 7 19 7C12.9249 7 8 11.9249 8 18C8 24.0751 12.9249 29 19 29Z" fill="url(#h)" /> <path d="M19 27C23.9706 27 28 22.9706 28 18C28 13.0294 23.9706 9 19 9C14.0294 9 10 13.0294 10 18C10 22.9706 14.0294 27 19 27Z" fill="url(#c)" /> <path d="M20.375 9.0625H17.625V9.75H20.375V9.0625Z" fill="#FFB000" /> <path d="M16.9375 9.75H15.5625V10.4375H16.9375V9.75Z" fill="#FFB000" /> <path d="M17.625 9.75H16.9375V10.4375H17.625V9.75Z" fill="#FFB000" /> <path d="M22.4375 9.75H20.375V10.4375H22.4375V9.75Z" fill="#FFB000" /> <path d="M15.5625 10.4375H14.1875V11.125H15.5625V10.4375Z" fill="#FFB000" /> <path d="M23.8125 10.4375H22.4375V11.125H23.8125V10.4375Z" fill="#FFB000" /> <path d="M14.1875 11.125H13.5V11.8125H14.1875V11.125Z" fill="#FFB000" /> <path d="M25.1875 11.125H23.8125V11.8125H25.1875V11.125Z" fill="#FFB000" /> <path d="M13.5 11.8125H12.8125V12.5H13.5V11.8125Z" fill="#FFB000" /> <path d="M25.875 11.8125H25.1875V13.1875H25.875V11.8125Z" fill="#FFB000" /> <path d="M12.8125 12.5H12.125V13.875H12.8125V12.5Z" fill="#FFB000" /> <path d="M12.125 13.875H11.4375V15.9375H12.125V13.875Z" fill="#FFB000" /> <path d="M11.4375 15.9375H10.75V18H11.4375V15.9375Z" fill="#FFB000" /> <path d="M10.75 18H10.0625V19.375H10.75V18Z" fill="#FFB000" /> <path d="M11.4375 19.375H10.75V20.75H11.4375V19.375Z" fill="#FFB000" /> <path d="M12.125 20.75H11.4375V22.125H12.125V20.75Z" fill="#FFB000" /> <path d="M12.8125 22.125H12.125V23.5H12.8125V22.125Z" fill="#FFB000" /> <path d="M26.5625 13.1875H25.875V15.25H26.5625V13.1875Z" fill="#FFB000" /> <path d="M27.25 15.25H26.5625V17.3125H27.25V15.25Z" fill="#FFB000" /> <path d="M27.9375 17.3125H27.25V19.375H27.9375V17.3125Z" fill="#FFB000" /> <path d="M27.25 19.375H26.5625V20.75H27.25V19.375Z" fill="#FFB000" /> <path d="M26.5625 20.75H25.875V22.125H26.5625V20.75Z" fill="#FFB000" /> <path d="M25.875 22.125H25.1875V23.5H25.875V22.125Z" fill="#FFB000" /> <path d="M14.1875 23.5H12.8125V24.1875H14.1875V23.5Z" fill="#FFB000" /> <path d="M16.25 24.1875H14.1875V24.875H16.25V24.1875Z" fill="#FFB000" /> <path d="M18.3125 24.875H16.25V25.5625H18.3125V24.875Z" fill="#FFB000" /> <path d="M20.375 25.5625H18.3125V26.25H20.375V25.5625Z" fill="#FFB000" /> <path d="M22.4375 24.875H20.375V25.5625H22.4375V24.875Z" fill="#FFB000" /> <path d="M24.5 24.1875H22.4375V24.875H24.5V24.1875Z" fill="#FFB000" /> <path d="M25.1875 23.5H24.5V24.1875H25.1875V23.5Z" fill="#FFB000" /> <path d="M10.0625 15.9375H9.375V16.625H10.0625V15.9375Z" fill="#FFB000" /> <path d="M29.3125 16.625H28.625V17.3125H29.3125V16.625Z" fill="#FFB000" /> <path d="M28.625 20.75H27.9375V21.4375H28.625V20.75Z" fill="#FFB000" /> <path d="M10.75 21.4375H10.0625V22.125H10.75V21.4375Z" fill="#FFB000" /> <path d="M18.4375 21C20.6466 21 22.4375 19.2091 22.4375 17C22.4375 14.7909 20.6466 13 18.4375 13C16.2284 13 14.4375 14.7909 14.4375 17C14.4375 19.2091 16.2284 21 18.4375 21Z" fill="#FFB000" /> <path d="M16.25 15.25H15.5625V17.3125H16.25V15.25Z" fill="#FFC233" /> <path d="M18.3125 13.875H16.25V14.5625H18.3125V13.875Z" fill="#FFC233" /> <path d="M16.25 14.5625H15.5625V15.25H16.25V14.5625Z" fill="#FFC233" /> <path d="M17.5 17C18.3284 17 19 16.3284 19 15.5C19 14.6716 18.3284 14 17.5 14C16.6716 14 16 14.6716 16 15.5C16 16.3284 16.6716 17 17.5 17Z" fill="#FFD97A" /> <path d="M17.5 15C17.7761 15 18 14.7761 18 14.5C18 14.2239 17.7761 14 17.5 14C17.2239 14 17 14.2239 17 14.5C17 14.7761 17.2239 15 17.5 15Z" fill="#FFE8A8" /></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="8 7 22 22" width="32" height="32"><defs> <radialGradient id="h" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(19 19.1) scale(13.2)"> <stop stop-color="#FFB000" stop-opacity="0.3" /> <stop offset="1" stop-color="#020003" stop-opacity="0" /> </radialGradient> <radialGradient id="c" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(19 18.9) scale(9.9)"> <stop stop-color="#FFB000" stop-opacity="0.45" /> <stop offset="0.6" stop-color="#9A5700" stop-opacity="0.22" /> <stop offset="1" stop-color="#020003" stop-opacity="0" /> </radialGradient> <radialGradient id="y" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(16.9 15.5) scale(5.6)"> <stop stop-color="#FFD97A" /> <stop offset="0.55" stop-color="#FFB000" /> <stop offset="1" stop-color="#B87C00" /> </radialGradient> </defs> <path d="M19 29C25.0751 29 30 24.0751 30 18C30 11.9249 25.0751 7 19 7C12.9249 7 8 11.9249 8 18C8 24.0751 12.9249 29 19 29Z" fill="url(#h)" /> <path d="M19 27C23.9706 27 28 22.9706 28 18C28 13.0294 23.9706 9 19 9C14.0294 9 10 13.0294 10 18C10 22.9706 14.0294 27 19 27Z" fill="url(#c)" /> <path d="M20.375 9.0625H17.625V9.75H20.375V9.0625Z" fill="#FFB000" /> <path d="M16.9375 9.75H15.5625V10.4375H16.9375V9.75Z" fill="#FFB000" /> <path d="M17.625 9.75H16.9375V10.4375H17.625V9.75Z" fill="#FFB000" /> <path d="M22.4375 9.75H20.375V10.4375H22.4375V9.75Z" fill="#FFB000" /> <path d="M15.5625 10.4375H14.1875V11.125H15.5625V10.4375Z" fill="#FFB000" /> <path d="M23.8125 10.4375H22.4375V11.125H23.8125V10.4375Z" fill="#FFB000" /> <path d="M14.1875 11.125H13.5V11.8125H14.1875V11.125Z" fill="#FFB000" /> <path d="M25.1875 11.125H23.8125V11.8125H25.1875V11.125Z" fill="#FFB000" /> <path d="M13.5 11.8125H12.8125V12.5H13.5V11.8125Z" fill="#FFB000" /> <path d="M25.875 11.8125H25.1875V13.1875H25.875V11.8125Z" fill="#FFB000" /> <path d="M12.8125 12.5H12.125V13.875H12.8125V12.5Z" fill="#FFB000" /> <path d="M12.125 13.875H11.4375V15.9375H12.125V13.875Z" fill="#FFB000" /> <path d="M11.4375 15.9375H10.75V18H11.4375V15.9375Z" fill="#FFB000" /> <path d="M10.75 18H10.0625V19.375H10.75V18Z" fill="#FFB000" /> <path d="M11.4375 19.375H10.75V20.75H11.4375V19.375Z" fill="#FFB000" /> <path d="M12.125 20.75H11.4375V22.125H12.125V20.75Z" fill="#FFB000" /> <path d="M12.8125 22.125H12.125V23.5H12.8125V22.125Z" fill="#FFB000" /> <path d="M26.5625 13.1875H25.875V15.25H26.5625V13.1875Z" fill="#FFB000" /> <path d="M27.25 15.25H26.5625V17.3125H27.25V15.25Z" fill="#FFB000" /> <path d="M27.9375 17.3125H27.25V19.375H27.9375V17.3125Z" fill="#FFB000" /> <path d="M27.25 19.375H26.5625V20.75H27.25V19.375Z" fill="#FFB000" /> <path d="M26.5625 20.75H25.875V22.125H26.5625V20.75Z" fill="#FFB000" /> <path d="M25.875 22.125H25.1875V23.5H25.875V22.125Z" fill="#FFB000" /> <path d="M14.1875 23.5H12.8125V24.1875H14.1875V23.5Z" fill="#FFB000" /> <path d="M16.25 24.1875H14.1875V24.875H16.25V24.1875Z" fill="#FFB000" /> <path d="M18.3125 24.875H16.25V25.5625H18.3125V24.875Z" fill="#FFB000" /> <path d="M20.375 25.5625H18.3125V26.25H20.375V25.5625Z" fill="#FFB000" /> <path d="M22.4375 24.875H20.375V25.5625H22.4375V24.875Z" fill="#FFB000" /> <path d="M24.5 24.1875H22.4375V24.875H24.5V24.1875Z" fill="#FFB000" /> <path d="M25.1875 23.5H24.5V24.1875H25.1875V23.5Z" fill="#FFB000" /> <path d="M10.0625 15.9375H9.375V16.625H10.0625V15.9375Z" fill="#FFB000" /> <path d="M29.3125 16.625H28.625V17.3125H29.3125V16.625Z" fill="#FFB000" /> <path d="M28.625 20.75H27.9375V21.4375H28.625V20.75Z" fill="#FFB000" /> <path d="M10.75 21.4375H10.0625V22.125H10.75V21.4375Z" fill="#FFB000" /> <path d="M18.4375 21C20.6466 21 22.4375 19.2091 22.4375 17C22.4375 14.7909 20.6466 13 18.4375 13C16.2284 13 14.4375 14.7909 14.4375 17C14.4375 19.2091 16.2284 21 18.4375 21Z" fill="url(#y)" /> <path d="M16.25 15.25H15.5625V17.3125H16.25V15.25Z" fill="#FFE8A8" opacity="0.8" /> <path d="M18.3125 13.875H16.25V14.5625H18.3125V13.875Z" fill="#FFE8A8" opacity="0.8" /> <path d="M17.5 15C17.7761 15 18 14.7761 18 14.5C18 14.2239 17.7761 14 17.5 14C17.2239 14 17 14.2239 17 14.5C17 14.7761 17.2239 15 17.5 15Z" fill="#FFFFFF" opacity="0.9" /> </svg>
@@ -43,6 +43,11 @@
43
43
  font-synthesis: none;
44
44
  }
45
45
 
46
+ /* Text floor (DMNC-1579): nothing in eidotter renders below 16px (--typography-font-size-text-base,
47
+ * Tailwind text-dos-text-base). The DOS VGA font's native cell is 9x16, so 16px is the authentic
48
+ * size. The preset aliases Tailwind text-xs/text-sm to the same 1rem. Never go below body size.
49
+ */
50
+
46
51
  /* Body tier — JetBrains Mono Nerd Font (multi-weight; includes Nerd Font glyphs).
47
52
  * Uses --typography-font-family-body and real body-weight tokens (DMNC-885). */
48
53
  :where(
@@ -193,7 +198,7 @@
193
198
  * Accessibility
194
199
  * ========================================================================== */
195
200
 
196
- @media (prefers-contrast: high) {
201
+ @media (prefers-contrast: high), (prefers-contrast: more) {
197
202
  .dos-hero,
198
203
  .dos-h1,
199
204
  .dos-h2,
@@ -42,9 +42,9 @@
42
42
  --sidebar-ring: 45 77% 55%;
43
43
  --chart-1: 41 100% 50%;
44
44
  --chart-2: 34 100% 30%;
45
- --chart-3: 45 77% 55%;
46
- --chart-4: 41 100% 50%;
47
- --chart-5: 37 75% 41%;
45
+ --chart-3: 27 96% 81%;
46
+ --chart-4: 45 77% 55%;
47
+ --chart-5: 34 100% 30%;
48
48
  }
49
49
 
50
50
  [data-theme="amber-mono"], .theme-amber-mono {
@@ -66,7 +66,7 @@
66
66
  --destructive-foreground: 0 0% 100%;
67
67
  --border: 41 100% 50%;
68
68
  --input: 41 100% 50%;
69
- --ring: 27 96% 81%;
69
+ --ring: 41 100% 50%;
70
70
  --sidebar: 280 100% 1%;
71
71
  --sidebar-foreground: 41 100% 50%;
72
72
  --sidebar-primary: 41 100% 50%;
@@ -74,12 +74,12 @@
74
74
  --sidebar-accent: 240 50% 1%;
75
75
  --sidebar-accent-foreground: 41 100% 50%;
76
76
  --sidebar-border: 41 100% 50%;
77
- --sidebar-ring: 27 96% 81%;
77
+ --sidebar-ring: 41 100% 50%;
78
78
  --chart-1: 41 100% 50%;
79
79
  --chart-2: 37 75% 41%;
80
80
  --chart-3: 27 96% 81%;
81
- --chart-4: 41 100% 50%;
82
- --chart-5: 41 100% 50%;
81
+ --chart-4: 45 77% 55%;
82
+ --chart-5: 34 100% 30%;
83
83
  }
84
84
 
85
85
  [data-theme="cga-amber"], .theme-cga-amber {
@@ -96,7 +96,7 @@
96
96
  --muted: 48 5% 22%;
97
97
  --muted-foreground: 30 100% 33%;
98
98
  --accent: 240 100% 33%;
99
- --accent-foreground: 36 100% 1%;
99
+ --accent-foreground: 38 100% 98%;
100
100
  --destructive: 0 100% 33%;
101
101
  --destructive-foreground: 0 0% 100%;
102
102
  --border: 37 5% 66%;
@@ -112,9 +112,9 @@
112
112
  --sidebar-ring: 41 100% 50%;
113
113
  --chart-1: 41 100% 50%;
114
114
  --chart-2: 30 100% 33%;
115
- --chart-3: 41 100% 50%;
116
- --chart-4: 240 100% 33%;
117
- --chart-5: 37 5% 66%;
115
+ --chart-3: 27 96% 81%;
116
+ --chart-4: 41 100% 50%;
117
+ --chart-5: 34 100% 30%;
118
118
  }
119
119
 
120
120
  [data-theme="cga-mode4-p0"], .theme-cga-mode4-p0 {
@@ -149,7 +149,7 @@
149
149
  --chart-2: 60 100% 50%;
150
150
  --chart-3: 60 100% 50%;
151
151
  --chart-4: 120 100% 50%;
152
- --chart-5: 60 100% 50%;
152
+ --chart-5: 120 100% 50%;
153
153
  }
154
154
 
155
155
  [data-theme="cga-mode4-p1"], .theme-cga-mode4-p1 {
@@ -184,7 +184,7 @@
184
184
  --chart-2: 38 100% 98%;
185
185
  --chart-3: 38 100% 98%;
186
186
  --chart-4: 180 100% 50%;
187
- --chart-5: 38 100% 98%;
187
+ --chart-5: 180 100% 50%;
188
188
  }
189
189
 
190
190
  [data-theme="cga-mode5"], .theme-cga-mode5 {
@@ -219,7 +219,7 @@
219
219
  --chart-2: 38 100% 98%;
220
220
  --chart-3: 38 100% 98%;
221
221
  --chart-4: 180 100% 50%;
222
- --chart-5: 38 100% 98%;
222
+ --chart-5: 180 100% 50%;
223
223
  }
224
224
 
225
225
  [data-theme="light"], .theme-light {
@@ -252,7 +252,42 @@
252
252
  --sidebar-ring: 34 100% 30%;
253
253
  --chart-1: 41 100% 50%;
254
254
  --chart-2: 39 8% 40%;
255
- --chart-3: 34 100% 30%;
256
- --chart-4: 41 100% 50%;
257
- --chart-5: 33 17% 10%;
255
+ --chart-3: 41 100% 44%;
256
+ --chart-4: 34 100% 30%;
257
+ --chart-5: 42 83% 91%;
258
+ }
259
+
260
+ [data-theme="amber-paper"], .theme-amber-paper {
261
+ --background: 41 100% 50%;
262
+ --foreground: 280 100% 1%;
263
+ --card: 42 100% 45%;
264
+ --card-foreground: 280 100% 1%;
265
+ --popover: 42 100% 45%;
266
+ --popover-foreground: 280 100% 1%;
267
+ --primary: 280 100% 1%;
268
+ --primary-foreground: 41 100% 50%;
269
+ --secondary: 42 100% 45%;
270
+ --secondary-foreground: 280 100% 1%;
271
+ --muted: 42 100% 45%;
272
+ --muted-foreground: 28 74% 21%;
273
+ --accent: 280 100% 1%;
274
+ --accent-foreground: 41 100% 50%;
275
+ --destructive: 28 74% 21%;
276
+ --destructive-foreground: 41 100% 50%;
277
+ --border: 280 100% 1%;
278
+ --input: 280 100% 1%;
279
+ --ring: 280 100% 1%;
280
+ --sidebar: 41 100% 50%;
281
+ --sidebar-foreground: 280 100% 1%;
282
+ --sidebar-primary: 280 100% 1%;
283
+ --sidebar-primary-foreground: 41 100% 50%;
284
+ --sidebar-accent: 42 100% 45%;
285
+ --sidebar-accent-foreground: 280 100% 1%;
286
+ --sidebar-border: 280 100% 1%;
287
+ --sidebar-ring: 280 100% 1%;
288
+ --chart-1: 280 100% 1%;
289
+ --chart-2: 28 74% 21%;
290
+ --chart-3: 22 87% 9%;
291
+ --chart-4: 37 100% 5%;
292
+ --chart-5: 29 80% 16%;
258
293
  }
@@ -41,7 +41,9 @@
41
41
  --color-semantic-text-ai-gradient-from-light: #c0228a; /** AI-marker gradient start under light themes ([data-theme=light]/.light) — deep magenta, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
42
42
  --color-semantic-text-ai-gradient-to-light: #7a3cc0; /** AI-marker gradient end under light themes — violet, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
43
43
  --color-semantic-text-primary: var(--color-cga-amber);
44
- --color-semantic-text-secondary: var(--color-cga-black);
44
+ --color-semantic-text-secondary: var(--color-cga-light-gray); /** DMNC-1494: visible de-emphasised tone on dark backgrounds. For dark text on an amber fill use `text.onAccent`. */
45
+ --color-semantic-text-on-accent: var(--color-cga-black); /** DMNC-1494: dark text/icon sitting on an accent (amber) fill. Was the value of `text.secondary`. */
46
+ --color-semantic-text-on-light: var(--color-cga-black); /** DMNC-1494: near-black text/icon for an unfilled element sitting on a light surface (e.g. Nav modern links). Near-black in every theme, unlike `text.onAccent`, which follows the accent fill. */
45
47
  --color-semantic-text-accent: var(--color-cga-yellow);
46
48
  --color-semantic-text-disabled: var(--color-cga-amber-dim);
47
49
  --color-semantic-text-muted: var(--color-cga-light-gray);
@@ -53,7 +55,7 @@
53
55
  --color-semantic-background-accent: var(--color-cga-amber);
54
56
  --color-semantic-background-error: var(--color-cga-amber-dim); /** DMNC-1059: amber-mono is the DEFAULT theme — functional roles must NOT leak the honest :root red/green. Destructive fill uses dark amberDim so the white foreground keeps contrast (honest #AA0000 fill only appears under colour themes, e.g. cga-amber / the Modern theme DMNC-1058). */
55
57
  --color-semantic-border-default: var(--color-cga-amber);
56
- --color-semantic-border-focus: var(--color-cga-amber-bright);
58
+ --color-semantic-border-focus: var(--color-cga-amber);
57
59
  --color-semantic-border-hover: var(--color-cga-yellow);
58
60
  --color-semantic-border-disabled: var(--color-cga-amber-dim);
59
61
  --color-semantic-border-success: var(--color-cga-amber-bright); /** DMNC-1059: amber-mono default — success border is amber, not honest green. */
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Do not edit directly, this file was auto-generated.
3
+ */
4
+
5
+ [data-theme="amber-paper"], .theme-amber-paper {
6
+ --color-cga-black: #ffb000; /** Reverse video: the darkest CGA value becomes the amber ground. */
7
+ --color-cga-blue: #2c1203; /** Amber monochrome */
8
+ --color-cga-green: #411f06; /** Amber monochrome */
9
+ --color-cga-cyan: #552d0a; /** Amber monochrome */
10
+ --color-cga-red: #65360c; /** Amber monochrome */
11
+ --color-cga-magenta: #713e0d; /** Amber monochrome */
12
+ --color-cga-brown: #5f340e; /** Amber monochrome */
13
+ --color-cga-light-gray: #5f340e; /** Reverse video: tan body tone becomes dark brown (5.8:1 on ground). */
14
+ --color-cga-dark-gray: #e6a000; /** Reverse video: raised/secondary surface, a slightly darker amber shade. */
15
+ --color-cga-bright-blue: #2c1203;
16
+ --color-cga-bright-green: #2c1203;
17
+ --color-cga-bright-cyan: #2c1203;
18
+ --color-cga-bright-red: #2c1203;
19
+ --color-cga-bright-magenta: #2c1203;
20
+ --color-cga-yellow: #020003; /** Reverse video: accent yellow becomes ink. */
21
+ --color-cga-white: #2c1203; /** Reverse video: hover/emphasis tone becomes a deep brown. */
22
+ --color-cga-amber: #020003; /** Reverse video: amber ink becomes near-black. */
23
+ --color-cga-amber-bright: #1a1000; /** Reverse video: hover/active peaks go darker, not lighter. */
24
+ --color-cga-amber-dim: #7a4500; /** Reverse video: dim amber becomes mid brown (4.3:1 on ground, 3.5:1 on shade). */
25
+ --color-cga-amber-glow: rgba(0, 0, 0, 0); /** Reverse video has no phosphor bloom: transparent, so raw amber-glow rules render nothing. */
26
+ --color-cga-red-glow: rgba(255, 85, 85, 0.5); /** Red glow at 50% opacity */
27
+ --color-cga-green-glow: rgba(85, 255, 85, 0.5); /** Green glow at 50% opacity */
28
+ --color-cga-cyan-glow: rgba(85, 255, 255, 0.5); /** Cyan glow at 50% opacity */
29
+ --color-cga-magenta-glow: rgba(255, 85, 255, 0.5); /** Magenta glow at 50% opacity */
30
+ --color-cga-blue-glow: rgba(85, 85, 255, 0.5); /** Blue glow at 50% opacity */
31
+ --color-cga-white-glow: rgba(255, 245, 224, 0.5); /** Warm white glow at 50% opacity */
32
+ --color-cga-true-green: #00aa00; /** True CGA green — functional success / in-range. */
33
+ --color-cga-true-red: #aa0000; /** True CGA red — functional error / out-of-range. */
34
+ --color-cga-true-cyan: #00aaaa; /** True CGA cyan — functional info / sensor. */
35
+ --color-cga-true-white: #ffffff; /** True CGA white — theme-invariant light foreground for functional fills (white-on-red destructive, white-on-green success). #FFFFFF on cga-true.red #AA0000 is ~5.9:1 (passes WCAG AA). DMNC-922. */
36
+ --color-cga-true-red-bright: #ff5555; /** True CGA bright red — theme-invariant. The readable-as-TEXT-on-dark red (#FF5555 on the #020003 CRT bg passes AA, where the solid #AA0000 is only ~2.3:1). Use for error TEXT/icons on dark; use the solid `red` for fills. DMNC-922. */
37
+ --color-semantic-text-ai-draft: #ff1a8c; /** AI-drafted prose, not yet revised by human — Signalnoise hot pink. Brand-locked hex: same value across all themes so the AI marker is unmissable regardless of palette. Lives in base (T1) so all themes inherit it; the rest of color.semantic.* lives in web.tokens.json (T2). */
38
+ --color-semantic-text-ai-draft-glow: rgba(255, 26, 140, 0.5); /** Phosphor halo around AI-drafted prose. 50% rgba of the aiDraft hex; brand-locked alongside it. Used in text-shadow only; no Tailwind utility. */
39
+ --color-semantic-text-ai-gradient-from: #ff1a8c; /** AI-marker gradient start on amber/dark themes (Signalnoise pink). Static two-stop magenta gradient ('AI writer' style — no animation) clipped to the text in provenance.css; brand-locked; no Tailwind utility (DMNC-946). */
40
+ --color-semantic-text-ai-gradient-to: #ff55ff; /** AI-marker gradient end on amber/dark themes (bright magenta). Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
41
+ --color-semantic-text-ai-gradient-from-light: #c0228a; /** AI-marker gradient start under light themes ([data-theme=light]/.light) — deep magenta, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
42
+ --color-semantic-text-ai-gradient-to-light: #7a3cc0; /** AI-marker gradient end under light themes — violet, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
43
+ --color-semantic-text-primary: #020003; /** Black ink body text (11.4:1 on ground). */
44
+ --color-semantic-text-secondary: #5f340e; /** DMNC-1494: visible de-emphasised tone on the amber ground (5.8:1). For text on a black fill use text.onAccent. */
45
+ --color-semantic-text-on-accent: #ffb000; /** DMNC-1494: text/icon on an accent (black) fill, amber. */
46
+ --color-semantic-text-on-light: #020003; /** DMNC-1494: near-black text/icon for an unfilled element sitting on a light surface (e.g. Nav modern links); the amber ground is the light surface here (11.4:1 on ground, 9.4:1 on shade). */
47
+ --color-semantic-text-accent: #1a1000; /** Accent text, near-black ink (10.3:1 on ground). Reverse video: where the default accent is brighter than amber, here it is the darker peak; distinct from background.brand so the shadcn chart ramp stays five distinct colours (DMNC-1436). */
48
+ --color-semantic-text-disabled: #7a4500; /** Disabled text/icon, mid brown, at least 3:1 on ground and shade. */
49
+ --color-semantic-text-muted: #5f340e; /** Muted supplementary text, dark brown (5.8:1 ground, 4.7:1 shade). */
50
+ --color-semantic-text-tertiary: #5f340e; /** Third-emphasis text, same as muted. */
51
+ --color-semantic-text-brand: #020003; /** Brand text, ink. */
52
+ --color-semantic-text-brand-bright: #1a1000; /** Brand emphasis text (hover/active peaks), near-black; reverse video peaks go darker. */
53
+ --color-semantic-text-on-brand: #ffb000; /** Text/icon on a black brand fill, amber. */
54
+ --color-semantic-text-error: #020003; /** Monochrome error text, ink (pair with icon/pattern, never colour alone). */
55
+ --color-semantic-text-warning: #411f06; /** Monochrome warning text, deep brown. */
56
+ --color-semantic-text-success: #2c1203; /** Monochrome success text, deep brown. */
57
+ --color-semantic-text-info: #5f340e; /** Monochrome info text, dark brown. */
58
+ --color-semantic-text-white: #ffb000; /** Light foreground for functional (dark) fills; in reverse video the light tone is the amber ground. */
59
+ --color-semantic-background-primary: #ffb000; /** Amber page ground. */
60
+ --color-semantic-background-secondary: #e6a000; /** Raised/card surface, slightly darker amber. */
61
+ --color-semantic-background-tertiary: #e6a000; /** Third surface level (same as secondary, mirrors the default). */
62
+ --color-semantic-background-accent: #020003; /** Accent fill: what was an amber fill is black ink. Pair with text.onAccent (amber). */
63
+ --color-semantic-background-brand: #020003; /** Brand fill (e.g. primary button), black. Pair with text.onBrand. */
64
+ --color-semantic-background-brand-bright: #2c1203; /** Brand emphasis fill (hover/active), deep brown, visibly distinct from the black brand fill. */
65
+ --color-semantic-background-brand-dim: #4a2808; /** Dim brand fill (card header, timeline axis), dark brown; text.onAccent (amber) reads 7.2:1 on it. Kept distinct from text.muted so the shadcn chart ramp stays five distinct colours (DMNC-1436). */
66
+ --color-semantic-background-error: #5f340e; /** Destructive fill stays monochrome: dark brown with text.white (amber) on it. */
67
+ --color-semantic-background-success: #411f06; /** Success fill stays monochrome: deep brown with text.white (amber) on it. */
68
+ --color-semantic-border-default: #020003; /** Ink border. */
69
+ --color-semantic-border-focus: #020003; /** Focus ring, ink. */
70
+ --color-semantic-border-hover: #2c1203; /** Hover border, deep brown. */
71
+ --color-semantic-border-disabled: #7a4500; /** Disabled border, mid brown. */
72
+ --color-semantic-border-brand: #020003; /** Brand border, ink. */
73
+ --color-semantic-border-brand-bright: #2c1203; /** Brand emphasis border. */
74
+ --color-semantic-border-brand-dim: #7a4500; /** Dim brand border, mid brown (3:1+ on ground). */
75
+ --color-semantic-border-error: #020003; /** Monochrome error border, ink. */
76
+ --color-semantic-border-success: #020003; /** Monochrome success border, ink. */
77
+ --color-semantic-link-default: #2c1203; /** Link, deep brown (9.6:1); distinguished by underline, not hue. */
78
+ --color-semantic-link-hover: #020003; /** Link hover, ink. */
79
+ --color-semantic-link-active: #5f340e; /** Link active, dark brown. */
80
+ --color-semantic-link-visited: #411f06; /** Visited, deep brown. */
81
+ --color-semantic-status-success: #2c1203; /** Monochrome status success. */
82
+ --color-semantic-status-warning: #411f06; /** Monochrome status warning. */
83
+ --color-semantic-status-error: #020003; /** Monochrome status error. */
84
+ --color-semantic-status-info: #5f340e; /** Monochrome status info. */
85
+ --color-semantic-alert-info: #e6a000; /** Alert surface, amber shade; tone is carried by icon + text, not hue. */
86
+ --color-semantic-alert-success: #e6a000; /** Alert surface, amber shade. */
87
+ --color-semantic-alert-warning: #e6a000; /** Alert surface, amber shade. */
88
+ --color-semantic-alert-error: #e6a000; /** Alert surface, amber shade. */
89
+ --color-semantic-glow-error: rgba(0, 0, 0, 0); /** No bloom on reverse video, transparent. */
90
+ --shadow-glow-xs: 0px 0px 8px 0px #02000300; /** No phosphor bloom on reverse video (transparent). */
91
+ --shadow-glow-sm: 0px 0px 10px 0px #02000300; /** No phosphor bloom on reverse video (transparent). */
92
+ --shadow-glow-md: 0px 0px 20px 0px #02000300; /** No phosphor bloom on reverse video (transparent). */
93
+ --shadow-glow-lg: 0px 0px 30px 0px #02000300; /** No phosphor bloom on reverse video (transparent). */
94
+ --focus-ring-color: #020003; /** Focus ring, ink on the amber ground. */
95
+ --effects-overlay: rgba(2, 0, 3, 0.7); /** Modal backdrop, ink at 70% so the amber dialog separates from the page. */
96
+ --effects-scanline-light: rgba(2, 0, 3, 0.05); /** Scanline band, faint ink. */
97
+ --effects-scanline-dark: rgba(2, 0, 3, 0.02); /** Scanline band, fainter ink. */
98
+ --effects-vignette-glow: rgba(2, 0, 3, 0); /** No inner glow on reverse video. */
99
+ --effects-vignette-edge: rgba(2, 0, 3, 0.15); /** Vignette edge darkening, ink at low alpha. */
100
+ --effects-vignette-corner: rgba(2, 0, 3, 0.3); /** Vignette corner darkening, ink at low alpha. */
101
+ --effects-screen-tint: rgba(2, 0, 3, 0.05); /** Screen tint, ink at about 5%. */
102
+ --effects-phosphor-glow: rgba(2, 0, 3, 0); /** No phosphor bloom on reverse video. */
103
+ --effects-bloom-outer: rgba(2, 0, 3, 0); /** No bloom on reverse video. */
104
+ --effects-bloom-center: rgba(2, 0, 3, 0); /** No bloom on reverse video. */
105
+ --effects-crt-background: #ffb000; /** CRT screen background, amber ground. */
106
+ }
@@ -45,7 +45,9 @@
45
45
  --color-semantic-alert-warning: #352800;
46
46
  --color-semantic-alert-error: #430500;
47
47
  --color-semantic-text-primary: var(--color-cga-light-gray);
48
- --color-semantic-text-secondary: var(--color-cga-black);
48
+ --color-semantic-text-secondary: var(--color-cga-light-gray); /** DMNC-1494: visible de-emphasised tone on dark backgrounds. For dark text on an amber fill use `text.onAccent`. */
49
+ --color-semantic-text-on-accent: var(--color-cga-white); /** DMNC-1494: text/icon sitting on an accent fill. Light here because the cga-amber accent fill is blue; elsewhere it is the old `text.secondary` value. */
50
+ --color-semantic-text-on-light: var(--color-cga-black); /** DMNC-1494: near-black text/icon for an unfilled element sitting on a light surface (e.g. Nav modern links). Near-black in every theme, unlike `text.onAccent`, which follows the accent fill. */
49
51
  --color-semantic-text-accent: var(--color-cga-amber);
50
52
  --color-semantic-text-disabled: var(--color-cga-dark-gray);
51
53
  --color-semantic-text-muted: var(--color-cga-brown);
@@ -41,7 +41,9 @@
41
41
  --color-semantic-text-ai-gradient-from-light: #c0228a; /** AI-marker gradient start under light themes ([data-theme=light]/.light) — deep magenta, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
42
42
  --color-semantic-text-ai-gradient-to-light: #7a3cc0; /** AI-marker gradient end under light themes — violet, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
43
43
  --color-semantic-text-primary: #ffff00;
44
- --color-semantic-text-secondary: #050300;
44
+ --color-semantic-text-secondary: #ffff00; /** DMNC-1494: visible de-emphasised tone (same as text.primary in this mode theme). */
45
+ --color-semantic-text-on-accent: #050300; /** DMNC-1494: dark text on an accent fill. Was the value of `text.secondary`. */
46
+ --color-semantic-text-on-light: #050300; /** DMNC-1494: near-black text/icon for an unfilled element sitting on a light surface (e.g. Nav modern links). Near-black in every theme, unlike `text.onAccent`, which follows the accent fill. */
45
47
  --color-semantic-text-accent: #00ff00;
46
48
  --color-semantic-text-disabled: #ff0000;
47
49
  --color-semantic-text-muted: rgba(255, 255, 0, 0.65);
@@ -41,7 +41,9 @@
41
41
  --color-semantic-text-ai-gradient-from-light: #c0228a; /** AI-marker gradient start under light themes ([data-theme=light]/.light) — deep magenta, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
42
42
  --color-semantic-text-ai-gradient-to-light: #7a3cc0; /** AI-marker gradient end under light themes — violet, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
43
43
  --color-semantic-text-primary: #fffcf7;
44
- --color-semantic-text-secondary: #050300;
44
+ --color-semantic-text-secondary: #fffcf7; /** DMNC-1494: visible de-emphasised tone (same as text.primary in this mode theme). */
45
+ --color-semantic-text-on-accent: #050300; /** DMNC-1494: dark text on an accent fill. Was the value of `text.secondary`. */
46
+ --color-semantic-text-on-light: #050300; /** DMNC-1494: near-black text/icon for an unfilled element sitting on a light surface (e.g. Nav modern links). Near-black in every theme, unlike `text.onAccent`, which follows the accent fill. */
45
47
  --color-semantic-text-accent: #00ffff;
46
48
  --color-semantic-text-disabled: #ff00ff;
47
49
  --color-semantic-text-muted: rgba(255, 252, 247, 0.65);
@@ -41,7 +41,9 @@
41
41
  --color-semantic-text-ai-gradient-from-light: #c0228a; /** AI-marker gradient start under light themes ([data-theme=light]/.light) — deep magenta, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
42
42
  --color-semantic-text-ai-gradient-to-light: #7a3cc0; /** AI-marker gradient end under light themes — violet, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
43
43
  --color-semantic-text-primary: #fffcf7;
44
- --color-semantic-text-secondary: #050300;
44
+ --color-semantic-text-secondary: #fffcf7; /** DMNC-1494: visible de-emphasised tone (same as text.primary in this mode theme). */
45
+ --color-semantic-text-on-accent: #050300; /** DMNC-1494: dark text on an accent fill. Was the value of `text.secondary`. */
46
+ --color-semantic-text-on-light: #050300; /** DMNC-1494: near-black text/icon for an unfilled element sitting on a light surface (e.g. Nav modern links). Near-black in every theme, unlike `text.onAccent`, which follows the accent fill. */
45
47
  --color-semantic-text-accent: #00ffff;
46
48
  --color-semantic-text-disabled: #ff0000;
47
49
  --color-semantic-text-muted: rgba(255, 252, 247, 0.65);
@@ -41,7 +41,9 @@
41
41
  --color-semantic-text-ai-gradient-from-light: #c0228a; /** AI-marker gradient start under light themes ([data-theme=light]/.light) — deep magenta, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
42
42
  --color-semantic-text-ai-gradient-to-light: #7a3cc0; /** AI-marker gradient end under light themes — violet, contrast on white. Static, brand-locked. Gradient-only; no Tailwind utility (DMNC-946). */
43
43
  --color-semantic-text-primary: #1f1b16; /** Warm near-black body text (~13:1 on bg.primary). */
44
- --color-semantic-text-secondary: #1f1b16; /** Dark text for amber/light fills. */
44
+ --color-semantic-text-secondary: #1f1b16; /** DMNC-1494: visible on the light page background (near-black). For dark text on an amber fill use `text.onAccent`. */
45
+ --color-semantic-text-on-accent: #1f1b16; /** DMNC-1494: dark text/icon on an amber accent fill. */
46
+ --color-semantic-text-on-light: #1f1b16; /** DMNC-1494: near-black text/icon for an unfilled element sitting on a light surface (e.g. Nav modern links). Near-black in every theme, unlike `text.onAccent`, which follows the accent fill. */
45
47
  --color-semantic-text-accent: #9a5700; /** Deep-amber accent text (readable on light, ~5:1). */
46
48
  --color-semantic-text-disabled: #a8a096; /** Disabled text/icon. */
47
49
  --color-semantic-text-muted: #6e685d; /** Muted supplementary text (~5.5:1 on bg.primary). */
@@ -47,6 +47,7 @@
47
47
  --typography-font-family-primary: 'Perfect DOS VGA 437', monospace; /** Perfect DOS VGA 437 by Zeh Fernando (free-for-any-use; ships with bundled LICENSE.txt). Pixel-perfect-vector TTF — every glyph outline is axis-aligned, scales cleanly to any size. The `monospace` fallback preserves DOS aesthetic on @font-face failure. Used for display/heading tiers (dos-hero, dos-h1…h5). */
48
48
  --typography-font-family-body: 'JetBrains Mono Nerd Font', monospace; /** JetBrains Mono Nerd Font (OFL-1.1; ships with bundled JetBrainsMonoNerdFont_OFL.txt). Multi-weight monospace body font — includes Nerd Font glyph extensions (powerline, devicons, language logos) for terminal-aesthetic UIs alongside pixelarticons. Ships as four per-weight woff2 files (Regular/Medium/SemiBold/Bold). Used for body/prose tiers (dos-body, dos-body-lg, dos-caption, dos-micro). Use fontWeight.body-* tokens for real weight variation (DMNC-885). */
49
49
  --typography-font-family-fallback: monospace; /** Bare `monospace` stack — fail-loud diagnostic counterpart to `primary`. Compose with `primary` when consumers want strict Perfect-DOS-or-nothing rendering. */
50
+ --typography-font-size-text-base: 1rem; /** 16px — body floor (DOS VGA native 9x16 cell); nothing in eidotter renders text smaller (DMNC-1579) */
50
51
  --typography-font-size-text-xs: 1.125rem; /** 18px — smallest body text */
51
52
  --typography-font-size-text-sm: 1.25rem; /** 20px — secondary body text */
52
53
  --typography-font-size-text-md: 1.375rem; /** 22px — default body text */
@@ -65,6 +66,7 @@
65
66
  --typography-font-weight-body-medium: 500; /** Body: JetBrains Mono Nerd Font medium. */
66
67
  --typography-font-weight-body-semibold: 600; /** Body: JetBrains Mono Nerd Font semibold. */
67
68
  --typography-font-weight-body-bold: 700; /** Body: JetBrains Mono Nerd Font bold. */
69
+ --typography-line-height-text-base: 1.25rem; /** 20px */
68
70
  --typography-line-height-text-xs: 1.125rem; /** 18px */
69
71
  --typography-line-height-text-sm: 1.25rem; /** 20px */
70
72
  --typography-line-height-text-md: 1.5rem; /** 24px */
@@ -195,7 +197,9 @@
195
197
  --motion-easing-energize: ease-out; /** phosphor-energize easing (runs forwards). */
196
198
  --motion-easing-blink: step-end; /** blink easing — hard step, no interpolation (terminal cursor). */
197
199
  --color-semantic-text-primary: var(--color-cga-light-gray);
198
- --color-semantic-text-secondary: var(--color-cga-black);
200
+ --color-semantic-text-secondary: var(--color-cga-light-gray); /** DMNC-1494: visible de-emphasised tone on dark backgrounds. For dark text on an amber fill use `text.onAccent`. */
201
+ --color-semantic-text-on-accent: var(--color-cga-black); /** DMNC-1494: dark text/icon sitting on an accent (amber) fill. Was the value of `text.secondary`. */
202
+ --color-semantic-text-on-light: var(--color-cga-black); /** DMNC-1494: near-black text/icon for an unfilled element sitting on a light surface (e.g. Nav modern links). Near-black in every theme, unlike `text.onAccent`, which follows the accent fill. */
199
203
  --color-semantic-text-accent: var(--color-cga-yellow);
200
204
  --color-semantic-text-disabled: var(--color-cga-dark-gray);
201
205
  --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. */
@@ -30,6 +30,7 @@ try {
30
30
  animatePlugin = null;
31
31
  }
32
32
 
33
+ // DMNC-1579: text-xs/text-sm are aliased to the 16px body floor
33
34
  const preset = {
34
35
  "theme": {
35
36
  "extend": {
@@ -72,6 +73,8 @@ const preset = {
72
73
  "dos-text-ai-draft": "var(--color-semantic-text-ai-draft)",
73
74
  "dos-text-primary": "var(--color-semantic-text-primary)",
74
75
  "dos-text-secondary": "var(--color-semantic-text-secondary)",
76
+ "dos-text-on-accent": "var(--color-semantic-text-on-accent)",
77
+ "dos-text-on-light": "var(--color-semantic-text-on-light)",
75
78
  "dos-text-accent": "var(--color-semantic-text-accent)",
76
79
  "dos-text-disabled": "var(--color-semantic-text-disabled)",
77
80
  "dos-text-muted": "var(--color-semantic-text-muted)",
@@ -120,6 +123,12 @@ const preset = {
120
123
  ]
121
124
  },
122
125
  "fontSize": {
126
+ "dos-text-base": [
127
+ "1rem",
128
+ {
129
+ "lineHeight": "1.25rem"
130
+ }
131
+ ],
123
132
  "dos-text-xs": "1.125rem",
124
133
  "dos-text-sm": "1.25rem",
125
134
  "dos-text-md": "1.375rem",
@@ -130,9 +139,22 @@ const preset = {
130
139
  "dos-display-md": "2.625rem",
131
140
  "dos-display-lg": "3.5rem",
132
141
  "dos-display-xl": "4.125rem",
133
- "dos-display-2xl": "4.875rem"
142
+ "dos-display-2xl": "4.875rem",
143
+ "xs": [
144
+ "1rem",
145
+ {
146
+ "lineHeight": "1.25rem"
147
+ }
148
+ ],
149
+ "sm": [
150
+ "1rem",
151
+ {
152
+ "lineHeight": "1.25rem"
153
+ }
154
+ ]
134
155
  },
135
156
  "lineHeight": {
157
+ "dos-text-base": "1.25rem",
136
158
  "dos-text-xs": "1.125rem",
137
159
  "dos-text-sm": "1.25rem",
138
160
  "dos-text-md": "1.5rem",
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};