@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.
Files changed (68) hide show
  1. package/dist/catalog/core-foundation-stories.d.ts.map +1 -1
  2. package/dist/catalog/core-foundation-stories.js +15 -3
  3. package/dist/components/chat/chat-input.d.ts.map +1 -1
  4. package/dist/components/chat/chat-input.js +1 -1
  5. package/dist/components/chat/chat-message.js +1 -1
  6. package/dist/components/chat/index.d.ts +1 -0
  7. package/dist/components/chat/index.d.ts.map +1 -1
  8. package/dist/components/chat/index.js +1 -0
  9. package/dist/components/chat/orb-materials.d.ts +14 -0
  10. package/dist/components/chat/orb-materials.d.ts.map +1 -0
  11. package/dist/components/chat/orb-materials.js +340 -0
  12. package/dist/components/chat/voice-orb-shaders.d.ts +1 -1
  13. package/dist/components/chat/voice-orb-shaders.d.ts.map +1 -1
  14. package/dist/components/chat/voice-orb-shaders.js +11 -162
  15. package/dist/components/chat/voice-orb.d.ts.map +1 -1
  16. package/dist/components/chat/voice-orb.js +2 -1
  17. package/dist/components/native-capabilities/shortcut-recorder.js +1 -1
  18. package/dist/components/rich-media-player.js +1 -1
  19. package/dist/components/ui/app-frame.d.ts +1 -1
  20. package/dist/components/ui/app-frame.d.ts.map +1 -1
  21. package/dist/components/ui/app-frame.js +7 -39
  22. package/dist/components/ui/button-group.d.ts +1 -1
  23. package/dist/components/ui/button-group.js +1 -1
  24. package/dist/components/ui/button.d.ts +1 -1
  25. package/dist/components/ui/button.d.ts.map +1 -1
  26. package/dist/components/ui/button.js +1 -0
  27. package/dist/components/ui/checkbox.js +1 -1
  28. package/dist/components/ui/collapsible.js +1 -1
  29. package/dist/components/ui/combobox.js +1 -1
  30. package/dist/components/ui/command.d.ts.map +1 -1
  31. package/dist/components/ui/command.js +10 -2
  32. package/dist/components/ui/date-field.js +1 -1
  33. package/dist/components/ui/index.d.ts +1 -0
  34. package/dist/components/ui/index.d.ts.map +1 -1
  35. package/dist/components/ui/index.js +1 -0
  36. package/dist/components/ui/input-group.d.ts.map +1 -1
  37. package/dist/components/ui/input-otp.js +1 -1
  38. package/dist/components/ui/input.js +1 -1
  39. package/dist/components/ui/inspector.js +3 -3
  40. package/dist/components/ui/menubar.js +1 -1
  41. package/dist/components/ui/number-input.js +1 -1
  42. package/dist/components/ui/panel.d.ts +2 -2
  43. package/dist/components/ui/panel.js +2 -2
  44. package/dist/components/ui/radio-group.js +1 -1
  45. package/dist/components/ui/select.js +1 -1
  46. package/dist/components/ui/switch.js +1 -1
  47. package/dist/components/ui/toolbar-controls.d.ts +47 -0
  48. package/dist/components/ui/toolbar-controls.d.ts.map +1 -0
  49. package/dist/components/ui/toolbar-controls.js +40 -0
  50. package/dist/components/ui/toolbar.d.ts +15 -4
  51. package/dist/components/ui/toolbar.d.ts.map +1 -1
  52. package/dist/components/ui/toolbar.js +16 -5
  53. package/dist/components/ui/window-titlebar.d.ts +8 -0
  54. package/dist/components/ui/window-titlebar.d.ts.map +1 -0
  55. package/dist/components/ui/window-titlebar.js +40 -0
  56. package/dist/index.d.ts +1 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +1 -1
  59. package/dist/lib/commands.d.ts +29 -0
  60. package/dist/lib/commands.d.ts.map +1 -1
  61. package/dist/lib/commands.js +28 -0
  62. package/docs/app-anatomy.md +9 -7
  63. package/docs/standalone-app-windows.md +12 -8
  64. package/package.json +2 -2
  65. package/src/components/ui/app-frame.md +6 -8
  66. package/src/components/ui/toolbar-controls.md +75 -0
  67. package/src/components/ui/toolbar.md +20 -1
  68. 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
- Compact pane chrome for context and actions.
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.
@@ -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;