@nuvin/components 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/dist/MarkdownBody-XBNXK6P4.js +121 -0
  2. package/dist/app/App.d.ts +24 -0
  3. package/dist/app/App.d.ts.map +1 -0
  4. package/dist/app/AppShell.d.ts +13 -0
  5. package/dist/app/AppShell.d.ts.map +1 -0
  6. package/dist/app/Header.d.ts +11 -0
  7. package/dist/app/Header.d.ts.map +1 -0
  8. package/dist/app/SessionSubHeader.d.ts +15 -0
  9. package/dist/app/SessionSubHeader.d.ts.map +1 -0
  10. package/dist/app/WorkspacePanel.d.ts +15 -0
  11. package/dist/app/WorkspacePanel.d.ts.map +1 -0
  12. package/dist/app/app-shell.styles.d.ts +11 -0
  13. package/dist/app/app-shell.styles.d.ts.map +1 -0
  14. package/dist/app/route-components.d.ts +46 -0
  15. package/dist/app/route-components.d.ts.map +1 -0
  16. package/dist/app/routes.d.ts +11 -0
  17. package/dist/app/routes.d.ts.map +1 -0
  18. package/dist/assets/fonts/inter-latin-400-normal.woff2 +0 -0
  19. package/dist/assets/fonts/inter-latin-500-normal.woff2 +0 -0
  20. package/dist/assets/fonts/inter-latin-600-normal.woff2 +0 -0
  21. package/dist/assets/fonts/inter-latin-700-normal.woff2 +0 -0
  22. package/dist/assets/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  23. package/dist/assets/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  24. package/dist/assets/fonts/jetbrains-mono-latin-600-normal.woff2 +0 -0
  25. package/dist/assets/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
  26. package/dist/chunk-TLWTUPOJ.js +10 -0
  27. package/dist/features/account/auth-gate.d.ts +17 -0
  28. package/dist/features/account/auth-gate.d.ts.map +1 -0
  29. package/dist/features/account/index.d.ts +3 -0
  30. package/dist/features/account/index.d.ts.map +1 -0
  31. package/dist/features/composer/Composer.d.ts +39 -0
  32. package/dist/features/composer/Composer.d.ts.map +1 -0
  33. package/dist/features/composer/QuestionCard.d.ts +21 -0
  34. package/dist/features/composer/QuestionCard.d.ts.map +1 -0
  35. package/dist/features/composer/context-status.d.ts +6 -0
  36. package/dist/features/composer/context-status.d.ts.map +1 -0
  37. package/dist/features/composer/index.d.ts +2 -0
  38. package/dist/features/composer/index.d.ts.map +1 -0
  39. package/dist/features/config/CloudProviderSetup.d.ts +12 -0
  40. package/dist/features/config/CloudProviderSetup.d.ts.map +1 -0
  41. package/dist/features/config/OnboardingGate.d.ts +22 -0
  42. package/dist/features/config/OnboardingGate.d.ts.map +1 -0
  43. package/dist/features/config/ProviderManager.d.ts +15 -0
  44. package/dist/features/config/ProviderManager.d.ts.map +1 -0
  45. package/dist/features/config/WorkspaceManager.d.ts +13 -0
  46. package/dist/features/config/WorkspaceManager.d.ts.map +1 -0
  47. package/dist/features/config/config-client.d.ts +49 -0
  48. package/dist/features/config/config-client.d.ts.map +1 -0
  49. package/dist/features/config/index.d.ts +10 -0
  50. package/dist/features/config/index.d.ts.map +1 -0
  51. package/dist/features/config/protocol-config-client.d.ts +22 -0
  52. package/dist/features/config/protocol-config-client.d.ts.map +1 -0
  53. package/dist/features/config/rest-config-client.d.ts +4 -0
  54. package/dist/features/config/rest-config-client.d.ts.map +1 -0
  55. package/dist/features/config/use-provider-status.d.ts +8 -0
  56. package/dist/features/config/use-provider-status.d.ts.map +1 -0
  57. package/dist/features/daemon-switcher/DaemonAvatar.d.ts +16 -0
  58. package/dist/features/daemon-switcher/DaemonAvatar.d.ts.map +1 -0
  59. package/dist/features/daemon-switcher/DaemonRail.d.ts +18 -0
  60. package/dist/features/daemon-switcher/DaemonRail.d.ts.map +1 -0
  61. package/dist/features/daemon-switcher/DaemonSwitcher.d.ts +17 -0
  62. package/dist/features/daemon-switcher/DaemonSwitcher.d.ts.map +1 -0
  63. package/dist/features/daemon-switcher/index.d.ts +7 -0
  64. package/dist/features/daemon-switcher/index.d.ts.map +1 -0
  65. package/dist/features/diff/DiffView.d.ts +13 -0
  66. package/dist/features/diff/DiffView.d.ts.map +1 -0
  67. package/dist/features/diff/diff.d.ts +23 -0
  68. package/dist/features/diff/diff.d.ts.map +1 -0
  69. package/dist/features/diff/index.d.ts +4 -0
  70. package/dist/features/diff/index.d.ts.map +1 -0
  71. package/dist/features/launcher/SessionItem.d.ts +12 -0
  72. package/dist/features/launcher/SessionItem.d.ts.map +1 -0
  73. package/dist/features/launcher/SessionSidebar.d.ts +24 -0
  74. package/dist/features/launcher/SessionSidebar.d.ts.map +1 -0
  75. package/dist/features/launcher/index.d.ts +5 -0
  76. package/dist/features/launcher/index.d.ts.map +1 -0
  77. package/dist/features/launcher/session-sidebar-model.d.ts +77 -0
  78. package/dist/features/launcher/session-sidebar-model.d.ts.map +1 -0
  79. package/dist/features/launcher/session-status.d.ts +9 -0
  80. package/dist/features/launcher/session-status.d.ts.map +1 -0
  81. package/dist/features/launcher/use-daemon-history.d.ts +17 -0
  82. package/dist/features/launcher/use-daemon-history.d.ts.map +1 -0
  83. package/dist/features/new-session/StartScreen.d.ts +31 -0
  84. package/dist/features/new-session/StartScreen.d.ts.map +1 -0
  85. package/dist/features/new-session/index.d.ts +3 -0
  86. package/dist/features/new-session/index.d.ts.map +1 -0
  87. package/dist/features/new-session/start-screen.styles.d.ts +46 -0
  88. package/dist/features/new-session/start-screen.styles.d.ts.map +1 -0
  89. package/dist/features/picker/Picker.d.ts +23 -0
  90. package/dist/features/picker/Picker.d.ts.map +1 -0
  91. package/dist/features/picker/PickerSession.d.ts +8 -0
  92. package/dist/features/picker/PickerSession.d.ts.map +1 -0
  93. package/dist/features/picker/index.d.ts +6 -0
  94. package/dist/features/picker/index.d.ts.map +1 -0
  95. package/dist/features/picker/picker-model.d.ts +31 -0
  96. package/dist/features/picker/picker-model.d.ts.map +1 -0
  97. package/dist/features/tabs/Tab.d.ts +8 -0
  98. package/dist/features/tabs/Tab.d.ts.map +1 -0
  99. package/dist/features/tabs/TabBar.d.ts +7 -0
  100. package/dist/features/tabs/TabBar.d.ts.map +1 -0
  101. package/dist/features/tabs/index.d.ts +8 -0
  102. package/dist/features/tabs/index.d.ts.map +1 -0
  103. package/dist/features/tabs/tab-model.d.ts +39 -0
  104. package/dist/features/tabs/tab-model.d.ts.map +1 -0
  105. package/dist/features/tabs/tab.styles.d.ts +9 -0
  106. package/dist/features/tabs/tab.styles.d.ts.map +1 -0
  107. package/dist/features/theme/ThemeToggle.d.ts +8 -0
  108. package/dist/features/theme/ThemeToggle.d.ts.map +1 -0
  109. package/dist/features/theme/index.d.ts +5 -0
  110. package/dist/features/theme/index.d.ts.map +1 -0
  111. package/dist/features/theme/themes.d.ts +13 -0
  112. package/dist/features/theme/themes.d.ts.map +1 -0
  113. package/dist/features/theme/use-theme-mode.d.ts +3 -0
  114. package/dist/features/theme/use-theme-mode.d.ts.map +1 -0
  115. package/dist/features/transcript/components/AssistantMessage.d.ts +21 -0
  116. package/dist/features/transcript/components/AssistantMessage.d.ts.map +1 -0
  117. package/dist/features/transcript/components/ChildMessagesContext.d.ts +27 -0
  118. package/dist/features/transcript/components/ChildMessagesContext.d.ts.map +1 -0
  119. package/dist/features/transcript/components/CodeBlock.d.ts +5 -0
  120. package/dist/features/transcript/components/CodeBlock.d.ts.map +1 -0
  121. package/dist/features/transcript/components/MarkdownBody.d.ts +17 -0
  122. package/dist/features/transcript/components/MarkdownBody.d.ts.map +1 -0
  123. package/dist/features/transcript/components/MessageList.d.ts +24 -0
  124. package/dist/features/transcript/components/MessageList.d.ts.map +1 -0
  125. package/dist/features/transcript/components/NestedMessageListContext.d.ts +18 -0
  126. package/dist/features/transcript/components/NestedMessageListContext.d.ts.map +1 -0
  127. package/dist/features/transcript/components/ProcessingIndicator.d.ts +5 -0
  128. package/dist/features/transcript/components/ProcessingIndicator.d.ts.map +1 -0
  129. package/dist/features/transcript/components/styles-test-utils.d.ts +6 -0
  130. package/dist/features/transcript/components/styles-test-utils.d.ts.map +1 -0
  131. package/dist/features/transcript/components/tool-display/BareLine.d.ts +14 -0
  132. package/dist/features/transcript/components/tool-display/BareLine.d.ts.map +1 -0
  133. package/dist/features/transcript/components/tool-display/Card.d.ts +31 -0
  134. package/dist/features/transcript/components/tool-display/Card.d.ts.map +1 -0
  135. package/dist/features/transcript/components/tool-display/Turn.d.ts +15 -0
  136. package/dist/features/transcript/components/tool-display/Turn.d.ts.map +1 -0
  137. package/dist/features/transcript/components/tool-display/index.d.ts +3 -0
  138. package/dist/features/transcript/components/tool-display/index.d.ts.map +1 -0
  139. package/dist/features/transcript/components/tool-display/renderers/AskUserRenderer.d.ts +4 -0
  140. package/dist/features/transcript/components/tool-display/renderers/AskUserRenderer.d.ts.map +1 -0
  141. package/dist/features/transcript/components/tool-display/renderers/AssignTaskRenderer.d.ts +9 -0
  142. package/dist/features/transcript/components/tool-display/renderers/AssignTaskRenderer.d.ts.map +1 -0
  143. package/dist/features/transcript/components/tool-display/renderers/BareToolRenderer.d.ts +8 -0
  144. package/dist/features/transcript/components/tool-display/renderers/BareToolRenderer.d.ts.map +1 -0
  145. package/dist/features/transcript/components/tool-display/renderers/BashRenderer.d.ts +11 -0
  146. package/dist/features/transcript/components/tool-display/renderers/BashRenderer.d.ts.map +1 -0
  147. package/dist/features/transcript/components/tool-display/renderers/FileEditRenderer.d.ts +4 -0
  148. package/dist/features/transcript/components/tool-display/renderers/FileEditRenderer.d.ts.map +1 -0
  149. package/dist/features/transcript/components/tool-display/renderers/FileNewRenderer.d.ts +4 -0
  150. package/dist/features/transcript/components/tool-display/renderers/FileNewRenderer.d.ts.map +1 -0
  151. package/dist/features/transcript/components/tool-display/renderers/TodoWriteRenderer.d.ts +4 -0
  152. package/dist/features/transcript/components/tool-display/renderers/TodoWriteRenderer.d.ts.map +1 -0
  153. package/dist/features/transcript/components/tool-display/renderers/UnknownRenderer.d.ts +4 -0
  154. package/dist/features/transcript/components/tool-display/renderers/UnknownRenderer.d.ts.map +1 -0
  155. package/dist/features/transcript/components/tool-display/tool-icon.d.ts +4 -0
  156. package/dist/features/transcript/components/tool-display/tool-icon.d.ts.map +1 -0
  157. package/dist/features/transcript/components/tool-display/tool-meta.d.ts +9 -0
  158. package/dist/features/transcript/components/tool-display/tool-meta.d.ts.map +1 -0
  159. package/dist/features/transcript/components/tool-display/tool-variants.d.ts +8 -0
  160. package/dist/features/transcript/components/tool-display/tool-variants.d.ts.map +1 -0
  161. package/dist/features/transcript/components/tool-display/types.d.ts +11 -0
  162. package/dist/features/transcript/components/tool-display/types.d.ts.map +1 -0
  163. package/dist/features/transcript/hooks/use-live-tick.d.ts +8 -0
  164. package/dist/features/transcript/hooks/use-live-tick.d.ts.map +1 -0
  165. package/dist/features/transcript/hooks/use-revealed-text.d.ts +28 -0
  166. package/dist/features/transcript/hooks/use-revealed-text.d.ts.map +1 -0
  167. package/dist/features/transcript/index.d.ts +6 -0
  168. package/dist/features/transcript/index.d.ts.map +1 -0
  169. package/dist/features/transcript/lib/message-groups.d.ts +9 -0
  170. package/dist/features/transcript/lib/message-groups.d.ts.map +1 -0
  171. package/dist/features/transcript/lib/preview-lines.d.ts +27 -0
  172. package/dist/features/transcript/lib/preview-lines.d.ts.map +1 -0
  173. package/dist/features/transcript/lib/processing-state.d.ts +16 -0
  174. package/dist/features/transcript/lib/processing-state.d.ts.map +1 -0
  175. package/dist/features/transcript/lib/reasoning-label.d.ts +9 -0
  176. package/dist/features/transcript/lib/reasoning-label.d.ts.map +1 -0
  177. package/dist/features/transcript/lib/tool-format-utils.d.ts +29 -0
  178. package/dist/features/transcript/lib/tool-format-utils.d.ts.map +1 -0
  179. package/dist/features/transcript/lib/tool-formatters.d.ts +45 -0
  180. package/dist/features/transcript/lib/tool-formatters.d.ts.map +1 -0
  181. package/dist/features/transcript/lib/tool-status.d.ts +39 -0
  182. package/dist/features/transcript/lib/tool-status.d.ts.map +1 -0
  183. package/dist/features/transcript/lib/transcript-rows.d.ts +15 -0
  184. package/dist/features/transcript/lib/transcript-rows.d.ts.map +1 -0
  185. package/dist/features/transcript/lib/turn-groups.d.ts +20 -0
  186. package/dist/features/transcript/lib/turn-groups.d.ts.map +1 -0
  187. package/dist/features/transcript/lib/turn-summary.d.ts +11 -0
  188. package/dist/features/transcript/lib/turn-summary.d.ts.map +1 -0
  189. package/dist/features/workflows/WorkflowsPanel.d.ts +11 -0
  190. package/dist/features/workflows/WorkflowsPanel.d.ts.map +1 -0
  191. package/dist/features/workflows/index.d.ts +3 -0
  192. package/dist/features/workflows/index.d.ts.map +1 -0
  193. package/dist/index.d.ts +45 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +7877 -0
  196. package/dist/session/client-commands.d.ts +26 -0
  197. package/dist/session/client-commands.d.ts.map +1 -0
  198. package/dist/session/commands.d.ts +9 -0
  199. package/dist/session/commands.d.ts.map +1 -0
  200. package/dist/session/directory-source.d.ts +101 -0
  201. package/dist/session/directory-source.d.ts.map +1 -0
  202. package/dist/session/directory-status.d.ts +8 -0
  203. package/dist/session/directory-status.d.ts.map +1 -0
  204. package/dist/session/directory.d.ts +41 -0
  205. package/dist/session/directory.d.ts.map +1 -0
  206. package/dist/session/index.d.ts +16 -0
  207. package/dist/session/index.d.ts.map +1 -0
  208. package/dist/session/snapshot.d.ts +11 -0
  209. package/dist/session/snapshot.d.ts.map +1 -0
  210. package/dist/session/store.d.ts +96 -0
  211. package/dist/session/store.d.ts.map +1 -0
  212. package/dist/session/tool-timing.d.ts +14 -0
  213. package/dist/session/tool-timing.d.ts.map +1 -0
  214. package/dist/session/transport.d.ts +187 -0
  215. package/dist/session/transport.d.ts.map +1 -0
  216. package/dist/session/types.d.ts +73 -0
  217. package/dist/session/types.d.ts.map +1 -0
  218. package/dist/session/use-directory.d.ts +54 -0
  219. package/dist/session/use-directory.d.ts.map +1 -0
  220. package/dist/session/use-session-transport.d.ts +10 -0
  221. package/dist/session/use-session-transport.d.ts.map +1 -0
  222. package/dist/shared/hooks/use-stick-to-bottom-sentinel.d.ts +64 -0
  223. package/dist/shared/hooks/use-stick-to-bottom-sentinel.d.ts.map +1 -0
  224. package/dist/shared/lib/navigation.d.ts +20 -0
  225. package/dist/shared/lib/navigation.d.ts.map +1 -0
  226. package/dist/shared/lib/toast.d.ts +35 -0
  227. package/dist/shared/lib/toast.d.ts.map +1 -0
  228. package/dist/shared/lib/utils.d.ts +3 -0
  229. package/dist/shared/lib/utils.d.ts.map +1 -0
  230. package/dist/shared/ui/CopyButton.d.ts +6 -0
  231. package/dist/shared/ui/CopyButton.d.ts.map +1 -0
  232. package/dist/shared/ui/avatar.d.ts +9 -0
  233. package/dist/shared/ui/avatar.d.ts.map +1 -0
  234. package/dist/shared/ui/badge.d.ts +8 -0
  235. package/dist/shared/ui/badge.d.ts.map +1 -0
  236. package/dist/shared/ui/button.d.ts +11 -0
  237. package/dist/shared/ui/button.d.ts.map +1 -0
  238. package/dist/shared/ui/command.d.ts +10 -0
  239. package/dist/shared/ui/command.d.ts.map +1 -0
  240. package/dist/shared/ui/confirm-dialog.d.ts +17 -0
  241. package/dist/shared/ui/confirm-dialog.d.ts.map +1 -0
  242. package/dist/shared/ui/dropdown-menu.d.ts +9 -0
  243. package/dist/shared/ui/dropdown-menu.d.ts.map +1 -0
  244. package/dist/shared/ui/input.d.ts +3 -0
  245. package/dist/shared/ui/input.d.ts.map +1 -0
  246. package/dist/shared/ui/kbd.d.ts +3 -0
  247. package/dist/shared/ui/kbd.d.ts.map +1 -0
  248. package/dist/shared/ui/popover.d.ts +7 -0
  249. package/dist/shared/ui/popover.d.ts.map +1 -0
  250. package/dist/shared/ui/scroll-area.d.ts +5 -0
  251. package/dist/shared/ui/scroll-area.d.ts.map +1 -0
  252. package/dist/shared/ui/tabs.d.ts +7 -0
  253. package/dist/shared/ui/tabs.d.ts.map +1 -0
  254. package/dist/shared/ui/toast.d.ts +7 -0
  255. package/dist/shared/ui/toast.d.ts.map +1 -0
  256. package/dist/shared/ui/tooltip.d.ts +7 -0
  257. package/dist/shared/ui/tooltip.d.ts.map +1 -0
  258. package/dist/styles/base.css +49 -0
  259. package/dist/styles/components.css +206 -0
  260. package/dist/styles/effects.css +76 -0
  261. package/dist/styles/fonts.css +49 -0
  262. package/dist/styles/index.css +14 -0
  263. package/dist/styles/styles.test.ts +45 -0
  264. package/dist/styles/themes.css +33 -0
  265. package/dist/styles/tokens.css +245 -0
  266. package/dist/styles/tokens.test.ts +113 -0
  267. package/dist/test-setup.d.ts +29 -0
  268. package/dist/test-setup.d.ts.map +1 -0
  269. package/package.json +71 -0
@@ -0,0 +1,206 @@
1
+ /* Tape-label header strip — "// SECTION_NAME [meta]" */
2
+ .nv-tape {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: 8px;
6
+ padding: 2px 10px;
7
+ font: 600 10.5px / 1.4 var(--nv-mono);
8
+ letter-spacing: 0.14em;
9
+ text-transform: uppercase;
10
+ color: var(--color-background);
11
+ background: var(--color-accent);
12
+ clip-path: polygon(0 0, calc(100% - 8px) 0, 100% 50%, calc(100% - 8px) 100%, 0 100%);
13
+ }
14
+
15
+ /* Status chip — square, mono */
16
+ .nv-chip {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ gap: 6px;
20
+ max-width: 100%;
21
+ min-width: 0;
22
+ padding: 4px 10px;
23
+ font: 500 11px / 1.2 var(--nv-mono);
24
+ letter-spacing: 0.04em;
25
+ color: var(--color-muted);
26
+ background: var(--color-panel);
27
+ border: 1px solid var(--color-border);
28
+ }
29
+ .nv-chip[data-tone="ok"] {
30
+ color: var(--color-accent);
31
+ border-color: var(--color-accent);
32
+ box-shadow:
33
+ inset 0 0 0 1px color-mix(in srgb, var(--color-accent) 18%, transparent),
34
+ 0 0 12px -4px color-mix(in srgb, var(--color-accent) 60%, transparent);
35
+ }
36
+ .nv-chip[data-tone="busy"] {
37
+ color: var(--color-accent-soft);
38
+ border-color: var(--color-accent-soft);
39
+ animation: nv-pulse 1.6s ease-in-out infinite;
40
+ }
41
+ .nv-chip[data-tone="error"] {
42
+ color: var(--color-error);
43
+ border-color: var(--color-error);
44
+ }
45
+ .nv-chip > span:last-child {
46
+ min-width: 0;
47
+ overflow: hidden;
48
+ text-overflow: ellipsis;
49
+ white-space: nowrap;
50
+ }
51
+ .nv-theme-toggle {
52
+ cursor: pointer;
53
+ outline: none;
54
+ text-transform: uppercase;
55
+ transition:
56
+ color 120ms ease,
57
+ border-color 120ms ease;
58
+ }
59
+ .nv-theme-toggle:hover {
60
+ color: var(--color-text);
61
+ border-color: var(--color-text);
62
+ }
63
+ .nv-theme-toggle:focus-visible {
64
+ color: var(--color-accent);
65
+ border-color: var(--color-accent);
66
+ box-shadow: 0 0 0 1px var(--color-accent);
67
+ }
68
+ .nv-theme-toggle > svg {
69
+ flex: 0 0 auto;
70
+ }
71
+ .nv-chip-dot {
72
+ width: 6px;
73
+ height: 6px;
74
+ background: currentColor;
75
+ display: inline-block;
76
+ flex: 0 0 auto;
77
+ }
78
+
79
+ @keyframes nv-pulse {
80
+ 0%,
81
+ 100% {
82
+ opacity: 1;
83
+ }
84
+ 50% {
85
+ opacity: 0.55;
86
+ }
87
+ }
88
+
89
+ @keyframes nv-blink {
90
+ 0%,
91
+ 49% {
92
+ opacity: 1;
93
+ }
94
+ 50%,
95
+ 100% {
96
+ opacity: 0;
97
+ }
98
+ }
99
+
100
+ .nv-caret::after {
101
+ content: "▍";
102
+ margin-left: 2px;
103
+ color: var(--color-accent);
104
+ animation: nv-blink 1s steps(1) infinite;
105
+ }
106
+
107
+ /* Composer
108
+ The composer textarea is restyled to the prototype shell via Tailwind token
109
+ utilities in Composer.tsx (Phase 3, Task 8); its `.nv-input` rules were
110
+ retired. The composer/approval buttons were migrated to the `Button`
111
+ primitive (Phase 3, Tasks 8-9); `.nv-btn*` is retained only because
112
+ QuestionCard / StartScreen still emit it (deferred surfaces). */
113
+ .nv-btn {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ gap: 8px;
118
+ min-height: 44px;
119
+ padding: 10px 16px;
120
+ font: 600 12px / 1 var(--nv-mono);
121
+ letter-spacing: 0.12em;
122
+ text-transform: uppercase;
123
+ background: transparent;
124
+ color: var(--color-text);
125
+ border: 1px solid var(--color-border);
126
+ cursor: pointer;
127
+ transition: all 120ms ease;
128
+ }
129
+ .nv-btn:hover:not(:disabled) {
130
+ border-color: var(--color-accent);
131
+ color: var(--color-accent);
132
+ }
133
+ .nv-btn:focus-visible {
134
+ outline: none;
135
+ border-color: var(--color-accent);
136
+ box-shadow: 0 0 0 1px var(--color-accent);
137
+ }
138
+ .nv-btn:disabled {
139
+ opacity: 0.4;
140
+ cursor: not-allowed;
141
+ }
142
+ .nv-btn-primary {
143
+ background: var(--color-accent);
144
+ color: var(--color-background);
145
+ border-color: var(--color-accent);
146
+ }
147
+ .nv-btn-primary:hover:not(:disabled) {
148
+ background: var(--color-accent-soft);
149
+ border-color: var(--color-accent-soft);
150
+ color: var(--color-background);
151
+ box-shadow: 0 0 24px -6px color-mix(in srgb, var(--color-accent) 80%, transparent);
152
+ }
153
+
154
+ /* Code/result preview block — JS-side hook with content-visibility tuning. */
155
+ .nv-pre {
156
+ overflow-x: auto;
157
+ content-visibility: auto;
158
+ contain-intrinsic-size: auto 200px;
159
+ }
160
+
161
+ /* Diff view styling migrated to prototype DiffBlock token utilities in
162
+ DiffView.tsx (nuvin-web.html lines 197-218). The `.nv-diff*` class names
163
+ remain as JS-side hooks only (no CSS rules). */
164
+
165
+ /* Empty state */
166
+ .nv-empty {
167
+ display: flex;
168
+ flex-direction: column;
169
+ gap: 6px;
170
+ align-items: center;
171
+ justify-content: center;
172
+ padding: 48px 24px;
173
+ text-align: center;
174
+ border: 1px dashed var(--color-border);
175
+ color: var(--color-muted);
176
+ font: 400 13px / 1.6 var(--nv-mono);
177
+ }
178
+
179
+ /* tool-display: node pulse (running/approved) + body reveal */
180
+ @keyframes nv-node-pulse {
181
+ 0%,
182
+ 100% {
183
+ opacity: 1;
184
+ }
185
+ 50% {
186
+ opacity: 0.55;
187
+ }
188
+ }
189
+ @keyframes nv-reveal {
190
+ from {
191
+ opacity: 0;
192
+ transform: translateY(-2px);
193
+ }
194
+ to {
195
+ opacity: 1;
196
+ transform: translateY(0);
197
+ }
198
+ }
199
+
200
+ /* Assistant markdown tables (streamdown) — the app's global base font is
201
+ monospace (Terminal Brutalism); render tabular data in sans so it reads like
202
+ streamdown's intended default. Inline-code chips inside keep their own
203
+ font-mono override. */
204
+ [data-streamdown="table-wrapper"] {
205
+ font-family: var(--nv-sans);
206
+ }
@@ -0,0 +1,76 @@
1
+ /* Global CRT scanline + dot-grid backdrop */
2
+ .nv-crt {
3
+ position: relative;
4
+ isolation: isolate;
5
+ }
6
+ .nv-crt::before {
7
+ content: "";
8
+ position: fixed;
9
+ inset: 0;
10
+ pointer-events: none;
11
+ z-index: 0;
12
+ background-image:
13
+ repeating-linear-gradient(
14
+ 0deg,
15
+ rgba(var(--nv-scanline-rgb), var(--nv-scanline-alpha)) 0px,
16
+ rgba(var(--nv-scanline-rgb), var(--nv-scanline-alpha)) 1px,
17
+ transparent 1px,
18
+ transparent 3px
19
+ ),
20
+ radial-gradient(
21
+ circle at 1px 1px,
22
+ rgba(var(--nv-scanline-rgb), var(--nv-grid-alpha)) 1px,
23
+ transparent 0
24
+ );
25
+ background-size:
26
+ 100% 3px,
27
+ 24px 24px;
28
+ mix-blend-mode: var(--nv-crt-blend);
29
+ }
30
+ .nv-crt::after {
31
+ content: "";
32
+ position: fixed;
33
+ inset: 0;
34
+ pointer-events: none;
35
+ z-index: 0;
36
+ background: radial-gradient(ellipse at center, transparent 55%, var(--nv-vignette-color) 100%);
37
+ }
38
+
39
+ /* Corner-bracket frame — pure CSS, sharp, brutalist */
40
+ .nv-frame {
41
+ position: relative;
42
+ border: 1px solid var(--color-border);
43
+ background: var(--color-panel);
44
+ }
45
+ .nv-frame::before,
46
+ .nv-frame::after,
47
+ .nv-frame > .nv-frame-bl,
48
+ .nv-frame > .nv-frame-br {
49
+ content: "";
50
+ position: absolute;
51
+ width: var(--nv-bracket-size);
52
+ height: var(--nv-bracket-size);
53
+ border-color: var(--color-accent);
54
+ border-style: solid;
55
+ pointer-events: none;
56
+ }
57
+ .nv-frame::before {
58
+ top: -1px;
59
+ left: -1px;
60
+ border-width: var(--nv-bracket-thickness) 0 0 var(--nv-bracket-thickness);
61
+ }
62
+ .nv-frame::after {
63
+ top: -1px;
64
+ right: -1px;
65
+ border-width: var(--nv-bracket-thickness) var(--nv-bracket-thickness) 0 0;
66
+ }
67
+ .nv-frame > .nv-frame-bl {
68
+ bottom: -1px;
69
+ left: -1px;
70
+ border-width: 0 0 var(--nv-bracket-thickness) var(--nv-bracket-thickness);
71
+ }
72
+ .nv-frame > .nv-frame-br {
73
+ bottom: -1px;
74
+ right: -1px;
75
+ border-width: 0 var(--nv-bracket-thickness) var(--nv-bracket-thickness) 0;
76
+ }
@@ -0,0 +1,49 @@
1
+ @font-face {
2
+ font-family: "Inter";
3
+ font-style: normal;
4
+ font-weight: 400;
5
+ font-display: swap;
6
+ src: url("../assets/fonts/inter-latin-400-normal.woff2") format("woff2");
7
+ }
8
+ @font-face {
9
+ font-family: "Inter";
10
+ font-style: normal;
11
+ font-weight: 500;
12
+ font-display: swap;
13
+ src: url("../assets/fonts/inter-latin-500-normal.woff2") format("woff2");
14
+ }
15
+ @font-face {
16
+ font-family: "Inter";
17
+ font-style: normal;
18
+ font-weight: 600;
19
+ font-display: swap;
20
+ src: url("../assets/fonts/inter-latin-600-normal.woff2") format("woff2");
21
+ }
22
+ @font-face {
23
+ font-family: "Inter";
24
+ font-style: normal;
25
+ font-weight: 700;
26
+ font-display: swap;
27
+ src: url("../assets/fonts/inter-latin-700-normal.woff2") format("woff2");
28
+ }
29
+ @font-face {
30
+ font-family: "JetBrains Mono";
31
+ font-style: normal;
32
+ font-weight: 400;
33
+ font-display: swap;
34
+ src: url("../assets/fonts/jetbrains-mono-latin-400-normal.woff2") format("woff2");
35
+ }
36
+ @font-face {
37
+ font-family: "JetBrains Mono";
38
+ font-style: normal;
39
+ font-weight: 500;
40
+ font-display: swap;
41
+ src: url("../assets/fonts/jetbrains-mono-latin-500-normal.woff2") format("woff2");
42
+ }
43
+ @font-face {
44
+ font-family: "JetBrains Mono";
45
+ font-style: normal;
46
+ font-weight: 600;
47
+ font-display: swap;
48
+ src: url("../assets/fonts/jetbrains-mono-latin-600-normal.woff2") format("woff2");
49
+ }
@@ -0,0 +1,14 @@
1
+ @import "tailwindcss";
2
+ @import "./tokens.css";
3
+ @import "./fonts.css";
4
+ @import "./base.css";
5
+ @import "./effects.css";
6
+ @import "./components.css";
7
+ @import "./themes.css";
8
+
9
+ @source "../../node_modules/streamdown/dist/*.js";
10
+ /* Scan this package's own bundled JS output so downstream consumers pick up
11
+ component class names. Resolves to the dist tree (one level up from this
12
+ file, which lives at dist/styles). This CSS ships uncompiled; the consumer's
13
+ Tailwind resolves the directive. */
14
+ @source "../**/*.js";
@@ -0,0 +1,45 @@
1
+ // @vitest-environment node
2
+ import { readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { describe, expect, it } from "vitest";
5
+
6
+ function readStyles(): string {
7
+ const dir = join(process.cwd(), "src/styles");
8
+ return ["base.css", "effects.css", "components.css", "themes.css"]
9
+ .map((f) => readFileSync(join(dir, f), "utf8"))
10
+ .join("\n");
11
+ }
12
+
13
+ const styles = readStyles();
14
+
15
+ describe("web styles", () => {
16
+ it("contains expected structural CSS class markers", () => {
17
+ // Positive presence guards: if these selectors are missing (block dropped during split),
18
+ // assertions below would vacuously pass on empty strings — catch that early.
19
+ expect(styles).toContain(":root {");
20
+ expect(styles).toContain(".nv-crt {");
21
+ expect(styles).toContain(".nv-frame {");
22
+ expect(styles).toContain(".nv-tape {");
23
+ expect(styles).toContain(".nv-chip {");
24
+ expect(styles).toContain(".nv-empty {");
25
+ expect(styles).toContain('[data-theme="dark"] {');
26
+ });
27
+
28
+ it("keeps the tool-display keyframes that back the continuous-spine renderers", () => {
29
+ // The v2 tool-display system (components/tool-display/) is pure Tailwind + CVA;
30
+ // the only CSS it relies on are these two keyframes (node pulse + body reveal),
31
+ // referenced via motion-safe:animate-[nv-node-pulse...] / animate-[nv-reveal...].
32
+ // The old `.nv-tool-*` rules were removed with the tool-renders system.
33
+ expect(styles).toContain("@keyframes nv-node-pulse");
34
+ expect(styles).toContain("@keyframes nv-reveal");
35
+ expect(styles).not.toContain(".nv-tool-row");
36
+ expect(styles).not.toContain(".nv-tool-head");
37
+ });
38
+
39
+ it("does not use neon-like accent colors in selectable themes", () => {
40
+ expect(styles).not.toContain("#22c55e");
41
+ expect(styles).not.toContain("#86efac");
42
+ expect(styles).not.toContain("#facc15");
43
+ expect(styles).not.toContain("#fef08a");
44
+ });
45
+ });
@@ -0,0 +1,33 @@
1
+ /* Legacy --color-* aliases consumed by the not-yet-migrated .nv-* sheets.
2
+ Re-keyed onto data-theme; removed entirely in Phase 3 when the .nv-* CSS is retired. */
3
+ [data-theme="dark"] {
4
+ color-scheme: dark;
5
+ --color-accent: #f97316;
6
+ --color-accent-soft: #fdba74;
7
+ --color-background: #050505;
8
+ --color-border: #2a2a2a;
9
+ --color-error: #ef4444;
10
+ --color-muted: #a3a3a3;
11
+ --color-panel: #111111;
12
+ --color-panel-elevated: rgba(23, 23, 23, 1);
13
+ --color-text: #fafafa;
14
+ }
15
+
16
+ [data-theme="light"] {
17
+ color-scheme: light;
18
+ --color-accent: #ea580c;
19
+ --color-accent-soft: #c2410c;
20
+ --color-background: #fafafa;
21
+ --color-border: #d4d4d4;
22
+ --color-error: #dc2626;
23
+ --color-muted: #525252;
24
+ --color-panel: #f0f0f0;
25
+ --color-panel-elevated: rgba(255, 255, 255, 1);
26
+ --color-text: #0a0a0a;
27
+ /* Tune the CRT overlay so it stays subtle on a light background. */
28
+ --nv-scanline-rgb: 0, 0, 0;
29
+ --nv-scanline-alpha: 0.02;
30
+ --nv-grid-alpha: 0.04;
31
+ --nv-crt-blend: multiply;
32
+ --nv-vignette-color: rgba(0, 0, 0, 0.06);
33
+ }
@@ -0,0 +1,245 @@
1
+ /* tokens.css — canonical design tokens (Strategy A).
2
+ Token vocabulary is lifted verbatim from nuvin-web.html (lines 17-36).
3
+ shadcn token names are ALIASED onto this vocabulary below.
4
+
5
+ NOTE ON --accent: the prototype's --accent is the brand blue and stays
6
+ canonical (organisms use it directly). shadcn ALSO defines --accent for
7
+ muted hover surfaces; aliasing it would clobber the brand token. We
8
+ therefore do NOT define shadcn's --accent (nor its paired foreground) at all.
9
+ shadcn's brand role is served by --primary (-> var(--accent)). shadcn
10
+ components that reference --accent for hover are hand-rethemed to
11
+ bg-surface-hover during the per-component retheme. */
12
+
13
+ :root,
14
+ [data-theme="dark"] {
15
+ /* >>> VERBATIM from nuvin-web.html line 18-25 <<< */
16
+ --bg-base: oklch(15% 0.012 264);
17
+ --bg-raised: oklch(18% 0.014 264);
18
+ --bg-overlay: oklch(21% 0.014 264);
19
+ --bg-inset: oklch(12% 0.01 264);
20
+ --bg-sunken: oklch(9% 0.008 264);
21
+ --bg-hover: oklch(24% 0.014 264);
22
+ --fg-primary: oklch(94% 0.004 264);
23
+ --fg-secondary: oklch(73% 0.008 264);
24
+ --fg-tertiary: oklch(52% 0.01 264);
25
+ --fg-quaternary: oklch(38% 0.01 264);
26
+ --fg-on-accent: oklch(98% 0.002 264);
27
+ --border-subtle: oklch(26% 0.012 264 / 50%);
28
+ --border-default: oklch(28% 0.012 264);
29
+ --border-strong: oklch(36% 0.014 264);
30
+ --border-focus: oklch(62% 0.16 263);
31
+ --accent: oklch(63% 0.19 263);
32
+ --accent-hover: oklch(68% 0.19 263);
33
+ --accent-subtle: oklch(63% 0.19 263 / 12%);
34
+ --accent-border: oklch(63% 0.19 263 / 35%);
35
+ --success: oklch(68% 0.15 155);
36
+ --success-subtle: oklch(68% 0.15 155 / 10%);
37
+ --danger: oklch(62% 0.19 22);
38
+ --danger-subtle: oklch(62% 0.19 22 / 10%);
39
+ --warning: oklch(72% 0.14 75);
40
+ --warning-subtle: oklch(72% 0.14 75 / 10%);
41
+ --syn-keyword: oklch(72% 0.14 290);
42
+ --syn-string: oklch(72% 0.15 155);
43
+ --syn-fn: oklch(75% 0.13 230);
44
+ --syn-var: oklch(82% 0.02 264);
45
+ --syn-comment: oklch(48% 0.01 264);
46
+ --syn-punct: oklch(60% 0.008 264);
47
+ --diff-add-bg: oklch(68% 0.15 155 / 6%);
48
+ --diff-add-fg: oklch(72% 0.15 155);
49
+ --diff-del-bg: oklch(62% 0.19 22 / 6%);
50
+ --diff-del-fg: oklch(68% 0.16 22);
51
+ --diff-line-num: oklch(40% 0.01 264);
52
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
53
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.25);
54
+ --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.35);
55
+ --ring-focus: 0 0 0 2px var(--bg-sunken), 0 0 0 4px var(--accent);
56
+
57
+ /* shadcn alias block (Strategy A) — dark */
58
+ --background: var(--bg-base);
59
+ --foreground: var(--fg-primary);
60
+ --card: var(--bg-raised);
61
+ --card-foreground: var(--fg-primary);
62
+ --popover: var(--bg-overlay);
63
+ --popover-foreground: var(--fg-primary);
64
+ --primary: var(--accent);
65
+ --primary-foreground: var(--fg-on-accent);
66
+ --secondary: var(--bg-overlay);
67
+ --secondary-foreground: var(--fg-secondary);
68
+ --muted: var(--bg-inset);
69
+ --muted-foreground: var(--fg-tertiary);
70
+ --destructive: var(--danger);
71
+ --destructive-foreground: var(--fg-on-accent);
72
+ --border: var(--border-default);
73
+ --input: var(--border-default);
74
+ --ring: var(--border-focus);
75
+ --radius: 0.5rem;
76
+ /* NOTE: shadcn --accent (and its paired foreground) intentionally NOT defined. */
77
+ }
78
+
79
+ [data-theme="light"] {
80
+ /* >>> VERBATIM from nuvin-web.html line 28-35 <<< */
81
+ --bg-base: oklch(98% 0.001 264);
82
+ --bg-raised: oklch(100% 0 0);
83
+ --bg-overlay: oklch(96% 0.002 264);
84
+ --bg-inset: oklch(96% 0.002 264);
85
+ --bg-sunken: oklch(94% 0.003 264);
86
+ --bg-hover: oklch(96% 0.004 264);
87
+ --fg-primary: oklch(20% 0.012 264);
88
+ --fg-secondary: oklch(45% 0.01 264);
89
+ --fg-tertiary: oklch(55% 0.008 264);
90
+ --fg-quaternary: oklch(68% 0.006 264);
91
+ --fg-on-accent: oklch(99% 0.002 264);
92
+ --border-subtle: oklch(90% 0.004 264 / 60%);
93
+ --border-default: oklch(88% 0.005 264);
94
+ --border-strong: oklch(80% 0.008 264);
95
+ --border-focus: oklch(52% 0.16 263);
96
+ --accent: oklch(53% 0.19 263);
97
+ --accent-hover: oklch(48% 0.18 263);
98
+ --accent-subtle: oklch(53% 0.19 263 / 8%);
99
+ --accent-border: oklch(53% 0.19 263 / 25%);
100
+ --success: oklch(52% 0.15 155);
101
+ --success-subtle: oklch(52% 0.15 155 / 8%);
102
+ --danger: oklch(52% 0.19 22);
103
+ --danger-subtle: oklch(52% 0.19 22 / 8%);
104
+ --warning: oklch(60% 0.15 60);
105
+ --warning-subtle: oklch(60% 0.15 60 / 8%);
106
+ --syn-keyword: oklch(50% 0.19 290);
107
+ --syn-string: oklch(42% 0.15 155);
108
+ --syn-fn: oklch(48% 0.15 230);
109
+ --syn-var: oklch(25% 0.02 264);
110
+ --syn-comment: oklch(55% 0.008 264);
111
+ --syn-punct: oklch(50% 0.006 264);
112
+ --diff-add-bg: oklch(52% 0.15 155 / 6%);
113
+ --diff-add-fg: oklch(38% 0.15 155);
114
+ --diff-del-bg: oklch(52% 0.19 22 / 5%);
115
+ --diff-del-fg: oklch(45% 0.18 22);
116
+ --diff-line-num: oklch(70% 0.006 264);
117
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
118
+ --shadow-md: 0 3px 8px rgba(0, 0, 0, 0.06);
119
+ --shadow-lg: 0 12px 28px rgba(0, 0, 0, 0.08);
120
+ --ring-focus: 0 0 0 2px var(--bg-sunken), 0 0 0 4px var(--accent);
121
+
122
+ /* shadcn alias block (Strategy A) — light (same alias mapping, re-declared so it
123
+ resolves against the light vocab) */
124
+ --background: var(--bg-base);
125
+ --foreground: var(--fg-primary);
126
+ --card: var(--bg-raised);
127
+ --card-foreground: var(--fg-primary);
128
+ --popover: var(--bg-overlay);
129
+ --popover-foreground: var(--fg-primary);
130
+ --primary: var(--accent);
131
+ --primary-foreground: var(--fg-on-accent);
132
+ --secondary: var(--bg-overlay);
133
+ --secondary-foreground: var(--fg-secondary);
134
+ --muted: var(--bg-inset);
135
+ --muted-foreground: var(--fg-tertiary);
136
+ --destructive: var(--danger);
137
+ --destructive-foreground: var(--fg-on-accent);
138
+ --border: var(--border-default);
139
+ --input: var(--border-default);
140
+ --ring: var(--border-focus);
141
+ --radius: 0.5rem;
142
+ /* shadcn --accent (and its paired foreground) intentionally NOT defined. */
143
+ }
144
+
145
+ /* Tailwind v4: map tokens -> color utilities so organisms use utilities, not raw var(). */
146
+ @theme inline {
147
+ --color-surface-base: var(--bg-base);
148
+ --color-surface-raised: var(--bg-raised);
149
+ --color-surface-overlay: var(--bg-overlay);
150
+ --color-surface-inset: var(--bg-inset);
151
+ --color-surface-sunken: var(--bg-sunken);
152
+ --color-surface-hover: var(--bg-hover);
153
+ --color-fg-primary: var(--fg-primary);
154
+ --color-fg-secondary: var(--fg-secondary);
155
+ --color-fg-tertiary: var(--fg-tertiary);
156
+ --color-fg-quaternary: var(--fg-quaternary);
157
+ --color-fg-on-accent: var(--fg-on-accent);
158
+ --color-accent: var(--accent);
159
+ --color-accent-hover: var(--accent-hover);
160
+ --color-accent-subtle: var(--accent-subtle);
161
+ --color-accent-border: var(--accent-border);
162
+ --color-border-subtle: var(--border-subtle);
163
+ --color-border-default: var(--border-default);
164
+ --color-border-strong: var(--border-strong);
165
+ --color-border-focus: var(--border-focus);
166
+ --color-success: var(--success);
167
+ --color-success-subtle: var(--success-subtle);
168
+ --color-danger: var(--danger);
169
+ --color-danger-subtle: var(--danger-subtle);
170
+ --color-warning: var(--warning);
171
+ --color-warning-subtle: var(--warning-subtle);
172
+ --color-syn-keyword: var(--syn-keyword);
173
+ --color-syn-string: var(--syn-string);
174
+ --color-syn-fn: var(--syn-fn);
175
+ --color-syn-var: var(--syn-var);
176
+ --color-syn-comment: var(--syn-comment);
177
+ --color-syn-punct: var(--syn-punct);
178
+ --color-diff-add-bg: var(--diff-add-bg);
179
+ --color-diff-add-fg: var(--diff-add-fg);
180
+ --color-diff-del-bg: var(--diff-del-bg);
181
+ --color-diff-del-fg: var(--diff-del-fg);
182
+ --color-diff-line-num: var(--diff-line-num);
183
+
184
+ /* shadcn-token bridge for streamdown's components (table, blockquote, etc.).
185
+ streamdown is authored entirely against shadcn names; our theme avoids them
186
+ by design, so map only the ones streamdown actually uses onto our palette. */
187
+ --color-foreground: var(--fg-primary);
188
+ --color-muted-foreground: var(--fg-tertiary);
189
+ --color-muted: var(--bg-inset);
190
+ --color-background: var(--bg-base);
191
+ --color-border: var(--border-default);
192
+ --color-sidebar: var(--bg-raised);
193
+ --color-sidebar-foreground: var(--fg-primary);
194
+ --color-primary: var(--accent);
195
+ --color-primary-foreground: var(--fg-on-accent);
196
+ }
197
+
198
+ /* Prototype keyframes (nuvin-web.html lines 281-286), shared by organisms in later phases. */
199
+ @keyframes blink-cursor {
200
+ 0%,
201
+ 50% {
202
+ opacity: 1;
203
+ }
204
+ 50.01%,
205
+ 100% {
206
+ opacity: 0;
207
+ }
208
+ }
209
+ @keyframes pulse-dot {
210
+ 0%,
211
+ 100% {
212
+ opacity: 1;
213
+ transform: scale(1);
214
+ }
215
+ 50% {
216
+ opacity: 0.4;
217
+ transform: scale(0.8);
218
+ }
219
+ }
220
+ @keyframes live-pulse {
221
+ 0%,
222
+ 100% {
223
+ opacity: 1;
224
+ box-shadow: 0 0 0 0 oklch(68% 0.12 155 / 40%);
225
+ }
226
+ 50% {
227
+ opacity: 0.6;
228
+ box-shadow: 0 0 0 4px oklch(68% 0.12 155 / 0%);
229
+ }
230
+ }
231
+ @keyframes spin {
232
+ to {
233
+ transform: rotate(360deg);
234
+ }
235
+ }
236
+ @keyframes fade-in-up {
237
+ from {
238
+ opacity: 0;
239
+ transform: translateY(8px);
240
+ }
241
+ to {
242
+ opacity: 1;
243
+ transform: translateY(0);
244
+ }
245
+ }