@tt-a1i/openpi 0.6.0 → 0.7.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/README.md +13 -11
- package/SETUP.md +2 -2
- package/THIRD_PARTY_NOTICES.md +242 -0
- package/extensions/ai-providers/README.md +12 -6
- package/extensions/ai-providers/cursor/connect-frame-reader.ts +76 -0
- package/extensions/ai-providers/cursor/input-images.ts +2 -3
- package/extensions/ai-providers/cursor/proto.ts +218 -11
- package/extensions/ai-providers/cursor/protobuf.ts +12 -2
- package/extensions/ai-providers/cursor/provider.ts +280 -37
- package/extensions/ai-providers/cursor/tool-bridge.ts +68 -0
- package/extensions/ai-providers/index.ts +3 -3
- package/extensions/file-mutation-display/index.ts +13 -9
- package/extensions/shared/agent-transcript.ts +3 -2
- package/extensions/shared/child-session.ts +14 -0
- package/extensions/subagents/index.ts +20 -3
- package/extensions/subagents/src/agent-types.ts +5 -17
- package/extensions/subagents/src/backends/pi.ts +70 -59
- package/extensions/subagents/src/backends/tool-preview.ts +29 -0
- package/extensions/subagents/src/manager.ts +2 -71
- package/extensions/subagents/src/prompt.ts +2 -2
- package/extensions/subagents/src/runtime.ts +10 -3
- package/extensions/web/index.ts +69 -5
- package/extensions/workflows/artifacts.ts +362 -23
- package/extensions/workflows/dashboard.ts +141 -21
- package/extensions/workflows/index.ts +62 -20
- package/extensions/workflows/progress-projection.ts +7 -1
- package/extensions/workflows/runner.ts +5 -162
- package/extensions/workflows/sandbox.ts +4 -0
- package/package.json +28 -4
- package/skills/subagents/REFERENCE.md +6 -7
- package/skills/subagents/SKILL.md +1 -1
- package/skills/workflows/REFERENCE.md +3 -1
- package/web/dist/app.js +87 -0
- package/web/dist/favicon.svg +9 -0
- package/web/dist/index.html +15 -0
- package/web/dist/styles.css +3 -0
- package/web/host/web-host.ts +6 -9
- package/web/ui/index.html +3 -131
- package/web/ui/public/favicon.svg +9 -0
- package/web/ui/src/app/App.tsx +134 -0
- package/web/ui/src/app/providers.tsx +38 -0
- package/web/ui/src/components/Markdown.tsx +58 -0
- package/web/ui/src/components/OpenPiLogo.tsx +41 -0
- package/web/ui/src/features/activity/ActivityBar.tsx +120 -0
- package/web/ui/src/features/composer/Composer.tsx +237 -0
- package/web/ui/src/features/sessions/SessionSidebar.tsx +418 -0
- package/web/ui/src/features/transcript/Transcript.tsx +860 -0
- package/web/ui/src/i18n.ts +159 -0
- package/web/ui/src/lib/format.ts +57 -0
- package/web/ui/src/main.tsx +16 -0
- package/web/ui/src/protocol/client.ts +199 -0
- package/web/ui/src/protocol/event-stream.ts +88 -0
- package/web/ui/src/store/web-store.ts +926 -0
- package/web/ui/src/styles.css +420 -0
- package/web/ui/tsconfig.json +12 -0
- package/web/ui/vite-env.d.ts +1 -0
- package/web/vite.config.mjs +21 -1
- package/web/host/static-assets.ts +0 -4
- package/web/ui/app.js +0 -1700
- package/web/ui/styles.css +0 -680
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
@layer reset, theme, base, astryx-base, astryx-theme, components, utilities;
|
|
2
|
+
|
|
3
|
+
@import "tailwindcss/theme.css" layer(theme);
|
|
4
|
+
@import "tailwindcss/preflight.css" layer(base);
|
|
5
|
+
@import "@astryxdesign/core/reset.css";
|
|
6
|
+
@import "@astryxdesign/core/astryx.css";
|
|
7
|
+
@import "@astryxdesign/theme-neutral/theme.css";
|
|
8
|
+
@import "@astryxdesign/core/tailwind-theme.css";
|
|
9
|
+
@import "tailwindcss/utilities.css" layer(utilities);
|
|
10
|
+
|
|
11
|
+
:root {
|
|
12
|
+
color-scheme: light;
|
|
13
|
+
--page: oklch(99.8% 0.003 87);
|
|
14
|
+
--sidebar: oklch(97.8% 0.021 91);
|
|
15
|
+
--sidebar-hover: oklch(93.5% 0.043 91 / 65%);
|
|
16
|
+
--sidebar-active: oklch(92.8% 0.025 91 / 82%);
|
|
17
|
+
--border: oklch(91.6% 0.009 248);
|
|
18
|
+
--border-strong: oklch(86.8% 0.014 248);
|
|
19
|
+
--text: oklch(26.2% 0.018 249);
|
|
20
|
+
--muted: oklch(52.5% 0.019 249);
|
|
21
|
+
--subtle: oklch(65.2% 0.016 249);
|
|
22
|
+
--accent: oklch(51.6% 0.151 253);
|
|
23
|
+
--focus: oklch(61.8% 0.14 251);
|
|
24
|
+
--healthy: oklch(53.6% 0.12 158);
|
|
25
|
+
--error: oklch(49.7% 0.187 28);
|
|
26
|
+
--warning: oklch(56.4% 0.126 74);
|
|
27
|
+
--grid-minor: oklch(27% 0.024 250 / 3%);
|
|
28
|
+
--grid-major: oklch(27% 0.024 250 / 7%);
|
|
29
|
+
--grid-cross: oklch(27% 0.024 250 / 11%);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
* { box-sizing: border-box; }
|
|
33
|
+
html, body, #root { width: 100%; height: 100%; overflow: hidden; }
|
|
34
|
+
body {
|
|
35
|
+
margin: 0;
|
|
36
|
+
background-color: var(--sidebar);
|
|
37
|
+
background-image:
|
|
38
|
+
linear-gradient(to bottom, oklch(65% 0.04 85 / 6%), transparent 40%, transparent 72%, oklch(97.8% 0.021 91 / 50%)),
|
|
39
|
+
linear-gradient(var(--grid-minor) 0 1px, transparent 1px 4px),
|
|
40
|
+
linear-gradient(to right, var(--grid-minor) 0 1px, transparent 1px 4px),
|
|
41
|
+
linear-gradient(var(--grid-major) 0 1px, transparent 1px 20px),
|
|
42
|
+
linear-gradient(to right, var(--grid-major) 0 1px, transparent 1px 20px),
|
|
43
|
+
radial-gradient(circle at center, transparent 2px, var(--sidebar) 2px 100%),
|
|
44
|
+
linear-gradient(var(--grid-cross) 0 1px, transparent 1px 20px),
|
|
45
|
+
linear-gradient(to right, var(--grid-cross) 0 1px, transparent 1px 20px);
|
|
46
|
+
background-size: 100% 100%, 4px 4px, 4px 4px, 20px 20px, 20px 20px, 20px 20px, 20px 20px, 20px 20px;
|
|
47
|
+
background-position: 0 0, 0 0, 0 0, 0 0, 0 0, -10px -10px, 0 0, 0 0;
|
|
48
|
+
color: var(--text);
|
|
49
|
+
font: 14px/1.5 ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
50
|
+
-webkit-font-smoothing: antialiased;
|
|
51
|
+
text-rendering: optimizeLegibility;
|
|
52
|
+
}
|
|
53
|
+
::selection { background: oklch(51.6% 0.151 253 / 18%); }
|
|
54
|
+
button, input, textarea { font: inherit; letter-spacing: 0; }
|
|
55
|
+
input, textarea { caret-color: var(--accent); }
|
|
56
|
+
button { color: inherit; }
|
|
57
|
+
button:focus-visible, input:focus-visible, textarea:focus-visible, summary:focus-visible {
|
|
58
|
+
outline: 2px solid var(--focus);
|
|
59
|
+
outline-offset: 2px;
|
|
60
|
+
}
|
|
61
|
+
svg { display: block; width: 1em; height: 1em; fill: none; stroke: currentColor; stroke-width: 1.8; }
|
|
62
|
+
|
|
63
|
+
.app-shell {
|
|
64
|
+
@apply grid h-dvh w-full;
|
|
65
|
+
grid-template-columns: 280px minmax(0, 1fr);
|
|
66
|
+
transition: grid-template-columns 180ms ease;
|
|
67
|
+
}
|
|
68
|
+
.app-shell.sidebar-collapsed { grid-template-columns: 56px minmax(0, 1fr); }
|
|
69
|
+
.session-sidebar {
|
|
70
|
+
@apply relative z-20 flex min-h-0 flex-col overflow-hidden;
|
|
71
|
+
padding: 8px 10px;
|
|
72
|
+
border-right: 1px solid oklch(86.8% 0.014 248 / 50%);
|
|
73
|
+
background-color: oklch(97.8% 0.021 91 / 30%);
|
|
74
|
+
background-image: linear-gradient(to bottom, oklch(99.8% 0.003 87 / 42%), oklch(99.8% 0.003 87 / 8%) 36%, transparent);
|
|
75
|
+
box-shadow: inset 0 1px 0 oklch(99.8% 0.003 87 / 60%), inset -1px 0 0 oklch(99.8% 0.003 87 / 30%);
|
|
76
|
+
backdrop-filter: blur(30px) saturate(1.8) brightness(1.04);
|
|
77
|
+
}
|
|
78
|
+
.session-sidebar::before {
|
|
79
|
+
content: "";
|
|
80
|
+
@apply pointer-events-none absolute inset-0 -z-10;
|
|
81
|
+
filter: blur(1.6px);
|
|
82
|
+
background-image:
|
|
83
|
+
linear-gradient(oklch(27% 0.024 250 / 7%) 0 1px, transparent 1px 4px),
|
|
84
|
+
linear-gradient(to right, oklch(27% 0.024 250 / 7%) 0 1px, transparent 1px 4px),
|
|
85
|
+
linear-gradient(oklch(27% 0.024 250 / 9%) 0 1px, transparent 1px 20px),
|
|
86
|
+
linear-gradient(to right, oklch(27% 0.024 250 / 9%) 0 1px, transparent 1px 20px);
|
|
87
|
+
background-size: 4px 4px, 4px 4px, 20px 20px, 20px 20px;
|
|
88
|
+
}
|
|
89
|
+
.sidebar-brand { @apply flex h-11 items-center justify-between; padding: 0 4px 0 6px; }
|
|
90
|
+
.brand-lockup { @apply inline-flex items-center; color: var(--text); font-weight: 700; line-height: 1; }
|
|
91
|
+
.brand-lockup.compact { font-size: 18px; }
|
|
92
|
+
.compact .pixel-mark { position: relative; display: inline-block; width: 21px; height: 21px; margin-left: 2px; }
|
|
93
|
+
.compact .pixel-mark i { position: absolute; display: block; width: 6px; height: 6px; background: currentColor; }
|
|
94
|
+
.compact .pixel-mark i:nth-child(1) { top: 0; left: 0; }
|
|
95
|
+
.compact .pixel-mark i:nth-child(2) { top: 0; left: 5px; }
|
|
96
|
+
.compact .pixel-mark i:nth-child(3) { top: 0; left: 10px; }
|
|
97
|
+
.compact .pixel-mark i:nth-child(4) { top: 5px; left: 0; }
|
|
98
|
+
.compact .pixel-mark i:nth-child(5) { top: 5px; left: 10px; }
|
|
99
|
+
.compact .pixel-mark i:nth-child(6) { top: 10px; left: 0; }
|
|
100
|
+
.compact .pixel-mark i:nth-child(7) { top: 10px; left: 5px; }
|
|
101
|
+
.compact .pixel-mark i:nth-child(8) { top: 10px; left: 15px; }
|
|
102
|
+
.compact .pixel-mark i:nth-child(9) { top: 15px; left: 0; }
|
|
103
|
+
.compact .pixel-mark i:nth-child(10) { top: 15px; left: 15px; }
|
|
104
|
+
.collapse-button, .icon-button, .workspace-action, .sidebar-expand {
|
|
105
|
+
@apply grid shrink-0 place-items-center border-0 bg-transparent;
|
|
106
|
+
color: var(--muted);
|
|
107
|
+
border-radius: 6px;
|
|
108
|
+
transition: background-color 140ms ease, color 140ms ease;
|
|
109
|
+
}
|
|
110
|
+
.collapse-button { width: 30px; height: 30px; }
|
|
111
|
+
.collapse-button svg, .icon-button svg { width: 18px; height: 18px; }
|
|
112
|
+
.collapse-button:hover, .icon-button:hover, .workspace-action:hover { background: var(--sidebar-hover); color: var(--text); }
|
|
113
|
+
.new-session-button {
|
|
114
|
+
@apply flex shrink-0 items-center justify-center gap-2;
|
|
115
|
+
width: calc(100% - 4px);
|
|
116
|
+
height: 38px;
|
|
117
|
+
margin: 8px 2px 10px;
|
|
118
|
+
border: 1px solid var(--border-strong);
|
|
119
|
+
border-radius: 19px;
|
|
120
|
+
background: var(--page);
|
|
121
|
+
font-weight: 550;
|
|
122
|
+
}
|
|
123
|
+
.new-session-button:hover { border-color: oklch(78% 0.018 248); background: oklch(99% 0.004 248); }
|
|
124
|
+
.new-session-button svg { width: 17px; height: 17px; }
|
|
125
|
+
.workspace-heading { @apply flex min-h-8 items-center justify-between; padding: 0 4px 0 8px; }
|
|
126
|
+
.workspace-heading-label { color: var(--muted); font-size: 11px; font-weight: 650; letter-spacing: .04em; text-transform: uppercase; }
|
|
127
|
+
.workspace-actions { @apply flex gap-0.5; }
|
|
128
|
+
.icon-button { width: 28px; height: 28px; }
|
|
129
|
+
.session-search { @apply hidden min-w-0 flex-1 items-center gap-1.5; }
|
|
130
|
+
.session-search > svg { width: 14px; height: 14px; color: var(--subtle); }
|
|
131
|
+
.session-search input { @apply min-w-0 flex-1 border-0 bg-transparent outline-0; height: 28px; color: var(--text); font-size: 12px; }
|
|
132
|
+
.session-search button { @apply grid size-6 place-items-center border-0 bg-transparent; color: var(--subtle); }
|
|
133
|
+
.session-search button svg { width: 14px; height: 14px; }
|
|
134
|
+
.workspace-heading.is-searching .session-search { @apply flex; }
|
|
135
|
+
.workspace-heading.is-searching .workspace-heading-label, .workspace-heading.is-searching .workspace-actions { display: none; }
|
|
136
|
+
.workspace-tree { @apply min-h-0 flex-1 overflow-y-auto py-1; scrollbar-width: thin; scrollbar-color: oklch(58% 0.02 250 / 45%) transparent; }
|
|
137
|
+
.workspace-group { margin-bottom: 3px; }
|
|
138
|
+
.workspace-button { @apply flex min-w-0 items-center; height: 34px; border-radius: 6px; color: var(--muted); cursor: pointer; }
|
|
139
|
+
.workspace-button:hover { background: var(--sidebar-hover); color: var(--text); }
|
|
140
|
+
.workspace-label { @apply flex h-full min-w-0 flex-1 items-center border-0 bg-transparent text-left; }
|
|
141
|
+
.workspace-toggle { @apply grid h-full w-7 shrink-0 place-items-center border-0 bg-transparent; }
|
|
142
|
+
.workspace-chevron { display: block; font-size: 15px; transform: rotate(0); transition: transform 140ms ease; }
|
|
143
|
+
.workspace-group.collapsed .workspace-chevron { transform: rotate(-90deg); }
|
|
144
|
+
.workspace-button strong { @apply min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap; font-size: 12.5px; font-weight: 600; }
|
|
145
|
+
.workspace-row-actions { @apply flex items-center; }
|
|
146
|
+
.workspace-action { width: 27px; height: 27px; }
|
|
147
|
+
.workspace-action svg { width: 14px; height: 14px; }
|
|
148
|
+
.menu-action-button { width: 27px !important; height: 27px !important; min-width: 27px !important; padding: 0 !important; color: var(--muted) !important; }
|
|
149
|
+
.menu-action-button svg { width: 14px; height: 14px; }
|
|
150
|
+
.workspace-sessions { @apply grid; }
|
|
151
|
+
.workspace-group.collapsed .workspace-sessions { display: none; }
|
|
152
|
+
.session-row { @apply relative flex min-w-0 items-center; }
|
|
153
|
+
.session { @apply flex min-w-0 flex-1 items-center gap-2 border-0 bg-transparent text-left; height: 34px; padding: 0 8px 0 29px; border-radius: 6px; color: var(--muted); }
|
|
154
|
+
.session:hover { background: var(--sidebar-hover); color: var(--text); }
|
|
155
|
+
.session.active { background: var(--sidebar-active); color: var(--text); }
|
|
156
|
+
.session-title { @apply min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap; font-size: 12.5px; }
|
|
157
|
+
.session-time { flex: 0 0 auto; color: var(--subtle); font-size: 10.5px; }
|
|
158
|
+
.session-row > .astryx-menu-trigger { @apply absolute right-1 opacity-0; pointer-events: none; }
|
|
159
|
+
.session-row:hover > .astryx-menu-trigger, .session-row:focus-within > .astryx-menu-trigger { opacity: 1; pointer-events: auto; }
|
|
160
|
+
.session-row:hover .session-time, .session-row:focus-within .session-time { visibility: hidden; }
|
|
161
|
+
.empty { min-height: 32px; padding: 7px 10px 7px 29px; color: var(--subtle); font-size: 12px; }
|
|
162
|
+
.sidebar-expand { @apply fixed left-2 top-2 z-30; width: 40px; height: 40px; }
|
|
163
|
+
.sidebar-expand svg { width: 19px; height: 19px; }
|
|
164
|
+
.sidebar-collapsed .session-sidebar { align-items: center; padding: 8px; }
|
|
165
|
+
.sidebar-collapsed .sidebar-brand { width: 40px; justify-content: center; padding: 0; }
|
|
166
|
+
.sidebar-collapsed .sidebar-brand, .sidebar-collapsed .workspace-heading, .sidebar-collapsed .workspace-tree { visibility: hidden; }
|
|
167
|
+
.sidebar-collapsed .new-session-button { width: 36px; height: 36px; margin: 54px 0 12px; padding: 0; border-color: transparent; background: transparent; }
|
|
168
|
+
.sidebar-collapsed .new-session-button span { display: none; }
|
|
169
|
+
.sidebar-collapsed .new-session-button:hover { background: var(--sidebar-hover); }
|
|
170
|
+
|
|
171
|
+
.conversation-shell { @apply relative grid min-h-0 min-w-0; container-name: conversation-shell; container-type: inline-size; grid-template-rows: minmax(0, 1fr) auto; }
|
|
172
|
+
.conversation-shell:not(.landing) {
|
|
173
|
+
background-image: linear-gradient(to right, transparent, oklch(97.8% 0.021 91 / 88%) 90px, oklch(97.8% 0.021 91 / 88%) calc(100% - 90px), transparent);
|
|
174
|
+
background-position: center;
|
|
175
|
+
background-repeat: no-repeat;
|
|
176
|
+
background-size: min(1020px, 100%) 100%;
|
|
177
|
+
}
|
|
178
|
+
.conversation-shell.landing { grid-template-rows: minmax(0, 1fr); }
|
|
179
|
+
.landing .conversation, .landing .composer-dock { grid-area: 1 / 1; }
|
|
180
|
+
.conversation { @apply min-h-0 overflow-y-auto; scroll-behavior: smooth; scrollbar-width: thin; scrollbar-color: oklch(58% 0.02 250 / 45%) transparent; }
|
|
181
|
+
.landing-conversation { @apply grid place-items-center; pointer-events: none; }
|
|
182
|
+
.landing-welcome { padding: 0 24px; text-align: center; transform: translateY(-110px); }
|
|
183
|
+
.landing-brand { @apply flex items-center justify-center border-0 bg-transparent; pointer-events: auto; }
|
|
184
|
+
.landing-brand .brand-lockup { align-items: flex-end; font-size: 44px; animation: brand-lockup 2100ms cubic-bezier(.22, 1, .36, 1) both; }
|
|
185
|
+
.landing-brand .brand-word { display: inline-block; opacity: 0; animation: brand-word-slide 2100ms cubic-bezier(.22, 1, .36, 1) both; }
|
|
186
|
+
.landing-brand .pixel-mark { position: relative; display: inline-block; width: 66px; height: 55px; margin-left: 4px; animation: pixel-nudge 2100ms cubic-bezier(.22, 1, .36, 1) both; }
|
|
187
|
+
.landing-brand .pixel-mark i { position: absolute; display: block; width: 11px; height: 11px; border-radius: 2px; background-color: var(--piece, currentColor); animation: pixel-drop 350ms cubic-bezier(.22, 1, .36, 1) both, piece-to-ink 2100ms ease both; }
|
|
188
|
+
.landing-brand .pixel-mark i::after { content: ""; position: absolute; inset: 0; border-radius: 2px; box-shadow: inset 0 2px 0 oklch(99% 0 0 / 30%), inset 0 -2px 0 oklch(0% 0 0 / 16%), inset 2px 0 0 oklch(99% 0 0 / 12%), inset -2px 0 0 oklch(0% 0 0 / 8%); animation: piece-texture-fade 2100ms ease both; }
|
|
189
|
+
.landing-brand .pixel-mark i:nth-child(1) { top: 0; left: 11px; }
|
|
190
|
+
.landing-brand .pixel-mark i:nth-child(2) { top: 0; left: 22px; }
|
|
191
|
+
.landing-brand .pixel-mark i:nth-child(3) { top: 0; left: 33px; }
|
|
192
|
+
.landing-brand .pixel-mark i:nth-child(4) { top: 11px; left: 33px; }
|
|
193
|
+
.landing-brand .pixel-mark i:nth-child(5) { top: 11px; left: 11px; }
|
|
194
|
+
.landing-brand .pixel-mark i:nth-child(6) { top: 22px; left: 11px; }
|
|
195
|
+
.landing-brand .pixel-mark i:nth-child(7) { top: 22px; left: 22px; }
|
|
196
|
+
.landing-brand .pixel-mark i:nth-child(8) { top: 33px; left: 11px; }
|
|
197
|
+
.landing-brand .pixel-mark i:nth-child(9) { top: 22px; left: 44px; }
|
|
198
|
+
.landing-brand .pixel-mark i:nth-child(10) { top: 33px; left: 44px; }
|
|
199
|
+
.landing-brand .pixel-mark i:nth-child(11) { top: 44px; left: 44px; }
|
|
200
|
+
.landing-brand .pixel-mark i:nth-child(12) { top: 44px; left: 55px; }
|
|
201
|
+
.landing-brand .pixel-mark i:nth-child(13) { top: 44px; left: 0; }
|
|
202
|
+
.landing-brand .pixel-mark i:nth-child(14) { top: 44px; left: 11px; }
|
|
203
|
+
.landing-brand .pixel-mark i:nth-child(15) { top: 44px; left: 22px; }
|
|
204
|
+
.landing-brand .pixel-mark i:nth-child(16) { top: 44px; left: 33px; }
|
|
205
|
+
.landing-brand .pixel-mark i:nth-child(5), .landing-brand .pixel-mark i:nth-child(6), .landing-brand .pixel-mark i:nth-child(7), .landing-brand .pixel-mark i:nth-child(8) { --piece: oklch(55% .105 37); animation-delay: 250ms, 0ms; }
|
|
206
|
+
.landing-brand .pixel-mark i:nth-child(1), .landing-brand .pixel-mark i:nth-child(2), .landing-brand .pixel-mark i:nth-child(3), .landing-brand .pixel-mark i:nth-child(4) { --piece: oklch(52% .083 252); animation-delay: 500ms, 0ms; }
|
|
207
|
+
.landing-brand .pixel-mark i:nth-child(9), .landing-brand .pixel-mark i:nth-child(10), .landing-brand .pixel-mark i:nth-child(11), .landing-brand .pixel-mark i:nth-child(12) { --piece: oklch(66% .08 111); animation-delay: 750ms, 0ms; }
|
|
208
|
+
.landing-brand .pixel-mark i:nth-child(13), .landing-brand .pixel-mark i:nth-child(14), .landing-brand .pixel-mark i:nth-child(15), .landing-brand .pixel-mark i:nth-child(16) { --piece: oklch(69% .116 78); }
|
|
209
|
+
.landing-brand .pixel-mark i:nth-child(11), .landing-brand .pixel-mark i:nth-child(12), .landing-brand .pixel-mark i:nth-child(13), .landing-brand .pixel-mark i:nth-child(14), .landing-brand .pixel-mark i:nth-child(15), .landing-brand .pixel-mark i:nth-child(16) { opacity: 0; animation: pixel-doomed 2100ms ease both; }
|
|
210
|
+
.landing-brand .pixel-mark i:nth-child(11), .landing-brand .pixel-mark i:nth-child(12) { animation-name: pixel-doomed-late; }
|
|
211
|
+
.landing-brand .pixel-mark i:nth-child(13) { --dx: -12px; --rot: -22deg; }
|
|
212
|
+
.landing-brand .pixel-mark i:nth-child(14) { --dx: -8px; --rot: -12deg; }
|
|
213
|
+
.landing-brand .pixel-mark i:nth-child(15) { --dx: -3px; --rot: -5deg; }
|
|
214
|
+
.landing-brand .pixel-mark i:nth-child(16) { --dx: 3px; --rot: 6deg; }
|
|
215
|
+
.landing-brand .pixel-mark i:nth-child(11) { --dx: 8px; --rot: 14deg; }
|
|
216
|
+
.landing-brand .pixel-mark i:nth-child(12) { --dx: 13px; --rot: 24deg; }
|
|
217
|
+
@keyframes pixel-drop { 0% { opacity: 0; transform: translateY(-40px); } 100% { opacity: 1; transform: none; } }
|
|
218
|
+
@keyframes piece-to-ink { 0%, 72% { background-color: var(--piece, currentColor); } 86%, 100% { background-color: currentColor; } }
|
|
219
|
+
@keyframes piece-texture-fade { 0%, 72% { opacity: 1; } 86%, 100% { opacity: 0; } }
|
|
220
|
+
@keyframes pixel-doomed { 0% { opacity: 0; transform: translateY(-40px); } 13%, 60% { opacity: 1; transform: none; } 74% { opacity: .9; transform: translate(var(--dx), 14px) rotate(var(--rot)) scale(.85); } 100% { opacity: 0; transform: translate(calc(var(--dx) * 2.5), 44px) rotate(calc(var(--rot) * 1.5)) scale(.5); } }
|
|
221
|
+
@keyframes pixel-doomed-late { 0%, 33% { opacity: 0; transform: translateY(-40px); } 44%, 60% { opacity: 1; transform: none; } 74% { opacity: .9; transform: translate(var(--dx), 14px) rotate(var(--rot)) scale(.85); } 100% { opacity: 0; transform: translate(calc(var(--dx) * 2.5), 44px) rotate(calc(var(--rot) * 1.5)) scale(.5); } }
|
|
222
|
+
@keyframes brand-word-slide { 0%, 55% { opacity: 0; transform: translateX(-64px); } 62% { opacity: 1; transform: translateX(2px); } 70%, 100% { opacity: 1; transform: none; } }
|
|
223
|
+
@keyframes brand-lockup { 0%, 56% { transform: translateX(-52px); } 64% { transform: translateX(-38px); } 90%, 100% { transform: none; } }
|
|
224
|
+
@keyframes pixel-nudge { 0%, 60% { transform: none; } 65% { transform: translateY(13px); } 71% { transform: translateY(11px); } 82%, 100% { transform: translate(-11px, 11px); } }
|
|
225
|
+
|
|
226
|
+
.message-row { @apply relative mx-auto; width: min(820px, calc(100% - 48px)); padding: 18px 0 26px; }
|
|
227
|
+
.message-row.user { @apply flex justify-end; padding-top: 26px; }
|
|
228
|
+
.message-row.assistant { width: min(840px, calc(100% - 48px)); padding: 6px 0; }
|
|
229
|
+
.message-row.detail-only { padding: 6px 0; }
|
|
230
|
+
.message-content { min-width: 0; max-width: min(78%, 620px); }
|
|
231
|
+
.message-row.assistant .message-content { width: 100%; max-width: none; }
|
|
232
|
+
.message-body { color: var(--text); font-size: 14px; line-height: 1.7; overflow-wrap: anywhere; white-space: pre-wrap; }
|
|
233
|
+
.message-row.user .message-body { padding: 9px 15px; border-radius: 18px; background: var(--sidebar-active); box-shadow: inset 0 0 0 1px oklch(72% .06 85 / 20%); }
|
|
234
|
+
.markdown { color: var(--text); font-size: 14px; line-height: 1.7; overflow-wrap: anywhere; }
|
|
235
|
+
.markdown > :first-child { margin-top: 0; }
|
|
236
|
+
.markdown > :last-child { margin-bottom: 0; }
|
|
237
|
+
.markdown p { margin: 0 0 12px; }
|
|
238
|
+
.markdown h1, .markdown h2, .markdown h3, .markdown h4 { margin: 18px 0 8px; color: var(--text); font-weight: 650; line-height: 1.3; }
|
|
239
|
+
.markdown h1 { font-size: 1.45em; } .markdown h2 { font-size: 1.3em; } .markdown h3 { font-size: 1.15em; }
|
|
240
|
+
.markdown ul, .markdown ol { margin: 0 0 12px; padding-left: 24px; }
|
|
241
|
+
.markdown li + li { margin-top: 4px; }
|
|
242
|
+
.markdown blockquote { margin: 0 0 12px; padding: 8px 14px; border: 1px solid var(--border-strong); border-radius: 6px; color: var(--muted); background: oklch(97% .006 249); }
|
|
243
|
+
.markdown hr { margin: 18px 0; border: 0; border-top: 1px solid var(--border); }
|
|
244
|
+
.markdown a { color: var(--accent); text-decoration: underline; text-decoration-color: oklch(51.6% .151 253 / 35%); text-underline-offset: 2px; }
|
|
245
|
+
.markdown code { padding: 2px 5px; border: 1px solid oklch(86.8% .014 248 / 55%); border-radius: 5px; background: oklch(95.5% .008 249); color: oklch(35% .02 249); font: .9em ui-monospace, SFMono-Regular, Menlo, monospace; }
|
|
246
|
+
.markdown pre { margin: 0 0 14px; overflow-x: auto; padding: 12px 14px; border: 1px solid var(--border); border-radius: 8px; background: oklch(96.8% .006 249 / 90%); }
|
|
247
|
+
.markdown pre code { padding: 0; border: 0; background: transparent; color: var(--text); font-size: 12px; white-space: pre; }
|
|
248
|
+
.markdown table { width: 100%; margin: 0 0 14px; border-collapse: collapse; font-size: .95em; }
|
|
249
|
+
.markdown th, .markdown td { padding: 7px 9px; border: 1px solid var(--border); text-align: left; vertical-align: top; }
|
|
250
|
+
.markdown th { background: oklch(96% .007 249); font-weight: 650; }
|
|
251
|
+
.markdown input[type="checkbox"] { margin-right: 7px; accent-color: var(--accent); }
|
|
252
|
+
.message-details { width: min(820px, calc(100% - 4px)); margin: 4px auto; color: var(--muted); }
|
|
253
|
+
.message-details summary { @apply flex min-h-9 items-center gap-2; padding: 5px 8px; border-radius: 7px; cursor: pointer; list-style: none; font-size: 12.5px; }
|
|
254
|
+
.message-details summary::-webkit-details-marker, .tool-group summary::-webkit-details-marker { display: none; }
|
|
255
|
+
.message-details summary:hover { background: oklch(95% .008 249 / 72%); color: var(--text); }
|
|
256
|
+
.details-mark { width: 8px; height: 8px; flex: 0 0 auto; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(-45deg); transition: transform 140ms ease; }
|
|
257
|
+
.message-details[open] .details-mark, .tool-group[open] > summary .details-mark { transform: rotate(45deg); }
|
|
258
|
+
.details-body { margin: 2px 8px 9px 38px; color: oklch(42% .018 249); font-size: 12px; line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
259
|
+
.tool-icon { @apply grid shrink-0 place-items-center; width: 22px; height: 22px; border-radius: 6px; background: oklch(55% .02 249 / 10%); }
|
|
260
|
+
.tool-icon svg { width: 13px; height: 13px; }
|
|
261
|
+
.details-title { @apply flex min-w-0 flex-1 items-baseline gap-2; }
|
|
262
|
+
.tool-name { @apply shrink-0; color: var(--text); font-size: 12.5px; font-weight: 600; }
|
|
263
|
+
.tool-summary { @apply min-w-0 overflow-hidden text-ellipsis whitespace-nowrap; color: var(--muted); font: 11.5px ui-monospace, SFMono-Regular, Menlo, monospace; }
|
|
264
|
+
.tool-evidence { max-height: 440px; overflow: auto; padding: 9px 10px; border: 1px solid var(--border); border-radius: 6px; background: oklch(97% .006 249 / 75%); }
|
|
265
|
+
.status-mark { @apply shrink-0; width: 14px; height: 14px; }
|
|
266
|
+
.status-mark.done { color: var(--healthy); } .status-mark.error { color: var(--error); } .status-mark.warn { color: var(--warning); }
|
|
267
|
+
.status-mark.running { @apply flex items-center justify-center; }
|
|
268
|
+
.status-mark.running i, .activity-chip-dot, .conversation-running-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--accent); animation: conversation-pulse 1.5s ease-out infinite; }
|
|
269
|
+
.tool-line.error .tool-icon { color: var(--error); background: oklch(50% .18 28 / 9%); }
|
|
270
|
+
.tool-line-empty { @apply flex min-h-8 items-center gap-2; padding: 3px 8px; color: var(--muted); }
|
|
271
|
+
.tool-group { width: min(820px, calc(100% - 48px)); margin: 6px auto; overflow: hidden; border: 1px solid var(--border); border-radius: 8px; background: oklch(99% .004 249 / 50%); color: var(--muted); }
|
|
272
|
+
.tool-group > summary { @apply flex min-h-9 items-center gap-2; padding: 5px 10px; cursor: pointer; list-style: none; font-size: 12.5px; }
|
|
273
|
+
.tool-group > summary:hover { background: oklch(95% .008 249 / 72%); }
|
|
274
|
+
.tool-group-icons { @apply flex items-center gap-1; }
|
|
275
|
+
.tool-group-icons svg { width: 13px; height: 13px; }
|
|
276
|
+
.tool-group-body { padding: 4px 10px; border-top: 1px solid var(--border); }
|
|
277
|
+
.tool-group-body .message-row { width: 100%; padding: 0; }
|
|
278
|
+
.activity-card { overflow: hidden; border: 1px solid var(--border); border-radius: 8px; background: oklch(99% .004 249 / 60%); }
|
|
279
|
+
.activity-card summary { min-height: 44px; padding: 7px 10px; }
|
|
280
|
+
.activity-card .details-mark { order: 3; }
|
|
281
|
+
.activity-icon { @apply grid shrink-0 place-items-center; width: 28px; height: 28px; border-radius: 7px; }
|
|
282
|
+
.activity-icon svg { width: 16px; height: 16px; }
|
|
283
|
+
.activity-card.subagent .activity-icon { color: var(--accent); background: oklch(52% .15 253 / 10%); }
|
|
284
|
+
.activity-card.workflow .activity-icon { color: oklch(55% .09 310); background: oklch(55% .09 310 / 12%); }
|
|
285
|
+
.activity-main { @apply flex min-w-0 flex-1 flex-col; gap: 1px; }
|
|
286
|
+
.activity-title, .activity-meta { @apply overflow-hidden text-ellipsis whitespace-nowrap; }
|
|
287
|
+
.activity-title { color: var(--text); font-weight: 550; }
|
|
288
|
+
.activity-meta { color: var(--subtle); font-size: 11px; }
|
|
289
|
+
.activity-card .details-body { margin-left: 48px; }
|
|
290
|
+
.activity-bar { @apply mx-auto flex w-full flex-wrap gap-1.5; max-width: 840px; padding: 0 15px 2px; }
|
|
291
|
+
.activity-chip { @apply flex min-w-0 items-center gap-1.5; max-width: 320px; padding: 3px 10px; border: 1px solid var(--border); border-radius: 999px; background: oklch(99% .004 249 / 78%); color: var(--muted); font-size: 11.5px; }
|
|
292
|
+
.activity-chip > svg { width: 12px; height: 12px; }
|
|
293
|
+
.activity-chip-text { @apply overflow-hidden text-ellipsis whitespace-nowrap; }
|
|
294
|
+
.activity-chip.more { color: var(--subtle); }
|
|
295
|
+
.activity-chip.done > svg { color: var(--healthy); } .activity-chip.error > svg { color: var(--error); }
|
|
296
|
+
.conversation-running { @apply mx-auto flex items-center gap-2; width: min(840px, calc(100% - 48px)); margin-bottom: 18px; color: var(--muted); font-size: 12px; }
|
|
297
|
+
@keyframes conversation-pulse { 70% { box-shadow: 0 0 0 6px oklch(52% .15 253 / 0%); } 100% { box-shadow: 0 0 0 0 oklch(52% .15 253 / 0%); } }
|
|
298
|
+
.switching { @apply flex items-center; }
|
|
299
|
+
.message-actions { @apply mt-1 flex h-6 items-center justify-end gap-1; color: var(--subtle); font-size: 10.5px; opacity: 0; transition: opacity 120ms ease; }
|
|
300
|
+
.message-row:hover > .message-actions, .message-row:focus-within > .message-actions { opacity: 1; }
|
|
301
|
+
.message-actions button { @apply grid size-6 place-items-center border-0 bg-transparent; border-radius: 5px; }
|
|
302
|
+
.message-actions button:hover { color: var(--text); background: oklch(95% .008 249); }
|
|
303
|
+
.message-actions svg { width: 13px; height: 13px; }
|
|
304
|
+
.message-editor { width: min(100%, 620px); margin-left: auto; }
|
|
305
|
+
.message-editor textarea { width: 100%; min-height: 52px; max-height: 220px; resize: vertical; padding: 10px 14px; border: 1px solid var(--border-strong); border-radius: 14px; background: var(--page); outline: 0; }
|
|
306
|
+
.message-edit-actions { @apply mt-2 flex justify-end gap-2; }
|
|
307
|
+
.message-edit-actions button { height: 30px; padding: 0 14px; border: 1px solid var(--border-strong); border-radius: 15px; background: var(--page); font-size: 12.5px; }
|
|
308
|
+
.message-edit-actions .confirm { border-color: var(--text); background: var(--text); color: var(--page); }
|
|
309
|
+
.turn-rail { @apply absolute z-10 flex flex-col gap-0.5 overflow-y-auto; top: 50%; right: 24px; width: 16px; max-height: 70%; padding: 4px 2px; border: 1px solid transparent; border-radius: 8px; transform: translateY(-50%); transition: width 160ms ease, background-color 160ms ease, border-color 160ms ease; }
|
|
310
|
+
.turn-rail:hover, .turn-rail:focus-within { width: 240px; padding: 6px; border-color: var(--border); background: oklch(99% .004 249 / 92%); box-shadow: 0 12px 28px oklch(26% .02 249 / 14%); backdrop-filter: blur(8px); }
|
|
311
|
+
.turn-tick { @apply flex w-full items-center gap-2 border-0 bg-transparent; padding: 3px 4px; border-radius: 6px; }
|
|
312
|
+
.turn-tick:hover { background: oklch(95% .008 249); }
|
|
313
|
+
.turn-tick-mark { width: 8px; height: 2px; flex: 0 0 auto; border-radius: 1px; background: var(--subtle); }
|
|
314
|
+
.turn-tick-label { @apply hidden min-w-0 overflow-hidden text-left text-ellipsis whitespace-nowrap; color: var(--muted); font-size: 12px; }
|
|
315
|
+
.turn-rail:hover .turn-tick-label, .turn-rail:focus-within .turn-tick-label { display: block; }
|
|
316
|
+
|
|
317
|
+
@container conversation-shell (max-width: 960px) {
|
|
318
|
+
.turn-rail { display: none; }
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.composer-dock { @apply flex flex-col items-center gap-2; padding: 12px 24px 22px; }
|
|
322
|
+
.landing .composer-dock { @apply absolute inset-x-0 z-10 w-full items-stretch; top: calc(50% - 81px); padding: 0 24px; }
|
|
323
|
+
.workspace-picker-row { @apply relative mx-auto flex w-full min-w-0 items-center; max-width: 840px; padding-left: 15px; }
|
|
324
|
+
.workspace-picker { max-width: 260px !important; height: 36px !important; border-radius: 18px !important; background: transparent !important; color: var(--text) !important; box-shadow: none !important; }
|
|
325
|
+
.workspace-picker:hover, .workspace-picker[aria-expanded="true"] { background: var(--sidebar-active) !important; }
|
|
326
|
+
.workspace-picker svg { width: 15px; height: 15px; }
|
|
327
|
+
.composer { @apply relative mx-auto flex w-full flex-col; max-width: 840px; min-height: 118px; padding: 13px 13px 10px; border: 1px solid var(--border-strong); border-radius: 18px; background: var(--page); box-shadow: 0 8px 26px oklch(42% .06 251 / 10%); transition: border-color 160ms ease, box-shadow 160ms ease; }
|
|
328
|
+
.dormant-overlay { @apply absolute inset-0 z-10 border-0 bg-transparent; border-radius: 18px; }
|
|
329
|
+
.composer:focus-within { border-color: oklch(84% .04 87); box-shadow: 0 0 0 2px oklch(84% .04 87 / 28%), 0 8px 26px oklch(40% .04 87 / 10%); }
|
|
330
|
+
.composer.dormant { border-style: dashed; box-shadow: none; cursor: pointer; }
|
|
331
|
+
.composer.dormant:hover { border-color: oklch(66% .018 249); }
|
|
332
|
+
.composer textarea { @apply w-full min-w-0 border-0 bg-transparent outline-0; min-height: 52px; max-height: 220px; flex: 0 0 auto; padding: 0 2px; resize: none; color: var(--text); font-size: 14px; line-height: 1.55; }
|
|
333
|
+
.composer textarea::placeholder { color: var(--subtle); }
|
|
334
|
+
.composer-toolbar { @apply mt-2 flex min-w-0 items-center justify-end gap-2; }
|
|
335
|
+
.model-picker-wrap { min-width: 0; max-width: 48%; }
|
|
336
|
+
.model-picker { min-width: 150px !important; max-width: 100% !important; height: 34px !important; padding: 0 9px 0 10px !important; background: transparent !important; color: var(--muted) !important; box-shadow: none !important; }
|
|
337
|
+
.model-picker:hover, .model-picker[aria-expanded="true"] { background: oklch(97% .006 249) !important; color: var(--text) !important; }
|
|
338
|
+
.model-picker svg { width: 14px; height: 14px; }
|
|
339
|
+
.send-button { @apply grid shrink-0 place-items-center border-0; width: 34px; height: 34px; border-radius: 50%; background: var(--sidebar); transition: background-color 140ms ease, transform 100ms ease; }
|
|
340
|
+
.send-button:hover:not(:disabled) { background: var(--sidebar-hover); }
|
|
341
|
+
.send-button:active:not(:disabled) { transform: scale(.92); }
|
|
342
|
+
.send-button:disabled { color: var(--subtle); opacity: .65; }
|
|
343
|
+
.send-button svg { width: 17px; height: 17px; }
|
|
344
|
+
.composer-hint { display: none; }
|
|
345
|
+
.notice { @apply absolute bottom-4 left-1/2 z-40 flex max-w-xl -translate-x-1/2 items-center gap-3; padding: 9px 10px 9px 14px; border: 1px solid oklch(70% .11 28); border-radius: 6px; background: var(--page); box-shadow: 0 12px 32px oklch(26% .02 249 / 18%); color: var(--error); font-size: 12px; }
|
|
346
|
+
.notice button { @apply grid size-6 place-items-center border-0 bg-transparent; }
|
|
347
|
+
.notice svg { width: 14px; height: 14px; }
|
|
348
|
+
.mobile-header { display: none; }
|
|
349
|
+
.connection-state { @apply items-center gap-1.5; color: var(--healthy); font-size: 11px; }
|
|
350
|
+
.connection-state::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
|
|
351
|
+
.connection-state.reconnecting { color: var(--warning); }
|
|
352
|
+
.connection-state.unavailable { color: var(--error); }
|
|
353
|
+
.sidebar-scrim { display: none; }
|
|
354
|
+
.openpi-dialog { @apply grid gap-4; padding: 20px; color: var(--text); }
|
|
355
|
+
.openpi-dialog strong { font-size: 15px; font-weight: 650; }
|
|
356
|
+
.openpi-dialog p { margin: 0; color: var(--muted); font-size: 13px; line-height: 1.65; }
|
|
357
|
+
.openpi-dialog input { width: 100%; height: 38px; padding: 0 10px; border: 1px solid var(--border-strong); border-radius: 5px; background: var(--page); }
|
|
358
|
+
.dialog-actions { @apply flex justify-end gap-2; }
|
|
359
|
+
.dialog-actions button { height: 34px; padding: 0 13px; border: 1px solid var(--border-strong); border-radius: 5px; background: var(--page); }
|
|
360
|
+
.dialog-actions .primary { border-color: var(--text); background: var(--text); color: var(--page); }
|
|
361
|
+
.dialog-actions .danger { border-color: oklch(80% .08 28); color: var(--error); }
|
|
362
|
+
|
|
363
|
+
@media (max-width: 760px) {
|
|
364
|
+
.app-shell, .app-shell.sidebar-collapsed { grid-template-columns: 1fr; }
|
|
365
|
+
.session-sidebar { position: fixed; inset: 0 auto 0 0; width: min(86vw, 300px); transform: translateX(-100%); border-right: 1px solid var(--border); background: var(--sidebar); backdrop-filter: none; transition: transform 180ms ease; }
|
|
366
|
+
.session-sidebar::before { display: none; }
|
|
367
|
+
.sidebar-open .session-sidebar { transform: translateX(0); }
|
|
368
|
+
.sidebar-collapsed .session-sidebar { align-items: stretch; padding: 8px 10px; }
|
|
369
|
+
.sidebar-collapsed .sidebar-brand, .sidebar-collapsed .workspace-heading, .sidebar-collapsed .workspace-tree { visibility: visible; }
|
|
370
|
+
.sidebar-collapsed .new-session-button { width: calc(100% - 4px); height: 38px; margin: 8px 2px 10px; border-color: var(--border-strong); background: var(--page); }
|
|
371
|
+
.sidebar-collapsed .new-session-button span { display: initial; }
|
|
372
|
+
.sidebar-expand { display: none; }
|
|
373
|
+
.sidebar-scrim { @apply fixed inset-0 z-10 border-0; background: oklch(20% .02 249 / 28%); }
|
|
374
|
+
.sidebar-open .sidebar-scrim { display: block; }
|
|
375
|
+
.mobile-header { @apply pointer-events-none absolute inset-0 z-10 block; }
|
|
376
|
+
.mobile-header > button { @apply pointer-events-auto fixed left-3 top-3 grid place-items-center border-0; width: 34px; height: 34px; border-radius: 6px; background: oklch(99% .004 249 / 88%); }
|
|
377
|
+
.mobile-header > button svg { width: 19px; height: 19px; }
|
|
378
|
+
.mobile-header .connection-state { @apply absolute right-3 top-4 flex; font-size: 0; }
|
|
379
|
+
.message-row { width: calc(100% - 28px); }
|
|
380
|
+
.message-row.assistant, .conversation-running { width: calc(100% - 24px); }
|
|
381
|
+
.turn-rail { display: none; }
|
|
382
|
+
.composer-dock { padding: 10px 12px 12px; }
|
|
383
|
+
.landing .composer-dock { top: calc(50% - 74px); padding: 0 12px; }
|
|
384
|
+
.landing-welcome { transform: translateY(-96px); }
|
|
385
|
+
.composer { min-height: 104px; }
|
|
386
|
+
.notice { bottom: 12px; width: calc(100% - 24px); }
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
@media (any-pointer: coarse) {
|
|
390
|
+
.session-row > .astryx-menu-trigger { opacity: 1; pointer-events: auto; }
|
|
391
|
+
.session-row .session-time { visibility: hidden; }
|
|
392
|
+
.message-actions { opacity: 1; }
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
@media (prefers-reduced-motion: reduce) {
|
|
396
|
+
.app-shell, .session-sidebar, .workspace-chevron, .message-actions, .turn-rail, .details-mark { transition: none; }
|
|
397
|
+
.conversation { scroll-behavior: auto; }
|
|
398
|
+
.landing-brand .brand-lockup, .landing-brand .brand-word, .landing-brand .pixel-mark, .landing-brand .pixel-mark i, .landing-brand .pixel-mark i::after { animation: none; }
|
|
399
|
+
.landing-brand .brand-word { opacity: 1; }
|
|
400
|
+
.landing-brand .pixel-mark i { background-color: currentColor; }
|
|
401
|
+
.landing-brand .pixel-mark i::after { opacity: 0; }
|
|
402
|
+
.status-mark.running i, .activity-chip-dot, .conversation-running-dot { animation: none; }
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/* Resolve the canonical Pi theme without a second browser preference. */
|
|
406
|
+
:root[data-theme="dark"] {
|
|
407
|
+
color-scheme: dark;
|
|
408
|
+
--page: #17191c; --sidebar: #1d2024; --sidebar-hover: #292d32; --sidebar-active: #30353b;
|
|
409
|
+
--border: #353a40; --border-strong: #48515a; --text: #edf0f2; --muted: #a8b0b8; --subtle: #7f8993;
|
|
410
|
+
--accent: #74a9e6; --focus: #78aee9; --healthy: #62c795; --error: #ff8c84; --warning: #e5b64f;
|
|
411
|
+
--grid-minor: #87909908; --grid-major: #87909912; --grid-cross: #8790991c;
|
|
412
|
+
}
|
|
413
|
+
:root[data-theme="dark"] body { background-image: linear-gradient(var(--grid-minor) 1px, transparent 1px), linear-gradient(90deg, var(--grid-minor) 1px, transparent 1px); }
|
|
414
|
+
:root[data-theme="dark"] .session-sidebar { background: var(--sidebar); box-shadow: none; border-color: var(--border); }
|
|
415
|
+
:root[data-theme="dark"] .conversation-shell:not(.landing) { background-image: none; background-color: var(--page); }
|
|
416
|
+
:root[data-theme="dark"] .details-body { color: var(--muted); }
|
|
417
|
+
:root[data-theme="dark"] :is(.markdown blockquote, .markdown code, .markdown pre, .markdown th, .tool-evidence, .tool-group, .activity-card, .activity-chip, .mobile-header > button) { background: var(--sidebar); color: var(--text); border-color: var(--border); }
|
|
418
|
+
:root[data-theme="dark"] :is(.new-session-button:hover, .message-details summary:hover, .tool-group > summary:hover, .message-actions button:hover, .turn-tick:hover) { background: var(--sidebar-hover); border-color: var(--border); }
|
|
419
|
+
:root[data-theme="dark"] :is(.turn-rail:hover, .turn-rail:focus-within) { background: var(--page); }
|
|
420
|
+
:root[data-theme="dark"] .model-picker:hover, :root[data-theme="dark"] .model-picker[aria-expanded="true"] { background: var(--sidebar-hover) !important; }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"jsx": "react-jsx",
|
|
5
|
+
"lib": ["DOM", "DOM.Iterable", "ES2022"],
|
|
6
|
+
"types": ["vite/client", "node"],
|
|
7
|
+
"allowImportingTsExtensions": true,
|
|
8
|
+
"module": "ESNext",
|
|
9
|
+
"moduleResolution": "Bundler"
|
|
10
|
+
},
|
|
11
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "vite-env.d.ts"]
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
package/web/vite.config.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { defineConfig } from "vite";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
+
import react from "@vitejs/plugin-react";
|
|
4
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
3
5
|
|
|
4
6
|
const backendOrigin =
|
|
5
7
|
process.env.OPENPI_WEB_BACKEND?.replace(/\/$/u, "") ||
|
|
@@ -21,6 +23,25 @@ function backendProxy() {
|
|
|
21
23
|
|
|
22
24
|
export default defineConfig({
|
|
23
25
|
root: fileURLToPath(new URL("./ui/", import.meta.url)),
|
|
26
|
+
publicDir: fileURLToPath(new URL("./ui/public/", import.meta.url)),
|
|
27
|
+
plugins: [react(), tailwindcss()],
|
|
28
|
+
build: {
|
|
29
|
+
outDir: fileURLToPath(new URL("./dist/", import.meta.url)),
|
|
30
|
+
emptyOutDir: true,
|
|
31
|
+
cssCodeSplit: false,
|
|
32
|
+
sourcemap: false,
|
|
33
|
+
rollupOptions: {
|
|
34
|
+
output: {
|
|
35
|
+
entryFileNames: "app.js",
|
|
36
|
+
chunkFileNames: "app-[name].js",
|
|
37
|
+
assetFileNames: ({ names }) =>
|
|
38
|
+
names?.some((name) => name.endsWith(".css"))
|
|
39
|
+
? "styles.css"
|
|
40
|
+
: "[name][extname]",
|
|
41
|
+
manualChunks: undefined,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
24
45
|
server: {
|
|
25
46
|
host: "127.0.0.1",
|
|
26
47
|
port: Number(process.env.OPENPI_WEB_UI_PORT || 5173),
|
|
@@ -28,7 +49,6 @@ export default defineConfig({
|
|
|
28
49
|
proxy: {
|
|
29
50
|
"/api": backendProxy(),
|
|
30
51
|
"/events": backendProxy(),
|
|
31
|
-
"/marked.js": backendProxy(),
|
|
32
52
|
},
|
|
33
53
|
},
|
|
34
54
|
});
|