@moldable-ai/ui 0.2.26 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"core-foundation-stories.d.ts","sourceRoot":"","sources":["../../src/catalog/core-foundation-stories.tsx"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAE/D,eAAO,MAAM,qBAAqB,EAAE,wBA2InC,CAAA"}
1
+ {"version":3,"file":"core-foundation-stories.d.ts","sourceRoot":"","sources":["../../src/catalog/core-foundation-stories.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAE/D,eAAO,MAAM,qBAAqB,EAAE,wBAkLnC,CAAA"}
@@ -1,12 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { ChevronLeftIcon, ChevronRightIcon, LocateFixedIcon, PlusIcon, } from 'lucide-react';
3
- import { AppFrame, AppFrameContent, } from '../components/ui/app-frame.js';
2
+ import { ChevronLeftIcon, ChevronRightIcon, ImageIcon, LocateFixedIcon, PaletteIcon, PlusIcon, Redo2Icon, Undo2Icon, } from 'lucide-react';
3
+ import { AppFrame, AppFrameContent } from '../components/ui/app-frame.js';
4
4
  import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '../components/ui/card.js';
5
5
  import { IconButton } from '../components/ui/icon-button.js';
6
6
  import { Material, MaterialGroup } from '../components/ui/material.js';
7
7
  import { Panel, PanelContent, PanelGroup, PanelHeader, } from '../components/ui/panel.js';
8
8
  import { Text } from '../components/ui/text.js';
9
9
  import { Toolbar, ToolbarActions, ToolbarContent, ToolbarDescription, ToolbarTitle, } from '../components/ui/toolbar.js';
10
+ import { ToolbarBackButton, ToolbarButton, ToolbarControlGroup, ToolbarControlSeparator, ToolbarIconButton, ToolbarOverflowMenu, ToolbarSidebarToggle, ToolbarTitleField, } from '../components/ui/toolbar-controls.js';
10
11
  export const coreFoundationSection = {
11
12
  id: 'window-foundations',
12
13
  title: 'Window foundations',
@@ -40,6 +41,17 @@ export const coreFoundationSection = {
40
41
  viewports: ['narrow'],
41
42
  render: () => (_jsxs(Toolbar, { className: "rounded-container border", children: [_jsxs(ToolbarContent, { children: [_jsx(ToolbarTitle, { children: "Daily plan" }), _jsx(ToolbarDescription, { children: "Three tasks remaining" })] }), _jsx(ToolbarActions, { children: _jsx(IconButton, { label: "Add task", variant: "ghost", size: "sm", children: _jsx(PlusIcon, {}) }) })] })),
42
43
  },
44
+ {
45
+ id: 'document-toolbar-controls',
46
+ title: 'Document toolbar controls',
47
+ description: 'Contextual navigation, closely related groups, secondary actions, overflow, and one primary action.',
48
+ components: ['toolbar', 'toolbar-controls'],
49
+ viewports: ['wide'],
50
+ render: () => (_jsxs(Toolbar, { position: "top", className: "rounded-container border", children: [_jsx(ToolbarSidebarToggle, { expanded: true, onExpandedChange: () => undefined }), _jsx(ToolbarBackButton, { onClick: () => undefined }), _jsx(ToolbarTitleField, { defaultValue: "Open House" }), _jsxs(ToolbarActions, { children: [_jsxs(ToolbarControlGroup, { "aria-label": "Edit history", children: [_jsx(ToolbarIconButton, { label: "Undo", children: _jsx(Undo2Icon, {}) }), _jsx(ToolbarControlSeparator, {}), _jsx(ToolbarIconButton, { label: "Redo", children: _jsx(Redo2Icon, {}) })] }), _jsx(ToolbarIconButton, { label: "Style", children: _jsx(PaletteIcon, {}) }), _jsx(ToolbarIconButton, { label: "Assets", children: _jsx(ImageIcon, {}) }), _jsx(ToolbarOverflowMenu, { items: [
51
+ { id: 'history', label: 'Version history' },
52
+ { id: 'publish', label: 'Publish' },
53
+ ] }), _jsx(ToolbarButton, { variant: "default", children: "Present" })] })] })),
54
+ },
43
55
  {
44
56
  id: 'work-surfaces',
45
57
  title: 'Work surfaces',
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
- size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
4
+ variant?: "link" | "toolbar" | "default" | "outline" | "destructive" | "secondary" | "ghost" | null | undefined;
5
+ size?: "default" | "sm" | "xs" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  type ButtonProps = React.ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
8
8
  asChild?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/button.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,cAAc;;;8EAkCnB,CAAA;AAED,KAAK,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAC/C,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AA4CH,iBAAS,MAAM,CAAC,EACd,WAAW,EAAE,QAAQ,EACrB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,OAAe,EACf,OAAO,EACP,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,OAAe,EACf,GAAG,KAAK,EACT,EAAE,WAAW,2CAqDb;AAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/button.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,cAAc;;;8EAoCnB,CAAA;AAED,KAAK,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAC/C,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AA4CH,iBAAS,MAAM,CAAC,EACd,WAAW,EAAE,QAAQ,EACrB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,OAAe,EACf,OAAO,EACP,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,OAAe,EACf,GAAG,KAAK,EACT,EAAE,WAAW,2CAqDb;AAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA"}
@@ -8,6 +8,7 @@ const buttonVariants = cva("text-ui-body relative inline-flex shrink-0 cursor-po
8
8
  variants: {
9
9
  variant: {
10
10
  default: 'bg-primary text-primary-foreground hover:bg-primary/90 active:bg-primary/80',
11
+ toolbar: 'border-[var(--toolbar-control-border)] bg-[var(--toolbar-control-background)] text-foreground shadow-[var(--toolbar-control-shadow)] border hover:bg-[var(--toolbar-control-hover)] active:bg-[var(--toolbar-control-pressed)]',
11
12
  destructive: 'bg-destructive text-white hover:bg-destructive/90 active:bg-destructive/80 dark:bg-destructive/60',
12
13
  outline: 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground active:bg-control-pressed dark:bg-input/30 dark:border-input dark:hover:bg-input/50 dark:active:bg-control-pressed',
13
14
  secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80 active:bg-secondary/65',
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
3
  declare const dateFieldVariants: (props?: ({
4
4
  variant?: "default" | "filled" | null | undefined;
5
- density?: "default" | "compact" | "comfortable" | null | undefined;
5
+ density?: "compact" | "default" | "comfortable" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  interface DateFieldProps extends Omit<React.ComponentProps<'input'>, 'defaultValue' | 'size' | 'type' | 'value'>, VariantProps<typeof dateFieldVariants> {
8
8
  /** ISO calendar date in YYYY-MM-DD form. No timezone conversion is applied. */
@@ -74,5 +74,6 @@ export * from './text.js';
74
74
  export * from './toggle.js';
75
75
  export * from './toggle-group.js';
76
76
  export * from './toolbar.js';
77
+ export * from './toolbar-controls.js';
77
78
  export * from './tooltip.js';
78
79
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,QAAQ,CAAA;AACtB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,YAAY,CAAA;AAC1B,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,QAAQ,CAAA;AACtB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,YAAY,CAAA;AAC1B,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,oBAAoB,CAAA;AAClC,cAAc,WAAW,CAAA"}
@@ -74,4 +74,5 @@ export * from './text.js';
74
74
  export * from './toggle.js';
75
75
  export * from './toggle-group.js';
76
76
  export * from './toolbar.js';
77
+ export * from './toolbar-controls.js';
77
78
  export * from './tooltip.js';
@@ -3,11 +3,11 @@ import { Button } from './button.js';
3
3
  import { type VariantProps } from 'class-variance-authority';
4
4
  declare function InputGroup({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
5
5
  declare const inputGroupAddonVariants: (props?: ({
6
- align?: "inline-end" | "inline-start" | "block-end" | "block-start" | null | undefined;
6
+ align?: "inline-start" | "inline-end" | "block-start" | "block-end" | null | undefined;
7
7
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
8
  declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>): import("react/jsx-runtime").JSX.Element;
9
9
  declare const inputGroupButtonVariants: (props?: ({
10
- size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
10
+ size?: "sm" | "xs" | "icon-xs" | "icon-sm" | null | undefined;
11
11
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
12
12
  declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, 'size'> & VariantProps<typeof inputGroupButtonVariants>): import("react/jsx-runtime").JSX.Element;
13
13
  declare function InputGroupText({ className, ...props }: React.ComponentProps<'span'>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,47 @@
1
+ import * as React from 'react';
2
+ import type { MenuItems } from '../../lib/host-native-menu.js';
3
+ import { Button } from './button.js';
4
+ import { type IconButtonProps, type IconButtonSize } from './icon-button.js';
5
+ import { Separator } from './separator.js';
6
+ type ToolbarControlAppearance = 'chrome' | 'quiet';
7
+ export interface ToolbarButtonProps extends React.ComponentProps<typeof Button> {
8
+ /**
9
+ * `chrome` uses the raised translucent toolbar surface. `quiet` is useful
10
+ * inside a ToolbarControlGroup, which owns the shared surface.
11
+ */
12
+ appearance?: ToolbarControlAppearance;
13
+ }
14
+ declare function ToolbarButton({ appearance, className, size, variant, ...props }: ToolbarButtonProps): import("react/jsx-runtime").JSX.Element;
15
+ export interface ToolbarIconButtonProps extends Omit<IconButtonProps, 'size'> {
16
+ appearance?: ToolbarControlAppearance;
17
+ size?: IconButtonSize;
18
+ }
19
+ declare function ToolbarIconButton({ appearance, className, size, variant, ...props }: ToolbarIconButtonProps): import("react/jsx-runtime").JSX.Element;
20
+ export interface ToolbarControlGroupProps extends React.ComponentProps<'div'> {
21
+ appearance?: ToolbarControlAppearance;
22
+ }
23
+ declare function ToolbarControlGroup({ appearance, className, ...props }: ToolbarControlGroupProps): import("react/jsx-runtime").JSX.Element;
24
+ declare function ToolbarControlSeparator({ className, ...props }: React.ComponentProps<typeof Separator>): import("react/jsx-runtime").JSX.Element;
25
+ export interface ToolbarBackButtonProps extends Omit<ToolbarIconButtonProps, 'children' | 'label'> {
26
+ label?: string;
27
+ }
28
+ declare function ToolbarBackButton({ label, tooltip, ...props }: ToolbarBackButtonProps): import("react/jsx-runtime").JSX.Element;
29
+ export interface ToolbarSidebarToggleProps extends Omit<ToolbarIconButtonProps, 'aria-pressed' | 'children' | 'label' | 'onClick'> {
30
+ expanded: boolean;
31
+ onExpandedChange: (expanded: boolean) => void;
32
+ showLabel?: string;
33
+ hideLabel?: string;
34
+ }
35
+ declare function ToolbarSidebarToggle({ expanded, hideLabel, onExpandedChange, showLabel, tooltip, ...props }: ToolbarSidebarToggleProps): import("react/jsx-runtime").JSX.Element;
36
+ export interface ToolbarOverflowMenuProps extends Omit<ToolbarIconButtonProps, 'children' | 'label' | 'onClick'> {
37
+ items: MenuItems[];
38
+ label?: string;
39
+ onSelectItem?: (id: string) => void;
40
+ }
41
+ declare function ToolbarOverflowMenu({ items, label, onSelectItem, tooltip, ...props }: ToolbarOverflowMenuProps): import("react/jsx-runtime").JSX.Element;
42
+ export interface ToolbarTitleFieldProps extends Omit<React.ComponentProps<'input'>, 'size'> {
43
+ label?: string;
44
+ }
45
+ declare function ToolbarTitleField({ 'aria-label': ariaLabel, className, label, type, ...props }: ToolbarTitleFieldProps): import("react/jsx-runtime").JSX.Element;
46
+ export { ToolbarBackButton, ToolbarButton, ToolbarControlGroup, ToolbarControlSeparator, ToolbarIconButton, ToolbarOverflowMenu, ToolbarSidebarToggle, ToolbarTitleField, };
47
+ //# sourceMappingURL=toolbar-controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar-controls.d.ts","sourceRoot":"","sources":["../../../src/components/ui/toolbar-controls.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { ChevronLeftIcon, EllipsisIcon, PanelLeftIcon } from 'lucide-react';
4
+ import * as React from 'react';
5
+ import { cn } from '../../lib/utils.js';
6
+ import { Button } from './button.js';
7
+ import { DropdownMenu, DropdownMenuTrigger } from './dropdown-menu.js';
8
+ import { IconButton, } from './icon-button.js';
9
+ import { Separator } from './separator.js';
10
+ const ToolbarControlGroupContext = React.createContext(null);
11
+ function ToolbarButton({ appearance = 'chrome', className, size, variant, ...props }) {
12
+ const group = React.useContext(ToolbarControlGroupContext);
13
+ return (_jsx(Button, { "data-slot": "toolbar-button", size: size ?? (group ? 'sm' : 'lg'), variant: variant ?? (group || appearance === 'quiet' ? 'ghost' : 'toolbar'), className: cn(group && 'shadow-none', className), ...props }));
14
+ }
15
+ function ToolbarIconButton({ appearance = 'chrome', className, size, variant, ...props }) {
16
+ const group = React.useContext(ToolbarControlGroupContext);
17
+ return (_jsx(IconButton, { "data-slot": "toolbar-icon-button", size: size ?? (group ? 'sm' : 'lg'), variant: variant ?? (group || appearance === 'quiet' ? 'ghost' : 'toolbar'), className: cn(group && 'shadow-none', className), ...props }));
18
+ }
19
+ function ToolbarControlGroup({ appearance = 'chrome', className, ...props }) {
20
+ return (_jsx(ToolbarControlGroupContext.Provider, { value: { grouped: true }, children: _jsx("div", { role: "group", "data-slot": "toolbar-control-group", "data-appearance": appearance, className: cn('h-control-lg rounded-control flex shrink-0 items-center', appearance === 'chrome'
21
+ ? 'gap-0.5 border border-[var(--toolbar-control-border)] bg-[var(--toolbar-control-background)] p-1 shadow-[var(--toolbar-control-shadow)]'
22
+ : 'gap-1.5', className), ...props }) }));
23
+ }
24
+ function ToolbarControlSeparator({ className, ...props }) {
25
+ return (_jsx(Separator, { "data-slot": "toolbar-control-separator", orientation: "vertical", className: cn('mx-0.5 h-4 self-center bg-[var(--toolbar-control-border)]', className), ...props }));
26
+ }
27
+ function ToolbarBackButton({ label = 'Back', tooltip = true, ...props }) {
28
+ return (_jsx(ToolbarIconButton, { label: label, tooltip: tooltip, ...props, children: _jsx(ChevronLeftIcon, {}) }));
29
+ }
30
+ function ToolbarSidebarToggle({ expanded, hideLabel = 'Hide sidebar', onExpandedChange, showLabel = 'Show sidebar', tooltip = true, ...props }) {
31
+ const label = expanded ? hideLabel : showLabel;
32
+ return (_jsx(ToolbarIconButton, { "aria-pressed": expanded, "data-state": expanded ? 'on' : 'off', label: label, tooltip: tooltip, onClick: () => onExpandedChange(!expanded), ...props, children: _jsx(PanelLeftIcon, {}) }));
33
+ }
34
+ function ToolbarOverflowMenu({ items, label = 'More actions', onSelectItem, tooltip = true, ...props }) {
35
+ return (_jsx(DropdownMenu, { items: items, onSelectItem: onSelectItem, children: _jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(ToolbarIconButton, { label: label, tooltip: tooltip, ...props, children: _jsx(EllipsisIcon, {}) }) }) }));
36
+ }
37
+ function ToolbarTitleField({ 'aria-label': ariaLabel, className, label = 'Document title', type = 'text', ...props }) {
38
+ return (_jsx("input", { "data-slot": "toolbar-title-field", "aria-label": ariaLabel ?? label, type: type, className: cn('text-foreground hover:bg-control-hover focus:bg-control-hover focus-visible:ring-ring h-control-sm rounded-control min-w-0 max-w-[min(24rem,32vw)] bg-transparent px-2 text-[15px] font-medium outline-none transition-colors focus-visible:ring-1', className), ...props }));
39
+ }
40
+ export { ToolbarBackButton, ToolbarButton, ToolbarControlGroup, ToolbarControlSeparator, ToolbarIconButton, ToolbarOverflowMenu, ToolbarSidebarToggle, ToolbarTitleField, };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moldable-ai/ui",
3
- "version": "0.2.26",
3
+ "version": "0.2.29",
4
4
  "description": "Shared UI components for Moldable applications",
5
5
  "author": "Desiderata LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -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.
@@ -37,3 +37,9 @@ The default toolbar uses `material="regular"`. The `plain` and `panel` variants
37
37
  default to `material="none"`; pass a material explicitly only when the toolbar
38
38
  actually floats over content. Reserve `material="clear"` for compact controls
39
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;
@@ -952,9 +979,7 @@
952
979
  * toolbars retain their density-specific compact sizing.
953
980
  */
954
981
  :root[data-moldable-display-mode='window'][data-moldable-window-titlebar='app']
955
- [data-slot='toolbar'][data-position='top']:not(
956
- [data-window-inset='none']
957
- ) {
982
+ [data-slot='toolbar'][data-position='top']:not([data-window-inset='none']) {
958
983
  min-height: max(3.25rem, var(--window-titlebar-height, 0px));
959
984
  padding-inline-start: max(
960
985
  var(--density-control-padding-inline, 0.625rem),
@@ -1204,6 +1229,11 @@
1204
1229
  --control-disabled: transparent;
1205
1230
  --control-focus: Highlight;
1206
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;
1207
1237
  --material-regular-fill: Canvas;
1208
1238
  --material-regular-fallback: Canvas;
1209
1239
  --material-regular-border: ButtonBorder;
@@ -1229,6 +1259,10 @@
1229
1259
  :where([data-transparency='reduced']) {
1230
1260
  --surface-toolbar: var(--background);
1231
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);
1232
1266
  --material-regular-fill: var(--material-regular-fallback);
1233
1267
  --material-regular-blur: 0px;
1234
1268
  --material-regular-saturation: 1;
@@ -1244,6 +1278,10 @@
1244
1278
  :root {
1245
1279
  --surface-toolbar: var(--background);
1246
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);
1247
1285
  --material-regular-fill: var(--material-regular-fallback);
1248
1286
  --material-regular-blur: 0px;
1249
1287
  --material-regular-saturation: 1;