@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.
- package/dist/MarkdownBody-XBNXK6P4.js +121 -0
- package/dist/app/App.d.ts +24 -0
- package/dist/app/App.d.ts.map +1 -0
- package/dist/app/AppShell.d.ts +13 -0
- package/dist/app/AppShell.d.ts.map +1 -0
- package/dist/app/Header.d.ts +11 -0
- package/dist/app/Header.d.ts.map +1 -0
- package/dist/app/SessionSubHeader.d.ts +15 -0
- package/dist/app/SessionSubHeader.d.ts.map +1 -0
- package/dist/app/WorkspacePanel.d.ts +15 -0
- package/dist/app/WorkspacePanel.d.ts.map +1 -0
- package/dist/app/app-shell.styles.d.ts +11 -0
- package/dist/app/app-shell.styles.d.ts.map +1 -0
- package/dist/app/route-components.d.ts +46 -0
- package/dist/app/route-components.d.ts.map +1 -0
- package/dist/app/routes.d.ts +11 -0
- package/dist/app/routes.d.ts.map +1 -0
- package/dist/assets/fonts/inter-latin-400-normal.woff2 +0 -0
- package/dist/assets/fonts/inter-latin-500-normal.woff2 +0 -0
- package/dist/assets/fonts/inter-latin-600-normal.woff2 +0 -0
- package/dist/assets/fonts/inter-latin-700-normal.woff2 +0 -0
- package/dist/assets/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
- package/dist/assets/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
- package/dist/assets/fonts/jetbrains-mono-latin-600-normal.woff2 +0 -0
- package/dist/assets/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
- package/dist/chunk-TLWTUPOJ.js +10 -0
- package/dist/features/account/auth-gate.d.ts +17 -0
- package/dist/features/account/auth-gate.d.ts.map +1 -0
- package/dist/features/account/index.d.ts +3 -0
- package/dist/features/account/index.d.ts.map +1 -0
- package/dist/features/composer/Composer.d.ts +39 -0
- package/dist/features/composer/Composer.d.ts.map +1 -0
- package/dist/features/composer/QuestionCard.d.ts +21 -0
- package/dist/features/composer/QuestionCard.d.ts.map +1 -0
- package/dist/features/composer/context-status.d.ts +6 -0
- package/dist/features/composer/context-status.d.ts.map +1 -0
- package/dist/features/composer/index.d.ts +2 -0
- package/dist/features/composer/index.d.ts.map +1 -0
- package/dist/features/config/CloudProviderSetup.d.ts +12 -0
- package/dist/features/config/CloudProviderSetup.d.ts.map +1 -0
- package/dist/features/config/OnboardingGate.d.ts +22 -0
- package/dist/features/config/OnboardingGate.d.ts.map +1 -0
- package/dist/features/config/ProviderManager.d.ts +15 -0
- package/dist/features/config/ProviderManager.d.ts.map +1 -0
- package/dist/features/config/WorkspaceManager.d.ts +13 -0
- package/dist/features/config/WorkspaceManager.d.ts.map +1 -0
- package/dist/features/config/config-client.d.ts +49 -0
- package/dist/features/config/config-client.d.ts.map +1 -0
- package/dist/features/config/index.d.ts +10 -0
- package/dist/features/config/index.d.ts.map +1 -0
- package/dist/features/config/protocol-config-client.d.ts +22 -0
- package/dist/features/config/protocol-config-client.d.ts.map +1 -0
- package/dist/features/config/rest-config-client.d.ts +4 -0
- package/dist/features/config/rest-config-client.d.ts.map +1 -0
- package/dist/features/config/use-provider-status.d.ts +8 -0
- package/dist/features/config/use-provider-status.d.ts.map +1 -0
- package/dist/features/daemon-switcher/DaemonAvatar.d.ts +16 -0
- package/dist/features/daemon-switcher/DaemonAvatar.d.ts.map +1 -0
- package/dist/features/daemon-switcher/DaemonRail.d.ts +18 -0
- package/dist/features/daemon-switcher/DaemonRail.d.ts.map +1 -0
- package/dist/features/daemon-switcher/DaemonSwitcher.d.ts +17 -0
- package/dist/features/daemon-switcher/DaemonSwitcher.d.ts.map +1 -0
- package/dist/features/daemon-switcher/index.d.ts +7 -0
- package/dist/features/daemon-switcher/index.d.ts.map +1 -0
- package/dist/features/diff/DiffView.d.ts +13 -0
- package/dist/features/diff/DiffView.d.ts.map +1 -0
- package/dist/features/diff/diff.d.ts +23 -0
- package/dist/features/diff/diff.d.ts.map +1 -0
- package/dist/features/diff/index.d.ts +4 -0
- package/dist/features/diff/index.d.ts.map +1 -0
- package/dist/features/launcher/SessionItem.d.ts +12 -0
- package/dist/features/launcher/SessionItem.d.ts.map +1 -0
- package/dist/features/launcher/SessionSidebar.d.ts +24 -0
- package/dist/features/launcher/SessionSidebar.d.ts.map +1 -0
- package/dist/features/launcher/index.d.ts +5 -0
- package/dist/features/launcher/index.d.ts.map +1 -0
- package/dist/features/launcher/session-sidebar-model.d.ts +77 -0
- package/dist/features/launcher/session-sidebar-model.d.ts.map +1 -0
- package/dist/features/launcher/session-status.d.ts +9 -0
- package/dist/features/launcher/session-status.d.ts.map +1 -0
- package/dist/features/launcher/use-daemon-history.d.ts +17 -0
- package/dist/features/launcher/use-daemon-history.d.ts.map +1 -0
- package/dist/features/new-session/StartScreen.d.ts +31 -0
- package/dist/features/new-session/StartScreen.d.ts.map +1 -0
- package/dist/features/new-session/index.d.ts +3 -0
- package/dist/features/new-session/index.d.ts.map +1 -0
- package/dist/features/new-session/start-screen.styles.d.ts +46 -0
- package/dist/features/new-session/start-screen.styles.d.ts.map +1 -0
- package/dist/features/picker/Picker.d.ts +23 -0
- package/dist/features/picker/Picker.d.ts.map +1 -0
- package/dist/features/picker/PickerSession.d.ts +8 -0
- package/dist/features/picker/PickerSession.d.ts.map +1 -0
- package/dist/features/picker/index.d.ts +6 -0
- package/dist/features/picker/index.d.ts.map +1 -0
- package/dist/features/picker/picker-model.d.ts +31 -0
- package/dist/features/picker/picker-model.d.ts.map +1 -0
- package/dist/features/tabs/Tab.d.ts +8 -0
- package/dist/features/tabs/Tab.d.ts.map +1 -0
- package/dist/features/tabs/TabBar.d.ts +7 -0
- package/dist/features/tabs/TabBar.d.ts.map +1 -0
- package/dist/features/tabs/index.d.ts +8 -0
- package/dist/features/tabs/index.d.ts.map +1 -0
- package/dist/features/tabs/tab-model.d.ts +39 -0
- package/dist/features/tabs/tab-model.d.ts.map +1 -0
- package/dist/features/tabs/tab.styles.d.ts +9 -0
- package/dist/features/tabs/tab.styles.d.ts.map +1 -0
- package/dist/features/theme/ThemeToggle.d.ts +8 -0
- package/dist/features/theme/ThemeToggle.d.ts.map +1 -0
- package/dist/features/theme/index.d.ts +5 -0
- package/dist/features/theme/index.d.ts.map +1 -0
- package/dist/features/theme/themes.d.ts +13 -0
- package/dist/features/theme/themes.d.ts.map +1 -0
- package/dist/features/theme/use-theme-mode.d.ts +3 -0
- package/dist/features/theme/use-theme-mode.d.ts.map +1 -0
- package/dist/features/transcript/components/AssistantMessage.d.ts +21 -0
- package/dist/features/transcript/components/AssistantMessage.d.ts.map +1 -0
- package/dist/features/transcript/components/ChildMessagesContext.d.ts +27 -0
- package/dist/features/transcript/components/ChildMessagesContext.d.ts.map +1 -0
- package/dist/features/transcript/components/CodeBlock.d.ts +5 -0
- package/dist/features/transcript/components/CodeBlock.d.ts.map +1 -0
- package/dist/features/transcript/components/MarkdownBody.d.ts +17 -0
- package/dist/features/transcript/components/MarkdownBody.d.ts.map +1 -0
- package/dist/features/transcript/components/MessageList.d.ts +24 -0
- package/dist/features/transcript/components/MessageList.d.ts.map +1 -0
- package/dist/features/transcript/components/NestedMessageListContext.d.ts +18 -0
- package/dist/features/transcript/components/NestedMessageListContext.d.ts.map +1 -0
- package/dist/features/transcript/components/ProcessingIndicator.d.ts +5 -0
- package/dist/features/transcript/components/ProcessingIndicator.d.ts.map +1 -0
- package/dist/features/transcript/components/styles-test-utils.d.ts +6 -0
- package/dist/features/transcript/components/styles-test-utils.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/BareLine.d.ts +14 -0
- package/dist/features/transcript/components/tool-display/BareLine.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/Card.d.ts +31 -0
- package/dist/features/transcript/components/tool-display/Card.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/Turn.d.ts +15 -0
- package/dist/features/transcript/components/tool-display/Turn.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/index.d.ts +3 -0
- package/dist/features/transcript/components/tool-display/index.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/renderers/AskUserRenderer.d.ts +4 -0
- package/dist/features/transcript/components/tool-display/renderers/AskUserRenderer.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/renderers/AssignTaskRenderer.d.ts +9 -0
- package/dist/features/transcript/components/tool-display/renderers/AssignTaskRenderer.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/renderers/BareToolRenderer.d.ts +8 -0
- package/dist/features/transcript/components/tool-display/renderers/BareToolRenderer.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/renderers/BashRenderer.d.ts +11 -0
- package/dist/features/transcript/components/tool-display/renderers/BashRenderer.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/renderers/FileEditRenderer.d.ts +4 -0
- package/dist/features/transcript/components/tool-display/renderers/FileEditRenderer.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/renderers/FileNewRenderer.d.ts +4 -0
- package/dist/features/transcript/components/tool-display/renderers/FileNewRenderer.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/renderers/TodoWriteRenderer.d.ts +4 -0
- package/dist/features/transcript/components/tool-display/renderers/TodoWriteRenderer.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/renderers/UnknownRenderer.d.ts +4 -0
- package/dist/features/transcript/components/tool-display/renderers/UnknownRenderer.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/tool-icon.d.ts +4 -0
- package/dist/features/transcript/components/tool-display/tool-icon.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/tool-meta.d.ts +9 -0
- package/dist/features/transcript/components/tool-display/tool-meta.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/tool-variants.d.ts +8 -0
- package/dist/features/transcript/components/tool-display/tool-variants.d.ts.map +1 -0
- package/dist/features/transcript/components/tool-display/types.d.ts +11 -0
- package/dist/features/transcript/components/tool-display/types.d.ts.map +1 -0
- package/dist/features/transcript/hooks/use-live-tick.d.ts +8 -0
- package/dist/features/transcript/hooks/use-live-tick.d.ts.map +1 -0
- package/dist/features/transcript/hooks/use-revealed-text.d.ts +28 -0
- package/dist/features/transcript/hooks/use-revealed-text.d.ts.map +1 -0
- package/dist/features/transcript/index.d.ts +6 -0
- package/dist/features/transcript/index.d.ts.map +1 -0
- package/dist/features/transcript/lib/message-groups.d.ts +9 -0
- package/dist/features/transcript/lib/message-groups.d.ts.map +1 -0
- package/dist/features/transcript/lib/preview-lines.d.ts +27 -0
- package/dist/features/transcript/lib/preview-lines.d.ts.map +1 -0
- package/dist/features/transcript/lib/processing-state.d.ts +16 -0
- package/dist/features/transcript/lib/processing-state.d.ts.map +1 -0
- package/dist/features/transcript/lib/reasoning-label.d.ts +9 -0
- package/dist/features/transcript/lib/reasoning-label.d.ts.map +1 -0
- package/dist/features/transcript/lib/tool-format-utils.d.ts +29 -0
- package/dist/features/transcript/lib/tool-format-utils.d.ts.map +1 -0
- package/dist/features/transcript/lib/tool-formatters.d.ts +45 -0
- package/dist/features/transcript/lib/tool-formatters.d.ts.map +1 -0
- package/dist/features/transcript/lib/tool-status.d.ts +39 -0
- package/dist/features/transcript/lib/tool-status.d.ts.map +1 -0
- package/dist/features/transcript/lib/transcript-rows.d.ts +15 -0
- package/dist/features/transcript/lib/transcript-rows.d.ts.map +1 -0
- package/dist/features/transcript/lib/turn-groups.d.ts +20 -0
- package/dist/features/transcript/lib/turn-groups.d.ts.map +1 -0
- package/dist/features/transcript/lib/turn-summary.d.ts +11 -0
- package/dist/features/transcript/lib/turn-summary.d.ts.map +1 -0
- package/dist/features/workflows/WorkflowsPanel.d.ts +11 -0
- package/dist/features/workflows/WorkflowsPanel.d.ts.map +1 -0
- package/dist/features/workflows/index.d.ts +3 -0
- package/dist/features/workflows/index.d.ts.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7877 -0
- package/dist/session/client-commands.d.ts +26 -0
- package/dist/session/client-commands.d.ts.map +1 -0
- package/dist/session/commands.d.ts +9 -0
- package/dist/session/commands.d.ts.map +1 -0
- package/dist/session/directory-source.d.ts +101 -0
- package/dist/session/directory-source.d.ts.map +1 -0
- package/dist/session/directory-status.d.ts +8 -0
- package/dist/session/directory-status.d.ts.map +1 -0
- package/dist/session/directory.d.ts +41 -0
- package/dist/session/directory.d.ts.map +1 -0
- package/dist/session/index.d.ts +16 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/snapshot.d.ts +11 -0
- package/dist/session/snapshot.d.ts.map +1 -0
- package/dist/session/store.d.ts +96 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/tool-timing.d.ts +14 -0
- package/dist/session/tool-timing.d.ts.map +1 -0
- package/dist/session/transport.d.ts +187 -0
- package/dist/session/transport.d.ts.map +1 -0
- package/dist/session/types.d.ts +73 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/use-directory.d.ts +54 -0
- package/dist/session/use-directory.d.ts.map +1 -0
- package/dist/session/use-session-transport.d.ts +10 -0
- package/dist/session/use-session-transport.d.ts.map +1 -0
- package/dist/shared/hooks/use-stick-to-bottom-sentinel.d.ts +64 -0
- package/dist/shared/hooks/use-stick-to-bottom-sentinel.d.ts.map +1 -0
- package/dist/shared/lib/navigation.d.ts +20 -0
- package/dist/shared/lib/navigation.d.ts.map +1 -0
- package/dist/shared/lib/toast.d.ts +35 -0
- package/dist/shared/lib/toast.d.ts.map +1 -0
- package/dist/shared/lib/utils.d.ts +3 -0
- package/dist/shared/lib/utils.d.ts.map +1 -0
- package/dist/shared/ui/CopyButton.d.ts +6 -0
- package/dist/shared/ui/CopyButton.d.ts.map +1 -0
- package/dist/shared/ui/avatar.d.ts +9 -0
- package/dist/shared/ui/avatar.d.ts.map +1 -0
- package/dist/shared/ui/badge.d.ts +8 -0
- package/dist/shared/ui/badge.d.ts.map +1 -0
- package/dist/shared/ui/button.d.ts +11 -0
- package/dist/shared/ui/button.d.ts.map +1 -0
- package/dist/shared/ui/command.d.ts +10 -0
- package/dist/shared/ui/command.d.ts.map +1 -0
- package/dist/shared/ui/confirm-dialog.d.ts +17 -0
- package/dist/shared/ui/confirm-dialog.d.ts.map +1 -0
- package/dist/shared/ui/dropdown-menu.d.ts +9 -0
- package/dist/shared/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/shared/ui/input.d.ts +3 -0
- package/dist/shared/ui/input.d.ts.map +1 -0
- package/dist/shared/ui/kbd.d.ts +3 -0
- package/dist/shared/ui/kbd.d.ts.map +1 -0
- package/dist/shared/ui/popover.d.ts +7 -0
- package/dist/shared/ui/popover.d.ts.map +1 -0
- package/dist/shared/ui/scroll-area.d.ts +5 -0
- package/dist/shared/ui/scroll-area.d.ts.map +1 -0
- package/dist/shared/ui/tabs.d.ts +7 -0
- package/dist/shared/ui/tabs.d.ts.map +1 -0
- package/dist/shared/ui/toast.d.ts +7 -0
- package/dist/shared/ui/toast.d.ts.map +1 -0
- package/dist/shared/ui/tooltip.d.ts +7 -0
- package/dist/shared/ui/tooltip.d.ts.map +1 -0
- package/dist/styles/base.css +49 -0
- package/dist/styles/components.css +206 -0
- package/dist/styles/effects.css +76 -0
- package/dist/styles/fonts.css +49 -0
- package/dist/styles/index.css +14 -0
- package/dist/styles/styles.test.ts +45 -0
- package/dist/styles/themes.css +33 -0
- package/dist/styles/tokens.css +245 -0
- package/dist/styles/tokens.test.ts +113 -0
- package/dist/test-setup.d.ts +29 -0
- package/dist/test-setup.d.ts.map +1 -0
- 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
|
+
}
|