@moldable-ai/ui 0.2.29 → 0.2.31
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/component-catalog.d.ts +9 -2
- package/dist/catalog/component-catalog.d.ts.map +1 -1
- package/dist/catalog/component-catalog.js +11 -7
- package/dist/catalog/core-control-stories.d.ts.map +1 -1
- package/dist/catalog/core-control-stories.js +1 -1
- package/dist/catalog/core-foundation-stories.d.ts.map +1 -1
- package/dist/catalog/core-foundation-stories.js +5 -5
- package/dist/components/ui/app-frame.d.ts +20 -1
- package/dist/components/ui/app-frame.d.ts.map +1 -1
- package/dist/components/ui/app-frame.js +37 -7
- package/dist/components/ui/badge.d.ts +1 -1
- package/dist/components/ui/badge.js +1 -1
- package/dist/components/ui/button.d.ts +5 -3
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +39 -11
- package/dist/components/ui/card.d.ts +12 -2
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/card.js +3 -2
- package/dist/components/ui/checkbox.d.ts +4 -1
- package/dist/components/ui/checkbox.d.ts.map +1 -1
- package/dist/components/ui/checkbox.js +4 -4
- package/dist/components/ui/context-menu.js +6 -6
- package/dist/components/ui/dropdown-menu.js +6 -6
- package/dist/components/ui/icon-button.d.ts +1 -1
- package/dist/components/ui/icon-button.d.ts.map +1 -1
- package/dist/components/ui/icon-button.js +1 -0
- package/dist/components/ui/input.d.ts +6 -2
- package/dist/components/ui/input.d.ts.map +1 -1
- package/dist/components/ui/input.js +2 -2
- package/dist/components/ui/material.d.ts +8 -3
- package/dist/components/ui/material.d.ts.map +1 -1
- package/dist/components/ui/material.js +2 -2
- package/dist/components/ui/search-field.d.ts +3 -1
- package/dist/components/ui/search-field.d.ts.map +1 -1
- package/dist/components/ui/search-field.js +16 -6
- package/dist/components/ui/segmented-control.d.ts +3 -1
- package/dist/components/ui/segmented-control.d.ts.map +1 -1
- package/dist/components/ui/segmented-control.js +23 -17
- package/dist/components/ui/select.js +2 -2
- package/dist/components/ui/sidebar.d.ts +5 -3
- package/dist/components/ui/sidebar.d.ts.map +1 -1
- package/dist/components/ui/sidebar.js +53 -15
- package/dist/components/ui/status.d.ts +1 -1
- package/dist/components/ui/status.js +1 -1
- package/dist/components/ui/switch.d.ts +3 -1
- package/dist/components/ui/switch.d.ts.map +1 -1
- package/dist/components/ui/switch.js +3 -2
- package/dist/components/ui/toolbar-controls.d.ts +3 -1
- package/dist/components/ui/toolbar-controls.d.ts.map +1 -1
- package/dist/components/ui/toolbar-controls.js +14 -7
- package/dist/components/ui/toolbar.d.ts +5 -4
- package/dist/components/ui/toolbar.d.ts.map +1 -1
- package/dist/components/ui/toolbar.js +3 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/lib/frame-lifecycle.d.ts +1 -0
- package/dist/lib/frame-lifecycle.d.ts.map +1 -1
- package/dist/lib/frame-lifecycle.js +7 -0
- package/dist/lib/theme.d.ts +39 -5
- package/dist/lib/theme.d.ts.map +1 -1
- package/dist/lib/theme.js +105 -17
- package/dist/tokens/contracts.d.ts +79 -0
- package/dist/tokens/contracts.d.ts.map +1 -0
- package/dist/tokens/contracts.js +57 -0
- package/dist/tokens/index.d.ts +2 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +1 -0
- package/docs/README.md +2 -0
- package/docs/adaptive-materials.md +14 -9
- package/docs/design-tokens.md +10 -6
- package/docs/foundations.md +3 -3
- package/docs/macos-design-audit.md +144 -0
- package/docs/native-integration.md +4 -4
- package/docs/platform-architecture.md +189 -0
- package/docs/standalone-app-windows.md +37 -0
- package/docs/visual-regression.md +6 -8
- package/package.json +13 -1
- package/src/components/ui/accordion.md +46 -0
- package/src/components/ui/alert.md +12 -4
- package/src/components/ui/app-frame.md +8 -5
- package/src/components/ui/aspect-ratio.md +37 -0
- package/src/components/ui/avatar.md +48 -0
- package/src/components/ui/breadcrumb.md +52 -0
- package/src/components/ui/button-group.md +43 -0
- package/src/components/ui/button.md +20 -4
- package/src/components/ui/calendar.md +42 -0
- package/src/components/ui/card.md +43 -0
- package/src/components/ui/carousel.md +47 -0
- package/src/components/ui/chart.md +52 -0
- package/src/components/ui/checkbox.md +36 -0
- package/src/components/ui/collapsible.md +2 -3
- package/src/components/ui/color-well.md +14 -4
- package/src/components/ui/combobox.md +3 -3
- package/src/components/ui/confirm-dialog.md +5 -4
- package/src/components/ui/context-menu.md +3 -2
- package/src/components/ui/date-field.md +6 -1
- package/src/components/ui/date-picker.md +6 -3
- package/src/components/ui/dialog.md +14 -12
- package/src/components/ui/drawer.md +58 -0
- package/src/components/ui/error-boundary-view.md +1 -1
- package/src/components/ui/field.md +2 -1
- package/src/components/ui/form.md +71 -0
- package/src/components/ui/grid.md +4 -3
- package/src/components/ui/icon-button.md +4 -1
- package/src/components/ui/input-group.md +49 -0
- package/src/components/ui/input-otp.md +56 -0
- package/src/components/ui/input.md +40 -0
- package/src/components/ui/inspector.md +47 -7
- package/src/components/ui/item.md +5 -3
- package/src/components/ui/kbd.md +30 -0
- package/src/components/ui/label.md +29 -0
- package/src/components/ui/list.md +2 -2
- package/src/components/ui/material.md +25 -12
- package/src/components/ui/menu-items.md +60 -0
- package/src/components/ui/menubar.md +58 -0
- package/src/components/ui/message-scroller-primitive.md +70 -0
- package/src/components/ui/message-scroller.md +86 -0
- package/src/components/ui/navigation-button-group.md +4 -3
- package/src/components/ui/navigation-menu.md +52 -0
- package/src/components/ui/number-input.md +8 -0
- package/src/components/ui/pagination.md +51 -0
- package/src/components/ui/panel.md +6 -0
- package/src/components/ui/popover.md +10 -7
- package/src/components/ui/progress.md +31 -0
- package/src/components/ui/radio-group.md +36 -0
- package/src/components/ui/resizable.md +2 -1
- package/src/components/ui/scroll-area.md +3 -1
- package/src/components/ui/search-field.md +6 -1
- package/src/components/ui/segmented-control.md +6 -1
- package/src/components/ui/separator.md +35 -0
- package/src/components/ui/sidebar.md +20 -3
- package/src/components/ui/skeleton.md +36 -0
- package/src/components/ui/slider.md +58 -0
- package/src/components/ui/spinner.md +41 -0
- package/src/components/ui/split-view.md +8 -4
- package/src/components/ui/switch.md +44 -0
- package/src/components/ui/table.md +7 -7
- package/src/components/ui/tabs.md +3 -1
- package/src/components/ui/textarea.md +41 -0
- package/src/components/ui/toggle-group.md +2 -2
- package/src/components/ui/toggle.md +9 -9
- package/src/components/ui/toolbar-controls.md +17 -9
- package/src/components/ui/toolbar.md +6 -6
- package/src/styles/index.css +171 -117
- package/src/tokens/contracts.ts +131 -0
- package/src/tokens/index.css +6 -0
- package/src/tokens/index.ts +23 -0
- package/src/tokens/macos-26/README.md +37 -0
- package/src/tokens/macos-26/aliases.css +53 -0
- package/src/tokens/macos-26/compatibility.css +7 -0
- package/src/tokens/macos-26/index.css +3 -0
- package/src/tokens/macos-26/source/provenance.generated.json +28 -0
- package/src/tokens/macos-26/source/sidebar.generated.css +29 -0
- package/src/tokens/macos-26/source.css +7 -0
- package/src/tokens/macos-26/web-adaptations.json +25 -0
- package/src/tokens/macos-26/web-adaptations.md +15 -0
- package/src/tokens/macos-27/accessibility.css +11 -0
- package/src/tokens/macos-27/aliases.css +304 -0
- package/src/tokens/macos-27/compatibility.css +212 -0
- package/src/tokens/macos-27/index.css +15 -0
- package/src/tokens/macos-27/recipes.css +23 -0
- package/src/tokens/macos-27/source/chrome.generated.css +338 -0
- package/src/tokens/macos-27/source/colors.generated.css +140 -0
- package/src/tokens/macos-27/source/context.generated.css +18 -0
- package/src/tokens/macos-27/source/controls.generated.css +764 -0
- package/src/tokens/macos-27/source/effects.generated.css +68 -0
- package/src/tokens/macos-27/source/kit.generated.css +50 -0
- package/src/tokens/macos-27/source/overlays-status.generated.css +931 -0
- package/src/tokens/macos-27/source/paint-styles.generated.css +81 -0
- package/src/tokens/macos-27/source/provenance.generated.json +62 -0
- package/src/tokens/macos-27/source/sizes.generated.css +385 -0
- package/src/tokens/macos-27/source/source.generated.json +554 -0
- package/src/tokens/macos-27/source/text-styles.generated.css +116 -0
- package/src/tokens/macos-27/source.css +17 -0
- package/src/tokens/macos-27/web-adaptations.css +98 -0
- package/src/tokens/macos-27/web-adaptations.json +163 -0
- package/src/tokens/macos-27/web-adaptations.md +117 -0
- package/src/tokens/moldable/brand.css +48 -0
- package/src/tokens/moldable/index.css +1 -0
- package/src/tokens/platform-contract.test.ts +290 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { type VariantProps } from 'class-variance-authority';
|
|
3
3
|
declare const statusVariants: (props?: ({
|
|
4
|
-
variant?: "
|
|
4
|
+
variant?: "neutral" | "info" | "success" | "warning" | "error" | "running" | "pending" | null | undefined;
|
|
5
5
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
6
|
export interface StatusProps extends React.ComponentProps<'span'>, VariantProps<typeof statusVariants> {
|
|
7
7
|
asChild?: boolean;
|
|
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { Slot } from '@radix-ui/react-slot';
|
|
4
4
|
import { cn } from '../../lib/utils.js';
|
|
5
5
|
import { cva } from 'class-variance-authority';
|
|
6
|
-
const statusVariants = cva('
|
|
6
|
+
const statusVariants = cva('inline-flex min-w-0 items-center gap-1.5 [font-size:var(--type-caption-size,10px)] font-medium [line-height:var(--type-caption-line-height,13px)]', {
|
|
7
7
|
variants: {
|
|
8
8
|
variant: {
|
|
9
9
|
info: 'text-info-foreground [&_[data-slot=status-indicator]]:bg-info',
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
|
|
3
|
+
import type { ControlSize } from '../../tokens/contracts.js';
|
|
4
|
+
declare function Switch({ className, controlSize, size, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root> & {
|
|
4
5
|
size?: 'sm' | 'default';
|
|
6
|
+
controlSize?: ControlSize;
|
|
5
7
|
}): import("react/jsx-runtime").JSX.Element;
|
|
6
8
|
export { Switch };
|
|
7
9
|
//# sourceMappingURL=switch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/components/ui/switch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/components/ui/switch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,WAAW,EACX,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG;IACrD,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;IACvB,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B,2CAuBA;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
4
4
|
import { cn } from '../../lib/utils.js';
|
|
5
|
-
function Switch({ className, size = 'default', ...props }) {
|
|
6
|
-
|
|
5
|
+
function Switch({ className, controlSize, size = 'default', ...props }) {
|
|
6
|
+
const resolvedControlSize = controlSize ?? (size === 'sm' ? 'small' : 'medium');
|
|
7
|
+
return (_jsx(SwitchPrimitive.Root, { "data-slot": "switch", "data-size": size, "data-control-size": resolvedControlSize, className: cn('focus-visible:border-ring focus-visible:ring-ring group/switch rounded-pill bg-[var(--m-ui-color-text-primary)]/10 active:bg-[var(--m-ui-color-text-primary)]/20 peer relative inline-flex h-[var(--m-ui-switch-track-height)] w-[var(--m-ui-switch-track-width)] shrink-0 cursor-pointer items-center border border-transparent p-0.5 outline-none transition-[background-color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-[0.06] data-[state=checked]:bg-[var(--m-ui-color-accent)]', className), ...props, children: _jsx(SwitchPrimitive.Thumb, { "data-slot": "switch-thumb", className: cn('border-separator-strong shadow-xs rounded-pill pointer-events-none relative z-10 block h-[var(--m-ui-switch-knob-height)] w-[var(--m-ui-switch-knob-width)] border bg-white ring-0 transition-[width,transform] data-[state=checked]:translate-x-[calc(var(--m-ui-switch-track-width)-var(--m-ui-switch-knob-width)-4px)] data-[state=unchecked]:translate-x-0') }) }));
|
|
7
8
|
}
|
|
8
9
|
export { Switch };
|
|
@@ -4,6 +4,7 @@ import { Button } from './button.js';
|
|
|
4
4
|
import { type IconButtonProps, type IconButtonSize } from './icon-button.js';
|
|
5
5
|
import { Separator } from './separator.js';
|
|
6
6
|
type ToolbarControlAppearance = 'chrome' | 'quiet';
|
|
7
|
+
type ToolbarControlSize = 'medium' | 'xl';
|
|
7
8
|
export interface ToolbarButtonProps extends React.ComponentProps<typeof Button> {
|
|
8
9
|
/**
|
|
9
10
|
* `chrome` uses the raised translucent toolbar surface. `quiet` is useful
|
|
@@ -19,8 +20,9 @@ export interface ToolbarIconButtonProps extends Omit<IconButtonProps, 'size'> {
|
|
|
19
20
|
declare function ToolbarIconButton({ appearance, className, size, variant, ...props }: ToolbarIconButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
20
21
|
export interface ToolbarControlGroupProps extends React.ComponentProps<'div'> {
|
|
21
22
|
appearance?: ToolbarControlAppearance;
|
|
23
|
+
size?: ToolbarControlSize;
|
|
22
24
|
}
|
|
23
|
-
declare function ToolbarControlGroup({ appearance, className, ...props }: ToolbarControlGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
declare function ToolbarControlGroup({ appearance, className, size, ...props }: ToolbarControlGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
24
26
|
declare function ToolbarControlSeparator({ className, ...props }: React.ComponentProps<typeof Separator>): import("react/jsx-runtime").JSX.Element;
|
|
25
27
|
export interface ToolbarBackButtonProps extends Omit<ToolbarIconButtonProps, 'children' | 'label'> {
|
|
26
28
|
label?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar-controls.d.ts","sourceRoot":"","sources":["../../../src/components/ui/toolbar-controls.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAE3D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,KAAK,wBAAwB,GAAG,QAAQ,GAAG,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"toolbar-controls.d.ts","sourceRoot":"","sources":["../../../src/components/ui/toolbar-controls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -10,19 +10,26 @@ import { Separator } from './separator.js';
|
|
|
10
10
|
const ToolbarControlGroupContext = React.createContext(null);
|
|
11
11
|
function ToolbarButton({ appearance = 'chrome', className, size, variant, ...props }) {
|
|
12
12
|
const group = React.useContext(ToolbarControlGroupContext);
|
|
13
|
-
|
|
13
|
+
const groupedSize = group?.size === 'xl' ? 'lg' : 'sm';
|
|
14
|
+
const emphasis = variant === 'prominent' ? 'primary' : 'standard';
|
|
15
|
+
const resolvedVariant = variant === 'prominent'
|
|
16
|
+
? 'toolbar'
|
|
17
|
+
: (variant ?? (group || appearance === 'quiet' ? 'ghost' : 'toolbar'));
|
|
18
|
+
return (_jsx(Button, { "data-slot": "toolbar-button", "data-emphasis": emphasis, size: size ?? (group ? groupedSize : 'xl'), variant: resolvedVariant, className: cn('rounded-pill gap-[var(--m-ui-toolbar-action-gap,var(--density-control-gap))] px-[var(--m-ui-toolbar-action-padding-inline,var(--density-control-padding-inline))] [&_svg:not([class*="size-"])]:size-[var(--m-ui-toolbar-action-icon-size,13px)]', emphasis === 'primary' && 'font-semibold', group && 'shadow-none', className), ...props }));
|
|
14
19
|
}
|
|
15
20
|
function ToolbarIconButton({ appearance = 'chrome', className, size, variant, ...props }) {
|
|
16
21
|
const group = React.useContext(ToolbarControlGroupContext);
|
|
17
|
-
|
|
22
|
+
const groupedSize = group?.size === 'xl' ? 'lg' : 'sm';
|
|
23
|
+
return (_jsx(IconButton, { "data-slot": "toolbar-icon-button", size: size ?? (group ? groupedSize : 'xl'), variant: variant ?? (group || appearance === 'quiet' ? 'ghost' : 'toolbar'), shape: "circle", className: cn(group && 'shadow-none', className), ...props }));
|
|
18
24
|
}
|
|
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('
|
|
21
|
-
? '
|
|
25
|
+
function ToolbarControlGroup({ appearance = 'chrome', className, size = 'xl', ...props }) {
|
|
26
|
+
return (_jsx(ToolbarControlGroupContext.Provider, { value: { grouped: true, size }, children: _jsx("div", { role: "group", "data-slot": "toolbar-control-group", "data-appearance": appearance, "data-size": size, className: cn('rounded-pill flex shrink-0 items-center', size === 'medium' ? 'h-control-md' : 'h-control-xl', appearance === 'chrome'
|
|
27
|
+
? cn('border border-[var(--toolbar-control-border)] bg-[var(--toolbar-control-background)] shadow-[var(--toolbar-control-shadow)]', size === 'medium' ? 'gap-1 p-0.5' : 'gap-1 p-1')
|
|
22
28
|
: 'gap-1.5', className), ...props }) }));
|
|
23
29
|
}
|
|
24
30
|
function ToolbarControlSeparator({ className, ...props }) {
|
|
25
|
-
|
|
31
|
+
const group = React.useContext(ToolbarControlGroupContext);
|
|
32
|
+
return (_jsx(Separator, { "data-slot": "toolbar-control-separator", orientation: "vertical", className: cn('mx-0.5 self-center bg-[var(--toolbar-control-border)]', group?.size === 'xl' ? 'h-5' : 'h-4', className), ...props }));
|
|
26
33
|
}
|
|
27
34
|
function ToolbarBackButton({ label = 'Back', tooltip = true, ...props }) {
|
|
28
35
|
return (_jsx(ToolbarIconButton, { label: label, tooltip: tooltip, ...props, children: _jsx(ChevronLeftIcon, {}) }));
|
|
@@ -35,6 +42,6 @@ function ToolbarOverflowMenu({ items, label = 'More actions', onSelectItem, tool
|
|
|
35
42
|
return (_jsx(DropdownMenu, { items: items, onSelectItem: onSelectItem, children: _jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(ToolbarIconButton, { label: label, tooltip: tooltip, ...props, children: _jsx(EllipsisIcon, {}) }) }) }));
|
|
36
43
|
}
|
|
37
44
|
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-
|
|
45
|
+
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-md rounded-control min-w-0 max-w-[min(24rem,32vw)] bg-transparent px-2 text-[13px] font-bold outline-none transition-colors focus-visible:ring-1', className), ...props }));
|
|
39
46
|
}
|
|
40
47
|
export { ToolbarBackButton, ToolbarButton, ToolbarControlGroup, ToolbarControlSeparator, ToolbarIconButton, ToolbarOverflowMenu, ToolbarSidebarToggle, ToolbarTitleField, };
|
|
@@ -4,18 +4,19 @@ import { Separator } from './separator.js';
|
|
|
4
4
|
import { Text } from './text.js';
|
|
5
5
|
import { type VariantProps } from 'class-variance-authority';
|
|
6
6
|
export type ToolbarInset = 'auto' | 'none' | 'windowControls' | 'windowControlsAndButton';
|
|
7
|
+
type ToolbarMaterialVariant = Extract<MaterialVariant, 'regular' | 'clear'>;
|
|
7
8
|
declare const toolbarVariants: (props?: ({
|
|
8
|
-
variant?: "
|
|
9
|
-
material?: "regular" | "
|
|
9
|
+
variant?: "default" | "panel" | "plain" | null | undefined;
|
|
10
|
+
material?: "regular" | "none" | "clear" | null | undefined;
|
|
10
11
|
density?: "compact" | "default" | "comfortable" | null | undefined;
|
|
11
|
-
position?: "
|
|
12
|
+
position?: "top" | "bottom" | "static" | null | undefined;
|
|
12
13
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
14
|
export interface ToolbarProps extends React.ComponentProps<'header'>, VariantProps<typeof toolbarVariants> {
|
|
14
15
|
/**
|
|
15
16
|
* Defaults to regular material for the default toolbar and no material for
|
|
16
17
|
* plain or panel variants.
|
|
17
18
|
*/
|
|
18
|
-
material?:
|
|
19
|
+
material?: ToolbarMaterialVariant | 'none';
|
|
19
20
|
/**
|
|
20
21
|
* Clearance for native window controls. `auto` applies the host-advertised
|
|
21
22
|
* inset only when this is a top toolbar in an app-owned window.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/ui/toolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/ui/toolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAK7B,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,MAAM,GACN,gBAAgB,GAChB,yBAAyB,CAAA;AAC7B,KAAK,sBAAsB,GAAG,OAAO,CAAC,eAAe,EAAE,SAAS,GAAG,OAAO,CAAC,CAAA;AAE3E,QAAA,MAAM,eAAe;;;;;8EAsCpB,CAAA;AAED,MAAM,WAAW,YACf,SAAQ,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EACpC,YAAY,CAAC,OAAO,eAAe,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAA;IAC1C;;;OAGG;IACH,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,iBAAS,OAAO,CAAC,EACf,OAAO,EACP,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,KAAc,EACd,SAAS,EACT,SAAS,EACT,aAAa,EACb,WAAW,EACX,GAAG,KAAK,EACT,EAAE,YAAY,2CAqCd;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQzE;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ3E;AAED,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,2CAWnC;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,2CAYnC;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ3E;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,2CASxC;AAED,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,eAAe,GAChB,CAAA"}
|
|
@@ -3,8 +3,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import { cn } from '../../lib/utils.js';
|
|
4
4
|
import { Separator } from './separator.js';
|
|
5
5
|
import { Text } from './text.js';
|
|
6
|
-
import { cva } from 'class-variance-authority';
|
|
7
6
|
import { handleWindowTitlebarDoubleClick, handleWindowTitlebarMouseDown, } from './window-titlebar.js';
|
|
7
|
+
import { cva } from 'class-variance-authority';
|
|
8
8
|
const toolbarVariants = cva('z-20 flex min-h-toolbar w-full shrink-0 items-center gap-control-gap px-control-inline', {
|
|
9
9
|
variants: {
|
|
10
10
|
variant: {
|
|
@@ -18,7 +18,7 @@ const toolbarVariants = cva('z-20 flex min-h-toolbar w-full shrink-0 items-cente
|
|
|
18
18
|
none: '',
|
|
19
19
|
},
|
|
20
20
|
density: {
|
|
21
|
-
compact: 'py-
|
|
21
|
+
compact: 'py-2',
|
|
22
22
|
default: 'py-1.5',
|
|
23
23
|
comfortable: 'py-2',
|
|
24
24
|
},
|
|
@@ -68,7 +68,7 @@ function ToolbarContent({ className, ...props }) {
|
|
|
68
68
|
return (_jsx("div", { "data-slot": "toolbar-content", className: cn('flex min-w-0 flex-1 flex-col', className), ...props }));
|
|
69
69
|
}
|
|
70
70
|
function ToolbarTitle({ className, ...props }) {
|
|
71
|
-
return (_jsx(Text, { as: "h2", variant: "strong", truncate: true, "data-slot": "toolbar-title", className: cn('text-[
|
|
71
|
+
return (_jsx(Text, { as: "h2", variant: "strong", truncate: true, "data-slot": "toolbar-title", className: cn('text-[13px] font-bold leading-[15px]', className), ...props }));
|
|
72
72
|
}
|
|
73
73
|
function ToolbarDescription({ className, ...props }) {
|
|
74
74
|
return (_jsx(Text, { as: "p", variant: "small", color: "secondary", truncate: true, "data-slot": "toolbar-description", className: className, ...props }));
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { cn } from './lib/utils.js';
|
|
2
|
-
export { ThemeProvider, useTheme, themeScript, type Theme } from './lib/theme.js';
|
|
2
|
+
export { ThemeProvider, useTheme, themeScript, type Theme, type ThemeProviderProps, } from './lib/theme.js';
|
|
3
|
+
export * from './tokens/index.js';
|
|
3
4
|
export { WorkspaceProvider, useWorkspace, WORKSPACE_HEADER, } from './lib/workspace.js';
|
|
4
5
|
export { useMoldableCommands, useMoldableCommand, useMoldableAppCommands, useMoldableWindowShortcuts, useMoldableNavigationPop, useMoldableNavigationState, isInMoldable, sendToMoldable, pushMoldableNavigation, popMoldableNavigation, resetMoldableNavigation, downloadFile, publishMoldableArtifact, setMoldableWindowFullscreen, type AppCommand, type CommandAction, type CommandsResponse, type CommandMessage, type MoldableNavigationEntry, type MoldableNavigationPopMessage, type MoldableNavigationStateMessage, type MoldableWindowShortcut, type MoldableWindowShortcutDefaults, type DownloadFileOptions, type MoldableArtifactFile, type MoldableArtifactPublishOptions, type MoldableArtifactPublishResult, type MoldableWindowFullscreenMode, type MoldableWindowFullscreenOptions, type MoldableWindowFullscreenResult, type MoldableWindowFullscreenMessage, type MoldableWindowFullscreenResultMessage, } from './lib/commands.js';
|
|
5
6
|
export * from './lib/native-capabilities/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAGhC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// Export utilities
|
|
2
2
|
export { cn } from './lib/utils.js';
|
|
3
3
|
// Export theme
|
|
4
|
-
export { ThemeProvider, useTheme, themeScript } from './lib/theme.js';
|
|
4
|
+
export { ThemeProvider, useTheme, themeScript, } from './lib/theme.js';
|
|
5
|
+
// Export design-system contracts
|
|
6
|
+
export * from './tokens/index.js';
|
|
5
7
|
// Export workspace
|
|
6
8
|
export { WorkspaceProvider, useWorkspace, WORKSPACE_HEADER, } from './lib/workspace.js';
|
|
7
9
|
// Export commands
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-lifecycle.d.ts","sourceRoot":"","sources":["../../src/lib/frame-lifecycle.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"frame-lifecycle.d.ts","sourceRoot":"","sources":["../../src/lib/frame-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -156,6 +156,13 @@ export function applyMoldableHostContext(message) {
|
|
|
156
156
|
delete root.dataset.moldableNativeMaterialSidebar;
|
|
157
157
|
clearSidebarMaterialRegion();
|
|
158
158
|
}
|
|
159
|
+
if (message.displayMode === 'window' &&
|
|
160
|
+
message.nativeMaterial?.background === true) {
|
|
161
|
+
root.dataset.moldableNativeMaterialBackground = 'available';
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
delete root.dataset.moldableNativeMaterialBackground;
|
|
165
|
+
}
|
|
159
166
|
const insets = message.safeInsets;
|
|
160
167
|
if (insets) {
|
|
161
168
|
applyBoundedLength('--window-safe-area-top', insets.top);
|
package/dist/lib/theme.d.ts
CHANGED
|
@@ -1,15 +1,49 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import type { ControlSize, MaterialContext, ResolvedUIAppearance, UIAppearance, UIPlatform, UIPlatformPack, UIPlatformVersion, UIPreferences, UISidebarStyle, UITheme } from '../tokens/contracts.js';
|
|
3
|
+
/** @deprecated Use UIAppearance. */
|
|
4
|
+
export type Theme = UIAppearance;
|
|
5
|
+
/** @deprecated Use ResolvedUIAppearance. */
|
|
6
|
+
type ResolvedTheme = ResolvedUIAppearance;
|
|
4
7
|
interface ThemeContextValue {
|
|
8
|
+
uiTheme: UITheme;
|
|
9
|
+
setUITheme: (theme: UITheme) => void;
|
|
10
|
+
platform: UIPlatform;
|
|
11
|
+
platformVersion: UIPlatformVersion;
|
|
12
|
+
platformPack: UIPlatformPack;
|
|
13
|
+
setPlatformPack: (platform: UIPlatform, version: UIPlatformVersion) => void;
|
|
14
|
+
sidebarStyle: UISidebarStyle;
|
|
15
|
+
setSidebarStyle: (style: UISidebarStyle) => void;
|
|
16
|
+
appearance: UIAppearance;
|
|
17
|
+
resolvedAppearance: ResolvedUIAppearance;
|
|
18
|
+
setAppearance: (appearance: UIAppearance) => void;
|
|
19
|
+
controlSize: ControlSize;
|
|
20
|
+
setControlSize: (controlSize: ControlSize) => void;
|
|
21
|
+
materialContext: MaterialContext;
|
|
22
|
+
setMaterialContext: (materialContext: MaterialContext) => void;
|
|
23
|
+
preferences: UIPreferences;
|
|
24
|
+
/** @deprecated Use appearance. */
|
|
5
25
|
theme: Theme;
|
|
26
|
+
/** @deprecated Use resolvedAppearance. */
|
|
6
27
|
resolvedTheme: ResolvedTheme;
|
|
28
|
+
/** @deprecated Use setAppearance. */
|
|
7
29
|
setTheme: (theme: Theme) => void;
|
|
8
30
|
}
|
|
9
|
-
export
|
|
31
|
+
export interface ThemeProviderProps {
|
|
10
32
|
children: ReactNode;
|
|
11
|
-
|
|
33
|
+
platform?: UIPlatform;
|
|
34
|
+
platformVersion?: UIPlatformVersion;
|
|
35
|
+
uiTheme?: UITheme;
|
|
36
|
+
sidebarStyle?: UISidebarStyle;
|
|
37
|
+
appearance?: UIAppearance;
|
|
38
|
+
controlSize?: ControlSize;
|
|
39
|
+
materialContext?: MaterialContext;
|
|
40
|
+
preferences?: UIPreferences;
|
|
41
|
+
storageKey?: string | false;
|
|
42
|
+
}
|
|
43
|
+
export declare function ThemeProvider({ children, platform, platformVersion, uiTheme: uiThemeProp, sidebarStyle: sidebarStyleProp, appearance: appearanceProp, controlSize: controlSizeProp, materialContext: materialContextProp, preferences, storageKey, }: ThemeProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
12
44
|
export declare function useTheme(): ThemeContextValue;
|
|
45
|
+
/** Internal-friendly optional access for components that also work standalone. */
|
|
46
|
+
export declare function useOptionalTheme(): ThemeContextValue | null;
|
|
13
47
|
/**
|
|
14
48
|
* Inline script to prevent theme flash on page load.
|
|
15
49
|
* Add this to your <head> in layout.tsx:
|
|
@@ -20,6 +54,6 @@ export declare function useTheme(): ThemeContextValue;
|
|
|
20
54
|
* </head>
|
|
21
55
|
* ```
|
|
22
56
|
*/
|
|
23
|
-
export declare const themeScript = "\n(function() {\n var params = new URLSearchParams(window.location.search);\n var theme = params.get('theme');\n if (!theme) {\n theme = localStorage.getItem('moldable-theme');\n }\n if (theme === 'system' || !theme) {\n theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n document.documentElement.classList.add(theme);\n})();\n";
|
|
57
|
+
export declare const themeScript = "\n(function() {\n var params = new URLSearchParams(window.location.search);\n var theme = params.get('theme');\n if (!theme) {\n theme = localStorage.getItem('moldable-theme');\n }\n if (theme === 'system' || !theme) {\n theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n document.documentElement.classList.add(theme);\n document.documentElement.dataset.uiTheme = 'moldable';\n document.documentElement.dataset.uiPlatform = 'macos';\n document.documentElement.dataset.uiPlatformVersion = '27';\n document.documentElement.dataset.uiPlatformPack = 'macos-27';\n document.documentElement.dataset.uiSidebarStyle = 'edge-to-edge';\n document.documentElement.dataset.uiAppearance = theme;\n document.documentElement.dataset.controlSize = 'medium';\n document.documentElement.dataset.materialContext = 'content';\n})();\n";
|
|
24
58
|
export {};
|
|
25
59
|
//# sourceMappingURL=theme.d.ts.map
|
package/dist/lib/theme.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/lib/theme.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/lib/theme.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,OAAO,EACR,MAAM,qBAAqB,CAAA;AAG5B,oCAAoC;AACpC,MAAM,MAAM,KAAK,GAAG,YAAY,CAAA;AAChC,4CAA4C;AAC5C,KAAK,aAAa,GAAG,oBAAoB,CAAA;AAEzC,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACpC,QAAQ,EAAE,UAAU,CAAA;IACpB,eAAe,EAAE,iBAAiB,CAAA;IAClC,YAAY,EAAE,cAAc,CAAA;IAC5B,eAAe,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAC3E,YAAY,EAAE,cAAc,CAAA;IAC5B,eAAe,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;IAChD,UAAU,EAAE,YAAY,CAAA;IACxB,kBAAkB,EAAE,oBAAoB,CAAA;IACxC,aAAa,EAAE,CAAC,UAAU,EAAE,YAAY,KAAK,IAAI,CAAA;IACjD,WAAW,EAAE,WAAW,CAAA;IACxB,cAAc,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAA;IAClD,eAAe,EAAE,eAAe,CAAA;IAChC,kBAAkB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,CAAA;IAC9D,WAAW,EAAE,aAAa,CAAA;IAC1B,kCAAkC;IAClC,KAAK,EAAE,KAAK,CAAA;IACZ,0CAA0C;IAC1C,aAAa,EAAE,aAAa,CAAA;IAC5B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAMD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAA;IACnB,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB,eAAe,CAAC,EAAE,iBAAiB,CAAA;IACnC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,YAAY,CAAC,EAAE,cAAc,CAAA;IAC7B,UAAU,CAAC,EAAE,YAAY,CAAA;IACzB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,WAAW,CAAC,EAAE,aAAa,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CAC5B;AA2CD,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,QAAkB,EAClB,eAAsB,EACtB,OAAO,EAAE,WAAwB,EACjC,YAAY,EAAE,gBAAgB,EAC9B,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,eAA0B,EACvC,eAAe,EAAE,mBAA+B,EAChD,WAAgB,EAChB,UAAwB,GACzB,EAAE,kBAAkB,2CA+IpB;AAED,wBAAgB,QAAQ,sBAMvB;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,6BAE/B;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,i3BAoBvB,CAAA"}
|
package/dist/lib/theme.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { createContext, useCallback, useContext, useEffect, useState, } from 'react';
|
|
4
4
|
import { TooltipProvider } from '../components/ui/tooltip.js';
|
|
5
|
+
import { resolvePlatformPack } from '../tokens/contracts.js';
|
|
5
6
|
const ThemeContext = createContext(null);
|
|
6
7
|
const STORAGE_KEY = 'moldable-theme';
|
|
7
8
|
function getSystemTheme() {
|
|
@@ -22,14 +23,16 @@ function getUrlTheme() {
|
|
|
22
23
|
}
|
|
23
24
|
return null;
|
|
24
25
|
}
|
|
25
|
-
function getStoredTheme() {
|
|
26
|
+
function getStoredTheme(storageKey = STORAGE_KEY) {
|
|
26
27
|
if (typeof window === 'undefined')
|
|
27
28
|
return 'system';
|
|
28
29
|
// URL parameter takes precedence (for iframe embedding)
|
|
29
30
|
const urlTheme = getUrlTheme();
|
|
30
31
|
if (urlTheme)
|
|
31
32
|
return urlTheme;
|
|
32
|
-
|
|
33
|
+
if (!storageKey)
|
|
34
|
+
return 'system';
|
|
35
|
+
const stored = localStorage.getItem(storageKey);
|
|
33
36
|
if (stored === 'light' || stored === 'dark' || stored === 'system') {
|
|
34
37
|
return stored;
|
|
35
38
|
}
|
|
@@ -41,36 +44,109 @@ function resolveTheme(theme) {
|
|
|
41
44
|
}
|
|
42
45
|
return theme;
|
|
43
46
|
}
|
|
44
|
-
export function ThemeProvider({ children }) {
|
|
45
|
-
const [
|
|
46
|
-
const [
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
export function ThemeProvider({ children, platform = 'macos', platformVersion = '27', uiTheme: uiThemeProp = 'moldable', sidebarStyle: sidebarStyleProp, appearance: appearanceProp, controlSize: controlSizeProp = 'medium', materialContext: materialContextProp = 'content', preferences = {}, storageKey = STORAGE_KEY, }) {
|
|
48
|
+
const [platformSelection, setPlatformSelection] = useState(platform);
|
|
49
|
+
const [platformVersionSelection, setPlatformVersionSelection] = useState(platformVersion);
|
|
50
|
+
const platformPack = resolvePlatformPack(platformSelection, platformVersionSelection);
|
|
51
|
+
const [uiTheme, setUIThemeState] = useState(uiThemeProp);
|
|
52
|
+
const [sidebarStyle, setSidebarStyle] = useState(() => sidebarStyleProp ?? 'edge-to-edge');
|
|
53
|
+
const [appearance, setAppearanceState] = useState(() => appearanceProp ?? getStoredTheme(storageKey));
|
|
54
|
+
const [resolvedAppearance, setResolvedAppearance] = useState(() => resolveTheme(appearance));
|
|
55
|
+
const [controlSize, setControlSize] = useState(controlSizeProp);
|
|
56
|
+
const [materialContext, setMaterialContext] = useState(materialContextProp);
|
|
57
|
+
const setAppearance = useCallback((newAppearance) => {
|
|
58
|
+
setAppearanceState(newAppearance);
|
|
59
|
+
if (storageKey && typeof window !== 'undefined') {
|
|
60
|
+
localStorage.setItem(storageKey, newAppearance);
|
|
61
|
+
}
|
|
62
|
+
}, [storageKey]);
|
|
63
|
+
const setPlatformPack = useCallback((nextPlatform, nextVersion) => {
|
|
64
|
+
setPlatformSelection(nextPlatform);
|
|
65
|
+
setPlatformVersionSelection(nextVersion);
|
|
50
66
|
}, []);
|
|
51
|
-
|
|
67
|
+
const setUITheme = useCallback((nextTheme) => {
|
|
68
|
+
setUIThemeState(nextTheme);
|
|
69
|
+
if (sidebarStyleProp === undefined) {
|
|
70
|
+
setSidebarStyle('edge-to-edge');
|
|
71
|
+
}
|
|
72
|
+
}, [sidebarStyleProp]);
|
|
73
|
+
useEffect(() => setPlatformSelection(platform), [platform]);
|
|
74
|
+
useEffect(() => setPlatformVersionSelection(platformVersion), [platformVersion]);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
setUIThemeState(uiThemeProp);
|
|
77
|
+
setSidebarStyle(sidebarStyleProp ?? 'edge-to-edge');
|
|
78
|
+
}, [sidebarStyleProp, uiThemeProp]);
|
|
52
79
|
useEffect(() => {
|
|
53
|
-
|
|
54
|
-
|
|
80
|
+
if (appearanceProp)
|
|
81
|
+
setAppearanceState(appearanceProp);
|
|
82
|
+
}, [appearanceProp]);
|
|
83
|
+
useEffect(() => setControlSize(controlSizeProp), [controlSizeProp]);
|
|
84
|
+
useEffect(() => setMaterialContext(materialContextProp), [materialContextProp]);
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
const resolved = resolveTheme(appearance);
|
|
87
|
+
setResolvedAppearance(resolved);
|
|
55
88
|
const root = document.documentElement;
|
|
56
89
|
root.classList.remove('light', 'dark');
|
|
57
90
|
root.classList.add(resolved);
|
|
58
|
-
|
|
59
|
-
|
|
91
|
+
root.dataset.uiTheme = uiTheme;
|
|
92
|
+
root.dataset.uiPlatform = platformPack.platform;
|
|
93
|
+
root.dataset.uiPlatformVersion = platformPack.version;
|
|
94
|
+
root.dataset.uiPlatformPack = platformPack.id;
|
|
95
|
+
root.dataset.uiSidebarStyle = sidebarStyle;
|
|
96
|
+
root.dataset.uiAppearance = resolved;
|
|
97
|
+
root.dataset.controlSize = controlSize;
|
|
98
|
+
root.dataset.materialContext = materialContext;
|
|
99
|
+
root.dataset.contrast = preferences.contrast ?? 'system';
|
|
100
|
+
root.dataset.transparency = preferences.transparency ?? 'system';
|
|
101
|
+
root.dataset.motion = preferences.motion ?? 'system';
|
|
102
|
+
}, [
|
|
103
|
+
appearance,
|
|
104
|
+
controlSize,
|
|
105
|
+
materialContext,
|
|
106
|
+
preferences.contrast,
|
|
107
|
+
preferences.motion,
|
|
108
|
+
preferences.transparency,
|
|
109
|
+
platformPack.id,
|
|
110
|
+
platformPack.platform,
|
|
111
|
+
platformPack.version,
|
|
112
|
+
sidebarStyle,
|
|
113
|
+
uiTheme,
|
|
114
|
+
]);
|
|
60
115
|
useEffect(() => {
|
|
61
|
-
if (
|
|
116
|
+
if (appearance !== 'system')
|
|
62
117
|
return;
|
|
63
118
|
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
64
119
|
const handleChange = () => {
|
|
65
120
|
const resolved = getSystemTheme();
|
|
66
|
-
|
|
121
|
+
setResolvedAppearance(resolved);
|
|
67
122
|
document.documentElement.classList.remove('light', 'dark');
|
|
68
123
|
document.documentElement.classList.add(resolved);
|
|
124
|
+
document.documentElement.dataset.uiAppearance = resolved;
|
|
69
125
|
};
|
|
70
126
|
mediaQuery.addEventListener('change', handleChange);
|
|
71
127
|
return () => mediaQuery.removeEventListener('change', handleChange);
|
|
72
|
-
}, [
|
|
73
|
-
return (_jsx(ThemeContext.Provider, { value: {
|
|
128
|
+
}, [appearance]);
|
|
129
|
+
return (_jsx(ThemeContext.Provider, { value: {
|
|
130
|
+
uiTheme,
|
|
131
|
+
setUITheme,
|
|
132
|
+
platform: platformPack.platform,
|
|
133
|
+
platformVersion: platformPack.version,
|
|
134
|
+
platformPack,
|
|
135
|
+
setPlatformPack,
|
|
136
|
+
sidebarStyle,
|
|
137
|
+
setSidebarStyle,
|
|
138
|
+
appearance,
|
|
139
|
+
resolvedAppearance,
|
|
140
|
+
setAppearance,
|
|
141
|
+
controlSize,
|
|
142
|
+
setControlSize,
|
|
143
|
+
materialContext,
|
|
144
|
+
setMaterialContext,
|
|
145
|
+
preferences,
|
|
146
|
+
theme: appearance,
|
|
147
|
+
resolvedTheme: resolvedAppearance,
|
|
148
|
+
setTheme: setAppearance,
|
|
149
|
+
}, children: _jsx(TooltipProvider, { children: children }) }));
|
|
74
150
|
}
|
|
75
151
|
export function useTheme() {
|
|
76
152
|
const context = useContext(ThemeContext);
|
|
@@ -79,6 +155,10 @@ export function useTheme() {
|
|
|
79
155
|
}
|
|
80
156
|
return context;
|
|
81
157
|
}
|
|
158
|
+
/** Internal-friendly optional access for components that also work standalone. */
|
|
159
|
+
export function useOptionalTheme() {
|
|
160
|
+
return useContext(ThemeContext);
|
|
161
|
+
}
|
|
82
162
|
/**
|
|
83
163
|
* Inline script to prevent theme flash on page load.
|
|
84
164
|
* Add this to your <head> in layout.tsx:
|
|
@@ -100,5 +180,13 @@ export const themeScript = `
|
|
|
100
180
|
theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
101
181
|
}
|
|
102
182
|
document.documentElement.classList.add(theme);
|
|
183
|
+
document.documentElement.dataset.uiTheme = 'moldable';
|
|
184
|
+
document.documentElement.dataset.uiPlatform = 'macos';
|
|
185
|
+
document.documentElement.dataset.uiPlatformVersion = '27';
|
|
186
|
+
document.documentElement.dataset.uiPlatformPack = 'macos-27';
|
|
187
|
+
document.documentElement.dataset.uiSidebarStyle = 'edge-to-edge';
|
|
188
|
+
document.documentElement.dataset.uiAppearance = theme;
|
|
189
|
+
document.documentElement.dataset.controlSize = 'medium';
|
|
190
|
+
document.documentElement.dataset.materialContext = 'content';
|
|
103
191
|
})();
|
|
104
192
|
`;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export type UITheme = 'platform' | 'moldable';
|
|
2
|
+
export type UIPlatform = 'macos' | 'windows' | 'web';
|
|
3
|
+
export type UIPlatformVersion = string;
|
|
4
|
+
/**
|
|
5
|
+
* A component recipe can intentionally come from a different versioned
|
|
6
|
+
* platform source than the application's base platform pack.
|
|
7
|
+
*
|
|
8
|
+
* Public names describe the anatomy an app is choosing. The registry below
|
|
9
|
+
* records which immutable platform source defines each recipe.
|
|
10
|
+
*/
|
|
11
|
+
export type UISidebarStyle = 'platform' | 'floating' | 'edge-to-edge';
|
|
12
|
+
export type PlatformPackId = `${UIPlatform}-${string}`;
|
|
13
|
+
export interface UIPlatformPack {
|
|
14
|
+
id: PlatformPackId;
|
|
15
|
+
platform: UIPlatform;
|
|
16
|
+
version: UIPlatformVersion;
|
|
17
|
+
capabilities: {
|
|
18
|
+
nativeMaterials: boolean;
|
|
19
|
+
nativeWindowChrome: boolean;
|
|
20
|
+
overlayScrollbars: boolean;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export type UIAppearance = 'light' | 'dark' | 'system';
|
|
24
|
+
export type ResolvedUIAppearance = Exclude<UIAppearance, 'system'>;
|
|
25
|
+
export type ControlSize = 'mini' | 'small' | 'medium' | 'large' | 'xl';
|
|
26
|
+
export type LayoutDensity = 'compact' | 'regular' | 'comfortable';
|
|
27
|
+
export type MaterialThickness = 'ultra-thick' | 'thick' | 'medium' | 'thin' | 'ultra-thin';
|
|
28
|
+
export type MaterialContext = 'content' | 'over-glass';
|
|
29
|
+
export type ContrastPreference = 'system' | 'standard' | 'increased';
|
|
30
|
+
export type TransparencyPreference = 'system' | 'standard' | 'reduced';
|
|
31
|
+
export type MotionPreference = 'system' | 'standard' | 'reduced';
|
|
32
|
+
export interface UIPreferences {
|
|
33
|
+
contrast?: ContrastPreference;
|
|
34
|
+
transparency?: TransparencyPreference;
|
|
35
|
+
motion?: MotionPreference;
|
|
36
|
+
}
|
|
37
|
+
export declare const CONTROL_SIZES: readonly ["mini", "small", "medium", "large", "xl"];
|
|
38
|
+
export declare const MATERIAL_THICKNESSES: readonly ["ultra-thick", "thick", "medium", "thin", "ultra-thin"];
|
|
39
|
+
export declare const SIDEBAR_STYLES: {
|
|
40
|
+
readonly platform: {
|
|
41
|
+
readonly id: "platform";
|
|
42
|
+
readonly sourcePlatform: null;
|
|
43
|
+
readonly sourceVersion: null;
|
|
44
|
+
};
|
|
45
|
+
readonly floating: {
|
|
46
|
+
readonly id: "floating";
|
|
47
|
+
readonly sourcePlatform: "macos";
|
|
48
|
+
readonly sourceVersion: "26";
|
|
49
|
+
};
|
|
50
|
+
readonly 'edge-to-edge': {
|
|
51
|
+
readonly id: "edge-to-edge";
|
|
52
|
+
readonly sourcePlatform: "macos";
|
|
53
|
+
readonly sourceVersion: "27";
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
export declare const PLATFORM_PACKS: {
|
|
57
|
+
readonly 'macos-27': {
|
|
58
|
+
readonly id: "macos-27";
|
|
59
|
+
readonly platform: "macos";
|
|
60
|
+
readonly version: "27";
|
|
61
|
+
readonly capabilities: {
|
|
62
|
+
readonly nativeMaterials: true;
|
|
63
|
+
readonly nativeWindowChrome: true;
|
|
64
|
+
readonly overlayScrollbars: true;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
readonly 'web-default': {
|
|
68
|
+
readonly id: "web-default";
|
|
69
|
+
readonly platform: "web";
|
|
70
|
+
readonly version: "default";
|
|
71
|
+
readonly capabilities: {
|
|
72
|
+
readonly nativeMaterials: false;
|
|
73
|
+
readonly nativeWindowChrome: false;
|
|
74
|
+
readonly overlayScrollbars: false;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
export declare function resolvePlatformPack(platform: UIPlatform, version: UIPlatformVersion): UIPlatformPack;
|
|
79
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/tokens/contracts.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,UAAU,CAAA;AAE7C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAA;AAEpD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,CAAA;AAErE,MAAM,MAAM,cAAc,GAAG,GAAG,UAAU,IAAI,MAAM,EAAE,CAAA;AAEtD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,cAAc,CAAA;IAClB,QAAQ,EAAE,UAAU,CAAA;IACpB,OAAO,EAAE,iBAAiB,CAAA;IAC1B,YAAY,EAAE;QACZ,eAAe,EAAE,OAAO,CAAA;QACxB,kBAAkB,EAAE,OAAO,CAAA;QAC3B,iBAAiB,EAAE,OAAO,CAAA;KAC3B,CAAA;CACF;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEtD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAA;AAEtE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAA;AAEjE,MAAM,MAAM,iBAAiB,GACzB,aAAa,GACb,OAAO,GACP,QAAQ,GACR,MAAM,GACN,YAAY,CAAA;AAEhB,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,YAAY,CAAA;AAEtD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAA;AAEpE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAA;AAEtE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAA;AAEhE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,YAAY,CAAC,EAAE,sBAAsB,CAAA;IACrC,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAC1B;AAED,eAAO,MAAM,aAAa,qDAMiB,CAAA;AAE3C,eAAO,MAAM,oBAAoB,mEAMgB,CAAA;AAEjD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;CAuB1B,CAAA;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;CAqBwB,CAAA;AAEnD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,iBAAiB,GACzB,cAAc,CAMhB"}
|