anentrypoint-design 0.0.121 → 0.0.124

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 (202) hide show
  1. package/README.md +253 -253
  2. package/app-shell.css +931 -594
  3. package/colors_and_type.css +226 -226
  4. package/community.css +817 -1222
  5. package/dist/247420.css +2202 -2084
  6. package/dist/247420.js +13 -13
  7. package/package.json +80 -80
  8. package/src/bootstrap.js +25 -25
  9. package/src/components/chat.js +199 -199
  10. package/src/components/community.js +190 -208
  11. package/src/components/content.js +269 -269
  12. package/src/components/editor-primitives.js +100 -0
  13. package/src/components/files-modals.js +107 -107
  14. package/src/components/files.js +118 -118
  15. package/src/components/freddie/helpers.js +50 -50
  16. package/src/components/freddie.js +33 -33
  17. package/src/components/shell.js +117 -117
  18. package/src/components/theme-toggle.js +70 -70
  19. package/src/components.js +59 -57
  20. package/src/debug.js +30 -30
  21. package/src/deck-stage.js +21 -21
  22. package/src/highlight.js +65 -32
  23. package/src/index.js +86 -86
  24. package/src/kits/os/about-app.js +52 -52
  25. package/src/kits/os/app-panes.css +152 -152
  26. package/src/kits/os/browser-app.js +58 -58
  27. package/src/kits/os/files-app.js +44 -44
  28. package/src/kits/os/freddie/helpers.js +59 -59
  29. package/src/kits/os/freddie/pages-chat.js +143 -143
  30. package/src/kits/os/freddie/pages-core.js +101 -101
  31. package/src/kits/os/freddie/pages-os.js +51 -51
  32. package/src/kits/os/freddie/pages-tools.js +183 -183
  33. package/src/kits/os/freddie/routes.js +24 -24
  34. package/src/kits/os/freddie-dashboard.css +51 -51
  35. package/src/kits/os/freddie-dashboard.js +101 -101
  36. package/src/kits/os/icons.js +17 -17
  37. package/src/kits/os/index.js +17 -17
  38. package/src/kits/os/launcher.css +61 -61
  39. package/src/kits/os/launcher.js +79 -79
  40. package/src/kits/os/monitor-app.js +34 -34
  41. package/src/kits/os/shell.js +214 -214
  42. package/src/kits/os/terminal-app.js +45 -45
  43. package/src/kits/os/theme.css +450 -450
  44. package/src/kits/os/validate.css +19 -19
  45. package/src/kits/os/validator-app.js +55 -55
  46. package/src/kits/os/wm.css +115 -115
  47. package/src/kits/os/wm.js +111 -111
  48. package/src/markdown.js +39 -39
  49. package/src/motion.js +35 -35
  50. package/src/page-html.js +196 -196
  51. package/src/styles.js +25 -25
  52. package/src/theme.js +99 -99
  53. package/src/web-components/ds-chat.js +116 -116
  54. package/dist/.nojekyll +0 -0
  55. package/dist/app-shell.css +0 -594
  56. package/dist/colors_and_type.css +0 -197
  57. package/dist/favicon.svg +0 -1
  58. package/dist/index.html +0 -308
  59. package/dist/preview/buttons.html +0 -28
  60. package/dist/preview/colors-core.html +0 -45
  61. package/dist/preview/colors-lore.html +0 -28
  62. package/dist/preview/colors-semantic.html +0 -34
  63. package/dist/preview/dateline.html +0 -19
  64. package/dist/preview/dropzone.html +0 -30
  65. package/dist/preview/file-grid.html +0 -19
  66. package/dist/preview/file-row.html +0 -20
  67. package/dist/preview/file-toolbar.html +0 -40
  68. package/dist/preview/file-viewer.html +0 -31
  69. package/dist/preview/header.html +0 -24
  70. package/dist/preview/icons-unicode.html +0 -26
  71. package/dist/preview/index-row.html +0 -25
  72. package/dist/preview/inputs.html +0 -22
  73. package/dist/preview/manifesto.html +0 -52
  74. package/dist/preview/motion-default.js +0 -106
  75. package/dist/preview/rules.html +0 -16
  76. package/dist/preview/spacing.html +0 -18
  77. package/dist/preview/stamps-lore.html +0 -20
  78. package/dist/preview/stamps.html +0 -14
  79. package/dist/preview/theme-ink.html +0 -15
  80. package/dist/preview/type-display.html +0 -16
  81. package/dist/preview/type-mono.html +0 -15
  82. package/dist/preview/type-prose.html +0 -11
  83. package/dist/preview/type-scale.html +0 -20
  84. package/dist/preview/wordmarks.html +0 -28
  85. package/dist/robots.txt +0 -8
  86. package/dist/site/content/globals/navigation.yaml +0 -5
  87. package/dist/site/content/globals/site.yaml +0 -16
  88. package/dist/site/content/pages/freddie.yaml +0 -88
  89. package/dist/site/content/pages/home.yaml +0 -190
  90. package/dist/site/theme.mjs +0 -368
  91. package/dist/sitemap.xml +0 -31
  92. package/dist/slides/deck-stage-overlay.js +0 -63
  93. package/dist/slides/deck-stage-state.js +0 -81
  94. package/dist/slides/deck-stage-style.js +0 -117
  95. package/dist/slides/deck-stage.js +0 -159
  96. package/dist/slides/index.html +0 -276
  97. package/dist/src/bootstrap.js +0 -25
  98. package/dist/src/components/chat.js +0 -199
  99. package/dist/src/components/community.js +0 -167
  100. package/dist/src/components/content.js +0 -213
  101. package/dist/src/components/files-modals.js +0 -107
  102. package/dist/src/components/files.js +0 -118
  103. package/dist/src/components/freddie/helpers.js +0 -50
  104. package/dist/src/components/freddie.js +0 -33
  105. package/dist/src/components/shell.js +0 -117
  106. package/dist/src/components/theme-toggle.js +0 -70
  107. package/dist/src/components.js +0 -52
  108. package/dist/src/debug.js +0 -30
  109. package/dist/src/deck-stage.js +0 -21
  110. package/dist/src/highlight.js +0 -32
  111. package/dist/src/index.js +0 -86
  112. package/dist/src/kits/os/about-app.js +0 -52
  113. package/dist/src/kits/os/app-panes.css +0 -152
  114. package/dist/src/kits/os/browser-app.js +0 -58
  115. package/dist/src/kits/os/files-app.js +0 -44
  116. package/dist/src/kits/os/freddie/helpers.js +0 -59
  117. package/dist/src/kits/os/freddie/pages-chat.js +0 -143
  118. package/dist/src/kits/os/freddie/pages-core.js +0 -101
  119. package/dist/src/kits/os/freddie/pages-os.js +0 -51
  120. package/dist/src/kits/os/freddie/pages-tools.js +0 -183
  121. package/dist/src/kits/os/freddie/routes.js +0 -24
  122. package/dist/src/kits/os/freddie-dashboard.css +0 -51
  123. package/dist/src/kits/os/freddie-dashboard.js +0 -101
  124. package/dist/src/kits/os/icons.js +0 -17
  125. package/dist/src/kits/os/index.js +0 -5
  126. package/dist/src/kits/os/launcher.css +0 -61
  127. package/dist/src/kits/os/launcher.js +0 -79
  128. package/dist/src/kits/os/monitor-app.js +0 -34
  129. package/dist/src/kits/os/shell.js +0 -214
  130. package/dist/src/kits/os/terminal-app.js +0 -45
  131. package/dist/src/kits/os/theme.css +0 -412
  132. package/dist/src/kits/os/validate.css +0 -19
  133. package/dist/src/kits/os/validator-app.js +0 -55
  134. package/dist/src/kits/os/wm.css +0 -115
  135. package/dist/src/kits/os/wm.js +0 -111
  136. package/dist/src/markdown.js +0 -39
  137. package/dist/src/motion.js +0 -35
  138. package/dist/src/page-html.js +0 -196
  139. package/dist/src/styles.js +0 -25
  140. package/dist/src/theme.js +0 -99
  141. package/dist/src/web-components/ds-chat.js +0 -45
  142. package/dist/ui_kits/aicat/README.md +0 -7
  143. package/dist/ui_kits/aicat/app.js +0 -156
  144. package/dist/ui_kits/aicat/index.html +0 -26
  145. package/dist/ui_kits/aicat/sample-square.png +0 -0
  146. package/dist/ui_kits/aicat/sample-svg.svg +0 -1
  147. package/dist/ui_kits/aicat/sample.pdf +0 -32
  148. package/dist/ui_kits/blog/README.md +0 -3
  149. package/dist/ui_kits/blog/index.html +0 -90
  150. package/dist/ui_kits/chat/README.md +0 -5
  151. package/dist/ui_kits/chat/app.js +0 -110
  152. package/dist/ui_kits/chat/index.html +0 -26
  153. package/dist/ui_kits/chat/sample-square.png +0 -0
  154. package/dist/ui_kits/chat/sample-svg.svg +0 -1
  155. package/dist/ui_kits/chat/sample.pdf +0 -32
  156. package/dist/ui_kits/community/app.js +0 -134
  157. package/dist/ui_kits/community/index.html +0 -24
  158. package/dist/ui_kits/dashboard/app.js +0 -92
  159. package/dist/ui_kits/dashboard/index.html +0 -26
  160. package/dist/ui_kits/docs/README.md +0 -3
  161. package/dist/ui_kits/docs/index.html +0 -123
  162. package/dist/ui_kits/error_404/app.js +0 -56
  163. package/dist/ui_kits/error_404/index.html +0 -26
  164. package/dist/ui_kits/file_browser/README.md +0 -48
  165. package/dist/ui_kits/file_browser/app.js +0 -231
  166. package/dist/ui_kits/file_browser/index.html +0 -33
  167. package/dist/ui_kits/gallery/app.js +0 -121
  168. package/dist/ui_kits/gallery/index.html +0 -26
  169. package/dist/ui_kits/homepage/README.md +0 -7
  170. package/dist/ui_kits/homepage/app.js +0 -167
  171. package/dist/ui_kits/homepage/index.html +0 -46
  172. package/dist/ui_kits/project_page/README.md +0 -3
  173. package/dist/ui_kits/project_page/app.js +0 -154
  174. package/dist/ui_kits/project_page/index.html +0 -45
  175. package/dist/ui_kits/search/app.js +0 -107
  176. package/dist/ui_kits/search/index.html +0 -26
  177. package/dist/ui_kits/settings/app.js +0 -133
  178. package/dist/ui_kits/settings/index.html +0 -26
  179. package/dist/ui_kits/signin/app.js +0 -115
  180. package/dist/ui_kits/signin/index.html +0 -26
  181. package/dist/ui_kits/slide_deck/app.js +0 -174
  182. package/dist/ui_kits/slide_deck/index.html +0 -26
  183. package/dist/ui_kits/system_primer/app.js +0 -152
  184. package/dist/ui_kits/system_primer/index.html +0 -26
  185. package/dist/ui_kits/terminal/app.js +0 -150
  186. package/dist/ui_kits/terminal/index.html +0 -26
  187. package/dist/vendor/webjsx/applyDiff.js +0 -182
  188. package/dist/vendor/webjsx/attributes.js +0 -154
  189. package/dist/vendor/webjsx/constants.js +0 -4
  190. package/dist/vendor/webjsx/createDOMElement.js +0 -52
  191. package/dist/vendor/webjsx/createElement.js +0 -75
  192. package/dist/vendor/webjsx/elementTags.js +0 -115
  193. package/dist/vendor/webjsx/factory.js +0 -6
  194. package/dist/vendor/webjsx/index.js +0 -6
  195. package/dist/vendor/webjsx/jsx-dev-runtime.js +0 -2
  196. package/dist/vendor/webjsx/jsx-runtime.js +0 -30
  197. package/dist/vendor/webjsx/jsx.js +0 -2
  198. package/dist/vendor/webjsx/package.json +0 -39
  199. package/dist/vendor/webjsx/renderSuspension.js +0 -25
  200. package/dist/vendor/webjsx/types.js +0 -5
  201. package/dist/vendor/webjsx/utils.js +0 -84
  202. package/src/components/overlays.js +0 -151
package/app-shell.css CHANGED
@@ -1,594 +1,931 @@
1
- /* ============================================================
2
- 247420 design system — component sheet
3
- Tonal surfaces over borders. Indicator rails over hairlines.
4
- Friendly rounded sans body; mono only on real code.
5
- ============================================================ */
6
-
7
- /* ============================================================
8
- Base
9
- ============================================================ */
10
- * { box-sizing: border-box; }
11
- html, body { margin: 0; padding: 0; }
12
- body {
13
- background: var(--bg);
14
- color: var(--fg);
15
- font-family: var(--ff-body);
16
- font-size: var(--fs-body);
17
- line-height: var(--lh-base);
18
- -webkit-font-smoothing: antialiased;
19
- text-rendering: optimizeLegibility;
20
- }
21
- ::selection { background: var(--mascot); color: var(--ink); }
22
-
23
- /* Every root has a CQ container so fluid type can resolve to a meaningful inline-size. */
24
- .app, [class*="kit-"], .ds-stage {
25
- container-type: inline-size;
26
- overflow-x: clip;
27
- min-width: 0;
28
- }
29
- .app *, [class*="kit-"] * { min-width: 0; }
30
-
31
- /* ============================================================
32
- Typography
33
- ============================================================ */
34
- h1, .t-h1 { font-family: var(--ff-body); font-size: var(--fs-h1); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
35
- h2, .t-h2 { font-family: var(--ff-body); font-size: var(--fs-h2); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
36
- h3, .t-h3 { font-family: var(--ff-body); font-size: var(--fs-h3); line-height: var(--lh-snug); letter-spacing: -0.01em; font-weight: 600; margin: 0; }
37
- h4, .t-h4 { font-family: var(--ff-body); font-size: var(--fs-h4); line-height: var(--lh-snug); font-weight: 600; margin: 0; }
38
-
39
- .t-hero { font-family: var(--ff-body); font-size: var(--fs-hero); line-height: var(--lh-tight); letter-spacing: var(--tr-tighter); font-weight: 600; margin: 0; }
40
- .t-mega { font-family: var(--ff-body); font-size: var(--fs-mega); line-height: 0.95; letter-spacing: var(--tr-tighter); font-weight: 600; margin: 0; }
41
-
42
- .t-display { font-family: var(--ff-body); font-weight: 600; letter-spacing: var(--tr-tight); }
43
- .t-mono { font-family: var(--ff-mono); }
44
- .t-body { font-family: var(--ff-body); }
45
-
46
- .t-label { font-family: var(--ff-mono); font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-label); font-weight: 500; }
47
- .t-micro { font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: var(--tr-label); color: var(--fg-3); }
48
- .t-meta { font-family: var(--ff-body); font-size: var(--fs-sm); color: var(--fg-3); }
49
-
50
- .lede, .t-lede {
51
- font-family: var(--ff-body); font-size: var(--fs-xl);
52
- line-height: 1.4; max-width: 38ch; font-weight: 400; color: var(--fg-2);
53
- margin: 0;
54
- }
55
-
56
- .eyebrow {
57
- font-family: var(--ff-body);
58
- font-size: var(--fs-tiny);
59
- font-weight: 600;
60
- letter-spacing: var(--tr-caps);
61
- text-transform: uppercase;
62
- color: var(--accent);
63
- display: inline-flex; align-items: center; gap: 10px;
64
- }
65
- .eyebrow::before {
66
- content: '';
67
- width: 18px; height: 2px; background: currentColor;
68
- }
69
-
70
- .ds-prose {
71
- font-family: var(--ff-body);
72
- font-size: var(--fs-lg);
73
- line-height: var(--lh-long);
74
- max-width: var(--measure);
75
- text-wrap: pretty;
76
- }
77
- .ds-prose p { margin: 0 0 var(--space-4); }
78
- .ds-prose h1 { font-size: clamp(34px, 5.4cqi, 64px); margin-bottom: var(--space-3); }
79
- .ds-prose h2 { margin: var(--space-6) 0 var(--space-3); }
80
- .ds-prose h3 { margin: var(--space-5) 0 var(--space-2); font-size: var(--fs-lg); font-weight: 600; }
81
-
82
- .dim { color: var(--fg-3); }
83
-
84
- /* Links */
85
- a { color: inherit; text-decoration: none; }
86
- a.ds-link-accent, .ds-prose a {
87
- color: var(--accent);
88
- text-decoration: underline;
89
- text-underline-offset: 4px;
90
- text-decoration-thickness: 2px;
91
- }
92
- a.ds-link-accent:hover, .ds-prose a:hover {
93
- background: var(--accent); color: var(--accent-fg); text-decoration-color: transparent;
94
- }
95
-
96
- kbd {
97
- font-family: var(--ff-mono); font-size: 0.85em;
98
- background: var(--bg-2); padding: 2px 6px; border-radius: var(--r-1);
99
- }
100
-
101
- code {
102
- font-family: var(--ff-mono); font-size: 0.92em;
103
- background: var(--bg-2); padding: 0.15em 0.5em; border-radius: var(--r-1);
104
- }
105
-
106
- pre {
107
- font-family: var(--ff-mono);
108
- background: var(--ink);
109
- color: var(--paper);
110
- padding: var(--space-5);
111
- overflow-x: auto;
112
- line-height: 1.55;
113
- font-size: var(--fs-sm);
114
- margin: 0;
115
- border-radius: var(--r-3);
116
- }
117
- pre .k { color: var(--mascot); }
118
- pre .s { color: var(--sun); }
119
- pre .c { color: #9A9AA2; }
120
- pre .n { color: var(--green-2); }
121
-
122
- /* ============================================================
123
- AppShell — page frame. The topbar floats above a soft background;
124
- the body sits inside a rounded inner shell for a friendlier feel.
125
- ============================================================ */
126
- .app {
127
- display: flex; flex-direction: column;
128
- min-height: 100vh;
129
- background: var(--bg);
130
- color: var(--fg);
131
- }
132
-
133
- .app-topbar {
134
- position: sticky; top: 0; z-index: var(--z-header);
135
- display: grid; grid-template-columns: auto 1fr auto;
136
- align-items: center; gap: var(--space-4);
137
- padding: 18px var(--pad-x);
138
- background: color-mix(in oklab, var(--bg) 88%, transparent);
139
- backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
140
- }
141
- .app-topbar nav { display: flex; gap: 4px; font-size: var(--fs-sm); }
142
- .app-topbar nav a {
143
- color: var(--fg-2);
144
- padding: 8px 14px;
145
- border-radius: var(--r-pill);
146
- transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
147
- }
148
- .app-topbar nav a:hover { background: var(--bg-2); color: var(--fg); }
149
- .app-topbar nav a.active {
150
- color: var(--accent-fg);
151
- background: var(--accent);
152
- font-weight: 600;
153
- }
154
-
155
- .brand {
156
- font-family: var(--ff-body);
157
- font-weight: 700; font-size: var(--fs-sm);
158
- letter-spacing: -0.01em;
159
- }
160
- .brand .slash { color: var(--fg-3); font-weight: 400; margin: 0 2px; }
161
-
162
- .app-search {
163
- display: inline-flex; align-items: center; gap: 10px;
164
- padding: 9px 16px; background: var(--bg-2);
165
- border-radius: var(--r-pill);
166
- font-size: var(--fs-sm); color: var(--fg-3);
167
- max-width: 360px;
168
- }
169
- .app-search .icon { opacity: 0.6; }
170
- .app-search input {
171
- border: 0; outline: 0; background: transparent;
172
- font-family: inherit; font-size: inherit; color: var(--fg);
173
- width: 100%;
174
- }
175
-
176
- .app-crumb {
177
- padding: 0 var(--pad-x) 14px;
178
- display: flex; align-items: center; gap: 8px;
179
- font-size: var(--fs-sm); color: var(--fg-3);
180
- }
181
- .app-crumb .sep { opacity: 0.5; }
182
- .app-crumb .leaf { color: var(--fg); font-weight: 600; }
183
- .app-crumb .crumb-right { margin-left: auto; color: var(--fg-3); }
184
-
185
- .app-side-shell { background: var(--bg); }
186
- .app-body { display: grid; grid-template-columns: 220px minmax(0, 1fr); flex: 1; min-height: 0; }
187
- .app-body.no-side { grid-template-columns: minmax(0, 1fr); }
188
-
189
- .app-side {
190
- display: flex; flex-direction: column; gap: var(--space-4);
191
- padding: var(--space-5) var(--space-3);
192
- font-size: var(--fs-sm);
193
- }
194
- .app-side .group {
195
- font-size: var(--fs-xs); font-weight: 600;
196
- color: var(--fg-3); padding: 0 var(--space-3);
197
- margin-bottom: 6px;
198
- }
199
- .app-side a {
200
- display: grid; grid-template-columns: 18px 1fr auto;
201
- gap: 10px; align-items: center;
202
- padding: 10px 14px;
203
- border-radius: var(--r-pill);
204
- color: var(--fg-2);
205
- margin-bottom: 2px;
206
- }
207
- .app-side a:hover { background: var(--bg-2); color: var(--fg); }
208
- .app-side a.active {
209
- color: var(--accent-fg);
210
- background: var(--accent);
211
- font-weight: 600;
212
- }
213
- .app-side .count {
214
- background: var(--mascot); color: var(--ink);
215
- padding: 1px 9px; font-size: var(--fs-micro); font-weight: 700;
216
- border-radius: var(--r-pill);
217
- }
218
-
219
- .app-main {
220
- padding: var(--space-7) var(--pad-x);
221
- min-width: 0;
222
- }
223
- .app-main.narrow { max-width: 760px; margin: 0 auto; }
224
-
225
- .app-status {
226
- display: flex; align-items: center; gap: var(--space-3);
227
- padding: 14px var(--pad-x);
228
- font-family: var(--ff-mono); font-size: var(--fs-xs);
229
- color: var(--fg-3);
230
- }
231
- .app-status .item { color: inherit; }
232
- .app-status .item:first-of-type { color: var(--accent); }
233
- .app-status .spread { flex: 1; }
234
-
235
- /* ============================================================
236
- Primitives
237
- ============================================================ */
238
- .btn, .btn-primary, .btn-ghost {
239
- display: inline-flex; align-items: center; gap: 8px;
240
- padding: 13px 22px;
241
- font-family: var(--ff-body);
242
- font-weight: 600; font-size: var(--fs-sm);
243
- text-decoration: none;
244
- cursor: pointer;
245
- border-radius: var(--r-pill);
246
- border: 0;
247
- transition: transform var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
248
- }
249
- .btn { background: var(--bg-2); color: var(--fg); }
250
- .btn:hover { background: var(--bg-3); color: var(--fg); }
251
- .btn-primary { background: var(--accent); color: var(--accent-fg); }
252
- .btn-primary:hover { background: var(--fg); color: var(--bg); }
253
- .btn-ghost { background: transparent; color: var(--fg); box-shadow: inset 0 0 0 1.5px var(--rule-strong); }
254
- .btn-ghost:hover { background: var(--bg-2); }
255
- .btn:active, .btn-primary:active, .btn-ghost:active { transform: translateY(1px); }
256
-
257
- .chip {
258
- display: inline-flex; align-items: center; gap: 6px;
259
- padding: 3px 10px;
260
- background: var(--bg-2); color: var(--fg-2);
261
- font-family: var(--ff-body);
262
- font-size: var(--fs-tiny); font-weight: 600;
263
- letter-spacing: var(--tr-caps); text-transform: uppercase;
264
- border-radius: var(--r-pill);
265
- }
266
- .chip.tone-green { background: var(--green-tint); color: var(--green-deep); }
267
- .chip.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
268
- .chip.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
269
- .chip.tone-sun { background: var(--sun); color: var(--ink); }
270
- .chip.tone-flame { background: var(--flame); color: var(--paper); }
271
- .chip.tone-live { background: var(--green-tint); color: var(--green-deep); }
272
- .chip.tone-wip { background: var(--bg-3); color: var(--fg-2); }
273
-
274
- .glyph {
275
- display: inline-flex; align-items: center; justify-content: center;
276
- width: 18px; height: 18px;
277
- font-family: var(--ff-mono); font-size: 13px;
278
- opacity: 0.8;
279
- }
280
-
281
- /* ============================================================
282
- Panel — soft tonal container, no border decoration
283
- ============================================================ */
284
- .panel {
285
- background: var(--bg);
286
- border-radius: var(--r-3);
287
- margin: 0 0 var(--space-5);
288
- position: relative;
289
- }
290
- .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
291
- .panel.panel-wide { background: transparent; }
292
- .panel-head {
293
- display: flex; align-items: baseline; justify-content: space-between;
294
- padding: var(--space-4) var(--space-5) var(--space-3);
295
- font-size: var(--fs-xs); font-weight: 600;
296
- color: var(--fg-3);
297
- letter-spacing: var(--tr-caps); text-transform: uppercase;
298
- }
299
- .panel-head > :last-child {
300
- font-weight: 500; color: var(--fg-3);
301
- font-family: var(--ff-mono); letter-spacing: 0;
302
- }
303
- .panel-body { padding: var(--space-2) var(--space-3) var(--space-3); }
304
- .panel.panel-wide .panel-body { padding: 0; }
305
-
306
- /* ============================================================
307
- Row — primary list pattern. Indicator rail on the left,
308
- no hairlines between rows.
309
- ============================================================ */
310
- .row {
311
- display: grid;
312
- grid-template-columns: minmax(80px, 12ch) minmax(0, 1fr) auto;
313
- gap: var(--space-3);
314
- align-items: baseline;
315
- padding: 18px 22px;
316
- background: var(--bg);
317
- border-radius: var(--r-2);
318
- color: var(--fg);
319
- position: relative;
320
- transition: background var(--dur-snap) var(--ease), padding var(--dur-base) var(--ease);
321
- }
322
- .row + .row { margin-top: 4px; }
323
- .row::before {
324
- content: '';
325
- position: absolute; left: 6px; top: 22%; bottom: 22%; width: 3px;
326
- background: transparent; border-radius: 3px;
327
- transition: background var(--dur-snap) var(--ease);
328
- }
329
- .row:hover { background: var(--bg-2); }
330
- .row:hover::before { background: var(--rule-strong); }
331
- .row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
332
- .row.active::before { background: var(--accent); }
333
- .row-grid { /* explicit grid-template-columns set inline */ }
334
-
335
- .row .code { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
336
- .row .title { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-lg); display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
337
- .row .sub { font-family: var(--ff-body); font-weight: 400; font-size: var(--fs-sm); color: var(--fg-3); }
338
- .row .meta { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); text-align: right; }
339
-
340
- a.row { text-decoration: none; }
341
-
342
- /* ============================================================
343
- Hero
344
- ============================================================ */
345
- .ds-hero {
346
- padding: var(--space-9) 0 var(--space-8);
347
- display: grid; gap: var(--space-5);
348
- max-width: 940px;
349
- }
350
- .ds-hero-title {
351
- font-family: var(--ff-body); font-weight: 600;
352
- font-size: clamp(34px, 6.4cqi, 80px);
353
- line-height: 1.05; letter-spacing: var(--tr-tight);
354
- margin: 0; max-width: 18ch;
355
- }
356
- .ds-hero-body {
357
- font-family: var(--ff-body); font-size: var(--fs-xl);
358
- line-height: 1.45; margin: 0; max-width: 52ch;
359
- color: var(--fg-2);
360
- }
361
- .ds-hero-accent { color: var(--accent); font-weight: 500; }
362
-
363
- /* ============================================================
364
- Section grouping
365
- ============================================================ */
366
- .ds-section { margin: var(--space-8) 0; }
367
- .ds-section > h3 {
368
- font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-h3);
369
- margin: 0 0 var(--space-5);
370
- letter-spacing: -0.01em;
371
- }
372
-
373
- /* ============================================================
374
- Install — single CLI command card
375
- ============================================================ */
376
- .cli {
377
- display: flex; align-items: center; gap: 14px;
378
- padding: 20px 24px;
379
- background: var(--ink); color: var(--paper);
380
- border-radius: var(--r-3);
381
- font-family: var(--ff-mono); font-size: var(--fs-lg);
382
- }
383
- .cli .prompt { color: var(--green-2); }
384
- .cli .cmd { flex: 1; color: var(--paper); }
385
- .cli .copy {
386
- padding: 8px 16px; background: transparent; color: var(--paper);
387
- font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-caps);
388
- cursor: pointer; box-shadow: inset 0 0 0 1px #6A6A70;
389
- border-radius: var(--r-pill);
390
- }
391
- .cli .copy:hover { background: #6A6A70; }
392
-
393
- /* ============================================================
394
- Receipt — key/value table
395
- ============================================================ */
396
- table.kv { width: 100%; border-collapse: collapse; }
397
- table.kv td {
398
- padding: 8px 0;
399
- font-family: var(--ff-body); font-size: var(--fs-sm);
400
- }
401
- table.kv tr + tr td { border-top: 1px solid var(--rule); }
402
- table.kv td:first-child {
403
- color: var(--fg-3);
404
- font-size: var(--fs-xs);
405
- text-transform: uppercase; letter-spacing: var(--tr-caps);
406
- width: 14ch;
407
- }
408
- table.kv td:last-child {
409
- font-weight: 600;
410
- }
411
-
412
- /* ============================================================
413
- Generic table
414
- ============================================================ */
415
- table {
416
- width: 100%; border-collapse: collapse;
417
- font-family: var(--ff-body); font-size: var(--fs-sm);
418
- border-radius: var(--r-3); overflow: hidden;
419
- }
420
- table th {
421
- text-align: left;
422
- padding: 12px 16px;
423
- font-size: var(--fs-xs); font-weight: 600;
424
- color: var(--fg-3); text-transform: uppercase; letter-spacing: var(--tr-caps);
425
- background: var(--bg-2);
426
- }
427
- table td { padding: 14px 16px; border-top: 1px solid var(--rule); }
428
- table tr.clickable { cursor: pointer; }
429
- table tr.clickable:hover td { background: var(--bg-2); }
430
-
431
- /* ============================================================
432
- Changelog
433
- ============================================================ */
434
- .ds-changelog-row {
435
- grid-template-columns: minmax(110px, 14ch) minmax(60px, 9ch) minmax(0, 1fr) !important;
436
- }
437
- .ds-changelog-ver {
438
- font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-sm);
439
- }
440
-
441
- /* ============================================================
442
- Works
443
- ============================================================ */
444
- .work-detail {
445
- padding: var(--space-4) var(--space-5) var(--space-5);
446
- margin: 4px 0 var(--space-2);
447
- background: var(--bg-2);
448
- border-radius: var(--r-3);
449
- display: flex; flex-direction: column; gap: var(--space-3);
450
- }
451
- .ds-work-body { margin: 0; max-width: 60ch; }
452
- .ds-work-actions { display: flex; gap: 10px; flex-wrap: wrap; }
453
-
454
- /* ============================================================
455
- Manifesto / pull moment
456
- ============================================================ */
457
- .ds-manifesto { max-width: 60ch; }
458
- .ds-manifesto-para {
459
- font-family: var(--ff-body); font-size: var(--fs-lg);
460
- line-height: var(--lh-long); margin: 0 0 var(--space-3);
461
- }
462
- .ds-manifesto-para.dim { color: var(--fg-3); }
463
-
464
- /* ============================================================
465
- Currently shipping dots
466
- ============================================================ */
467
- .ds-dot-live { color: var(--green-2); }
468
- .ds-dot-idle { color: var(--fg-3); }
469
-
470
- /* ============================================================
471
- KPI
472
- ============================================================ */
473
- .kpi {
474
- display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
475
- gap: var(--space-2);
476
- }
477
- .kpi-card {
478
- padding: var(--space-5);
479
- background: var(--bg-2);
480
- border-radius: var(--r-3);
481
- }
482
- .kpi-card .num {
483
- font-family: var(--ff-body); font-weight: 600;
484
- font-size: clamp(30px, 3.6cqi, 48px); line-height: 1;
485
- letter-spacing: var(--tr-tight);
486
- }
487
- .kpi-card .lbl {
488
- font-size: var(--fs-xs); color: var(--fg-3);
489
- font-weight: 600; margin-top: 8px;
490
- letter-spacing: var(--tr-caps); text-transform: uppercase;
491
- }
492
-
493
- /* ============================================================
494
- Empty state
495
- ============================================================ */
496
- .empty {
497
- padding: var(--space-8);
498
- text-align: center;
499
- color: var(--fg-3);
500
- background: var(--bg-2);
501
- border-radius: var(--r-3);
502
- font-size: var(--fs-sm);
503
- }
504
-
505
- /* ============================================================
506
- Form
507
- ============================================================ */
508
- .row-form {
509
- display: grid; gap: 12px;
510
- padding: var(--space-5);
511
- background: var(--bg-2);
512
- border-radius: var(--r-3);
513
- }
514
- .row-form input,
515
- .row-form textarea {
516
- font-family: inherit; font-size: var(--fs-sm);
517
- padding: 12px 16px;
518
- background: var(--bg); color: var(--fg);
519
- border: 0; border-radius: var(--r-2); outline: 0;
520
- box-shadow: inset 0 0 0 1px var(--rule);
521
- }
522
- .row-form input:focus,
523
- .row-form textarea:focus { box-shadow: inset 0 0 0 2px var(--accent); }
524
-
525
- /* ============================================================
526
- Responsive
527
- ============================================================ */
528
- @container (max-width: 760px) {
529
- .app-body { grid-template-columns: 1fr !important; }
530
- .app-side-shell { border-right: 0; border-bottom: 1px solid var(--rule); }
531
- .app-topbar { grid-template-columns: 1fr auto; }
532
- .app-topbar nav { font-size: var(--fs-xs); gap: 14px; }
533
- .row { grid-template-columns: minmax(0, 1fr) auto !important; row-gap: 4px !important; }
534
- .row .sub { grid-column: 1 / -1; order: 3; }
535
- }
536
-
537
- /* ============================================================
538
- Chat — minimal styles (placeholder for full chat surface)
539
- ============================================================ */
540
- .ds-chat { display: flex; flex-direction: column; gap: 12px; padding: var(--space-4); }
541
- .ds-chat-msg { padding: 12px 18px; background: var(--bg-2); border-radius: var(--r-3); max-width: 36em; }
542
- .ds-chat-msg.user { background: var(--accent); color: var(--accent-fg); align-self: flex-end; }
543
- .ds-chat-md { font-size: var(--fs-sm); line-height: 1.6; }
544
- .ds-chat-composer { display: flex; gap: 8px; padding: var(--space-4); }
545
- .ds-chat-composer input { flex: 1; padding: 13px 18px; background: var(--bg-2); border: 0; border-radius: var(--r-pill); font-family: inherit; font-size: var(--fs-sm); color: var(--fg); outline: 0; }
546
- .ds-chat-composer input:focus { box-shadow: inset 0 0 0 2px var(--accent); }
547
-
548
- /* ============================================================
549
- File surface — minimal placeholder
550
- ============================================================ */
551
- .ds-file-row {
552
- display: grid; grid-template-columns: 28px minmax(0, 1fr) auto auto;
553
- gap: 14px; align-items: center;
554
- padding: 12px 18px; background: var(--bg);
555
- border-radius: var(--r-2); color: var(--fg);
556
- }
557
- .ds-file-row + .ds-file-row { margin-top: 3px; }
558
- .ds-file-row:hover { background: var(--bg-2); }
559
- .ds-file-row[data-file-type="dir"] { border-left: 3px solid var(--accent); padding-left: 11px; }
560
- .ds-file-row[data-file-type="image"] { border-left: 3px solid var(--mascot); padding-left: 11px; }
561
- .ds-file-row[data-file-type="video"] { border-left: 3px solid var(--purple-2); padding-left: 11px; }
562
- .ds-file-row[data-file-type="audio"] { border-left: 3px solid var(--sky); padding-left: 11px; }
563
- .ds-file-row[data-file-type="code"] { border-left: 3px solid var(--green-2); padding-left: 11px; }
564
- .ds-file-row[data-file-type="text"] { border-left: 3px solid var(--ink-3); padding-left: 11px; }
565
- .ds-file-row[data-file-type="archive"] { border-left: 3px solid var(--flame); padding-left: 11px; }
566
- .ds-file-row[data-file-type="document"] { border-left: 3px solid var(--sun); padding-left: 11px; }
567
- .ds-file-row[data-file-type="other"] { border-left: 3px solid var(--fg-3); padding-left: 11px; }
568
- .ds-file-row .name { font-weight: 500; }
569
- .ds-file-row .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
570
- .ds-file-row .time { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
571
-
572
- /* ============================================================
573
- Theme toggle (segmented + compact) — bound to src/theme.js
574
- ============================================================ */
575
- .ds-segmented {
576
- display: inline-flex; gap: 0; padding: 2px;
577
- background: var(--bg-2); border-radius: var(--r-pill);
578
- font-family: var(--ff-mono); font-size: var(--fs-xs);
579
- }
580
- .ds-segmented .ds-seg-btn {
581
- background: transparent; border: 0; color: var(--fg-3);
582
- padding: 4px 12px; border-radius: var(--r-pill); cursor: pointer;
583
- display: inline-flex; align-items: center; gap: 6px;
584
- transition: color var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
585
- }
586
- .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
587
- .ds-segmented .ds-seg-btn.is-on {
588
- background: var(--bg); color: var(--fg);
589
- box-shadow: 0 1px 2px rgba(0,0,0,0.08);
590
- }
591
- .ds-theme-toggle.btn {
592
- font-family: var(--ff-mono); font-size: var(--fs-xs);
593
- display: inline-flex; align-items: center; gap: 6px;
594
- }
1
+ /* ============================================================
2
+ 247420 design system — component sheet
3
+ Tonal surfaces over borders. Indicator rails over hairlines.
4
+ Friendly rounded sans body; mono only on real code.
5
+ ============================================================ */
6
+
7
+ /* ============================================================
8
+ Base
9
+ ============================================================ */
10
+ * { box-sizing: border-box; }
11
+ html, body { margin: 0; padding: 0; }
12
+ body {
13
+ background: var(--bg);
14
+ color: var(--fg);
15
+ font-family: var(--ff-body);
16
+ font-size: var(--fs-body);
17
+ line-height: var(--lh-base);
18
+ -webkit-font-smoothing: antialiased;
19
+ text-rendering: optimizeLegibility;
20
+ }
21
+ ::selection { background: var(--mascot); color: var(--ink); }
22
+
23
+ /* Every root has a CQ container so fluid type can resolve to a meaningful inline-size. */
24
+ .app, [class*="kit-"], .ds-stage {
25
+ container-type: inline-size;
26
+ overflow-x: clip;
27
+ min-width: 0;
28
+ }
29
+ .app *, [class*="kit-"] * { min-width: 0; }
30
+
31
+ /* ============================================================
32
+ Typography
33
+ ============================================================ */
34
+ h1, .t-h1 { font-family: var(--ff-body); font-size: var(--fs-h1); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
35
+ h2, .t-h2 { font-family: var(--ff-body); font-size: var(--fs-h2); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
36
+ h3, .t-h3 { font-family: var(--ff-body); font-size: var(--fs-h3); line-height: var(--lh-snug); letter-spacing: -0.01em; font-weight: 600; margin: 0; }
37
+ h4, .t-h4 { font-family: var(--ff-body); font-size: var(--fs-h4); line-height: var(--lh-snug); font-weight: 600; margin: 0; }
38
+
39
+ .t-hero { font-family: var(--ff-body); font-size: var(--fs-hero); line-height: var(--lh-tight); letter-spacing: var(--tr-tighter); font-weight: 600; margin: 0; }
40
+ .t-mega { font-family: var(--ff-body); font-size: var(--fs-mega); line-height: 0.95; letter-spacing: var(--tr-tighter); font-weight: 600; margin: 0; }
41
+
42
+ .t-display { font-family: var(--ff-body); font-weight: 600; letter-spacing: var(--tr-tight); }
43
+ .t-mono { font-family: var(--ff-mono); }
44
+ .t-body { font-family: var(--ff-body); }
45
+
46
+ .t-label { font-family: var(--ff-mono); font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-label); font-weight: 500; }
47
+ .t-micro { font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: var(--tr-label); color: var(--fg-3); }
48
+ .t-meta { font-family: var(--ff-body); font-size: var(--fs-sm); color: var(--fg-3); }
49
+
50
+ .lede, .t-lede {
51
+ font-family: var(--ff-body); font-size: var(--fs-xl);
52
+ line-height: 1.4; max-width: 38ch; font-weight: 400; color: var(--fg-2);
53
+ margin: 0;
54
+ }
55
+
56
+ .eyebrow {
57
+ font-family: var(--ff-body);
58
+ font-size: var(--fs-tiny);
59
+ font-weight: 600;
60
+ letter-spacing: var(--tr-caps);
61
+ text-transform: uppercase;
62
+ color: var(--accent);
63
+ display: inline-flex; align-items: center; gap: 10px;
64
+ }
65
+ .eyebrow::before {
66
+ content: '';
67
+ width: 18px; height: 2px; background: currentColor;
68
+ }
69
+
70
+ .ds-prose {
71
+ font-family: var(--ff-body);
72
+ font-size: var(--fs-lg);
73
+ line-height: var(--lh-long);
74
+ max-width: var(--measure);
75
+ text-wrap: pretty;
76
+ }
77
+ .ds-prose p { margin: 0 0 var(--space-4); }
78
+ .ds-prose h1 { font-size: clamp(34px, 5.4cqi, 64px); margin-bottom: var(--space-3); }
79
+ .ds-prose h2 { margin: var(--space-6) 0 var(--space-3); }
80
+ .ds-prose h3 { margin: var(--space-5) 0 var(--space-2); font-size: var(--fs-lg); font-weight: 600; }
81
+
82
+ .dim { color: var(--fg-3); }
83
+
84
+ /* Links */
85
+ a { color: inherit; text-decoration: none; }
86
+ a.ds-link-accent, .ds-prose a {
87
+ color: var(--accent);
88
+ text-decoration: underline;
89
+ text-underline-offset: 4px;
90
+ text-decoration-thickness: 2px;
91
+ }
92
+ a.ds-link-accent:hover, .ds-prose a:hover {
93
+ background: var(--accent); color: var(--accent-fg); text-decoration-color: transparent;
94
+ }
95
+
96
+ kbd {
97
+ font-family: var(--ff-mono); font-size: 0.85em;
98
+ background: var(--bg-2); padding: 2px 6px; border-radius: var(--r-1);
99
+ }
100
+
101
+ code {
102
+ font-family: var(--ff-mono); font-size: 0.92em;
103
+ background: var(--bg-2); padding: 0.15em 0.5em; border-radius: var(--r-1);
104
+ }
105
+
106
+ pre {
107
+ font-family: var(--ff-mono);
108
+ background: var(--ink);
109
+ color: var(--paper);
110
+ padding: var(--space-5);
111
+ overflow-x: auto;
112
+ line-height: 1.55;
113
+ font-size: var(--fs-sm);
114
+ margin: 0;
115
+ border-radius: var(--r-3);
116
+ }
117
+ pre .k { color: var(--mascot); }
118
+ pre .s { color: var(--sun); }
119
+ pre .c { color: #9A9AA2; }
120
+ pre .n { color: var(--green-2); }
121
+
122
+ /* ============================================================
123
+ AppShell — page frame. The topbar floats above a soft background;
124
+ the body sits inside a rounded inner shell for a friendlier feel.
125
+ ============================================================ */
126
+ .app {
127
+ display: flex; flex-direction: column;
128
+ min-height: 100vh;
129
+ background: var(--bg);
130
+ color: var(--fg);
131
+ }
132
+
133
+ .app-topbar {
134
+ position: sticky; top: 0; z-index: var(--z-header);
135
+ display: grid; grid-template-columns: auto 1fr auto;
136
+ align-items: center; gap: var(--space-4);
137
+ padding: 18px var(--pad-x);
138
+ background: color-mix(in oklab, var(--bg) 88%, transparent);
139
+ backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
140
+ }
141
+ .app-topbar nav { display: flex; gap: 4px; font-size: var(--fs-sm); }
142
+ .app-topbar nav a {
143
+ color: var(--fg-2);
144
+ padding: 8px 14px;
145
+ border-radius: var(--r-pill);
146
+ transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
147
+ }
148
+ .app-topbar nav a:hover { background: var(--bg-2); color: var(--fg); }
149
+ .app-topbar nav a.active {
150
+ color: var(--accent-fg);
151
+ background: var(--accent);
152
+ font-weight: 600;
153
+ }
154
+
155
+ .brand {
156
+ font-family: var(--ff-body);
157
+ font-weight: 700; font-size: var(--fs-sm);
158
+ letter-spacing: -0.01em;
159
+ }
160
+ .brand .slash { color: var(--fg-3); font-weight: 400; margin: 0 2px; }
161
+
162
+ .app-search {
163
+ display: inline-flex; align-items: center; gap: 10px;
164
+ padding: 9px 16px; background: var(--bg-2);
165
+ border-radius: var(--r-pill);
166
+ font-size: var(--fs-sm); color: var(--fg-3);
167
+ max-width: 360px;
168
+ }
169
+ .app-search .icon { opacity: 0.6; }
170
+ .app-search input {
171
+ border: 0; outline: 0; background: transparent;
172
+ font-family: inherit; font-size: inherit; color: var(--fg);
173
+ width: 100%;
174
+ }
175
+
176
+ .app-crumb {
177
+ padding: 0 var(--pad-x) 14px;
178
+ display: flex; align-items: center; gap: 8px;
179
+ font-size: var(--fs-sm); color: var(--fg-3);
180
+ }
181
+ .app-crumb .sep { opacity: 0.5; }
182
+ .app-crumb .leaf { color: var(--fg); font-weight: 600; }
183
+ .app-crumb .crumb-right { margin-left: auto; color: var(--fg-3); }
184
+
185
+ .app-side-shell { background: var(--bg); }
186
+ .app-body { display: grid; grid-template-columns: 220px minmax(0, 1fr); flex: 1; min-height: 0; }
187
+ .app-body.no-side { grid-template-columns: minmax(0, 1fr); }
188
+
189
+ .app-side {
190
+ display: flex; flex-direction: column; gap: var(--space-4);
191
+ padding: var(--space-5) var(--space-3);
192
+ font-size: var(--fs-sm);
193
+ }
194
+ .app-side .group {
195
+ font-size: var(--fs-xs); font-weight: 600;
196
+ color: var(--fg-3); padding: 0 var(--space-3);
197
+ margin-bottom: 6px;
198
+ }
199
+ .app-side a {
200
+ display: grid; grid-template-columns: 18px 1fr auto;
201
+ gap: 10px; align-items: center;
202
+ padding: 10px 14px;
203
+ border-radius: var(--r-pill);
204
+ color: var(--fg-2);
205
+ margin-bottom: 2px;
206
+ }
207
+ .app-side a:hover { background: var(--bg-2); color: var(--fg); }
208
+ .app-side a.active {
209
+ color: var(--accent-fg);
210
+ background: var(--accent);
211
+ font-weight: 600;
212
+ }
213
+ .app-side .count {
214
+ background: var(--mascot); color: var(--ink);
215
+ padding: 1px 9px; font-size: var(--fs-micro); font-weight: 700;
216
+ border-radius: var(--r-pill);
217
+ }
218
+
219
+ .app-main {
220
+ padding: var(--space-7) var(--pad-x);
221
+ min-width: 0;
222
+ }
223
+ .app-main.narrow { max-width: 760px; margin: 0 auto; }
224
+
225
+ .app-status {
226
+ display: flex; align-items: center; gap: var(--space-3);
227
+ padding: 14px var(--pad-x);
228
+ font-family: var(--ff-mono); font-size: var(--fs-xs);
229
+ color: var(--fg-3);
230
+ }
231
+ .app-status .item { color: inherit; }
232
+ .app-status .item:first-of-type { color: var(--accent); }
233
+ .app-status .spread { flex: 1; }
234
+
235
+ /* ============================================================
236
+ Primitives
237
+ ============================================================ */
238
+ .btn, .btn-primary, .btn-ghost {
239
+ display: inline-flex; align-items: center; gap: 8px;
240
+ padding: 13px 22px;
241
+ font-family: var(--ff-body);
242
+ font-weight: 600; font-size: var(--fs-sm);
243
+ text-decoration: none;
244
+ cursor: pointer;
245
+ border-radius: var(--r-pill);
246
+ border: 0;
247
+ transition: transform var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
248
+ }
249
+ .btn { background: var(--bg-2); color: var(--fg); }
250
+ .btn:hover { background: var(--bg-3); color: var(--fg); }
251
+ .btn-primary { background: var(--accent); color: var(--accent-fg); }
252
+ .btn-primary:hover { background: var(--fg); color: var(--bg); }
253
+ .btn-ghost { background: transparent; color: var(--fg); box-shadow: inset 0 0 0 1.5px var(--rule-strong); }
254
+ .btn-ghost:hover { background: var(--bg-2); }
255
+ .btn:active, .btn-primary:active, .btn-ghost:active { transform: translateY(1px); }
256
+
257
+ .chip {
258
+ display: inline-flex; align-items: center; gap: 6px;
259
+ padding: 3px 10px;
260
+ background: var(--bg-2); color: var(--fg-2);
261
+ font-family: var(--ff-body);
262
+ font-size: var(--fs-tiny); font-weight: 600;
263
+ letter-spacing: var(--tr-caps); text-transform: uppercase;
264
+ border-radius: var(--r-pill);
265
+ }
266
+ .chip.tone-green { background: var(--green-tint); color: var(--green-deep); }
267
+ .chip.tone-purple { background: var(--purple-tint); color: var(--purple-deep); }
268
+ .chip.tone-mascot { background: var(--mascot-tint); color: var(--ink); }
269
+ .chip.tone-sun { background: var(--sun); color: var(--ink); }
270
+ .chip.tone-flame { background: var(--flame); color: var(--paper); }
271
+ .chip.tone-live { background: var(--green-tint); color: var(--green-deep); }
272
+ .chip.tone-wip { background: var(--bg-3); color: var(--fg-2); }
273
+
274
+ .glyph {
275
+ display: inline-flex; align-items: center; justify-content: center;
276
+ width: 18px; height: 18px;
277
+ font-family: var(--ff-mono); font-size: 13px;
278
+ opacity: 0.8;
279
+ }
280
+
281
+ /* ============================================================
282
+ Panel — soft tonal container, no border decoration
283
+ ============================================================ */
284
+ .panel {
285
+ background: var(--bg);
286
+ border-radius: var(--r-3);
287
+ margin: 0 0 var(--space-5);
288
+ position: relative;
289
+ }
290
+ .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
291
+ .panel.panel-wide { background: transparent; }
292
+ .panel-head {
293
+ display: flex; align-items: baseline; justify-content: space-between;
294
+ padding: var(--space-4) var(--space-5) var(--space-3);
295
+ font-size: var(--fs-xs); font-weight: 600;
296
+ color: var(--fg-3);
297
+ letter-spacing: var(--tr-caps); text-transform: uppercase;
298
+ }
299
+ .panel-head > :last-child {
300
+ font-weight: 500; color: var(--fg-3);
301
+ font-family: var(--ff-mono); letter-spacing: 0;
302
+ }
303
+ .panel-body { padding: var(--space-2) var(--space-3) var(--space-3); }
304
+ .panel.panel-wide .panel-body { padding: 0; }
305
+
306
+ /* ============================================================
307
+ Row — primary list pattern. Indicator rail on the left,
308
+ no hairlines between rows.
309
+ ============================================================ */
310
+ .row {
311
+ display: grid;
312
+ grid-template-columns: minmax(80px, 12ch) minmax(0, 1fr) auto;
313
+ gap: var(--space-3);
314
+ align-items: baseline;
315
+ padding: 18px 22px;
316
+ background: var(--bg);
317
+ border-radius: var(--r-2);
318
+ color: var(--fg);
319
+ position: relative;
320
+ transition: background var(--dur-snap) var(--ease), padding var(--dur-base) var(--ease);
321
+ }
322
+ .row + .row { margin-top: 4px; }
323
+ .row::before {
324
+ content: '';
325
+ position: absolute; left: 6px; top: 22%; bottom: 22%; width: 3px;
326
+ background: transparent; border-radius: 3px;
327
+ transition: background var(--dur-snap) var(--ease);
328
+ }
329
+ .row:hover { background: var(--bg-2); }
330
+ .row:hover::before { background: var(--rule-strong); }
331
+ .row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
332
+ .row.active::before { background: var(--accent); }
333
+ .row-grid { /* explicit grid-template-columns set inline */ }
334
+
335
+ .row .code { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
336
+ .row .title { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-lg); display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
337
+ .row .sub { font-family: var(--ff-body); font-weight: 400; font-size: var(--fs-sm); color: var(--fg-3); }
338
+ .row .meta { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); text-align: right; }
339
+
340
+ a.row { text-decoration: none; }
341
+
342
+ /* ============================================================
343
+ Hero
344
+ ============================================================ */
345
+ .ds-hero {
346
+ padding: var(--space-9) 0 var(--space-8);
347
+ display: grid; gap: var(--space-5);
348
+ max-width: 940px;
349
+ }
350
+ .ds-hero-title {
351
+ font-family: var(--ff-body); font-weight: 600;
352
+ font-size: clamp(34px, 6.4cqi, 80px);
353
+ line-height: 1.05; letter-spacing: var(--tr-tight);
354
+ margin: 0; max-width: 18ch;
355
+ }
356
+ .ds-hero-body {
357
+ font-family: var(--ff-body); font-size: var(--fs-xl);
358
+ line-height: 1.45; margin: 0; max-width: 52ch;
359
+ color: var(--fg-2);
360
+ }
361
+ .ds-hero-accent { color: var(--accent); font-weight: 500; }
362
+
363
+ /* ============================================================
364
+ Section grouping
365
+ ============================================================ */
366
+ .ds-section { margin: var(--space-8) 0; }
367
+ .ds-section > h3 {
368
+ font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-h3);
369
+ margin: 0 0 var(--space-5);
370
+ letter-spacing: -0.01em;
371
+ }
372
+
373
+ /* ============================================================
374
+ Install — single CLI command card
375
+ ============================================================ */
376
+ .cli {
377
+ display: flex; align-items: center; gap: 14px;
378
+ padding: 20px 24px;
379
+ background: var(--ink); color: var(--paper);
380
+ border-radius: var(--r-3);
381
+ font-family: var(--ff-mono); font-size: var(--fs-lg);
382
+ }
383
+ .cli .prompt { color: var(--green-2); }
384
+ .cli .cmd { flex: 1; color: var(--paper); }
385
+ .cli .copy {
386
+ padding: 8px 16px; background: transparent; color: var(--paper);
387
+ font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-caps);
388
+ cursor: pointer; box-shadow: inset 0 0 0 1px #6A6A70;
389
+ border-radius: var(--r-pill);
390
+ }
391
+ .cli .copy:hover { background: #6A6A70; }
392
+
393
+ /* ============================================================
394
+ Receipt — key/value table
395
+ ============================================================ */
396
+ table.kv { width: 100%; border-collapse: collapse; }
397
+ table.kv td {
398
+ padding: 8px 0;
399
+ font-family: var(--ff-body); font-size: var(--fs-sm);
400
+ }
401
+ table.kv tr + tr td { border-top: 1px solid var(--rule); }
402
+ table.kv td:first-child {
403
+ color: var(--fg-3);
404
+ font-size: var(--fs-xs);
405
+ text-transform: uppercase; letter-spacing: var(--tr-caps);
406
+ width: 14ch;
407
+ }
408
+ table.kv td:last-child {
409
+ font-weight: 600;
410
+ }
411
+
412
+ /* ============================================================
413
+ Generic table
414
+ ============================================================ */
415
+ table {
416
+ width: 100%; border-collapse: collapse;
417
+ font-family: var(--ff-body); font-size: var(--fs-sm);
418
+ border-radius: var(--r-3); overflow: hidden;
419
+ }
420
+ table th {
421
+ text-align: left;
422
+ padding: 12px 16px;
423
+ font-size: var(--fs-xs); font-weight: 600;
424
+ color: var(--fg-3); text-transform: uppercase; letter-spacing: var(--tr-caps);
425
+ background: var(--bg-2);
426
+ }
427
+ table td { padding: 14px 16px; border-top: 1px solid var(--rule); }
428
+ table tr.clickable { cursor: pointer; }
429
+ table tr.clickable:hover td { background: var(--bg-2); }
430
+
431
+ /* ============================================================
432
+ Changelog
433
+ ============================================================ */
434
+ .ds-changelog-row {
435
+ grid-template-columns: minmax(110px, 14ch) minmax(60px, 9ch) minmax(0, 1fr) !important;
436
+ }
437
+ .ds-changelog-ver {
438
+ font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-sm);
439
+ }
440
+
441
+ /* ============================================================
442
+ Works
443
+ ============================================================ */
444
+ .work-detail {
445
+ padding: var(--space-4) var(--space-5) var(--space-5);
446
+ margin: 4px 0 var(--space-2);
447
+ background: var(--bg-2);
448
+ border-radius: var(--r-3);
449
+ display: flex; flex-direction: column; gap: var(--space-3);
450
+ }
451
+ .ds-work-body { margin: 0; max-width: 60ch; }
452
+ .ds-work-actions { display: flex; gap: 10px; flex-wrap: wrap; }
453
+
454
+ /* ============================================================
455
+ Manifesto / pull moment
456
+ ============================================================ */
457
+ .ds-manifesto { max-width: 60ch; }
458
+ .ds-manifesto-para {
459
+ font-family: var(--ff-body); font-size: var(--fs-lg);
460
+ line-height: var(--lh-long); margin: 0 0 var(--space-3);
461
+ }
462
+ .ds-manifesto-para.dim { color: var(--fg-3); }
463
+
464
+ /* ============================================================
465
+ Currently shipping dots
466
+ ============================================================ */
467
+ .ds-dot-live { color: var(--green-2); }
468
+ .ds-dot-idle { color: var(--fg-3); }
469
+
470
+ /* ============================================================
471
+ KPI
472
+ ============================================================ */
473
+ .kpi {
474
+ display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
475
+ gap: var(--space-2);
476
+ }
477
+ .kpi-card {
478
+ padding: var(--space-5);
479
+ background: var(--bg-2);
480
+ border-radius: var(--r-3);
481
+ }
482
+ .kpi-card .num {
483
+ font-family: var(--ff-body); font-weight: 600;
484
+ font-size: clamp(30px, 3.6cqi, 48px); line-height: 1;
485
+ letter-spacing: var(--tr-tight);
486
+ }
487
+ .kpi-card .lbl {
488
+ font-size: var(--fs-xs); color: var(--fg-3);
489
+ font-weight: 600; margin-top: 8px;
490
+ letter-spacing: var(--tr-caps); text-transform: uppercase;
491
+ }
492
+
493
+ /* ============================================================
494
+ Empty state
495
+ ============================================================ */
496
+ .empty {
497
+ padding: var(--space-8);
498
+ text-align: center;
499
+ color: var(--fg-3);
500
+ background: var(--bg-2);
501
+ border-radius: var(--r-3);
502
+ font-size: var(--fs-sm);
503
+ }
504
+
505
+ /* ============================================================
506
+ Form
507
+ ============================================================ */
508
+ .row-form {
509
+ display: grid; gap: 12px;
510
+ padding: var(--space-5);
511
+ background: var(--bg-2);
512
+ border-radius: var(--r-3);
513
+ }
514
+ .row-form input,
515
+ .row-form textarea {
516
+ font-family: inherit; font-size: var(--fs-sm);
517
+ padding: 12px 16px;
518
+ background: var(--bg); color: var(--fg);
519
+ border: 0; border-radius: var(--r-2); outline: 0;
520
+ box-shadow: inset 0 0 0 1px var(--rule);
521
+ }
522
+ .row-form input:focus,
523
+ .row-form textarea:focus { box-shadow: inset 0 0 0 2px var(--accent); }
524
+
525
+ /* ============================================================
526
+ Responsive
527
+ ============================================================ */
528
+ @container (max-width: 760px) {
529
+ .app-body { grid-template-columns: 1fr !important; }
530
+ .app-side-shell { border-right: 0; border-bottom: 1px solid var(--rule); }
531
+ .app-topbar { grid-template-columns: 1fr auto; }
532
+ .app-topbar nav { font-size: var(--fs-xs); gap: 14px; }
533
+ .row { grid-template-columns: minmax(0, 1fr) auto !important; row-gap: 4px !important; }
534
+ .row .sub { grid-column: 1 / -1; order: 3; }
535
+ }
536
+
537
+ /* ============================================================
538
+ Chat — minimal styles (placeholder for full chat surface)
539
+ ============================================================ */
540
+ .ds-chat { display: flex; flex-direction: column; gap: 12px; padding: var(--space-4); }
541
+ .ds-chat-msg { padding: 12px 18px; background: var(--bg-2); border-radius: var(--r-3); max-width: 36em; }
542
+ .ds-chat-msg.user { background: var(--accent); color: var(--accent-fg); align-self: flex-end; }
543
+ .ds-chat-md { font-size: var(--fs-sm); line-height: 1.6; }
544
+ .ds-chat-composer { display: flex; gap: 8px; padding: var(--space-4); }
545
+ .ds-chat-composer input { flex: 1; padding: 13px 18px; background: var(--bg-2); border: 0; border-radius: var(--r-pill); font-family: inherit; font-size: var(--fs-sm); color: var(--fg); outline: 0; }
546
+ .ds-chat-composer input:focus { box-shadow: inset 0 0 0 2px var(--accent); }
547
+
548
+ /* ============================================================
549
+ File surface — minimal placeholder
550
+ ============================================================ */
551
+ .ds-file-row {
552
+ display: grid; grid-template-columns: 28px minmax(0, 1fr) auto auto;
553
+ gap: 14px; align-items: center;
554
+ padding: 12px 18px; background: var(--bg);
555
+ border-radius: var(--r-2); color: var(--fg);
556
+ }
557
+ .ds-file-row + .ds-file-row { margin-top: 3px; }
558
+ .ds-file-row:hover { background: var(--bg-2); }
559
+ .ds-file-row[data-file-type="dir"] { border-left: 3px solid var(--accent); padding-left: 11px; }
560
+ .ds-file-row[data-file-type="image"] { border-left: 3px solid var(--mascot); padding-left: 11px; }
561
+ .ds-file-row[data-file-type="video"] { border-left: 3px solid var(--purple-2); padding-left: 11px; }
562
+ .ds-file-row[data-file-type="audio"] { border-left: 3px solid var(--sky); padding-left: 11px; }
563
+ .ds-file-row[data-file-type="code"] { border-left: 3px solid var(--green-2); padding-left: 11px; }
564
+ .ds-file-row[data-file-type="text"] { border-left: 3px solid var(--ink-3); padding-left: 11px; }
565
+ .ds-file-row[data-file-type="archive"] { border-left: 3px solid var(--flame); padding-left: 11px; }
566
+ .ds-file-row[data-file-type="document"] { border-left: 3px solid var(--sun); padding-left: 11px; }
567
+ .ds-file-row[data-file-type="other"] { border-left: 3px solid var(--fg-3); padding-left: 11px; }
568
+ .ds-file-row .name { font-weight: 500; }
569
+ .ds-file-row .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
570
+ .ds-file-row .time { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
571
+
572
+ /* ============================================================
573
+ Theme toggle (segmented + compact) — bound to src/theme.js
574
+ ============================================================ */
575
+ .ds-segmented {
576
+ display: inline-flex; gap: 0; padding: 2px;
577
+ background: var(--bg-2); border-radius: var(--r-pill);
578
+ font-family: var(--ff-mono); font-size: var(--fs-xs);
579
+ }
580
+ .ds-segmented .ds-seg-btn {
581
+ background: transparent; border: 0; color: var(--fg-3);
582
+ padding: 4px 12px; border-radius: var(--r-pill); cursor: pointer;
583
+ display: inline-flex; align-items: center; gap: 6px;
584
+ transition: color var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
585
+ }
586
+ .ds-segmented .ds-seg-btn:hover { color: var(--fg); }
587
+ .ds-segmented .ds-seg-btn.is-on {
588
+ background: var(--bg); color: var(--fg);
589
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
590
+ }
591
+ .ds-theme-toggle.btn {
592
+ font-family: var(--ff-mono); font-size: var(--fs-xs);
593
+ display: inline-flex; align-items: center; gap: 6px;
594
+ }
595
+
596
+ /* ============================================================
597
+ Chat kit polish — styles every class emitted by Chat /
598
+ ChatMessage / ChatComposer / AICat. Before this block the
599
+ chat-* classes had no CSS and rendered as unstyled paragraphs.
600
+ ============================================================ */
601
+ .chat {
602
+ display: flex; flex-direction: column;
603
+ flex: 1; min-height: 0; gap: var(--space-3);
604
+ }
605
+ .chat-head {
606
+ display: flex; align-items: baseline; gap: 8px;
607
+ padding: 0 0 var(--space-3);
608
+ font-family: var(--ff-mono); font-size: var(--fs-xs);
609
+ color: var(--fg-3); text-transform: lowercase; letter-spacing: 0.02em;
610
+ border-bottom: 1px solid color-mix(in oklab, var(--fg) 8%, transparent);
611
+ margin-bottom: var(--space-3);
612
+ }
613
+ .chat-head .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); flex-shrink: 0; }
614
+ .chat-head > span:nth-child(2) {
615
+ font-family: var(--ff-body); font-size: var(--fs-h4);
616
+ font-weight: 600; color: var(--fg);
617
+ text-transform: none; letter-spacing: var(--tr-tight, -0.01em); line-height: 1.2;
618
+ }
619
+ .chat-head .sub { color: var(--fg-3); }
620
+ .chat-head .spread { flex: 1; }
621
+
622
+ .chat-thread {
623
+ display: flex; flex-direction: column; gap: var(--space-3);
624
+ flex: 1; min-height: 0; overflow-y: auto;
625
+ padding: var(--space-2) 0;
626
+ scrollbar-width: thin; scrollbar-color: var(--bg-3) transparent;
627
+ }
628
+ .chat-thread::-webkit-scrollbar { width: 8px; }
629
+ .chat-thread::-webkit-scrollbar-thumb { background: var(--bg-3); border-radius: 4px; }
630
+
631
+ .chat-msg { display: flex; gap: 12px; align-items: flex-start; padding: 2px 0; }
632
+ .chat-msg.you { flex-direction: row-reverse; }
633
+ .chat-msg.you .chat-stack { align-items: flex-end; }
634
+
635
+ .chat-avatar {
636
+ width: 36px; height: 36px; flex-shrink: 0;
637
+ border-radius: 50%; background: var(--bg-3); color: var(--fg);
638
+ display: inline-flex; align-items: center; justify-content: center;
639
+ font-family: var(--ff-mono); font-size: 12px; font-weight: 600;
640
+ text-transform: lowercase; letter-spacing: 0.02em; user-select: none;
641
+ }
642
+ .chat-msg.you .chat-avatar {
643
+ background: color-mix(in oklab, var(--accent) 26%, var(--bg-3));
644
+ color: var(--accent);
645
+ }
646
+ .chat-msg.aicat .chat-avatar {
647
+ background: color-mix(in oklab, var(--mascot) 26%, var(--bg-2));
648
+ color: var(--mascot);
649
+ }
650
+
651
+ .chat-stack {
652
+ display: flex; flex-direction: column; gap: 4px;
653
+ max-width: min(70%, 56ch); min-width: 0;
654
+ }
655
+
656
+ .chat-bubble {
657
+ padding: 10px 14px; background: var(--bg-2); color: var(--fg);
658
+ border-radius: 14px; line-height: 1.55;
659
+ word-wrap: break-word; overflow-wrap: anywhere;
660
+ font-size: var(--fs-sm);
661
+ }
662
+ .chat-msg.you .chat-bubble { background: var(--accent); color: var(--accent-fg); }
663
+ .chat-msg.aicat .chat-bubble {
664
+ background: color-mix(in oklab, var(--mascot) 14%, var(--bg-2));
665
+ border: 1px solid color-mix(in oklab, var(--mascot) 28%, transparent);
666
+ }
667
+ .chat-bubble code {
668
+ font-family: var(--ff-mono); font-size: 0.92em;
669
+ background: color-mix(in oklab, var(--fg) 10%, transparent);
670
+ padding: 1px 6px; border-radius: 4px;
671
+ }
672
+ .chat-msg.you .chat-bubble code { background: color-mix(in oklab, var(--accent-fg) 18%, transparent); }
673
+ .chat-bubble a {
674
+ color: inherit; text-decoration: underline;
675
+ text-underline-offset: 2px; text-decoration-thickness: 1px;
676
+ text-decoration-color: color-mix(in oklab, currentColor 50%, transparent);
677
+ }
678
+ .chat-bubble a:hover { text-decoration-color: currentColor; }
679
+ .chat-bubble strong { font-weight: 700; }
680
+ .chat-bubble em { font-style: italic; }
681
+
682
+ .chat-bubble.chat-md { line-height: 1.6; }
683
+ .chat-bubble.chat-md > :first-child { margin-top: 0; }
684
+ .chat-bubble.chat-md > :last-child { margin-bottom: 0; }
685
+ .chat-bubble.chat-md h1,
686
+ .chat-bubble.chat-md h2,
687
+ .chat-bubble.chat-md h3,
688
+ .chat-bubble.chat-md h4 {
689
+ font-family: var(--ff-body); font-weight: 600;
690
+ margin: 12px 0 6px; line-height: 1.3;
691
+ }
692
+ .chat-bubble.chat-md h1 { font-size: 1.15em; }
693
+ .chat-bubble.chat-md h2 { font-size: 1.08em; }
694
+ .chat-bubble.chat-md h3 { font-size: 1.04em; }
695
+ .chat-bubble.chat-md p { margin: 6px 0; }
696
+ .chat-bubble.chat-md ul,
697
+ .chat-bubble.chat-md ol { margin: 6px 0; padding-left: 22px; }
698
+ .chat-bubble.chat-md li { margin: 3px 0; }
699
+ .chat-bubble.chat-md blockquote {
700
+ margin: 8px 0; padding: 4px 12px;
701
+ border-left: 3px solid color-mix(in oklab, currentColor 30%, transparent);
702
+ color: color-mix(in oklab, currentColor 75%, transparent); font-style: italic;
703
+ }
704
+ .chat-bubble.chat-md pre {
705
+ background: color-mix(in oklab, var(--fg) 8%, transparent);
706
+ padding: 10px 12px; border-radius: 6px; overflow-x: auto;
707
+ font-family: var(--ff-mono); font-size: 0.9em; margin: 8px 0;
708
+ }
709
+
710
+ .chat-msg .chat-bubble.chat-code,
711
+ .chat-msg.you .chat-bubble.chat-code,
712
+ .chat-bubble.chat-code {
713
+ padding: 0; background: var(--bg);
714
+ color: var(--fg);
715
+ border: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
716
+ overflow: hidden; max-width: min(90%, 72ch);
717
+ }
718
+ .chat-code-head {
719
+ display: flex; align-items: center; gap: 10px;
720
+ padding: 8px 12px;
721
+ background: color-mix(in oklab, var(--fg) 6%, var(--bg-2));
722
+ border-bottom: 1px solid color-mix(in oklab, var(--fg) 12%, transparent);
723
+ font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3);
724
+ }
725
+ .chat-code-head .lang { text-transform: uppercase; font-weight: 700; color: var(--accent); letter-spacing: 0.06em; }
726
+ .chat-code-head .filename,
727
+ .chat-code-head .name { color: var(--fg-2); font-weight: 500; }
728
+ .chat-code-head .spread { flex: 1; }
729
+ .chat-bubble.chat-code pre {
730
+ margin: 0; padding: 12px 16px; background: transparent;
731
+ font-family: var(--ff-mono); font-size: var(--fs-xs); line-height: 1.55;
732
+ overflow-x: auto; color: var(--fg); border-radius: 0;
733
+ }
734
+ .chat-bubble.chat-code code { background: transparent; padding: 0; font-size: inherit; }
735
+ .chat-bubble.chat-code .token.keyword,
736
+ .chat-bubble.chat-code .token.atrule,
737
+ .chat-bubble.chat-code .token.selector { color: var(--accent); }
738
+ .chat-bubble.chat-code .token.string,
739
+ .chat-bubble.chat-code .token.attr-value { color: var(--mascot); }
740
+ .chat-bubble.chat-code .token.comment { color: var(--fg-3); font-style: italic; }
741
+ .chat-bubble.chat-code .token.number,
742
+ .chat-bubble.chat-code .token.boolean { color: var(--sun); }
743
+ .chat-bubble.chat-code .token.punctuation { color: var(--fg-2); }
744
+ .chat-bubble.chat-code .token.property,
745
+ .chat-bubble.chat-code .token.attr-name { color: var(--sky); }
746
+
747
+ .chat-msg.you .chat-image,
748
+ .chat-msg .chat-image,
749
+ .chat-image {
750
+ display: inline-block; border-radius: 12px; overflow: hidden;
751
+ max-width: min(100%, 480px); background: var(--bg-2);
752
+ text-decoration: none; color: var(--fg);
753
+ border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
754
+ }
755
+ .chat-image img { display: block; width: 100%; height: auto; max-height: 360px; object-fit: cover; }
756
+ .chat-image .cap,
757
+ .chat-image .caption { display: block; padding: 8px 12px; font-size: var(--fs-xs); color: var(--fg-3); font-family: var(--ff-mono); }
758
+
759
+ .chat-msg.you .chat-file,
760
+ .chat-msg .chat-file,
761
+ .chat-file {
762
+ display: flex; align-items: center; gap: 12px; padding: 12px 14px;
763
+ background: var(--bg-2); border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
764
+ border-radius: 12px; text-decoration: none; color: var(--fg);
765
+ max-width: min(100%, 360px);
766
+ transition: background var(--dur-snap, .15s) var(--ease, ease), border-color var(--dur-snap, .15s) var(--ease, ease);
767
+ }
768
+ .chat-file:hover { background: var(--bg-3); border-color: color-mix(in oklab, var(--accent) 40%, transparent); }
769
+ .chat-file .glyph {
770
+ font-size: 22px; width: 36px; height: 36px;
771
+ display: inline-flex; align-items: center; justify-content: center;
772
+ background: color-mix(in oklab, var(--accent) 18%, transparent);
773
+ color: var(--accent); border-radius: 8px; flex-shrink: 0; font-family: var(--ff-mono);
774
+ }
775
+ .chat-file > div { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
776
+ .chat-file .name {
777
+ font-weight: 600; font-size: var(--fs-sm);
778
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0;
779
+ }
780
+ .chat-file .meta { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
781
+ .chat-file .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
782
+ .chat-file .go { font-family: var(--ff-mono); font-size: 16px; color: var(--fg-3); flex-shrink: 0; }
783
+ .chat-file:hover .go { color: var(--accent); }
784
+
785
+ .chat-msg.you .chat-pdf,
786
+ .chat-msg .chat-pdf,
787
+ .chat-pdf {
788
+ background: var(--bg-2);
789
+ color: var(--fg);
790
+ border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
791
+ border-radius: 12px; overflow: hidden; max-width: min(100%, 480px);
792
+ }
793
+ .chat-pdf-head {
794
+ display: flex; align-items: center; gap: 10px; padding: 10px 14px;
795
+ background: color-mix(in oklab, var(--fg) 5%, var(--bg-2));
796
+ border-bottom: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
797
+ }
798
+ .chat-pdf-head .glyph { font-size: 18px; color: var(--mascot); flex-shrink: 0; }
799
+ .chat-pdf-head .name { flex: 1; font-weight: 600; font-size: var(--fs-sm); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
800
+ .chat-pdf-head .size { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
801
+ .chat-pdf-head a { color: var(--accent); font-family: var(--ff-mono); font-size: var(--fs-xs); text-decoration: none; }
802
+ .chat-pdf embed,
803
+ .chat-pdf iframe,
804
+ .chat-pdf object { width: 100%; height: 360px; border: 0; display: block; }
805
+
806
+ .chat-msg.you .chat-link,
807
+ .chat-msg .chat-link,
808
+ .chat-link {
809
+ display: grid; grid-template-columns: 80px 1fr; gap: 12px; padding: 10px;
810
+ background: var(--bg-2);
811
+ border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
812
+ border-radius: 12px; text-decoration: none; color: var(--fg);
813
+ max-width: min(100%, 480px);
814
+ transition: background var(--dur-snap, .15s) var(--ease, ease), border-color var(--dur-snap, .15s) var(--ease, ease);
815
+ }
816
+ .chat-link:hover { background: var(--bg-3); border-color: color-mix(in oklab, var(--accent) 40%, transparent); }
817
+ .chat-link:not(:has(.thumb)):not(:has(img)) { grid-template-columns: 1fr; }
818
+ .chat-link .thumb,
819
+ .chat-link img.thumb { width: 80px; height: 80px; border-radius: 8px; object-fit: cover; background: var(--bg-3) center/cover no-repeat; }
820
+ .chat-link .meta { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
821
+ .chat-link .host { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); text-transform: lowercase; }
822
+ .chat-link .title { font-weight: 600; font-size: var(--fs-sm); line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
823
+ .chat-link .desc { font-size: var(--fs-xs); color: var(--fg-2); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
824
+
825
+ .chat-meta {
826
+ display: flex; align-items: center; gap: 6px;
827
+ font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3);
828
+ padding: 0 6px; letter-spacing: 0.02em;
829
+ }
830
+ .chat-meta .who { font-weight: 600; color: var(--fg-2); }
831
+ .chat-meta .who::after { content: ' ·'; color: var(--fg-3); font-weight: 400; }
832
+ .chat-meta .t { color: var(--fg-3); }
833
+ .chat-meta .tick { color: var(--fg-3); margin-left: 2px; letter-spacing: -2px; font-family: var(--ff-mono); }
834
+ .chat-meta .tick.read { color: var(--accent); }
835
+
836
+ .chat-reactions {
837
+ display: flex; gap: 4px; flex-wrap: wrap; margin-top: 2px;
838
+ }
839
+ .chat-reactions .rxn {
840
+ display: inline-flex; align-items: center; gap: 4px;
841
+ padding: 2px 8px; background: var(--bg-2);
842
+ border: 1px solid color-mix(in oklab, var(--fg) 10%, transparent);
843
+ border-radius: 999px; font-size: var(--fs-xs);
844
+ cursor: pointer; user-select: none;
845
+ transition: background var(--dur-snap, .12s) var(--ease, ease), border-color var(--dur-snap, .12s) var(--ease, ease);
846
+ }
847
+ .chat-reactions .rxn:hover { background: var(--bg-3); border-color: color-mix(in oklab, var(--accent) 40%, transparent); }
848
+ .chat-reactions .rxn.you {
849
+ background: color-mix(in oklab, var(--accent) 18%, var(--bg-2));
850
+ border-color: color-mix(in oklab, var(--accent) 55%, transparent);
851
+ color: var(--accent);
852
+ }
853
+ .chat-reactions .rxn .e { font-size: 14px; line-height: 1; }
854
+ .chat-reactions .rxn .n { font-family: var(--ff-mono); font-weight: 600; font-size: 11px; color: var(--fg-2); }
855
+ .chat-reactions .rxn.you .n { color: var(--accent); }
856
+
857
+ .chat-typing { display: inline-flex; gap: 4px; align-items: center; }
858
+ .chat-typing span {
859
+ width: 6px; height: 6px; border-radius: 50%; background: var(--fg-3);
860
+ animation: chat-typing-bounce 1.4s infinite ease-in-out;
861
+ }
862
+ .chat-typing span:nth-child(1) { animation-delay: 0s; }
863
+ .chat-typing span:nth-child(2) { animation-delay: 0.18s; }
864
+ .chat-typing span:nth-child(3) { animation-delay: 0.36s; }
865
+ @keyframes chat-typing-bounce {
866
+ 0%, 60%, 100% { transform: translateY(0); opacity: 0.55; }
867
+ 30% { transform: translateY(-5px); opacity: 1; }
868
+ }
869
+
870
+ .chat-composer {
871
+ display: flex; align-items: flex-end; gap: 8px;
872
+ padding: var(--space-3) 0 0;
873
+ border-top: 1px solid color-mix(in oklab, var(--fg) 8%, transparent);
874
+ flex-shrink: 0;
875
+ }
876
+ .chat-composer textarea {
877
+ flex: 1; padding: 12px 16px;
878
+ background: var(--bg-2); color: var(--fg);
879
+ border: 1px solid transparent; border-radius: var(--r-pill);
880
+ font-family: inherit; font-size: var(--fs-sm);
881
+ line-height: 1.4; resize: none; outline: 0;
882
+ min-height: 44px; max-height: 200px;
883
+ }
884
+ .chat-composer textarea::placeholder { color: var(--fg-3); }
885
+ .chat-composer textarea:focus {
886
+ background: var(--bg-2);
887
+ border-color: var(--accent);
888
+ box-shadow: 0 0 0 1px var(--accent);
889
+ }
890
+ .chat-composer .send,
891
+ .chat-composer button {
892
+ width: 44px; height: 44px; border-radius: 50%;
893
+ background: var(--accent); color: var(--accent-fg);
894
+ border: 0; cursor: pointer; font-size: 18px; font-weight: 700;
895
+ display: inline-flex; align-items: center; justify-content: center;
896
+ flex-shrink: 0; font-family: var(--ff-body);
897
+ transition: background var(--dur-snap, .15s) var(--ease, ease), transform .1s ease;
898
+ }
899
+ .chat-composer .send:hover,
900
+ .chat-composer button:hover { transform: scale(1.04); }
901
+ .chat-composer .send:active,
902
+ .chat-composer button:active { transform: scale(0.96); }
903
+ .chat-composer .send:disabled,
904
+ .chat-composer button:disabled {
905
+ background: var(--bg-3); color: var(--fg-3); cursor: not-allowed; transform: none;
906
+ }
907
+
908
+ .aicat-portrait { display: inline-flex; align-items: center; gap: 10px; padding: 4px 0; }
909
+ .aicat-face {
910
+ width: 32px; height: 32px; font-size: 24px;
911
+ display: inline-flex; align-items: center; justify-content: center;
912
+ background: color-mix(in oklab, var(--mascot) 22%, var(--bg-2));
913
+ border-radius: 50%; flex-shrink: 0;
914
+ }
915
+ .aicat-meta { display: flex; flex-direction: column; font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
916
+ .aicat-meta .name { color: var(--mascot); font-weight: 600; }
917
+
918
+ /* ============================================================
919
+ Sidebar polish: hide zero-count badges; tonal active state;
920
+ monospace count chips.
921
+ ============================================================ */
922
+ .app-side .count {
923
+ background: color-mix(in oklab, var(--mascot) 92%, transparent);
924
+ padding: 1px 8px; font-size: 10px; font-weight: 700;
925
+ font-family: var(--ff-mono); letter-spacing: 0.04em;
926
+ min-width: 18px; text-align: center;
927
+ }
928
+ .app-side a:has(> .count:empty) > .count,
929
+ .app-side .count:empty { display: none; }
930
+ .app-side a .glyph { font-family: var(--ff-mono); font-size: 13px; font-weight: 600; color: var(--fg-3); text-align: center; }
931
+ .app-side a.active .glyph { color: var(--accent); }