@moldable-ai/ui 0.2.25 → 0.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/catalog/core-foundation-stories.d.ts.map +1 -1
- package/dist/catalog/core-foundation-stories.js +15 -3
- package/dist/components/chat/chat-input.d.ts.map +1 -1
- package/dist/components/chat/chat-input.js +1 -1
- package/dist/components/chat/chat-message.js +1 -1
- package/dist/components/chat/index.d.ts +1 -0
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +1 -0
- package/dist/components/chat/orb-materials.d.ts +14 -0
- package/dist/components/chat/orb-materials.d.ts.map +1 -0
- package/dist/components/chat/orb-materials.js +340 -0
- package/dist/components/chat/voice-orb-shaders.d.ts +1 -1
- package/dist/components/chat/voice-orb-shaders.d.ts.map +1 -1
- package/dist/components/chat/voice-orb-shaders.js +11 -162
- package/dist/components/chat/voice-orb.d.ts.map +1 -1
- package/dist/components/chat/voice-orb.js +2 -1
- package/dist/components/native-capabilities/shortcut-recorder.js +1 -1
- package/dist/components/rich-media-player.js +1 -1
- package/dist/components/ui/app-frame.d.ts +1 -1
- package/dist/components/ui/app-frame.d.ts.map +1 -1
- package/dist/components/ui/app-frame.js +7 -39
- package/dist/components/ui/button-group.d.ts +1 -1
- package/dist/components/ui/button-group.js +1 -1
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +1 -0
- package/dist/components/ui/checkbox.js +1 -1
- package/dist/components/ui/collapsible.js +1 -1
- package/dist/components/ui/combobox.js +1 -1
- package/dist/components/ui/command.d.ts.map +1 -1
- package/dist/components/ui/command.js +10 -2
- package/dist/components/ui/date-field.js +1 -1
- package/dist/components/ui/index.d.ts +1 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +1 -0
- package/dist/components/ui/input-group.d.ts.map +1 -1
- package/dist/components/ui/input-otp.js +1 -1
- package/dist/components/ui/input.js +1 -1
- package/dist/components/ui/inspector.js +3 -3
- package/dist/components/ui/menubar.js +1 -1
- package/dist/components/ui/number-input.js +1 -1
- package/dist/components/ui/panel.d.ts +2 -2
- package/dist/components/ui/panel.js +2 -2
- package/dist/components/ui/radio-group.js +1 -1
- package/dist/components/ui/select.js +1 -1
- package/dist/components/ui/switch.js +1 -1
- package/dist/components/ui/toolbar-controls.d.ts +47 -0
- package/dist/components/ui/toolbar-controls.d.ts.map +1 -0
- package/dist/components/ui/toolbar-controls.js +40 -0
- package/dist/components/ui/toolbar.d.ts +15 -4
- package/dist/components/ui/toolbar.d.ts.map +1 -1
- package/dist/components/ui/toolbar.js +16 -5
- package/dist/components/ui/window-titlebar.d.ts +8 -0
- package/dist/components/ui/window-titlebar.d.ts.map +1 -0
- package/dist/components/ui/window-titlebar.js +40 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/commands.d.ts +29 -0
- package/dist/lib/commands.d.ts.map +1 -1
- package/dist/lib/commands.js +28 -0
- package/docs/app-anatomy.md +9 -7
- package/docs/standalone-app-windows.md +12 -8
- package/package.json +2 -2
- package/src/components/ui/app-frame.md +6 -8
- package/src/components/ui/toolbar-controls.md +75 -0
- package/src/components/ui/toolbar.md +20 -1
- package/src/styles/index.css +66 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Toolbar controls
|
|
2
|
+
|
|
3
|
+
Precomposed controls for native-window-aware `Toolbar` chrome. They use
|
|
4
|
+
Moldable semantic tokens, density, menus, and accessibility behavior while
|
|
5
|
+
keeping app toolbars visually consistent.
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<Toolbar position="top">
|
|
9
|
+
<ToolbarSidebarToggle
|
|
10
|
+
expanded={sidebarOpen}
|
|
11
|
+
onExpandedChange={setSidebarOpen}
|
|
12
|
+
/>
|
|
13
|
+
<ToolbarBackButton onClick={goBack} />
|
|
14
|
+
<ToolbarTitleField value={title} onChange={rename} />
|
|
15
|
+
<ToolbarActions>
|
|
16
|
+
<ToolbarControlGroup aria-label="History">
|
|
17
|
+
<ToolbarIconButton label="Undo" onClick={undo}>
|
|
18
|
+
<Undo2 />
|
|
19
|
+
</ToolbarIconButton>
|
|
20
|
+
<ToolbarControlSeparator />
|
|
21
|
+
<ToolbarIconButton label="Redo" onClick={redo}>
|
|
22
|
+
<Redo2 />
|
|
23
|
+
</ToolbarIconButton>
|
|
24
|
+
</ToolbarControlGroup>
|
|
25
|
+
<ToolbarOverflowMenu
|
|
26
|
+
items={[
|
|
27
|
+
{ id: 'history', label: 'Version history' },
|
|
28
|
+
{ id: 'export', label: 'Export' },
|
|
29
|
+
]}
|
|
30
|
+
onSelectItem={handleMoreAction}
|
|
31
|
+
/>
|
|
32
|
+
<ToolbarButton variant="default">Present</ToolbarButton>
|
|
33
|
+
</ToolbarActions>
|
|
34
|
+
</Toolbar>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Components
|
|
38
|
+
|
|
39
|
+
- `ToolbarButton` — text or mixed-content action. Defaults to 36px native
|
|
40
|
+
chrome; use `variant="default"` for the one primary action.
|
|
41
|
+
- `ToolbarIconButton` — required accessible label and optional tooltip.
|
|
42
|
+
- `ToolbarBackButton` — single chevron Back affordance for root-to-detail
|
|
43
|
+
navigation.
|
|
44
|
+
- `ToolbarSidebarToggle` — controlled sidebar visibility button with accurate
|
|
45
|
+
pressed state and dynamic label.
|
|
46
|
+
- `ToolbarOverflowMenu` — an ellipsis button backed by Moldable's declarative
|
|
47
|
+
menu API, including the native host menu when available.
|
|
48
|
+
- `ToolbarControlGroup` — a shared surface for closely related actions such as
|
|
49
|
+
Undo/Redo. Children automatically become compact quiet controls.
|
|
50
|
+
- `ToolbarControlSeparator` — divider within a related action group.
|
|
51
|
+
- `ToolbarTitleField` — an accessible, inline-editable contextual title.
|
|
52
|
+
|
|
53
|
+
`ToolbarButton` and `ToolbarIconButton` accept `appearance="quiet"` when a
|
|
54
|
+
standalone action should not have raised chrome. The default `chrome`
|
|
55
|
+
appearance uses the `toolbar` Button variant and these semantic tokens:
|
|
56
|
+
|
|
57
|
+
- `--toolbar-control-background`
|
|
58
|
+
- `--toolbar-control-hover`
|
|
59
|
+
- `--toolbar-control-pressed`
|
|
60
|
+
- `--toolbar-control-border`
|
|
61
|
+
- `--toolbar-control-shadow`
|
|
62
|
+
|
|
63
|
+
The tokens adapt to light/dark appearance, increased contrast, and reduced
|
|
64
|
+
transparency.
|
|
65
|
+
|
|
66
|
+
## Composition rules
|
|
67
|
+
|
|
68
|
+
- Keep the current document or view title leading and the primary action last.
|
|
69
|
+
- Prefer icon-only secondary controls and a text-only primary action.
|
|
70
|
+
- Put only genuinely related commands in `ToolbarControlGroup`.
|
|
71
|
+
- Move low-frequency commands such as history, duplicate, export, and delete
|
|
72
|
+
into `ToolbarOverflowMenu`.
|
|
73
|
+
- Keep roughly five or six visible actions. Tooltips do not replace accessible
|
|
74
|
+
labels.
|
|
75
|
+
- Use the shared Back and Sidebar controls instead of hand-building arrows.
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# Toolbar
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Native-window-aware toolbar chrome for context and actions. A top toolbar is
|
|
4
|
+
draggable and automatically clears the host-advertised traffic-light lane when
|
|
5
|
+
the app owns its titlebar. The same component remains compact pane chrome in an
|
|
6
|
+
embedded view.
|
|
4
7
|
|
|
5
8
|
```tsx
|
|
6
9
|
<Toolbar position="top">
|
|
@@ -20,7 +23,23 @@ Use one toolbar per pane. Put the current context before actions and keep one
|
|
|
20
23
|
clear primary action. Toolbars are not marketing headers. Icon-only actions
|
|
21
24
|
need labels and tooltips.
|
|
22
25
|
|
|
26
|
+
`ToolbarTitle` names the current view or document, not the app itself. Omit it
|
|
27
|
+
when there is no useful view context; the remaining toolbar still provides a
|
|
28
|
+
drag surface and a safe home for right-aligned actions.
|
|
29
|
+
|
|
30
|
+
The `inset` prop defaults to `auto`. Use `none` for a top toolbar that is not
|
|
31
|
+
window chrome, `windowControls` to force the standard control lane, or
|
|
32
|
+
`windowControlsAndButton` when another leading control sits beside the native
|
|
33
|
+
traffic lights. Set `draggable={false}` only for top toolbars that are nested
|
|
34
|
+
inside app content.
|
|
35
|
+
|
|
23
36
|
The default toolbar uses `material="regular"`. The `plain` and `panel` variants
|
|
24
37
|
default to `material="none"`; pass a material explicitly only when the toolbar
|
|
25
38
|
actually floats over content. Reserve `material="clear"` for compact controls
|
|
26
39
|
over media or a richly colored canvas.
|
|
40
|
+
|
|
41
|
+
Use the precomposed controls in
|
|
42
|
+
[`toolbar-controls.md`](./toolbar-controls.md) for native-sized Back, Sidebar,
|
|
43
|
+
Overflow, grouped-action, and editable-title behavior. Keep only closely
|
|
44
|
+
related actions in a shared group; a single capsule containing every command
|
|
45
|
+
does not communicate command hierarchy.
|
package/src/styles/index.css
CHANGED
|
@@ -268,6 +268,10 @@
|
|
|
268
268
|
--color-control-disabled: var(--control-disabled);
|
|
269
269
|
--color-control-focus: var(--control-focus);
|
|
270
270
|
--color-control-invalid: var(--control-invalid);
|
|
271
|
+
--color-toolbar-control: var(--toolbar-control-background);
|
|
272
|
+
--color-toolbar-control-hover: var(--toolbar-control-hover);
|
|
273
|
+
--color-toolbar-control-pressed: var(--toolbar-control-pressed);
|
|
274
|
+
--color-toolbar-control-border: var(--toolbar-control-border);
|
|
271
275
|
--color-window-chrome: var(--window-chrome-background);
|
|
272
276
|
--color-window-chrome-foreground: var(--window-chrome-foreground);
|
|
273
277
|
--color-window-chrome-muted: var(--window-chrome-muted-foreground);
|
|
@@ -851,6 +855,29 @@
|
|
|
851
855
|
);
|
|
852
856
|
--control-focus: var(--ring);
|
|
853
857
|
--control-invalid: var(--destructive);
|
|
858
|
+
--toolbar-control-background: color-mix(
|
|
859
|
+
in oklch,
|
|
860
|
+
var(--background) 74%,
|
|
861
|
+
transparent
|
|
862
|
+
);
|
|
863
|
+
--toolbar-control-hover: color-mix(
|
|
864
|
+
in oklch,
|
|
865
|
+
var(--background) 84%,
|
|
866
|
+
var(--foreground) 8%
|
|
867
|
+
);
|
|
868
|
+
--toolbar-control-pressed: color-mix(
|
|
869
|
+
in oklch,
|
|
870
|
+
var(--background) 74%,
|
|
871
|
+
var(--foreground) 14%
|
|
872
|
+
);
|
|
873
|
+
--toolbar-control-border: color-mix(
|
|
874
|
+
in oklch,
|
|
875
|
+
var(--foreground) 11%,
|
|
876
|
+
transparent
|
|
877
|
+
);
|
|
878
|
+
--toolbar-control-shadow:
|
|
879
|
+
inset 0 1px 0 color-mix(in oklch, white 42%, transparent),
|
|
880
|
+
0 1px 2px oklch(0.15 0.005 285 / 8%);
|
|
854
881
|
|
|
855
882
|
--material-blur-toolbar: 16px;
|
|
856
883
|
--material-blur-overlay: 20px;
|
|
@@ -946,6 +973,32 @@
|
|
|
946
973
|
--chat-safe-padding: 0px;
|
|
947
974
|
}
|
|
948
975
|
|
|
976
|
+
/*
|
|
977
|
+
* A top Toolbar becomes unified native window chrome only when the host gives
|
|
978
|
+
* the app ownership of the titlebar. Embedded views and ordinary pane
|
|
979
|
+
* toolbars retain their density-specific compact sizing.
|
|
980
|
+
*/
|
|
981
|
+
:root[data-moldable-display-mode='window'][data-moldable-window-titlebar='app']
|
|
982
|
+
[data-slot='toolbar'][data-position='top']:not([data-window-inset='none']) {
|
|
983
|
+
min-height: max(3.25rem, var(--window-titlebar-height, 0px));
|
|
984
|
+
padding-inline-start: max(
|
|
985
|
+
var(--density-control-padding-inline, 0.625rem),
|
|
986
|
+
var(--window-control-inset-inline-start, 0px)
|
|
987
|
+
);
|
|
988
|
+
padding-inline-end: max(
|
|
989
|
+
var(--density-control-padding-inline, 0.625rem),
|
|
990
|
+
var(--window-control-inset-inline-end, 0px)
|
|
991
|
+
);
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
:root[data-moldable-display-mode='window'][data-moldable-window-titlebar='app']
|
|
995
|
+
[data-slot='toolbar'][data-position='top'][data-window-inset='windowControlsAndButton'] {
|
|
996
|
+
padding-inline-start: max(
|
|
997
|
+
var(--density-control-padding-inline, 0.625rem),
|
|
998
|
+
calc(var(--window-control-inset-inline-start, 0px) + 2.75rem)
|
|
999
|
+
);
|
|
1000
|
+
}
|
|
1001
|
+
|
|
949
1002
|
:where([data-density='compact']) {
|
|
950
1003
|
--density-control-height-xs: 1.375rem;
|
|
951
1004
|
--density-control-height-sm: 1.75rem;
|
|
@@ -1176,6 +1229,11 @@
|
|
|
1176
1229
|
--control-disabled: transparent;
|
|
1177
1230
|
--control-focus: Highlight;
|
|
1178
1231
|
--control-invalid: Mark;
|
|
1232
|
+
--toolbar-control-background: Canvas;
|
|
1233
|
+
--toolbar-control-hover: Canvas;
|
|
1234
|
+
--toolbar-control-pressed: Canvas;
|
|
1235
|
+
--toolbar-control-border: ButtonBorder;
|
|
1236
|
+
--toolbar-control-shadow: none;
|
|
1179
1237
|
--material-regular-fill: Canvas;
|
|
1180
1238
|
--material-regular-fallback: Canvas;
|
|
1181
1239
|
--material-regular-border: ButtonBorder;
|
|
@@ -1201,6 +1259,10 @@
|
|
|
1201
1259
|
:where([data-transparency='reduced']) {
|
|
1202
1260
|
--surface-toolbar: var(--background);
|
|
1203
1261
|
--surface-overlay: var(--popover);
|
|
1262
|
+
--toolbar-control-background: var(--background);
|
|
1263
|
+
--toolbar-control-hover: var(--accent);
|
|
1264
|
+
--toolbar-control-pressed: var(--control-pressed);
|
|
1265
|
+
--toolbar-control-shadow: inset 0 0 0 1px var(--separator);
|
|
1204
1266
|
--material-regular-fill: var(--material-regular-fallback);
|
|
1205
1267
|
--material-regular-blur: 0px;
|
|
1206
1268
|
--material-regular-saturation: 1;
|
|
@@ -1216,6 +1278,10 @@
|
|
|
1216
1278
|
:root {
|
|
1217
1279
|
--surface-toolbar: var(--background);
|
|
1218
1280
|
--surface-overlay: var(--popover);
|
|
1281
|
+
--toolbar-control-background: var(--background);
|
|
1282
|
+
--toolbar-control-hover: var(--accent);
|
|
1283
|
+
--toolbar-control-pressed: var(--control-pressed);
|
|
1284
|
+
--toolbar-control-shadow: inset 0 0 0 1px var(--separator);
|
|
1219
1285
|
--material-regular-fill: var(--material-regular-fallback);
|
|
1220
1286
|
--material-regular-blur: 0px;
|
|
1221
1287
|
--material-regular-saturation: 1;
|