eidotter 0.24.2 → 0.26.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 (292) hide show
  1. package/LICENSE.md +0 -0
  2. package/README.md +9 -5
  3. package/dist/components/AIText/components/AIText.d.ts +0 -0
  4. package/dist/components/AIText/components/index.d.ts +0 -0
  5. package/dist/components/AIText/index.d.ts +0 -0
  6. package/dist/components/Accordion/components/AccordionFill.d.ts +0 -0
  7. package/dist/components/Accordion/components/Section.d.ts +0 -0
  8. package/dist/components/Accordion/components/index.d.ts +0 -0
  9. package/dist/components/Accordion/index.d.ts +0 -0
  10. package/dist/components/Alert/components/Alert.d.ts +0 -0
  11. package/dist/components/Alert/components/index.d.ts +0 -0
  12. package/dist/components/Alert/index.d.ts +0 -0
  13. package/dist/components/Badge/components/Badge.d.ts +0 -0
  14. package/dist/components/Badge/components/index.d.ts +0 -0
  15. package/dist/components/Badge/index.d.ts +0 -0
  16. package/dist/components/Brand/components/BrandLockup.d.ts +0 -0
  17. package/dist/components/Brand/components/Logo.d.ts +0 -0
  18. package/dist/components/Brand/components/Wordmark.d.ts +0 -0
  19. package/dist/components/Brand/components/index.d.ts +0 -0
  20. package/dist/components/Brand/index.d.ts +0 -0
  21. package/dist/components/Breadcrumb/components/Breadcrumb.d.ts +0 -0
  22. package/dist/components/Breadcrumb/components/index.d.ts +0 -0
  23. package/dist/components/Breadcrumb/index.d.ts +0 -0
  24. package/dist/components/Button/components/Button.d.ts +0 -0
  25. package/dist/components/Button/components/index.d.ts +0 -0
  26. package/dist/components/Button/index.d.ts +0 -0
  27. package/dist/components/Card/components/Card.d.ts +0 -0
  28. package/dist/components/Card/components/index.d.ts +0 -0
  29. package/dist/components/Card/index.d.ts +0 -0
  30. package/dist/components/Chat/components/ChatContainer.d.ts +0 -0
  31. package/dist/components/Chat/components/ChatHistory.d.ts +0 -0
  32. package/dist/components/Chat/components/ChatInput.d.ts +0 -0
  33. package/dist/components/Chat/components/ChatMessage.d.ts +0 -0
  34. package/dist/components/Chat/components/index.d.ts +0 -0
  35. package/dist/components/Chat/index.d.ts +0 -0
  36. package/dist/components/Checkbox/components/Checkbox.d.ts +0 -0
  37. package/dist/components/Checkbox/components/index.d.ts +0 -0
  38. package/dist/components/Checkbox/index.d.ts +0 -0
  39. package/dist/components/CmdPalette/components/CmdPalette.d.ts +0 -0
  40. package/dist/components/CmdPalette/components/index.d.ts +0 -0
  41. package/dist/components/CmdPalette/index.d.ts +0 -0
  42. package/dist/components/CommandPrompt/components/CommandPrompt.d.ts +0 -0
  43. package/dist/components/CommandPrompt/components/index.d.ts +0 -0
  44. package/dist/components/CommandPrompt/index.d.ts +0 -0
  45. package/dist/components/DosFigure/components/DosFigure.d.ts +0 -0
  46. package/dist/components/DosFigure/components/index.d.ts +0 -0
  47. package/dist/components/DosFigure/index.d.ts +0 -0
  48. package/dist/components/FilterBar/components/FilterBar.d.ts +0 -0
  49. package/dist/components/FilterBar/components/index.d.ts +0 -0
  50. package/dist/components/FilterBar/index.d.ts +0 -0
  51. package/dist/components/Footer/components/Footer.d.ts +0 -0
  52. package/dist/components/Footer/components/index.d.ts +0 -0
  53. package/dist/components/Footer/index.d.ts +0 -0
  54. package/dist/components/Header/components/Header.d.ts +0 -0
  55. package/dist/components/Header/components/index.d.ts +0 -0
  56. package/dist/components/Header/index.d.ts +0 -0
  57. package/dist/components/Icon/components/Icon.d.ts +0 -0
  58. package/dist/components/Icon/components/index.d.ts +0 -0
  59. package/dist/components/Icon/index.d.ts +0 -0
  60. package/dist/components/InlineExpand/components/InlineExpand.d.ts +0 -0
  61. package/dist/components/InlineExpand/components/index.d.ts +0 -0
  62. package/dist/components/InlineExpand/index.d.ts +0 -0
  63. package/dist/components/InlineLink/components/InlineLink.d.ts +0 -0
  64. package/dist/components/InlineLink/components/index.d.ts +0 -0
  65. package/dist/components/InlineLink/index.d.ts +0 -0
  66. package/dist/components/Input/components/Input.d.ts +0 -0
  67. package/dist/components/Input/components/index.d.ts +0 -0
  68. package/dist/components/Input/index.d.ts +0 -0
  69. package/dist/components/LegalPage/components/LegalPage.d.ts +0 -0
  70. package/dist/components/LegalPage/components/clauses.d.ts +0 -0
  71. package/dist/components/LegalPage/components/index.d.ts +0 -0
  72. package/dist/components/LegalPage/index.d.ts +0 -0
  73. package/dist/components/Lightbox/components/Lightbox.d.ts +0 -0
  74. package/dist/components/Lightbox/components/index.d.ts +0 -0
  75. package/dist/components/Lightbox/index.d.ts +0 -0
  76. package/dist/components/Modal/components/Modal.d.ts +0 -0
  77. package/dist/components/Modal/components/index.d.ts +0 -0
  78. package/dist/components/Modal/index.d.ts +0 -0
  79. package/dist/components/Nav/components/Nav.d.ts +0 -0
  80. package/dist/components/Nav/components/index.d.ts +0 -0
  81. package/dist/components/Nav/index.d.ts +0 -0
  82. package/dist/components/Notification/components/Notification.d.ts +0 -0
  83. package/dist/components/Notification/components/index.d.ts +0 -0
  84. package/dist/components/Notification/index.d.ts +0 -0
  85. package/dist/components/Progress/components/Progress.d.ts +0 -0
  86. package/dist/components/Progress/components/index.d.ts +0 -0
  87. package/dist/components/Progress/index.d.ts +0 -0
  88. package/dist/components/RetroEffects/components/RetroEffects.d.ts +0 -0
  89. package/dist/components/RetroEffects/components/index.d.ts +0 -0
  90. package/dist/components/RetroEffects/index.d.ts +0 -0
  91. package/dist/components/Separator/components/Separator.d.ts +0 -0
  92. package/dist/components/Separator/components/index.d.ts +0 -0
  93. package/dist/components/Separator/index.d.ts +0 -0
  94. package/dist/components/Stat/components/Stat.d.ts +0 -0
  95. package/dist/components/Stat/components/index.d.ts +0 -0
  96. package/dist/components/Stat/index.d.ts +0 -0
  97. package/dist/components/Switch/components/Switch.d.ts +0 -0
  98. package/dist/components/Switch/components/index.d.ts +0 -0
  99. package/dist/components/Switch/index.d.ts +0 -0
  100. package/dist/components/Tabs/components/Tabs.d.ts +0 -0
  101. package/dist/components/Tabs/components/index.d.ts +0 -0
  102. package/dist/components/Tabs/index.d.ts +0 -0
  103. package/dist/components/Tag/components/Tag.d.ts +0 -0
  104. package/dist/components/Tag/components/TagGroup.d.ts +0 -0
  105. package/dist/components/Tag/components/index.d.ts +0 -0
  106. package/dist/components/Tag/index.d.ts +0 -0
  107. package/dist/components/Terminal/components/Terminal.d.ts +0 -0
  108. package/dist/components/Terminal/components/index.d.ts +0 -0
  109. package/dist/components/Terminal/index.d.ts +0 -0
  110. package/dist/components/TextScramble/components/TextScramble.d.ts +0 -0
  111. package/dist/components/TextScramble/components/index.d.ts +0 -0
  112. package/dist/components/TextScramble/index.d.ts +0 -0
  113. package/dist/components/TimelineContainer/components/TimelineAxis.d.ts +0 -0
  114. package/dist/components/TimelineContainer/components/TimelineContainer.d.ts +0 -0
  115. package/dist/components/TimelineContainer/components/TimelineContent.d.ts +0 -0
  116. package/dist/components/TimelineContainer/components/TimelineEntryCard.d.ts +0 -0
  117. package/dist/components/TimelineContainer/components/ZoomControls.d.ts +0 -0
  118. package/dist/components/TimelineContainer/components/index.d.ts +0 -0
  119. package/dist/components/TimelineContainer/components/timelineUtils.d.ts +0 -0
  120. package/dist/components/TimelineContainer/components/timelineUtils.test.d.ts +0 -0
  121. package/dist/components/TimelineContainer/components/types.d.ts +0 -0
  122. package/dist/components/TimelineContainer/components/useDrillDown.d.ts +0 -0
  123. package/dist/components/TimelineContainer/components/useDrillDown.test.d.ts +0 -0
  124. package/dist/components/TimelineContainer/components/useSelection.d.ts +0 -0
  125. package/dist/components/TimelineContainer/components/useSelection.test.d.ts +0 -0
  126. package/dist/components/TimelineContainer/components/useZoom.d.ts +0 -0
  127. package/dist/components/TimelineContainer/components/useZoom.test.d.ts +0 -0
  128. package/dist/components/TimelineContainer/components/variants/TimelineEntryCardGallery.d.ts +0 -0
  129. package/dist/components/TimelineContainer/components/variants/TimelineEntryCardImage.d.ts +0 -0
  130. package/dist/components/TimelineContainer/components/views/DayView.d.ts +0 -0
  131. package/dist/components/TimelineContainer/components/views/HourView.d.ts +0 -0
  132. package/dist/components/TimelineContainer/components/views/MonthView.d.ts +0 -0
  133. package/dist/components/TimelineContainer/components/views/YearView.d.ts +0 -0
  134. package/dist/components/TimelineContainer/components/views/index.d.ts +0 -0
  135. package/dist/components/TimelineContainer/index.d.ts +0 -0
  136. package/dist/components/TimelineNode/components/TimelineNode.d.ts +0 -0
  137. package/dist/components/TimelineNode/components/index.d.ts +0 -0
  138. package/dist/components/TimelineNode/index.d.ts +0 -0
  139. package/dist/components/registry.d.ts +0 -0
  140. package/dist/eidotter.css +1 -1
  141. package/dist/icons/components/alert-square.d.ts +4 -0
  142. package/dist/icons/components/alert-square.d.ts.map +1 -0
  143. package/dist/icons/components/alert-square.js +2 -0
  144. package/dist/icons/components/alert-triangle.d.ts +4 -0
  145. package/dist/icons/components/alert-triangle.d.ts.map +1 -0
  146. package/dist/icons/components/alert-triangle.js +2 -0
  147. package/dist/icons/components/arrow-down.d.ts +4 -0
  148. package/dist/icons/components/arrow-down.d.ts.map +1 -0
  149. package/dist/icons/components/arrow-down.js +2 -0
  150. package/dist/icons/components/arrow-left.d.ts +4 -0
  151. package/dist/icons/components/arrow-left.d.ts.map +1 -0
  152. package/dist/icons/components/arrow-left.js +2 -0
  153. package/dist/icons/components/arrow-right.d.ts +4 -0
  154. package/dist/icons/components/arrow-right.d.ts.map +1 -0
  155. package/dist/icons/components/arrow-right.js +2 -0
  156. package/dist/icons/components/arrow-up.d.ts +4 -0
  157. package/dist/icons/components/arrow-up.d.ts.map +1 -0
  158. package/dist/icons/components/arrow-up.js +2 -0
  159. package/dist/icons/components/bell-01.d.ts +4 -0
  160. package/dist/icons/components/bell-01.d.ts.map +1 -0
  161. package/dist/icons/components/bell-01.js +2 -0
  162. package/dist/icons/components/check.d.ts +4 -0
  163. package/dist/icons/components/check.d.ts.map +1 -0
  164. package/dist/icons/components/check.js +2 -0
  165. package/dist/icons/components/chevron-down.d.ts +4 -0
  166. package/dist/icons/components/chevron-down.d.ts.map +1 -0
  167. package/dist/icons/components/chevron-down.js +2 -0
  168. package/dist/icons/components/chevron-left.d.ts +4 -0
  169. package/dist/icons/components/chevron-left.d.ts.map +1 -0
  170. package/dist/icons/components/chevron-left.js +2 -0
  171. package/dist/icons/components/chevron-right.d.ts +4 -0
  172. package/dist/icons/components/chevron-right.d.ts.map +1 -0
  173. package/dist/icons/components/chevron-right.js +2 -0
  174. package/dist/icons/components/chevron-up.d.ts +4 -0
  175. package/dist/icons/components/chevron-up.d.ts.map +1 -0
  176. package/dist/icons/components/chevron-up.js +2 -0
  177. package/dist/icons/components/copy-01.d.ts +4 -0
  178. package/dist/icons/components/copy-01.d.ts.map +1 -0
  179. package/dist/icons/components/copy-01.js +2 -0
  180. package/dist/icons/components/delete.d.ts +9 -0
  181. package/dist/icons/components/delete.d.ts.map +1 -0
  182. package/dist/icons/components/delete.js +7 -0
  183. package/dist/icons/components/dots-horizontal.d.ts +4 -0
  184. package/dist/icons/components/dots-horizontal.d.ts.map +1 -0
  185. package/dist/icons/components/dots-horizontal.js +2 -0
  186. package/dist/icons/components/dots-vertical.d.ts +4 -0
  187. package/dist/icons/components/dots-vertical.d.ts.map +1 -0
  188. package/dist/icons/components/dots-vertical.js +2 -0
  189. package/dist/icons/components/download-01.d.ts +4 -0
  190. package/dist/icons/components/download-01.d.ts.map +1 -0
  191. package/dist/icons/components/download-01.js +2 -0
  192. package/dist/icons/components/expand-01.d.ts +4 -0
  193. package/dist/icons/components/expand-01.d.ts.map +1 -0
  194. package/dist/icons/components/expand-01.js +2 -0
  195. package/dist/icons/components/eye-off.d.ts +4 -0
  196. package/dist/icons/components/eye-off.d.ts.map +1 -0
  197. package/dist/icons/components/eye-off.js +2 -0
  198. package/dist/icons/components/eye.d.ts +4 -0
  199. package/dist/icons/components/eye.d.ts.map +1 -0
  200. package/dist/icons/components/eye.js +2 -0
  201. package/dist/icons/components/filter-lines.d.ts +4 -0
  202. package/dist/icons/components/filter-lines.d.ts.map +1 -0
  203. package/dist/icons/components/filter-lines.js +2 -0
  204. package/dist/icons/components/heart.d.ts +4 -0
  205. package/dist/icons/components/heart.d.ts.map +1 -0
  206. package/dist/icons/components/heart.js +2 -0
  207. package/dist/icons/components/home-01.d.ts +4 -0
  208. package/dist/icons/components/home-01.d.ts.map +1 -0
  209. package/dist/icons/components/home-01.js +2 -0
  210. package/dist/icons/components/info-circle.d.ts +4 -0
  211. package/dist/icons/components/info-circle.d.ts.map +1 -0
  212. package/dist/icons/components/info-circle.js +2 -0
  213. package/dist/icons/components/link-01.d.ts +4 -0
  214. package/dist/icons/components/link-01.d.ts.map +1 -0
  215. package/dist/icons/components/link-01.js +2 -0
  216. package/dist/icons/components/loading-01.d.ts +4 -0
  217. package/dist/icons/components/loading-01.d.ts.map +1 -0
  218. package/dist/icons/components/loading-01.js +2 -0
  219. package/dist/icons/components/mail-01.d.ts +4 -0
  220. package/dist/icons/components/mail-01.d.ts.map +1 -0
  221. package/dist/icons/components/mail-01.js +2 -0
  222. package/dist/icons/components/menu-01.d.ts +4 -0
  223. package/dist/icons/components/menu-01.d.ts.map +1 -0
  224. package/dist/icons/components/menu-01.js +2 -0
  225. package/dist/icons/components/minus.d.ts +4 -0
  226. package/dist/icons/components/minus.d.ts.map +1 -0
  227. package/dist/icons/components/minus.js +2 -0
  228. package/dist/icons/components/plus.d.ts +4 -0
  229. package/dist/icons/components/plus.d.ts.map +1 -0
  230. package/dist/icons/components/plus.js +2 -0
  231. package/dist/icons/components/refresh-cw-01.d.ts +4 -0
  232. package/dist/icons/components/refresh-cw-01.d.ts.map +1 -0
  233. package/dist/icons/components/refresh-cw-01.js +2 -0
  234. package/dist/icons/components/save-01.d.ts +4 -0
  235. package/dist/icons/components/save-01.d.ts.map +1 -0
  236. package/dist/icons/components/save-01.js +2 -0
  237. package/dist/icons/components/search-md.d.ts +4 -0
  238. package/dist/icons/components/search-md.d.ts.map +1 -0
  239. package/dist/icons/components/search-md.js +2 -0
  240. package/dist/icons/components/settings-01.d.ts +4 -0
  241. package/dist/icons/components/settings-01.d.ts.map +1 -0
  242. package/dist/icons/components/settings-01.js +2 -0
  243. package/dist/icons/components/share-01.d.ts +4 -0
  244. package/dist/icons/components/share-01.d.ts.map +1 -0
  245. package/dist/icons/components/share-01.js +2 -0
  246. package/dist/icons/components/trash-01.d.ts +4 -0
  247. package/dist/icons/components/trash-01.d.ts.map +1 -0
  248. package/dist/icons/components/trash-01.js +2 -0
  249. package/dist/icons/components/upload-01.d.ts +4 -0
  250. package/dist/icons/components/upload-01.d.ts.map +1 -0
  251. package/dist/icons/components/upload-01.js +2 -0
  252. package/dist/icons/components/user-01.d.ts +4 -0
  253. package/dist/icons/components/user-01.d.ts.map +1 -0
  254. package/dist/icons/components/user-01.js +2 -0
  255. package/dist/icons/components/x-close.d.ts +4 -0
  256. package/dist/icons/components/x-close.d.ts.map +1 -0
  257. package/dist/icons/components/x-close.js +2 -0
  258. package/dist/icons/components/x.d.ts +4 -0
  259. package/dist/icons/components/x.d.ts.map +1 -0
  260. package/dist/icons/components/x.js +2 -0
  261. package/dist/icons/index.d.ts +42 -0
  262. package/dist/icons/index.d.ts.map +1 -0
  263. package/dist/icons/index.js +45 -0
  264. package/dist/icons/published.d.ts +42 -0
  265. package/dist/icons/published.d.ts.map +1 -0
  266. package/dist/icons/published.js +43 -0
  267. package/dist/icons/sprites.svg +298 -0
  268. package/dist/icons/types.d.ts +9 -0
  269. package/dist/icons/types.d.ts.map +1 -0
  270. package/dist/icons/types.js +1 -0
  271. package/dist/index.d.ts +1 -1
  272. package/dist/index.es.js +5 -2
  273. package/dist/index.umd.js +1 -1
  274. package/guidelines/README.md +5 -1
  275. package/guidelines/components.md +63 -0
  276. package/guidelines/figma-architecture.md +136 -0
  277. package/guidelines/patterns.md +0 -0
  278. package/package.json +26 -8
  279. package/src/styles/dos-utilities.css +0 -0
  280. package/src/styles/fonts/Flexi_IBM_VGA_LICENSE.txt +0 -0
  281. package/src/styles/fonts/Flexi_IBM_VGA_True.ttf +0 -0
  282. package/src/styles/fonts/Perfect_DOS_VGA_437_LICENSE.txt +0 -0
  283. package/src/styles/fonts/Perfect_DOS_VGA_437_Win.ttf +0 -0
  284. package/src/styles/fonts.css +0 -0
  285. package/src/styles/theme.amber-mono.css +3 -0
  286. package/src/styles/theme.cga-amber.css +3 -0
  287. package/src/styles/theme.cga-mode4-p0.css +3 -0
  288. package/src/styles/theme.cga-mode4-p1.css +3 -0
  289. package/src/styles/theme.cga-mode5.css +3 -0
  290. package/src/styles/tokens.css +9 -0
  291. package/tailwind.preset.cjs +0 -0
  292. package/tailwind.preset.enhanced.cjs +0 -29
@@ -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 36 ready-to-use components with consistent DOS terminal styling:
7
+ eidotter provides 40 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
@@ -128,3 +128,7 @@ These patterns break the eidotter aesthetic:
128
128
  - Rounded corners > 4px (`rounded-xl`, `rounded-full`)
129
129
  - `prefers-color-scheme` (eidotter is dark-only)
130
130
  - Arbitrary Tailwind values for colors (`bg-[#1a1a1a]`)
131
+
132
+ ## Maintainers
133
+
134
+ - [`figma-architecture.md`](./figma-architecture.md) — how the multi-platform Figma DS is structured (Foundation → platform → app), the aliasing model, the sync pipeline, and the app-adoption recipe.
@@ -766,3 +766,66 @@ DOS-styled icons backed by pixelarticons (MIT).
766
766
  <Icon name="Check" size="M" />
767
767
  <Icon name="Warning" size="L" />
768
768
  ```
769
+
770
+ ---
771
+
772
+ ## Lightbox
773
+
774
+ Fullscreen image viewer built on Modal's React Aria primitives — prev/next navigation, counter, caption, keyboard nav, touch swipe.
775
+
776
+ ### When to Use
777
+
778
+ - Viewing images from a gallery or timeline entry at full size
779
+ - Any "click thumbnail to expand" interaction
780
+ - Used internally by `TimelineContainer`'s image/gallery entry variants
781
+
782
+ ### Props
783
+
784
+ | Prop | Type | Default | Description |
785
+ |------|------|---------|-------------|
786
+ | images | `TimelineImage[]` | - | **Required.** Images to navigate between |
787
+ | isOpen | `boolean` | - | **Required.** Whether the lightbox is open |
788
+ | onClose | `() => void` | - | **Required.** Called on close button, backdrop click, or Esc |
789
+ | initialIndex | `number` | `0` | Index to start on when opened |
790
+ | onIndexChange | `(index: number) => void` | - | Fired when navigation moves to a new image |
791
+
792
+ ### Examples
793
+
794
+ ```tsx
795
+ const [open, setOpen] = useState(false);
796
+
797
+ <Lightbox
798
+ images={entry.images}
799
+ isOpen={open}
800
+ onClose={() => setOpen(false)}
801
+ initialIndex={2}
802
+ />
803
+ ```
804
+
805
+ ---
806
+
807
+ ## AIText
808
+
809
+ Inline marker for AI-drafted prose. Renders a `<span data-provenance="ai-draft">` with the magenta→white→cyan shimmer gradient from the eidotter provenance system.
810
+
811
+ ### When to Use
812
+
813
+ - Marking a single AI-drafted phrase inside otherwise-human prose
814
+ - Hand-authored MDX where `<AIText>…</AIText>` reads more naturally than the raw attribute
815
+ - For whole paragraphs in MDX, prefer `<p data-provenance="ai-draft">` directly — the diff pipeline unwraps it once the text drifts ≥40% from its AI baseline
816
+
817
+ ### Props
818
+
819
+ | Prop | Type | Default | Description |
820
+ |------|------|---------|-------------|
821
+ | children | `ReactNode` | - | **Required.** The AI-drafted text |
822
+ | title | `string` | `'AI-assisted text — being rewritten'` | Tooltip text |
823
+ | className | `string` | - | Additional CSS classes |
824
+
825
+ ### Examples
826
+
827
+ ```tsx
828
+ <p>
829
+ The release notes were <AIText>drafted with Claude and are being rewritten</AIText> by hand.
830
+ </p>
831
+ ```
@@ -0,0 +1,136 @@
1
+ # eiDotter Figma Design System — Architecture & Governance
2
+
3
+ How eiDotter's design system is structured across Figma files, how those files relate to the npm token sources, and how apps adopt it. This is the **maintainer/contributor** reference for the multi-platform DS (DMNC-916 and descendants). Consumers of the npm package do not need this — see `README.md` for usage.
4
+
5
+ > **Source of truth.** The npm token sources in `src/tokens/*.tokens.json` are canonical. Figma is a *projection* of them (via `style-dictionary` → DTCG → `figma_batch_create_variables`) plus the place components are designed. When they disagree, the JSON wins; rebuild and re-sync Figma rather than hand-editing generated values.
6
+
7
+ ## The chain
8
+
9
+ ```
10
+ src/tokens/*.tokens.json (canonical — npm)
11
+ │ style-dictionary (DTCG emit)
12
+ ▼
13
+ ┌──────────────────────────────────────────────┐
14
+ │ eiDotter Foundation (KoGTFX8…) │ T1 primitives + T3 dimensions
15
+ │ amber-mono CGA · effect numerics · type │ + T4 effect numerics + typography
16
+ └──────────────────────────────────────────────┘
17
+ │ alias │ alias │ alias
18
+ ▼ ▼ ▼
19
+ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐
20
+ │ Web DS │ │ iOS DS │ │ macOS DS │ T2 semantic layers
21
+ │ (iohPpta…) │ │ (TEnlcIg…) │ │ (peVTIvO…) │ (+ components)
22
+ └───────────────┘ └───────────────┘ └───────────────┘
23
+ │ │ subscribe + alias
24
+ ▼ ▼
25
+ ┌──────────────────────────────────┐
26
+ │ App files (DOSBTS_fig, …) │ subscribe + alias;
27
+ │ keep only app-specific literals │ app-only surfaces stay local
28
+ └──────────────────────────────────┘
29
+
30
+ V.37 / "❖ Pattern Lab" (V4tIz3sAMRx7…) ── UTI-full component-authoring reference;
31
+ the npm React components are designed against it.
32
+ Sits BESIDE the chain — aliases nothing in production.
33
+ ```
34
+
35
+ **One line:** Foundation is the single source of primitives + effect/motion numerics; each platform library aliases Foundation and adds a semantic layer + components; each app subscribes and aliases, keeping only genuinely app-specific literals local.
36
+
37
+ ## File map (authoritative)
38
+
39
+ | File | Key | Role |
40
+ |------|-----|------|
41
+ | **eiDotter Foundation** | `KoGTFX8INOAjFaOKPXnSlX` | **The canonical foundation.** Lean DOS-native, amber-mono CGA. Collections: `1. Primitives` (T1), `2. Effect Parameters` (T4 numerics), `3. Typography`. Published; subscribed-to. |
42
+ | **eiDotter Web DS** | `iohPpta7n73wCcP5xbsaJU` | Web platform sub-library. `2. Web Semantics` (T2, 126 vars — all aliasing Foundation) + 34 ComponentSets. |
43
+ | **eiDotter iOS DS** | `TEnlcIgXrB3akHvtjMy3po` | Apple iOS HIG semantic layer, 87 vars aliased to Foundation. |
44
+ | **eiDotter macOS DS** | `peVTIvO9oDzynkPXhQo0W8` | Apple macOS HIG aliased to Foundation; Liquid Glass shader params kept as literals (not aliased). |
45
+ | **V.37 / "❖ Pattern Lab"** | `V4tIz3sAMRx7H9wMYeesA6` | UntitledUI-full component fork — the component-authoring reference the npm package is built against. **Not a foundation**; aliases nothing in the production chain. Unpublished as a team library. |
46
+ | ~~"Foundation"~~ | `qlEyN6zHPX4XOohJefJ4bZ` | **Abandoned first attempt** on Molly Helmuth's DS. **Out of scope — never subscribe to or alias.** Named "Foundation" and shares V.37's "❖" glyph, so easily confused with `KoGTFX8`; it is neither the foundation nor V.37. Frozen palette-pattern source for DMNC-922 only. |
47
+ | **DOSBTS_fig** | `1Hemp6DehvK1a5uMrPJyhr` | Amber CGM app. Adoption target. |
48
+ | **calendar-365** | `npu5c86H9QHBB4fluVUjKJ` | App; future adoption candidate. |
49
+
50
+ ## Token tier taxonomy (DMNC-916)
51
+
52
+ | Tier | What | Lives in |
53
+ |------|------|----------|
54
+ | **T1 — Primitives** | The raw CGA palette (`color/cga/*`), brand amber. | Foundation `1. Primitives` |
55
+ | **T2 — Semantics** | Role-named tokens (`color/semantic/text/primary`, `status/success`, …). Each **aliases** a T1 primitive. | Platform DS files (Web/iOS/macOS) |
56
+ | **T3 — Dimensions** | Spacing, radius, border width, z-index, opacity. | Foundation (+ surfaced per platform) |
57
+ | **T4 — Effect numerics** | Phosphor/scanline/flicker/vignette/shadow numbers; (NEW) motion durations + easings. | Foundation `2. Effect Parameters` / `4. Motion` |
58
+
59
+ A T1 change in Foundation ripples through every T2 alias in every subscriber — that is the entire point of the chain.
60
+
61
+ ### Known limitation: amber-mono status colours
62
+
63
+ Foundation's CGA `green/red/cyan` primitives are **amber-monochromed** — they resolve to browns (`cga/brightGreen ≈ rgb(203,149,41)`). Because Web DS `color/semantic/status/*` aliases those primitives, **the amber-mono limitation propagates Foundation → Web DS → any app that adopts the chain.** Apps that need *honest* status colour (e.g. a glucose monitor's in-range green) cannot get it by aliasing today.
64
+
65
+ - **DMNC-1001 (this work):** *additively* introduces literal-CGA status primitives in Foundation (`#00AA00`/`#AA0000`/`#00AAAA`) so apps can alias honest colours, without disturbing the amber-mono DOS default.
66
+ - **DMNC-922 (future):** the *full* rationalization — collapse the 16-colour CGA set to ~10 honest primitives, rename `cga/*` → `color/amber/*`, and re-alias every platform DS. Heavier; deliberately out of scope here.
67
+
68
+ ## Aliasing mechanism
69
+
70
+ Cross-file aliasing is done via the figma-console MCP bridge (see `feedback_figma_mcp_preference` / `reference_figma_console_bridge_wsl` in maintainer memory), not REST (REST `/variables` is Enterprise-only):
71
+
72
+ ```js
73
+ const imported = await figma.variables.importVariableByKeyAsync(foundationKey);
74
+ localVar.setValueForMode(modeId, { type: 'VARIABLE_ALIAS', id: imported.id });
75
+ ```
76
+
77
+ - **Resolution map:** `figma-snapshots/foundation-keys.json` maps every Foundation variable *key* → its name. It is generated by resolving the unique Foundation keys referenced by alias targets in `ios.json` + `macos.json` + `web-ds.json`. After adding/renaming Foundation variables, **re-snapshot** so apps/platforms can alias the new keys.
78
+ - **Batching:** ≤86 alias updates per `figma_execute` call is known-safe (one macOS run landed 86 in a single call; the iOS migration ran 316 in batched form). Batch above 86 until empirically tested higher.
79
+ - **Effect Style colours can't bind variables** (2026 Plugin API) — phosphor-glow Effect Styles are literal RGBA; an amber rebrand still needs a manual republish. Effect *numerics* DO bind (`setBoundVariableForEffect`).
80
+ - **Opacity quirk:** `setBoundVariable('opacity', floatVar)` divides the resolved value by 100 — store Figma opacity vars as percent (0–100). The JSON sources keep decimal; Style Dictionary reads JSON, not Figma.
81
+
82
+ ## Sync pipeline
83
+
84
+ - **Forward (npm → Figma):** `scripts/sync-to-figma.ts` writes Markdown specs to `figma-specs/` (repo root). Variable/component-set *creation* in Figma is figma-console MCP work (`figma_batch_create_variables`), not REST.
85
+ - **Reverse (Figma → Swift):** `scripts/sync-figma-to-swift.ts` reads `figma-snapshots/{ios,macos}.json` + `foundation-keys.json` and emits `platforms/swiftui/Sources/EiDotterTokens/Apple{IOS,MacOS}.swift`, resolving cross-file Foundation aliases via the key map. Run `npm run sync-figma-to-swift` after re-snapshotting. CI (`build.yml`) fails if committed Swift drifts from the snapshot.
86
+
87
+ ## Live-verify rule (don't trust stale keys)
88
+
89
+ Figma file keys in the repo can mislead — multiple files are named "Foundation", keys rotate, and the abandoned `qlEyN6` masquerades as the real thing. **Before touching any file, verify it live on the bridge:**
90
+
91
+ 1. `figma_list_open_files` → confirm the target file is connected.
92
+ 2. `figma_navigate` to switch the active target (the bridge reads one active Desktop tab at a time; it cannot *open* files in local mode — the user opens them and starts the bridge plugin).
93
+ 3. `figma_get_variables` (summary) → confirm collections/var counts match expectation **before** any write.
94
+
95
+ iOS DS, macOS DS, and V.37 are documented from snapshots/memory — give each a live pass before modifying it.
96
+
97
+ ## App-adoption recipe (reusable)
98
+
99
+ How an app file adopts the DS. Goal: **no visual change** — every alias must resolve to the same hex the local literal had. Proven on DOSBTS_fig (DMNC-1002).
100
+
101
+ 0. **Confirm the app is in the eidotter DOS design language.** Adoption is *not* for every portfolio Figma file. If the app has its own bespoke palette and aesthetic, it is **not a DS consumer** — skip it. Example: `calendar-365`'s "Sunburst Tokens" are a *light* print-calendar palette (black/gray text, near-white pastel month wedges, gold spoke) with **zero** value-matches to Foundation — forcing adoption would be wrong. Only DOS-amber apps (DOSBTS, DOOMBTS, EatThisDie, …) adopt.
102
+ 1. **Enable libraries** in the app file: Assets → Libraries → enable **eiDotter Foundation** (+ the relevant platform DS, e.g. iOS DS for an iOS app). *Manual Figma UI step — the bridge cannot toggle subscriptions.*
103
+ 2. **Inventory + value-match** the app's local collection (`figma_get_variables` with `resolveAliases`); for each var, find the Foundation var with the **same resolved hex** (keys live in `figma-snapshots/foundation-keys.json`).
104
+ 3. **Re-point matches to aliases**, batched ≤86/call. What can alias **today**:
105
+ - `amber` → `color/cga/amber`; **status → the literal-CGA set** (`success`→`cga-true/green`, `error`→`cga-true/red`, `info`→`cga-true/cyan`) — *not* the amber-mono primitives.
106
+ - **Colours only, for now.** Foundation's Figma file currently exposes only **colours, effect numerics, and fontFamily** as variables — it has **no spacing/radius/type-size variables** — so dimensional/type tokens stay local until Foundation's T3 dimensions are pushed to Figma (follow-up under DMNC-916).
107
+ - keep genuinely app-specific surfaces (e.g. DOSBTS `bg`/`card`/`muted`) **local** — don't force-alias mismatches.
108
+
109
+ > **Accessibility caveat (cga-true/red):** `#AA0000` on the near-black CRT background is ~2.3:1 — below WCAG AA body text (4.5:1). Alias `status/error → cga-true/red` for **fills** (light foreground text over the red), not for error **text** on a dark background. `cga-true/green` (#00AA00) and `cga-true/cyan` (#00AAAA) pass AA body on dark.
110
+
111
+ The mechanism (figma-console / `figma_execute`):
112
+ ```js
113
+ const local = await figma.variables.getVariableByIdAsync(localId);
114
+ const imported = await figma.variables.importVariableByKeyAsync(foundationKey); // key from foundation-keys.json
115
+ local.setValueForMode(modeId, { type: 'VARIABLE_ALIAS', id: imported.id });
116
+ ```
117
+ 4. **Verify no drift:** components/screens bind to the local collection *by name*, so re-pointing values ripples invisibly. Screenshot-diff every screen against pre-refactor captures. (Cross-file aliases resolve to `null`+`aliasTo` in the bridge's resolver — the screenshot, not the resolved value, is the proof.)
118
+ 5. **Spot-check the ripple:** tweak a Foundation amber value and confirm it propagates into the app file, then revert.
119
+
120
+ **Worked example — DOSBTS_fig (DMNC-1002):** of 37 local vars, **5 aliased** — `amber` + `text-primary` → `cga/amber`; `success`/`error`/`info` → `cga-true/green·red·cyan` (the glucose colours, now Foundation-sourced). The rest stayed local: `bg`/`card`/`amber-dark`/`amber-light`/`muted`/`border`/`text-secondary`/`text-muted`/`white` (no Foundation value-match), plus all spacing/radius/type + `font-family` (no Foundation dimension/type vars yet). The Overview screen rendered identically.
121
+
122
+ ## Android (deferred)
123
+
124
+ Not built. Recipe for when un-deferred:
125
+
126
+ 1. Import the **Material 3** Figma community kit as `Android DS`.
127
+ 2. Rebind its colour/type/shape variables to **alias Foundation** (amber DOS) — same mechanism as Web/iOS/macOS.
128
+ 3. Add `Android DS` to the platform-sub-library set; snapshot it (`figma-snapshots/android.json`) and extend the Swift/sync tooling if a Kotlin/Compose token target is added.
129
+ 4. Keep Material-specific shape/elevation tokens local where they have no Foundation equivalent (mirrors macOS Liquid Glass literals).
130
+
131
+ ## References
132
+
133
+ - Linear: DMNC-916 (4-tier taxonomy, parent) · DMNC-1001 (this formalization) · DMNC-922 (full colour rationalization) · DMNC-976 (DOSBTS pipeline) · DMNC-596 / DMNC-802 (Apple forks).
134
+ - `CLAUDE.md` → "Figma Design System" for the condensed in-repo version.
135
+ - `figma-snapshots/{foundation-keys,web-ds,ios,macos}.json`, `scripts/sync-figma-to-swift.ts`, `scripts/sync-to-figma.ts`.
136
+ - `solutions/developer-experience/figma-variable-binding-quirks-2026-05-08.md` (opacity/dot-name quirks).
File without changes
package/package.json CHANGED
@@ -1,11 +1,15 @@
1
1
  {
2
2
  "name": "eidotter",
3
- "version": "0.24.2",
3
+ "version": "0.26.0",
4
4
  "type": "module",
5
5
  "description": "A DOS Themed Design System",
6
6
  "main": "./dist/index.umd.js",
7
7
  "module": "./dist/index.es.js",
8
8
  "types": "./dist/index.d.ts",
9
+ "sideEffects": [
10
+ "**/*.css",
11
+ "**/*.scss"
12
+ ],
9
13
  "exports": {
10
14
  ".": {
11
15
  "types": "./dist/index.d.ts",
@@ -20,14 +24,25 @@
20
24
  "./styles": "./dist/eidotter.css",
21
25
  "./utilities": "./src/styles/dos-utilities.css",
22
26
  "./tailwind.preset": "./tailwind.preset.cjs",
23
- "./tailwind.preset.enhanced": "./tailwind.preset.enhanced.cjs",
24
27
  "./fonts.css": "./src/styles/fonts.css",
25
28
  "./tokens.css": "./src/styles/tokens.css",
26
29
  "./themes/amber-mono.css": "./src/styles/theme.amber-mono.css",
27
30
  "./themes/cga-amber.css": "./src/styles/theme.cga-amber.css",
28
31
  "./themes/cga-mode4-p0.css": "./src/styles/theme.cga-mode4-p0.css",
29
32
  "./themes/cga-mode4-p1.css": "./src/styles/theme.cga-mode4-p1.css",
30
- "./themes/cga-mode5.css": "./src/styles/theme.cga-mode5.css"
33
+ "./themes/cga-mode5.css": "./src/styles/theme.cga-mode5.css",
34
+ "./icons": {
35
+ "types": "./dist/icons/published.d.ts",
36
+ "import": "./dist/icons/published.js"
37
+ },
38
+ "./icons/all": {
39
+ "types": "./dist/icons/index.d.ts",
40
+ "import": "./dist/icons/index.js"
41
+ },
42
+ "./icons/*": {
43
+ "types": "./dist/icons/components/*.d.ts",
44
+ "import": "./dist/icons/components/*.js"
45
+ }
31
46
  },
32
47
  "files": [
33
48
  "dist/index.d.ts",
@@ -35,8 +50,8 @@
35
50
  "dist/index.umd.js",
36
51
  "dist/eidotter.css",
37
52
  "dist/components",
53
+ "dist/icons",
38
54
  "tailwind.preset.cjs",
39
- "tailwind.preset.enhanced.cjs",
40
55
  "src/styles/fonts.css",
41
56
  "src/styles/fonts/Perfect_DOS_VGA_437_Win.ttf",
42
57
  "src/styles/fonts/Perfect_DOS_VGA_437_LICENSE.txt",
@@ -49,7 +64,10 @@
49
64
  ],
50
65
  "scripts": {
51
66
  "dev": "vite",
52
- "build": "vite build && tsc -p tsconfig.build.json",
67
+ "build": "vite build && tsc -p tsconfig.build.json && npm run build-icons",
68
+ "build-icons": "node scripts/icons/build-barrels.mjs && tsc -p tsconfig.icons.json",
69
+ "fetch-icons": "node scripts/icons/fetch-svgs.mjs",
70
+ "generate-icons": "node scripts/icons/build-tsx.mjs && node scripts/icons/build-barrels.mjs",
53
71
  "prepublishOnly": "npm run build",
54
72
  "build-tokens": "node style-dictionary.config.mjs",
55
73
  "lint": "eslint src/ --report-unused-disable-directives --max-warnings 0",
@@ -62,6 +80,7 @@
62
80
  "test": "jest",
63
81
  "create-component": "ts-node scripts/create-component.ts",
64
82
  "sync-to-figma": "ts-node scripts/sync-to-figma.ts",
83
+ "export-figcli-design-md": "ts-node scripts/figcli/export-design-md.ts",
65
84
  "sync-figma-to-swift": "ts-node scripts/sync-figma-to-swift.ts",
66
85
  "validate-tokens": "node scripts/validate-tokens.cjs"
67
86
  },
@@ -109,6 +128,7 @@
109
128
  "@storybook/react": "^10.2.7",
110
129
  "@storybook/react-vite": "^10.2.7",
111
130
  "@storybook/test-runner": "^0.24.3",
131
+ "@tailwindcss/postcss": "^4.3.0",
112
132
  "@testing-library/dom": "^10.4.1",
113
133
  "@testing-library/jest-dom": "^6.6.3",
114
134
  "@testing-library/react": "^16.3.0",
@@ -119,7 +139,6 @@
119
139
  "@types/react": "^19.1.2",
120
140
  "@types/react-dom": "^19.0.0",
121
141
  "@vitejs/plugin-react": "^6.0.2",
122
- "autoprefixer": "^10.4.27",
123
142
  "axe-playwright": "^2.2.2",
124
143
  "chromatic": "^16.2.0",
125
144
  "cross-env": "^10.1.0",
@@ -138,8 +157,7 @@
138
157
  "storybook": "^10.2.7",
139
158
  "style-dictionary": "^5.1.1",
140
159
  "tailwind-merge": "^3.5.0",
141
- "tailwindcss": "^3.4.19",
142
- "tailwindcss-animate": "^1.0.7",
160
+ "tailwindcss": "^4.3.0",
143
161
  "tailwindcss-react-aria-components": "^2.0.1",
144
162
  "ts-jest": "^29.4.0",
145
163
  "ts-node": "^10.9.2",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -29,6 +29,9 @@
29
29
  --color-cga-magenta-glow: rgba(255, 85, 255, 0.5); /** Magenta glow at 50% opacity */
30
30
  --color-cga-blue-glow: rgba(85, 85, 255, 0.5); /** Blue glow at 50% opacity */
31
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. */
32
35
  --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). */
33
36
  --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. */
34
37
  --color-semantic-text-primary: var(--color-cga-amber);
@@ -29,6 +29,9 @@
29
29
  --color-cga-magenta-glow: rgba(255, 85, 255, 0.5); /** Magenta glow at 50% opacity */
30
30
  --color-cga-blue-glow: rgba(85, 85, 255, 0.5); /** Blue glow at 50% opacity */
31
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. */
32
35
  --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). */
33
36
  --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. */
34
37
  --color-semantic-alert-info: #0a1828;
@@ -29,6 +29,9 @@
29
29
  --color-cga-magenta-glow: rgba(255, 85, 255, 0.5); /** Magenta glow at 50% opacity */
30
30
  --color-cga-blue-glow: rgba(85, 85, 255, 0.5); /** Blue glow at 50% opacity */
31
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. */
32
35
  --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). */
33
36
  --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. */
34
37
  --color-semantic-text-primary: #ffff00;
@@ -29,6 +29,9 @@
29
29
  --color-cga-magenta-glow: rgba(255, 85, 255, 0.5); /** Magenta glow at 50% opacity */
30
30
  --color-cga-blue-glow: rgba(85, 85, 255, 0.5); /** Blue glow at 50% opacity */
31
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. */
32
35
  --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). */
33
36
  --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. */
34
37
  --color-semantic-text-primary: #fffcf7;
@@ -29,6 +29,9 @@
29
29
  --color-cga-magenta-glow: rgba(255, 85, 255, 0.5); /** Magenta glow at 50% opacity */
30
30
  --color-cga-blue-glow: rgba(85, 85, 255, 0.5); /** Blue glow at 50% opacity */
31
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. */
32
35
  --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). */
33
36
  --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. */
34
37
  --color-semantic-text-primary: #fffcf7;
@@ -29,6 +29,9 @@
29
29
  --color-cga-magenta-glow: rgba(255, 85, 255, 0.5); /** Magenta glow at 50% opacity */
30
30
  --color-cga-blue-glow: rgba(85, 85, 255, 0.5); /** Blue glow at 50% opacity */
31
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. */
32
35
  --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). */
33
36
  --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. */
34
37
  --color-semantic-alert-info: #1f2228; /** Warm dark blue for info alerts */
@@ -174,6 +177,12 @@
174
177
  --effect-web-power-brightness-warmup-mid: 0.6; /** Warmup-mid brightness (web-only). */
175
178
  --effect-web-power-duration-off: 400ms; /** Web-only power-off animation duration. Apple platforms have own timing curves. */
176
179
  --effect-web-power-duration-on: 600ms; /** Web-only power-on animation duration. */
180
+ --motion-duration-warmup: 400ms; /** phosphor-warmup — CRT ignition brightness flicker on hover entry. Matches var(--duration-slow) at the Button call site. */
181
+ --motion-duration-energize: 150ms; /** phosphor-energize — brightness flash on press / check. */
182
+ --motion-duration-blink: 1000ms; /** blink — cursor / indicator blink cycle (paired with the stepped easing). */
183
+ --motion-easing-warmup: ease-out; /** phosphor-warmup easing. */
184
+ --motion-easing-energize: ease-out; /** phosphor-energize easing (runs forwards). */
185
+ --motion-easing-blink: step-end; /** blink easing — hard step, no interpolation (terminal cursor). */
177
186
  --color-semantic-text-primary: var(--color-cga-light-gray);
178
187
  --color-semantic-text-secondary: var(--color-cga-black);
179
188
  --color-semantic-text-accent: var(--color-cga-yellow);
File without changes
@@ -1,29 +0,0 @@
1
- /**
2
- * Deprecated alias for `eidotter/tailwind.preset`.
3
- *
4
- * REMOVE-IN-0.21.0 — grep this marker when preparing the 0.21.0 release to
5
- * delete this file, the `./tailwind.preset.enhanced` entry in `package.json`
6
- * `exports`, and the matching entry in `files`.
7
- *
8
- * @note Hand-written — NOT generated by `style-dictionary.config.mjs`.
9
- * The sibling `tailwind.preset.cjs` IS generated; do not confuse them.
10
- *
11
- * In v0.19.2, the base and enhanced presets were merged (#282). The single
12
- * `tailwind.preset` now includes all design tokens plus React Aria state
13
- * variants and the animate plugin. This file is a shim so existing consumers
14
- * don't break on upgrade.
15
- *
16
- * Migration:
17
- * - presets: [require('eidotter/tailwind.preset.enhanced')]
18
- * + presets: [require('eidotter/tailwind.preset')]
19
- */
20
-
21
- if (!globalThis.__eidotterEnhancedPresetDeprecationWarned) {
22
- globalThis.__eidotterEnhancedPresetDeprecationWarned = true;
23
- console.warn(
24
- "[eidotter] 'eidotter/tailwind.preset.enhanced' is deprecated since 0.19.2 " +
25
- "and will be removed in 0.21.0. Use 'eidotter/tailwind.preset' instead."
26
- );
27
- }
28
-
29
- module.exports = require('./tailwind.preset.cjs');