@floegence/floe-webapp-core 0.86.60 → 0.86.62

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 (103) hide show
  1. package/dist/components/chat/blocks/BlockRenderer.js +1 -1
  2. package/dist/components/chat/blocks/CodeDiffBlock.js +56 -56
  3. package/dist/components/chat/blocks/ImageBlock.js +1 -1
  4. package/dist/components/chat/blocks/ToolCallBlock.js +57 -57
  5. package/dist/components/chat/status/ConnectionStatus.js +10 -10
  6. package/dist/components/deck/DeckCell.js +25 -25
  7. package/dist/components/deck/DeckContextMenu.js +20 -20
  8. package/dist/components/deck/DeckGrid.js +1 -1
  9. package/dist/components/deck/DeckTopBar.js +42 -42
  10. package/dist/components/deck/DropZonePreview.js +6 -6
  11. package/dist/components/deck/LayoutSelector.js +53 -53
  12. package/dist/components/deck/WidgetFrame.js +28 -28
  13. package/dist/components/deck/WidgetPalette.js +31 -31
  14. package/dist/components/deck/WidgetTypeSwitcher.js +31 -31
  15. package/dist/components/file-browser/Breadcrumb.js +27 -27
  16. package/dist/components/file-browser/DirectoryTree.js +15 -15
  17. package/dist/components/file-browser/DragPreview.js +58 -58
  18. package/dist/components/file-browser/FileBrowser.js +17 -17
  19. package/dist/components/file-browser/FileBrowserStatusBar.js +18 -18
  20. package/dist/components/file-browser/FileBrowserToolbar.js +27 -27
  21. package/dist/components/file-browser/FileContextMenu.js +47 -47
  22. package/dist/components/file-browser/FileGridView.js +53 -51
  23. package/dist/components/file-browser/FileItemDecorations.js +30 -27
  24. package/dist/components/file-browser/FileListView.js +114 -114
  25. package/dist/components/icons/index.js +1357 -1357
  26. package/dist/components/launchpad/Launchpad.js +14 -14
  27. package/dist/components/launchpad/LaunchpadGrid.js +7 -7
  28. package/dist/components/launchpad/LaunchpadItem.js +11 -11
  29. package/dist/components/launchpad/LaunchpadPagination.js +16 -16
  30. package/dist/components/launchpad/LaunchpadSearch.js +9 -9
  31. package/dist/components/layout/ActivityBar.js +52 -55
  32. package/dist/components/layout/BottomBar.js +17 -17
  33. package/dist/components/layout/MobileNavigationPanel.js +36 -36
  34. package/dist/components/layout/MobileTabBar.js +39 -39
  35. package/dist/components/layout/Panel.js +16 -16
  36. package/dist/components/layout/ResizeHandle.js +19 -19
  37. package/dist/components/layout/Shell.js +50 -50
  38. package/dist/components/layout/Sidebar.js +37 -36
  39. package/dist/components/layout/SidebarPane.js +19 -19
  40. package/dist/components/layout/TopBar.js +16 -16
  41. package/dist/components/layout/TopBarIconButton.js +15 -15
  42. package/dist/components/loading/LoadingOverlay.js +9 -9
  43. package/dist/components/loading/Skeleton.js +11 -11
  44. package/dist/components/ui/Button.js +36 -36
  45. package/dist/components/ui/Card.d.ts +11 -62
  46. package/dist/components/ui/Card.js +64 -237
  47. package/dist/components/ui/Checkbox.js +79 -79
  48. package/dist/components/ui/CommandPalette.js +56 -55
  49. package/dist/components/ui/Dialog.js +91 -93
  50. package/dist/components/ui/DirectoryInput.js +22 -22
  51. package/dist/components/ui/DirectoryPicker.js +8 -8
  52. package/dist/components/ui/Dropdown.js +89 -87
  53. package/dist/components/ui/FeedbackIndicator.js +57 -57
  54. package/dist/components/ui/FileOpenPicker.js +37 -37
  55. package/dist/components/ui/FileSavePicker.js +41 -41
  56. package/dist/components/ui/FloatingWindow.js +213 -205
  57. package/dist/components/ui/Form.js +76 -76
  58. package/dist/components/ui/HighlightBlock.js +14 -14
  59. package/dist/components/ui/Input.js +106 -109
  60. package/dist/components/ui/Pagination.js +86 -86
  61. package/dist/components/ui/Popover.d.ts +33 -0
  62. package/dist/components/ui/Popover.js +133 -0
  63. package/dist/components/ui/ProcessingIndicator.js +344 -345
  64. package/dist/components/ui/Progress.js +94 -97
  65. package/dist/components/ui/QuoteBlock.js +25 -25
  66. package/dist/components/ui/Radio.js +91 -91
  67. package/dist/components/ui/SegmentedControl.js +24 -24
  68. package/dist/components/ui/Stepper.js +68 -60
  69. package/dist/components/ui/Switch.js +25 -25
  70. package/dist/components/ui/Tabs.js +99 -87
  71. package/dist/components/ui/Tag.js +12 -9
  72. package/dist/components/ui/Tooltip.js +30 -30
  73. package/dist/components/ui/floatingPresence.d.ts +7 -0
  74. package/dist/components/ui/floatingPresence.js +80 -39
  75. package/dist/components/ui/index.d.ts +2 -1
  76. package/dist/components/ui/picker/DirectoryFavorites.js +27 -27
  77. package/dist/components/ui/picker/PickerBase.js +107 -107
  78. package/dist/context/NotificationContext.js +4 -4
  79. package/dist/context/ThemeContext.js +71 -70
  80. package/dist/floe.css +205 -43
  81. package/dist/full.js +650 -652
  82. package/dist/language.css +320 -0
  83. package/dist/primitives.css +23 -17
  84. package/dist/standalone.css +1 -0
  85. package/dist/styles/themes/classicSemanticTokens.d.ts +122 -122
  86. package/dist/styles/themes/classicSemanticTokens.js +140 -138
  87. package/dist/styles/themes/index.d.ts +3 -1
  88. package/dist/styles/themes/index.js +10 -10
  89. package/dist/styles/themes/presets.d.ts +2 -2
  90. package/dist/styles/themes/presets.js +34 -34
  91. package/dist/styles/tokens.d.ts +152 -68
  92. package/dist/styles/tokens.js +87 -49
  93. package/dist/styles.css +1 -1
  94. package/dist/surface.css +161 -116
  95. package/dist/themes/dark.css +64 -64
  96. package/dist/themes/light.css +64 -64
  97. package/dist/ui.css +171 -255
  98. package/dist/ui.js +176 -178
  99. package/dist/utils/hotInteraction.d.ts +7 -0
  100. package/dist/utils/hotInteraction.js +12 -12
  101. package/dist/widgets/TerminalWidget.js +28 -28
  102. package/dist/workbench-composition.css +15 -15
  103. package/package.json +1 -1
@@ -0,0 +1,320 @@
1
+ /*
2
+ * Floe visual language — the single source of truth for planes, ink, state and
3
+ * elevation. Every component recipe derives from this file; nothing here is a
4
+ * component. A theme only supplies the six base colors, and the rest of the
5
+ * ladder is derived from them, so every preset inherits the same system.
6
+ *
7
+ * Four ideas carry the whole language:
8
+ *
9
+ * 1. Depth is a fill step, not a line. Planes separate by a few percent of ink;
10
+ * a hairline appears only where two planes would otherwise land on the same
11
+ * value. Cards therefore carry no border at rest.
12
+ * 2. One state ramp. Hover, press and selection are all percentages of ink —
13
+ * the same three alphas everywhere, so a row, a tab and a menu item respond
14
+ * with one gesture. Brand color never means "hovered".
15
+ * 3. Corners are concentric. A child radius is its parent's radius minus the
16
+ * gap between them, so nested groups never show a mismatched curve.
17
+ * 4. Motion is decisive. Short, decelerating, color-and-transform only.
18
+ */
19
+
20
+ :root,
21
+ [data-floe-theme] {
22
+ /* ---------------------------------------------------------------------
23
+ * Planes — four steps of depth. `plane` is the page ground, `surface` is a
24
+ * content plane sitting on it, `well` is recessed into a surface (fields,
25
+ * code, rails, track backgrounds), `float` is lifted above everything with
26
+ * a real shadow. Values are derived so a preset only has to pick its canvas.
27
+ * ------------------------------------------------------------------- */
28
+ --floe-plane: var(--background);
29
+ --floe-plane-raised: var(--card);
30
+ --floe-plane-float: var(--popover);
31
+ --floe-well: color-mix(in srgb, var(--foreground) 4.5%, var(--card));
32
+ --floe-well-strong: color-mix(in srgb, var(--foreground) 7%, var(--card));
33
+ --floe-well-on-plane: color-mix(in srgb, var(--foreground) 4%, var(--background));
34
+
35
+ /* ---------------------------------------------------------------------
36
+ * Ink — a four-step reading ramp. `ink` is body, `ink-soft` secondary copy,
37
+ * `ink-quiet` metadata and icons that sit outside the reading path,
38
+ * `ink-ghost` placeholders and disabled. Never invent a fifth grey.
39
+ * ------------------------------------------------------------------- */
40
+ --floe-ink: var(--foreground);
41
+ --floe-ink-soft: var(--muted-foreground);
42
+ --floe-ink-quiet: color-mix(in srgb, var(--foreground) 62%, var(--background));
43
+ --floe-ink-ghost: color-mix(in srgb, var(--foreground) 44%, var(--background));
44
+
45
+ /* ---------------------------------------------------------------------
46
+ * Hairlines — one width (1px), three strengths. `line` separates equal-value
47
+ * planes, `line-strong` marks an editable boundary that must stay findable,
48
+ * `line-quiet` is a divider inside dense content.
49
+ * ------------------------------------------------------------------- */
50
+ --floe-line: color-mix(in srgb, var(--foreground) 9%, transparent);
51
+ --floe-line-strong: color-mix(in srgb, var(--foreground) 18%, transparent);
52
+ --floe-line-quiet: color-mix(in srgb, var(--foreground) 5.5%, transparent);
53
+ --floe-line-inverse: color-mix(in srgb, var(--primary-foreground) 16%, transparent);
54
+
55
+ /* ---------------------------------------------------------------------
56
+ * Fields — a well with a whisper of an edge. The fill (not a line) says
57
+ * "you can type here"; the edge exists so the well has a boundary at all,
58
+ * and it brightens on hover, then more on focus.
59
+ *
60
+ * The edge is calibrated against the field's own fill, not the card, since
61
+ * that is the pair that decides whether a boundary is visible. 22% ink is
62
+ * the lowest value where every preset lands inside the quiet band this
63
+ * repository already uses for idle fields (1.25–2:1, set for porcelain-dark
64
+ * in b80c3e8): it measures 1.26 at the narrowest (solarized-light) and 1.76
65
+ * at the widest (forest). 16% left ten presets below 1.25, and in the dark
66
+ * presets it collapsed onto the fill entirely.
67
+ *
68
+ * The resting edge is deliberately below the 3:1 of a hit-area boundary:
69
+ * the well fill, the visible label and the field's own text identify the
70
+ * control, and `--ring` carries the 3:1 focus boundary. A labelled text
71
+ * field is what WCAG 1.4.11 excepts; the check that guards this file
72
+ * enforces the band rather than letting the edge disappear.
73
+ * ------------------------------------------------------------------- */
74
+ --floe-field-fill: var(--floe-well);
75
+ --floe-field-fill-hover: var(--floe-well-strong);
76
+ --floe-field-edge: color-mix(in srgb, var(--foreground) 22%, var(--card));
77
+ --floe-field-edge-hover: color-mix(in srgb, var(--foreground) 32%, var(--card));
78
+ --floe-field-placeholder: color-mix(in srgb, var(--foreground) 42%, var(--background));
79
+ /* An unchecked box or switch has no fill of its own, so its boundary *is*
80
+ * the control and must clear 3:1 against every plane it can sit on. */
81
+ --floe-control-edge: color-mix(in srgb, var(--foreground) 50%, var(--card));
82
+ --floe-control-edge-hover: color-mix(in srgb, var(--foreground) 66%, var(--card));
83
+
84
+ /* ---------------------------------------------------------------------
85
+ * State — the only hover/press/selection values in the system. They are
86
+ * translucent so they compose over any plane without a second palette.
87
+ * ------------------------------------------------------------------- */
88
+ --floe-state-hover: color-mix(in srgb, var(--foreground) 5.5%, transparent);
89
+ --floe-state-press: color-mix(in srgb, var(--foreground) 9%, transparent);
90
+ --floe-state-selected: color-mix(in srgb, var(--primary) 8%, transparent);
91
+ --floe-state-selected-strong: color-mix(in srgb, var(--primary) 12%, transparent);
92
+ --floe-state-on-inverse-hover: color-mix(in srgb, var(--primary-foreground) 12%, transparent);
93
+
94
+ /* Accent — jade is the one chromatic voice: focus, selection and positive
95
+ * emphasis. It is never used for a resting surface. */
96
+ --floe-accent-ink: var(--ring);
97
+ --floe-accent-soft: color-mix(in srgb, var(--ring) 12%, transparent);
98
+ --floe-accent-line: color-mix(in srgb, var(--ring) 34%, transparent);
99
+
100
+ /* ---------------------------------------------------------------------
101
+ * Elevation — three steps, used sparingly. Resting cards get `none`; the
102
+ * hairline + fill step already separate them. `raised` is for interactive
103
+ * cards on hover, `float` for popovers, menus, dialogs and windows.
104
+ * ------------------------------------------------------------------- */
105
+ --floe-elevation-raised:
106
+ 0 1px 2px -1px color-mix(in srgb, #000 8%, transparent),
107
+ 0 1px 1px -0.5px color-mix(in srgb, #000 5%, transparent);
108
+ --floe-elevation-float:
109
+ 0 12px 32px -8px color-mix(in srgb, #000 18%, transparent),
110
+ 0 4px 10px -4px color-mix(in srgb, #000 10%, transparent),
111
+ 0 1px 2px -1px color-mix(in srgb, #000 8%, transparent);
112
+ --floe-elevation-float-strong:
113
+ 0 24px 56px -12px color-mix(in srgb, #000 26%, transparent),
114
+ 0 8px 20px -8px color-mix(in srgb, #000 14%, transparent),
115
+ 0 1px 2px -1px color-mix(in srgb, #000 8%, transparent);
116
+
117
+ /* ---------------------------------------------------------------------
118
+ * Shape — concentric ladder. sm 6 · md 8 · control 10 · group 12 ·
119
+ * card 16 · panel 20 · float 20. A 10px control inside a 16px card with
120
+ * 8px padding lands on 8px, which is md: the curve stays parallel.
121
+ * ------------------------------------------------------------------- */
122
+ --floe-radius-xs: 0.25rem;
123
+ --floe-radius-sm: 0.375rem;
124
+ --floe-radius-md: 0.5rem;
125
+ --floe-radius-control: 0.625rem;
126
+ --floe-radius-field: 0.625rem;
127
+ --floe-radius-group: 0.75rem;
128
+ --floe-radius-card: 1rem;
129
+ --floe-radius-panel: 1.25rem;
130
+ --floe-radius-floating: 1.25rem;
131
+
132
+ /* ---------------------------------------------------------------------
133
+ * Density — one control scale, one row scale. sm 28 · md 32 · lg 36.
134
+ * Rows sit at 30 so a list of rows reads calmer than a toolbar.
135
+ * ------------------------------------------------------------------- */
136
+ --floe-control-height-xs: 1.5rem;
137
+ --floe-control-height-sm: 1.75rem;
138
+ --floe-control-height-md: 2rem;
139
+ --floe-control-height-lg: 2.25rem;
140
+ --floe-control-padding-sm: 0.5rem;
141
+ --floe-control-padding-md: 0.625rem;
142
+ --floe-control-padding-lg: 0.875rem;
143
+ --floe-row-height: 1.875rem;
144
+ --floe-row-height-compact: 1.625rem;
145
+
146
+ /* ---------------------------------------------------------------------
147
+ * Box rhythm — five paddings and three gaps. A control pad keeps a 10px
148
+ * radius concentric inside a 12px group; a card pad is the gutter that
149
+ * makes a plane read as an object rather than a rectangle.
150
+ * ------------------------------------------------------------------- */
151
+ --floe-pad-tight: 0.375rem;
152
+ --floe-pad-control: 0.5rem;
153
+ --floe-pad-group: 0.75rem;
154
+ --floe-pad-card: 0.875rem;
155
+ --floe-pad-panel: 1rem;
156
+ --floe-gap-inline: 0.25rem;
157
+ --floe-gap-control: 0.375rem;
158
+ --floe-gap-group: 0.75rem;
159
+ --floe-gap-section: 1.25rem;
160
+
161
+ /* ---------------------------------------------------------------------
162
+ * Type — 11 caption · 12 supporting · 13 control and body · 16 heading.
163
+ * One step per role; no component picks its own size.
164
+ * ------------------------------------------------------------------- */
165
+ --floe-type-caption: 0.6875rem;
166
+ --floe-type-supporting: 0.75rem;
167
+ --floe-type-control: 0.8125rem;
168
+ --floe-type-body: 0.8125rem;
169
+ --floe-type-heading: 1rem;
170
+ --floe-type-heading-sm: 0.9375rem;
171
+ --floe-type-display: 1.375rem;
172
+ /* Below caption. Only decorative chips that must fit inside an 8-10px
173
+ * badge belong here — never running text, metadata or a control label. */
174
+ --floe-type-micro: 0.5rem;
175
+ --floe-type-nano: 0.4375rem;
176
+ --floe-line-caption: 0.9375rem;
177
+ --floe-line-control: 1.25rem;
178
+ --floe-line-body: 1.375rem;
179
+ --floe-line-heading: 1.375rem;
180
+
181
+ /* ---------------------------------------------------------------------
182
+ * Motion — one decelerating curve and one settle curve. Nothing bounces
183
+ * except a deliberate spring for a control that changes shape.
184
+ * ------------------------------------------------------------------- */
185
+ --floe-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
186
+ --floe-ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
187
+ --floe-ease-spring: cubic-bezier(0.34, 1.35, 0.64, 1);
188
+ --floe-duration-instant: 90ms;
189
+ --floe-duration-fast: 140ms;
190
+ --floe-duration-base: 200ms;
191
+ --floe-duration-slow: 280ms;
192
+ --floe-duration-float: 240ms;
193
+ --floe-hover-lift: -1px;
194
+ --floe-press-scale: 0.985;
195
+ --floe-hover-lift-strong: -2px;
196
+ }
197
+
198
+ /*
199
+ * The interaction primitives. Components compose these instead of writing
200
+ * their own hover recipes, which is what kept the old set inconsistent.
201
+ */
202
+
203
+ /* Every interactive surface moves through the same transition set. */
204
+ [data-floe-interactive] {
205
+ transition:
206
+ background-color var(--floe-duration-fast) var(--floe-ease-out),
207
+ border-color var(--floe-duration-fast) var(--floe-ease-out),
208
+ color var(--floe-duration-fast) var(--floe-ease-out),
209
+ box-shadow var(--floe-duration-base) var(--floe-ease-out),
210
+ transform var(--floe-duration-fast) var(--floe-ease-out);
211
+ }
212
+
213
+ /* Rows, tabs, menu items: fill is transparent, so the state layer composes
214
+ * over whatever plane hosts them. A control that declares a surface part owns
215
+ * its own face (surface.css) and keeps the state layer off its fill, so a
216
+ * selected tab is not repainted by the generic selection tint. */
217
+ [data-floe-interactive]:where(
218
+ [data-floe-interactive='row'],
219
+ [data-floe-interactive='item']
220
+ ):not([data-floe-surface-part]):hover {
221
+ background-color: var(--floe-state-hover);
222
+ color: var(--floe-ink);
223
+ }
224
+
225
+ [data-floe-interactive]:where(
226
+ [data-floe-interactive='row'],
227
+ [data-floe-interactive='item']
228
+ ):not([data-floe-surface-part]):active {
229
+ background-color: var(--floe-state-press);
230
+ }
231
+
232
+ [data-floe-interactive]:not([data-floe-surface-part]):where(
233
+ [aria-selected='true'],
234
+ [data-selected='true']
235
+ ) {
236
+ background-color: var(--floe-state-selected);
237
+ color: var(--floe-ink);
238
+ }
239
+
240
+ /* Icon buttons rise a single step of ink on hover, in addition to the fill. */
241
+ [data-floe-interactive='icon']:hover {
242
+ color: var(--floe-ink);
243
+ }
244
+
245
+ /* Pressible controls settle rather than travel. */
246
+ [data-floe-interactive='press']:active {
247
+ transform: scale(var(--floe-press-scale));
248
+ }
249
+
250
+ /* Clickable planes rise one step and take the first elevation. A card is not a
251
+ * control: it travels instead of settling, and the shadow says it detached from
252
+ * the canvas rather than competing with the fill step. */
253
+ [data-floe-interactive='lift']:hover {
254
+ transform: translateY(var(--floe-hover-lift));
255
+ box-shadow: var(--floe-elevation-raised);
256
+ }
257
+
258
+ /*
259
+ * The field surface. One recipe for every editable boundary — text inputs,
260
+ * textareas, compound number/select fields, dropdown triggers and directory
261
+ * pickers — so a form never mixes two field looks. It is a filled well with a
262
+ * whisper edge, not a box: the fill carries the affordance, the edge only
263
+ * gives the well an end, and focus brightens the edge (see input-focus.css,
264
+ * which owns the color-only focus contract).
265
+ */
266
+ @layer components {
267
+ .floe-field {
268
+ border: 1px solid var(--floe-field-edge);
269
+ border-radius: var(--floe-radius-field);
270
+ background-color: var(--floe-field-fill);
271
+ color: var(--floe-ink);
272
+ transition:
273
+ background-color var(--floe-duration-fast) var(--floe-ease-out),
274
+ border-color var(--floe-duration-fast) var(--floe-ease-out);
275
+ }
276
+
277
+ .floe-field:hover:not(:disabled):not([aria-disabled='true']) {
278
+ border-color: var(--floe-field-edge-hover);
279
+ }
280
+
281
+ .floe-field::placeholder {
282
+ color: var(--floe-field-placeholder);
283
+ opacity: 1;
284
+ }
285
+
286
+ .floe-field[aria-invalid='true'] {
287
+ border-color: color-mix(in srgb, var(--error) 62%, var(--card));
288
+ }
289
+
290
+ .floe-field:disabled,
291
+ .floe-field[aria-disabled='true'] {
292
+ background-color: var(--floe-plane);
293
+ border-color: var(--floe-line);
294
+ }
295
+ }
296
+
297
+ @media (prefers-reduced-motion: reduce) {
298
+ [data-floe-interactive] {
299
+ transition-duration: 1ms;
300
+ }
301
+ [data-floe-interactive='press']:active {
302
+ transform: none;
303
+ }
304
+ [data-floe-interactive='lift']:hover {
305
+ transform: none;
306
+ box-shadow: none;
307
+ }
308
+ }
309
+
310
+ @media (forced-colors: active) {
311
+ :root,
312
+ [data-floe-theme] {
313
+ --floe-line: CanvasText;
314
+ --floe-line-strong: CanvasText;
315
+ --floe-state-hover: Highlight;
316
+ --floe-state-selected: Highlight;
317
+ --floe-elevation-float: none;
318
+ --floe-elevation-float-strong: none;
319
+ }
320
+ }
@@ -1,26 +1,32 @@
1
- /* Shared typography, spacing and shape; no layout or palette ownership. */
1
+ /*
2
+ * Fonts, tracking, spacing, and the coarse-pointer touch scale.
3
+ *
4
+ * Shape, type, motion and elevation tokens live in `language.css`, the single
5
+ * source of truth for the visual scale. This file must not restate them: both
6
+ * used to declare the same names with different values, so whichever file was
7
+ * imported last silently won. What stays here is what `language.css` does not
8
+ * own, plus the touch overrides that must land on `body` instead of `:root`.
9
+ */
2
10
  :root {
3
- --radius: 0.375rem;
4
- --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5
- --font-mono: 'JetBrains Mono', 'Fira Code', 'SF Mono', Menlo, Monaco, Consolas, monospace;
6
- --floe-type-caption: 0.6875rem;
7
- --floe-type-supporting: 0.75rem;
8
- --floe-type-control: 0.75rem;
9
- --floe-type-body: 0.75rem;
10
- --floe-type-heading: 1rem;
11
- --floe-line-control: 1.125rem;
12
- --floe-line-body: 1.25rem;
13
- --floe-control-height-sm: 1.75rem;
14
- --floe-control-height-md: 2rem;
15
- --floe-row-height: 1.75rem;
11
+ /* `--radius` predates the language ladder and is still read by downstream
12
+ * consumers. Point it at the ladder rather than hard-coding a second control
13
+ * radius; the reference resolves at computed-value time, so import order no
14
+ * longer decides the result. */
15
+ --radius: var(--floe-radius-control);
16
+
17
+ /* Type: a precise geometric humanist voice with optical sizing. */
18
+ --font-sans: 'Inter', 'InterVariable', ui-sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
19
+ --font-mono: 'JetBrains Mono', 'SFMono-Regular', 'Fira Code', 'SF Mono', Menlo, Monaco, Consolas, monospace;
20
+ /* Soft tracking keeps rounded geometry from reading as loose at small sizes. */
21
+ --floe-tracking-tight: -0.02em;
22
+ --floe-tracking-normal: -0.011em;
23
+ --floe-tracking-caps: 0.06em;
24
+
16
25
  --floe-space-1: 0.25rem;
17
26
  --floe-space-2: 0.5rem;
18
27
  --floe-space-3: 0.75rem;
19
28
  --floe-space-4: 1rem;
20
29
  --floe-space-6: 1.5rem;
21
- --floe-radius-control: 0.375rem;
22
- --floe-radius-group: 0.5rem;
23
- --floe-radius-floating: 12px;
24
30
  }
25
31
 
26
32
  /* Action labels stay on one line; their containing toolbar owns reflow. */
@@ -5,6 +5,7 @@
5
5
  * Applications own layout and declare data-floe-surface on visible boundaries.
6
6
  */
7
7
  @import './primitives.css';
8
+ @import './language.css';
8
9
  @import './themes/light.css';
9
10
  @import './themes/dark.css';
10
11
  @import './themes/shell-presets.generated.css';
@@ -1,71 +1,71 @@
1
1
  export declare const CLASSIC_LIGHT_CSS_TOKENS: {
2
2
  '--floe-window-background': "var(--popover)";
3
3
  '--floe-window-titlebar-background': "var(--popover)";
4
- '--background': "#f8f7f2";
5
- '--foreground': "#303a34";
6
- '--inline-code-foreground': "#1559B5";
7
- '--inline-code-background': "#EEF0EF";
8
- '--primary': "#465a43";
9
- '--primary-foreground': "#f8faf5";
10
- '--secondary': "#eeefe8";
11
- '--secondary-foreground': "#545f56";
12
- '--muted': "#e9ece3";
13
- '--muted-foreground': "#5e695c";
14
- '--accent': "#e0e7da";
15
- '--accent-foreground': "#303a34";
16
- '--border': "#d4d8cd";
17
- '--input': "#858e80";
18
- '--ring': "#56694f";
19
- '--chrome-border': "#dedfd7";
4
+ '--background': "#f6f4ef";
5
+ '--foreground': "#1a1b19";
6
+ '--inline-code-foreground': "#1c6b57";
7
+ '--inline-code-background': "#eeebe4";
8
+ '--primary': "#1c1d1b";
9
+ '--primary-foreground': "#fbfaf7";
10
+ '--secondary': "#edeae3";
11
+ '--secondary-foreground': "#4a4b46";
12
+ '--muted': "#efede7";
13
+ '--muted-foreground': "#6b6a64";
14
+ '--accent': "#eeebe4";
15
+ '--accent-foreground': "#1a1b19";
16
+ '--border': "#e4e1d9";
17
+ '--input': "#c9c6bd";
18
+ '--ring': "#2f7d63";
19
+ '--chrome-border': "#eeebe4";
20
20
  '--top-bar-border': "var(--chrome-border)";
21
21
  '--activity-bar-border': "var(--chrome-border)";
22
22
  '--bottom-bar-border': "var(--chrome-border)";
23
23
  '--terminal-panel-border': "var(--chrome-border)";
24
- '--card': "#fcfbf7";
25
- '--card-foreground': "#303a34";
26
- '--popover': "#fffefa";
27
- '--popover-foreground': "#303a34";
28
- '--success': "#496744";
29
- '--success-foreground': "#f8faf5";
30
- '--warning': "#856828";
31
- '--warning-foreground': "#fffefa";
32
- '--error': "#b74744";
33
- '--error-foreground': "#fffefa";
34
- '--info': "#2671d9";
35
- '--info-foreground': "#fffefa";
36
- '--highlight-block-info-accent': "oklch(0.52 0.14 245)";
37
- '--highlight-block-warning-accent': "oklch(0.62 0.16 65)";
38
- '--highlight-block-success-accent': "oklch(0.55 0.14 155)";
39
- '--highlight-block-error-accent': "oklch(0.55 0.16 25)";
40
- '--highlight-block-note-accent': "oklch(0.52 0.16 285)";
41
- '--highlight-block-tip-accent': "oklch(0.52 0.12 175)";
42
- '--sidebar': "#efeee7";
43
- '--sidebar-foreground': "#303a34";
44
- '--sidebar-primary': "#465a43";
45
- '--sidebar-primary-foreground': "#f8faf5";
46
- '--sidebar-accent': "#e0e7da";
47
- '--sidebar-accent-foreground': "#303a34";
48
- '--sidebar-border': "#dedfd7";
49
- '--sidebar-ring': "#56694f";
50
- '--activity-bar': "#eeede6";
51
- '--activity-bar-foreground': "#5e695c";
52
- '--activity-bar-foreground-active': "#303a34";
53
- '--activity-bar-badge': "#465a43";
54
- '--activity-bar-badge-foreground': "#f8faf5";
55
- '--terminal-background': "hsl(214 26% 17%)";
56
- '--terminal-foreground': "hsl(0 0% 92%)";
57
- '--chart-1': "hsl(214 26% 17%)";
58
- '--chart-2': "hsl(215 16% 42%)";
59
- '--chart-3': "hsl(217 91% 60%)";
60
- '--chart-4': "oklch(0.68 0.16 150)";
61
- '--chart-5': "hsl(38 92% 50%)";
62
- '--selection-bg': "hsl(217 91% 60%)";
63
- '--selection-fg': "hsl(0 0% 100%)";
64
- '--selection-on-primary-bg': "hsl(38 92% 50%)";
65
- '--selection-on-primary-fg': "hsl(214 26% 17%)";
66
- '--selection-code-bg': "hsl(212 100% 67%)";
67
- '--selection-code-fg': "hsl(220 20% 8%)";
68
- '--glow': "#465a43";
24
+ '--card': "#fefdfb";
25
+ '--card-foreground': "#1a1b19";
26
+ '--popover': "#fffefc";
27
+ '--popover-foreground': "#1a1b19";
28
+ '--success': "#227a50";
29
+ '--success-foreground': "#ffffff";
30
+ '--warning': "#8f5c0d";
31
+ '--warning-foreground': "#ffffff";
32
+ '--error': "#b8352c";
33
+ '--error-foreground': "#ffffff";
34
+ '--info': "#2a5f9e";
35
+ '--info-foreground': "#ffffff";
36
+ '--highlight-block-info-accent': "oklch(0.52 0.13 250)";
37
+ '--highlight-block-warning-accent': "oklch(0.64 0.13 72)";
38
+ '--highlight-block-success-accent': "oklch(0.55 0.12 160)";
39
+ '--highlight-block-error-accent': "oklch(0.55 0.17 27)";
40
+ '--highlight-block-note-accent': "oklch(0.53 0.15 292)";
41
+ '--highlight-block-tip-accent': "oklch(0.56 0.09 195)";
42
+ '--sidebar': "#f1efe9";
43
+ '--sidebar-foreground': "#1a1b19";
44
+ '--sidebar-primary': "#1c1d1b";
45
+ '--sidebar-primary-foreground': "#fbfaf7";
46
+ '--sidebar-accent': "#eeebe4";
47
+ '--sidebar-accent-foreground': "#1a1b19";
48
+ '--sidebar-border': "#e8e5dd";
49
+ '--sidebar-ring': "#2f7d63";
50
+ '--activity-bar': "#edeae3";
51
+ '--activity-bar-foreground': "#5f5f58";
52
+ '--activity-bar-foreground-active': "#1a1b19";
53
+ '--activity-bar-badge': "#1c1d1b";
54
+ '--activity-bar-badge-foreground': "#fbfaf7";
55
+ '--terminal-background': "#16171a";
56
+ '--terminal-foreground': "#e9e7e2";
57
+ '--chart-1': "#2f7d63";
58
+ '--chart-2': "#5f5f58";
59
+ '--chart-3': "#8f5c0d";
60
+ '--chart-4': "#b8352c";
61
+ '--chart-5': "#2a5f9e";
62
+ '--selection-bg': "#cde7db";
63
+ '--selection-fg': "#10211b";
64
+ '--selection-on-primary-bg': "#6fd0a8";
65
+ '--selection-on-primary-fg': "#082016";
66
+ '--selection-code-bg': "#bcded0";
67
+ '--selection-code-fg': "#0c1f18";
68
+ '--glow': "#2f7d63";
69
69
  '--floe-window-foreground': "var(--foreground)";
70
70
  '--floe-window-muted-foreground': "var(--muted-foreground)";
71
71
  '--floe-window-border': "color-mix(in srgb, var(--floe-window-background) 88%, var(--foreground))";
@@ -74,71 +74,71 @@ export declare const CLASSIC_LIGHT_CSS_TOKENS: {
74
74
  export declare const CLASSIC_DARK_CSS_TOKENS: {
75
75
  '--floe-window-background': "var(--popover)";
76
76
  '--floe-window-titlebar-background': "var(--popover)";
77
- '--background': "#202223";
78
- '--foreground': "#e5e6e2";
79
- '--inline-code-foreground': "#6CDCEB";
80
- '--inline-code-background': "#263032";
81
- '--primary': "#bccbb8";
82
- '--primary-foreground': "#20291f";
83
- '--secondary': "#303435";
84
- '--secondary-foreground': "#b8bdb8";
85
- '--muted': "#343738";
86
- '--muted-foreground': "#9da4a0";
87
- '--accent': "#353a38";
88
- '--accent-foreground': "#e5e6e2";
89
- '--border': "#3e4142";
90
- '--input': "#6d7571";
91
- '--ring': "#acbdb3";
92
- '--chrome-border': "#292c2b";
77
+ '--background': "#0d0e0d";
78
+ '--foreground': "#e9e8e3";
79
+ '--inline-code-foreground': "#5fd6a8";
80
+ '--inline-code-background': "#17201c";
81
+ '--primary': "#e9e8e3";
82
+ '--primary-foreground': "#101110";
83
+ '--secondary': "#1e1f1e";
84
+ '--secondary-foreground': "#c3c4be";
85
+ '--muted': "#1b1c1b";
86
+ '--muted-foreground': "#93948d";
87
+ '--accent': "#242524";
88
+ '--accent-foreground': "#e9e8e3";
89
+ '--border': "#262726";
90
+ '--input': "#3b3c3a";
91
+ '--ring': "#62b898";
92
+ '--chrome-border': "#1a1b1a";
93
93
  '--top-bar-border': "var(--chrome-border)";
94
94
  '--activity-bar-border': "var(--chrome-border)";
95
95
  '--bottom-bar-border': "var(--chrome-border)";
96
96
  '--terminal-panel-border': "var(--chrome-border)";
97
- '--card': "#282b2c";
98
- '--card-foreground': "#e5e6e2";
99
- '--popover': "#2b2e2f";
100
- '--popover-foreground': "#e5e6e2";
101
- '--success': "#a1b69e";
102
- '--success-foreground': "#20291f";
103
- '--warning': "#c8af84";
104
- '--warning-foreground': "#20291f";
105
- '--error': "oklch(0.7 0.22 25)";
106
- '--error-foreground': "#202223";
107
- '--info': "oklch(0.7 0.15 250)";
108
- '--info-foreground': "#202223";
109
- '--highlight-block-info-accent': "oklch(0.62 0.12 240)";
110
- '--highlight-block-warning-accent': "oklch(0.7 0.14 65)";
111
- '--highlight-block-success-accent': "oklch(0.62 0.12 155)";
112
- '--highlight-block-error-accent': "oklch(0.6 0.14 25)";
113
- '--highlight-block-note-accent': "oklch(0.62 0.14 285)";
114
- '--highlight-block-tip-accent': "oklch(0.6 0.1 175)";
115
- '--sidebar': "#1b1d1e";
116
- '--sidebar-foreground': "#e5e6e2";
117
- '--sidebar-primary': "#bccbb8";
118
- '--sidebar-primary-foreground': "#20291f";
119
- '--sidebar-accent': "#353a38";
120
- '--sidebar-accent-foreground': "#e5e6e2";
121
- '--sidebar-border': "#292c2b";
122
- '--sidebar-ring': "#acbdb3";
123
- '--activity-bar': "#17191a";
124
- '--activity-bar-foreground': "#9da4a0";
125
- '--activity-bar-foreground-active': "#e5e6e2";
126
- '--activity-bar-badge': "#bccbb8";
127
- '--activity-bar-badge-foreground': "#20291f";
128
- '--terminal-background': "hsl(222 32% 7%)";
129
- '--terminal-foreground': "hsl(210 15% 92%)";
130
- '--chart-1': "hsl(210 20% 98%)";
131
- '--chart-2': "hsl(215 20% 60%)";
132
- '--chart-3': "oklch(0.7 0.15 250)";
133
- '--chart-4': "oklch(0.72 0.19 150)";
134
- '--chart-5': "oklch(0.82 0.16 80)";
135
- '--selection-bg': "hsl(215 70% 50%)";
136
- '--selection-fg': "hsl(0 0% 100%)";
137
- '--selection-on-primary-bg': "hsl(215 80% 35%)";
138
- '--selection-on-primary-fg': "hsl(0 0% 100%)";
139
- '--selection-code-bg': "hsl(212 100% 67%)";
140
- '--selection-code-fg': "hsl(220 20% 8%)";
141
- '--glow': "hsl(217 65% 52%)";
97
+ '--card': "#161716";
98
+ '--card-foreground': "#e9e8e3";
99
+ '--popover': "#1a1b1a";
100
+ '--popover-foreground': "#e9e8e3";
101
+ '--success': "#62bf93";
102
+ '--success-foreground': "#07200f";
103
+ '--warning': "#d9ac5f";
104
+ '--warning-foreground': "#1d1607";
105
+ '--error': "#e8756b";
106
+ '--error-foreground': "#210907";
107
+ '--info': "#79a9e6";
108
+ '--info-foreground': "#061322";
109
+ '--highlight-block-info-accent': "oklch(0.7 0.12 248)";
110
+ '--highlight-block-warning-accent': "oklch(0.78 0.12 76)";
111
+ '--highlight-block-success-accent': "oklch(0.74 0.12 160)";
112
+ '--highlight-block-error-accent': "oklch(0.68 0.17 25)";
113
+ '--highlight-block-note-accent': "oklch(0.7 0.14 292)";
114
+ '--highlight-block-tip-accent': "oklch(0.7 0.09 192)";
115
+ '--sidebar': "#111211";
116
+ '--sidebar-foreground': "#e9e8e3";
117
+ '--sidebar-primary': "#e9e8e3";
118
+ '--sidebar-primary-foreground': "#101110";
119
+ '--sidebar-accent': "#242524";
120
+ '--sidebar-accent-foreground': "#e9e8e3";
121
+ '--sidebar-border': "#202120";
122
+ '--sidebar-ring': "#62b898";
123
+ '--activity-bar': "#0a0b0a";
124
+ '--activity-bar-foreground': "#8c8d86";
125
+ '--activity-bar-foreground-active': "#e9e8e3";
126
+ '--activity-bar-badge': "#62b898";
127
+ '--activity-bar-badge-foreground': "#07200f";
128
+ '--terminal-background': "#080908";
129
+ '--terminal-foreground': "#e2e1dc";
130
+ '--chart-1': "#62b898";
131
+ '--chart-2': "#93948d";
132
+ '--chart-3': "#d9ac5f";
133
+ '--chart-4': "#e8756b";
134
+ '--chart-5': "#79a9e6";
135
+ '--selection-bg': "#1f4a3a";
136
+ '--selection-fg': "#eafaf2";
137
+ '--selection-on-primary-bg': "#62b898";
138
+ '--selection-on-primary-fg': "#07200f";
139
+ '--selection-code-bg': "#2c6350";
140
+ '--selection-code-fg': "#eafaf2";
141
+ '--glow': "#62b898";
142
142
  '--floe-window-foreground': "var(--foreground)";
143
143
  '--floe-window-muted-foreground': "color-mix(in srgb, var(--muted-foreground) 72%, var(--foreground))";
144
144
  '--floe-window-border': "color-mix(in srgb, var(--floe-window-background) 88%, var(--foreground))";