@moldable-ai/ui 0.2.26 → 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.
Files changed (186) hide show
  1. package/dist/catalog/component-catalog.d.ts +9 -2
  2. package/dist/catalog/component-catalog.d.ts.map +1 -1
  3. package/dist/catalog/component-catalog.js +11 -7
  4. package/dist/catalog/core-control-stories.d.ts.map +1 -1
  5. package/dist/catalog/core-control-stories.js +1 -1
  6. package/dist/catalog/core-foundation-stories.d.ts.map +1 -1
  7. package/dist/catalog/core-foundation-stories.js +15 -3
  8. package/dist/components/ui/app-frame.d.ts +20 -1
  9. package/dist/components/ui/app-frame.d.ts.map +1 -1
  10. package/dist/components/ui/app-frame.js +37 -7
  11. package/dist/components/ui/badge.d.ts +1 -1
  12. package/dist/components/ui/badge.js +1 -1
  13. package/dist/components/ui/button.d.ts +5 -3
  14. package/dist/components/ui/button.d.ts.map +1 -1
  15. package/dist/components/ui/button.js +39 -10
  16. package/dist/components/ui/card.d.ts +12 -2
  17. package/dist/components/ui/card.d.ts.map +1 -1
  18. package/dist/components/ui/card.js +3 -2
  19. package/dist/components/ui/checkbox.d.ts +4 -1
  20. package/dist/components/ui/checkbox.d.ts.map +1 -1
  21. package/dist/components/ui/checkbox.js +4 -4
  22. package/dist/components/ui/context-menu.js +6 -6
  23. package/dist/components/ui/date-field.d.ts +1 -1
  24. package/dist/components/ui/dropdown-menu.js +6 -6
  25. package/dist/components/ui/icon-button.d.ts +1 -1
  26. package/dist/components/ui/icon-button.d.ts.map +1 -1
  27. package/dist/components/ui/icon-button.js +1 -0
  28. package/dist/components/ui/index.d.ts +1 -0
  29. package/dist/components/ui/index.d.ts.map +1 -1
  30. package/dist/components/ui/index.js +1 -0
  31. package/dist/components/ui/input-group.d.ts +2 -2
  32. package/dist/components/ui/input.d.ts +6 -2
  33. package/dist/components/ui/input.d.ts.map +1 -1
  34. package/dist/components/ui/input.js +2 -2
  35. package/dist/components/ui/material.d.ts +8 -3
  36. package/dist/components/ui/material.d.ts.map +1 -1
  37. package/dist/components/ui/material.js +2 -2
  38. package/dist/components/ui/search-field.d.ts +3 -1
  39. package/dist/components/ui/search-field.d.ts.map +1 -1
  40. package/dist/components/ui/search-field.js +16 -6
  41. package/dist/components/ui/segmented-control.d.ts +3 -1
  42. package/dist/components/ui/segmented-control.d.ts.map +1 -1
  43. package/dist/components/ui/segmented-control.js +23 -17
  44. package/dist/components/ui/select.js +2 -2
  45. package/dist/components/ui/sidebar.d.ts +5 -3
  46. package/dist/components/ui/sidebar.d.ts.map +1 -1
  47. package/dist/components/ui/sidebar.js +53 -15
  48. package/dist/components/ui/status.d.ts +1 -1
  49. package/dist/components/ui/status.js +1 -1
  50. package/dist/components/ui/switch.d.ts +3 -1
  51. package/dist/components/ui/switch.d.ts.map +1 -1
  52. package/dist/components/ui/switch.js +3 -2
  53. package/dist/components/ui/toolbar-controls.d.ts +49 -0
  54. package/dist/components/ui/toolbar-controls.d.ts.map +1 -0
  55. package/dist/components/ui/toolbar-controls.js +47 -0
  56. package/dist/components/ui/toolbar.d.ts +5 -4
  57. package/dist/components/ui/toolbar.d.ts.map +1 -1
  58. package/dist/components/ui/toolbar.js +3 -3
  59. package/dist/index.d.ts +2 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +3 -1
  62. package/dist/lib/frame-lifecycle.d.ts +1 -0
  63. package/dist/lib/frame-lifecycle.d.ts.map +1 -1
  64. package/dist/lib/frame-lifecycle.js +7 -0
  65. package/dist/lib/theme.d.ts +39 -5
  66. package/dist/lib/theme.d.ts.map +1 -1
  67. package/dist/lib/theme.js +105 -17
  68. package/dist/tokens/contracts.d.ts +79 -0
  69. package/dist/tokens/contracts.d.ts.map +1 -0
  70. package/dist/tokens/contracts.js +57 -0
  71. package/dist/tokens/index.d.ts +2 -0
  72. package/dist/tokens/index.d.ts.map +1 -0
  73. package/dist/tokens/index.js +1 -0
  74. package/docs/README.md +2 -0
  75. package/docs/adaptive-materials.md +14 -9
  76. package/docs/design-tokens.md +10 -6
  77. package/docs/foundations.md +3 -3
  78. package/docs/macos-design-audit.md +144 -0
  79. package/docs/native-integration.md +4 -4
  80. package/docs/platform-architecture.md +189 -0
  81. package/docs/standalone-app-windows.md +37 -0
  82. package/docs/visual-regression.md +6 -8
  83. package/package.json +13 -1
  84. package/src/components/ui/accordion.md +46 -0
  85. package/src/components/ui/alert.md +12 -4
  86. package/src/components/ui/app-frame.md +8 -5
  87. package/src/components/ui/aspect-ratio.md +37 -0
  88. package/src/components/ui/avatar.md +48 -0
  89. package/src/components/ui/breadcrumb.md +52 -0
  90. package/src/components/ui/button-group.md +43 -0
  91. package/src/components/ui/button.md +20 -4
  92. package/src/components/ui/calendar.md +42 -0
  93. package/src/components/ui/card.md +43 -0
  94. package/src/components/ui/carousel.md +47 -0
  95. package/src/components/ui/chart.md +52 -0
  96. package/src/components/ui/checkbox.md +36 -0
  97. package/src/components/ui/collapsible.md +2 -3
  98. package/src/components/ui/color-well.md +14 -4
  99. package/src/components/ui/combobox.md +3 -3
  100. package/src/components/ui/confirm-dialog.md +5 -4
  101. package/src/components/ui/context-menu.md +3 -2
  102. package/src/components/ui/date-field.md +6 -1
  103. package/src/components/ui/date-picker.md +6 -3
  104. package/src/components/ui/dialog.md +14 -12
  105. package/src/components/ui/drawer.md +58 -0
  106. package/src/components/ui/error-boundary-view.md +1 -1
  107. package/src/components/ui/field.md +2 -1
  108. package/src/components/ui/form.md +71 -0
  109. package/src/components/ui/grid.md +4 -3
  110. package/src/components/ui/icon-button.md +4 -1
  111. package/src/components/ui/input-group.md +49 -0
  112. package/src/components/ui/input-otp.md +56 -0
  113. package/src/components/ui/input.md +40 -0
  114. package/src/components/ui/inspector.md +47 -7
  115. package/src/components/ui/item.md +5 -3
  116. package/src/components/ui/kbd.md +30 -0
  117. package/src/components/ui/label.md +29 -0
  118. package/src/components/ui/list.md +2 -2
  119. package/src/components/ui/material.md +25 -12
  120. package/src/components/ui/menu-items.md +60 -0
  121. package/src/components/ui/menubar.md +58 -0
  122. package/src/components/ui/message-scroller-primitive.md +70 -0
  123. package/src/components/ui/message-scroller.md +86 -0
  124. package/src/components/ui/navigation-button-group.md +4 -3
  125. package/src/components/ui/navigation-menu.md +52 -0
  126. package/src/components/ui/number-input.md +8 -0
  127. package/src/components/ui/pagination.md +51 -0
  128. package/src/components/ui/panel.md +6 -0
  129. package/src/components/ui/popover.md +10 -7
  130. package/src/components/ui/progress.md +31 -0
  131. package/src/components/ui/radio-group.md +36 -0
  132. package/src/components/ui/resizable.md +2 -1
  133. package/src/components/ui/scroll-area.md +3 -1
  134. package/src/components/ui/search-field.md +6 -1
  135. package/src/components/ui/segmented-control.md +6 -1
  136. package/src/components/ui/separator.md +35 -0
  137. package/src/components/ui/sidebar.md +20 -3
  138. package/src/components/ui/skeleton.md +36 -0
  139. package/src/components/ui/slider.md +58 -0
  140. package/src/components/ui/spinner.md +41 -0
  141. package/src/components/ui/split-view.md +8 -4
  142. package/src/components/ui/switch.md +44 -0
  143. package/src/components/ui/table.md +7 -7
  144. package/src/components/ui/tabs.md +3 -1
  145. package/src/components/ui/textarea.md +41 -0
  146. package/src/components/ui/toggle-group.md +2 -2
  147. package/src/components/ui/toggle.md +9 -9
  148. package/src/components/ui/toolbar-controls.md +83 -0
  149. package/src/components/ui/toolbar.md +12 -6
  150. package/src/styles/index.css +199 -107
  151. package/src/tokens/contracts.ts +131 -0
  152. package/src/tokens/index.css +6 -0
  153. package/src/tokens/index.ts +23 -0
  154. package/src/tokens/macos-26/README.md +37 -0
  155. package/src/tokens/macos-26/aliases.css +53 -0
  156. package/src/tokens/macos-26/compatibility.css +7 -0
  157. package/src/tokens/macos-26/index.css +3 -0
  158. package/src/tokens/macos-26/source/provenance.generated.json +28 -0
  159. package/src/tokens/macos-26/source/sidebar.generated.css +29 -0
  160. package/src/tokens/macos-26/source.css +7 -0
  161. package/src/tokens/macos-26/web-adaptations.json +25 -0
  162. package/src/tokens/macos-26/web-adaptations.md +15 -0
  163. package/src/tokens/macos-27/accessibility.css +11 -0
  164. package/src/tokens/macos-27/aliases.css +304 -0
  165. package/src/tokens/macos-27/compatibility.css +212 -0
  166. package/src/tokens/macos-27/index.css +15 -0
  167. package/src/tokens/macos-27/recipes.css +23 -0
  168. package/src/tokens/macos-27/source/chrome.generated.css +338 -0
  169. package/src/tokens/macos-27/source/colors.generated.css +140 -0
  170. package/src/tokens/macos-27/source/context.generated.css +18 -0
  171. package/src/tokens/macos-27/source/controls.generated.css +764 -0
  172. package/src/tokens/macos-27/source/effects.generated.css +68 -0
  173. package/src/tokens/macos-27/source/kit.generated.css +50 -0
  174. package/src/tokens/macos-27/source/overlays-status.generated.css +931 -0
  175. package/src/tokens/macos-27/source/paint-styles.generated.css +81 -0
  176. package/src/tokens/macos-27/source/provenance.generated.json +62 -0
  177. package/src/tokens/macos-27/source/sizes.generated.css +385 -0
  178. package/src/tokens/macos-27/source/source.generated.json +554 -0
  179. package/src/tokens/macos-27/source/text-styles.generated.css +116 -0
  180. package/src/tokens/macos-27/source.css +17 -0
  181. package/src/tokens/macos-27/web-adaptations.css +98 -0
  182. package/src/tokens/macos-27/web-adaptations.json +163 -0
  183. package/src/tokens/macos-27/web-adaptations.md +117 -0
  184. package/src/tokens/moldable/brand.css +48 -0
  185. package/src/tokens/moldable/index.css +1 -0
  186. package/src/tokens/platform-contract.test.ts +290 -0
@@ -1,14 +1,21 @@
1
1
  import * as React from 'react';
2
+ import type { UIPlatform, UIPlatformVersion, UITheme } from '../tokens/contracts.js';
2
3
  import type { CatalogCase, CatalogCaseFilter, CatalogManifest } from './catalog-types.js';
3
4
  export interface ComponentCatalogProps extends Omit<React.ComponentProps<'main'>, 'children'> {
4
5
  manifest: CatalogManifest;
5
6
  filter?: CatalogCaseFilter;
6
7
  showCaseLabels?: boolean;
8
+ platform?: UIPlatform;
9
+ platformVersion?: UIPlatformVersion;
10
+ uiTheme?: UITheme;
7
11
  }
8
12
  export interface CatalogCaseFrameProps extends Omit<React.ComponentProps<'article'>, 'children'> {
9
13
  catalogCase: CatalogCase;
10
14
  showLabel?: boolean;
15
+ platform?: UIPlatform;
16
+ platformVersion?: UIPlatformVersion;
17
+ uiTheme?: UITheme;
11
18
  }
12
- export declare function CatalogCaseFrame({ catalogCase, showLabel, className, ...props }: CatalogCaseFrameProps): import("react/jsx-runtime").JSX.Element;
13
- export declare function ComponentCatalog({ manifest, filter, showCaseLabels, className, ...props }: ComponentCatalogProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function CatalogCaseFrame({ catalogCase, showLabel, platform, platformVersion, uiTheme, className, ...props }: CatalogCaseFrameProps): import("react/jsx-runtime").JSX.Element;
20
+ export declare function ComponentCatalog({ manifest, filter, showCaseLabels, platform, platformVersion, uiTheme, className, ...props }: ComponentCatalogProps): import("react/jsx-runtime").JSX.Element;
14
21
  //# sourceMappingURL=component-catalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"component-catalog.d.ts","sourceRoot":"","sources":["../../src/catalog/component-catalog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,eAAe,EAChB,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,qBACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IACtD,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,qBACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IACzD,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAiBD,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EACX,SAAgB,EAChB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,qBAAqB,2CAyDvB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,cAAqB,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,qBAAqB,2CA0GvB"}
1
+ {"version":3,"file":"component-catalog.d.ts","sourceRoot":"","sources":["../../src/catalog/component-catalog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,OAAO,EACR,MAAM,qBAAqB,CAAA;AAG5B,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,eAAe,EAChB,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,qBACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IACtD,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB,eAAe,CAAC,EAAE,iBAAiB,CAAA;IACnC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,qBACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IACzD,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB,eAAe,CAAC,EAAE,iBAAiB,CAAA;IACnC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAwBD,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EACX,SAAgB,EAChB,QAAkB,EAClB,eAAsB,EACtB,OAAoB,EACpB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,qBAAqB,2CAoEvB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,cAAqB,EACrB,QAAkB,EAClB,eAAsB,EACtB,OAAoB,EACpB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,qBAAqB,2CA6GvB"}
@@ -1,9 +1,12 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { cn } from '../lib/utils.js';
4
+ import { resolvePlatformPack } from '../tokens/contracts.js';
4
5
  import { buildCatalogCases } from './catalog-manifest.js';
5
- function caseLabel(catalogCase) {
6
+ function caseLabel(catalogCase, platform, platformVersion, uiTheme) {
6
7
  const labels = [
8
+ `${platform}-${platformVersion}`,
9
+ uiTheme,
7
10
  catalogCase.theme,
8
11
  catalogCase.density,
9
12
  catalogCase.viewport,
@@ -14,19 +17,20 @@ function caseLabel(catalogCase) {
14
17
  }
15
18
  return labels.join(' · ');
16
19
  }
17
- export function CatalogCaseFrame({ catalogCase, showLabel = true, className, ...props }) {
20
+ export function CatalogCaseFrame({ catalogCase, showLabel = true, platform = 'macos', platformVersion = '27', uiTheme = 'moldable', className, ...props }) {
18
21
  const isDark = catalogCase.theme === 'dark';
19
- return (_jsxs("article", { "data-slot": "catalog-case", "data-catalog-case": catalogCase.caseId, "data-theme": catalogCase.theme, "data-density": catalogCase.density, "data-viewport": catalogCase.viewport, "data-accessibility-mode": catalogCase.accessibilityMode, "data-transparency": catalogCase.accessibilityMode === 'reduced-transparency'
22
+ const platformPack = resolvePlatformPack(platform, platformVersion);
23
+ return (_jsxs("article", { "data-slot": "catalog-case", "data-catalog-case": catalogCase.caseId, "data-ui-platform": platformPack.platform, "data-ui-platform-version": platformPack.version, "data-ui-platform-pack": platformPack.id, "data-ui-theme": uiTheme, "data-ui-appearance": catalogCase.theme, "data-theme": catalogCase.theme, "data-density": catalogCase.density, "data-viewport": catalogCase.viewport, "data-accessibility-mode": catalogCase.accessibilityMode, "data-transparency": catalogCase.accessibilityMode === 'reduced-transparency'
20
24
  ? 'reduced'
21
25
  : undefined, "data-contrast": catalogCase.accessibilityMode === 'increased-contrast'
22
26
  ? 'increased'
23
27
  : undefined, "data-motion": catalogCase.accessibilityMode === 'reduced-motion'
24
28
  ? 'reduced'
25
- : undefined, "data-interaction": catalogCase.interaction, "aria-label": `${catalogCase.storyTitle}: ${caseLabel(catalogCase)}`, className: cn('bg-background text-foreground border-border isolate overflow-hidden rounded-lg border shadow-sm', catalogCase.viewport === 'narrow'
29
+ : undefined, "data-interaction": catalogCase.interaction, "aria-label": `${catalogCase.storyTitle}: ${caseLabel(catalogCase, platform, platformVersion, uiTheme)}`, className: cn('bg-background text-foreground border-border isolate overflow-hidden rounded-lg border shadow-sm', catalogCase.viewport === 'narrow'
26
30
  ? 'w-full max-w-80'
27
- : 'w-full max-w-3xl', isDark && 'dark', className), ...props, children: [showLabel ? (_jsx("header", { "data-slot": "catalog-case-label", className: "border-border bg-muted/40 text-muted-foreground border-b px-3 py-2 font-mono text-[11px] leading-4", children: caseLabel(catalogCase) })) : null, _jsx("div", { "data-slot": "catalog-case-stage", className: cn('bg-background text-foreground min-h-24', catalogCase.density === 'compact' ? 'p-2' : 'p-4'), children: catalogCase.render(catalogCase) })] }));
31
+ : 'w-full max-w-3xl', isDark && 'dark', className), ...props, children: [showLabel ? (_jsx("header", { "data-slot": "catalog-case-label", className: "border-border bg-muted/40 text-muted-foreground border-b px-3 py-2 font-mono text-[11px] leading-4", children: caseLabel(catalogCase, platform, platformVersion, uiTheme) })) : null, _jsx("div", { "data-slot": "catalog-case-stage", className: cn('bg-background text-foreground min-h-24', catalogCase.density === 'compact' ? 'p-2' : 'p-4'), children: catalogCase.render(catalogCase) })] }));
28
32
  }
29
- export function ComponentCatalog({ manifest, filter, showCaseLabels = true, className, ...props }) {
33
+ export function ComponentCatalog({ manifest, filter, showCaseLabels = true, platform = 'macos', platformVersion = '27', uiTheme = 'moldable', className, ...props }) {
30
34
  const cases = buildCatalogCases(manifest, filter);
31
35
  const groupedCases = new Map();
32
36
  for (const catalogCase of cases) {
@@ -44,6 +48,6 @@ export function ComponentCatalog({ manifest, filter, showCaseLabels = true, clas
44
48
  .filter((group) => group.cases.length > 0);
45
49
  if (storyGroups.length === 0)
46
50
  return null;
47
- return (_jsxs("section", { "data-slot": "catalog-section", "data-catalog-section": section.id, "aria-labelledby": `catalog-section-${section.id}`, children: [_jsxs("div", { className: "mb-4", children: [_jsx("h2", { id: `catalog-section-${section.id}`, className: "text-lg font-semibold tracking-tight", children: section.title }), section.description ? (_jsx("div", { className: "text-muted-foreground mt-1 max-w-3xl text-sm", children: section.description })) : null] }), _jsx("div", { className: "grid gap-8", children: storyGroups.map(({ story, cases: storyCases }) => (_jsxs("section", { "data-slot": "catalog-story", "data-catalog-story": story.id, "aria-labelledby": `catalog-story-${section.id}-${story.id}`, children: [_jsxs("div", { className: "mb-3", children: [_jsx("h3", { id: `catalog-story-${section.id}-${story.id}`, className: "text-sm font-medium", children: story.title }), story.description ? (_jsx("div", { className: "text-muted-foreground mt-1 text-xs", children: story.description })) : null] }), _jsx("div", { "data-slot": "catalog-case-grid", className: "grid items-start gap-4 xl:grid-cols-2", children: storyCases.map((catalogCase) => (_jsx(CatalogCaseFrame, { catalogCase: catalogCase, showLabel: showCaseLabels }, catalogCase.caseId))) })] }, story.id))) })] }, section.id));
51
+ return (_jsxs("section", { "data-slot": "catalog-section", "data-catalog-section": section.id, "aria-labelledby": `catalog-section-${section.id}`, children: [_jsxs("div", { className: "mb-4", children: [_jsx("h2", { id: `catalog-section-${section.id}`, className: "text-lg font-semibold tracking-tight", children: section.title }), section.description ? (_jsx("div", { className: "text-muted-foreground mt-1 max-w-3xl text-sm", children: section.description })) : null] }), _jsx("div", { className: "grid gap-8", children: storyGroups.map(({ story, cases: storyCases }) => (_jsxs("section", { "data-slot": "catalog-story", "data-catalog-story": story.id, "aria-labelledby": `catalog-story-${section.id}-${story.id}`, children: [_jsxs("div", { className: "mb-3", children: [_jsx("h3", { id: `catalog-story-${section.id}-${story.id}`, className: "text-sm font-medium", children: story.title }), story.description ? (_jsx("div", { className: "text-muted-foreground mt-1 text-xs", children: story.description })) : null] }), _jsx("div", { "data-slot": "catalog-case-grid", className: "grid items-start gap-4 xl:grid-cols-2", children: storyCases.map((catalogCase) => (_jsx(CatalogCaseFrame, { catalogCase: catalogCase, platform: platform, platformVersion: platformVersion, showLabel: showCaseLabels, uiTheme: uiTheme }, catalogCase.caseId))) })] }, story.id))) })] }, section.id));
48
52
  }) })] }));
49
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"core-control-stories.d.ts","sourceRoot":"","sources":["../../src/catalog/core-control-stories.tsx"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAuC/D,eAAO,MAAM,mBAAmB,EAAE,wBAoUjC,CAAA"}
1
+ {"version":3,"file":"core-control-stories.d.ts","sourceRoot":"","sources":["../../src/catalog/core-control-stories.tsx"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAuC/D,eAAO,MAAM,mBAAmB,EAAE,wBAqUjC,CAAA"}
@@ -45,7 +45,7 @@ export const coreControlsSection = {
45
45
  components: ['button'],
46
46
  interactions: ['rest', 'focus-visible', 'disabled'],
47
47
  liveStates: ['hover', 'focus', 'pressed'],
48
- render: ({ interaction }) => (_jsxs("div", { className: "grid gap-2", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Button, { size: "xs", variant: "outline", disabled: interaction === 'disabled', children: [_jsx(PlusIcon, {}), "Extra small"] }), _jsxs(Button, { size: "sm", disabled: interaction === 'disabled', children: [_jsx(PlusIcon, {}), "Small"] }), _jsxs(Button, { "data-catalog-target": true, "data-state-target": "hover focus pressed", autoFocus: interaction === 'focus-visible', disabled: interaction === 'disabled', children: [_jsx(PlusIcon, {}), "Default"] }), _jsxs(Button, { size: "lg", disabled: interaction === 'disabled', children: [_jsx(PlusIcon, {}), "Large"] })] }), _jsx("div", { className: "flex flex-wrap items-center gap-2", children: ['xs', 'sm', 'default', 'lg'].map((size) => (_jsx(IconButton, { label: `Add item, ${size} size`, size: size, variant: "outline", disabled: interaction === 'disabled', children: _jsx(PlusIcon, {}) }, size))) })] })),
48
+ render: ({ interaction }) => (_jsxs("div", { className: "grid gap-2", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Button, { size: "xs", variant: "outline", disabled: interaction === 'disabled', children: [_jsx(PlusIcon, {}), "Extra small"] }), _jsxs(Button, { size: "sm", disabled: interaction === 'disabled', children: [_jsx(PlusIcon, {}), "Small"] }), _jsxs(Button, { "data-catalog-target": true, "data-state-target": "hover focus pressed", autoFocus: interaction === 'focus-visible', variant: "prominent", disabled: interaction === 'disabled', children: [_jsx(PlusIcon, {}), "Prominent"] }), _jsxs(Button, { size: "lg", disabled: interaction === 'disabled', children: [_jsx(PlusIcon, {}), "Large"] })] }), _jsx("div", { className: "flex flex-wrap items-center gap-2", children: ['xs', 'sm', 'default', 'lg'].map((size) => (_jsx(IconButton, { label: `Add item, ${size} size`, size: size, variant: "outline", disabled: interaction === 'disabled', children: _jsx(PlusIcon, {}) }, size))) })] })),
49
49
  },
50
50
  {
51
51
  id: 'icon-button',
@@ -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,wBAuLnC,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,12 +41,23 @@ 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: [_jsxs(ToolbarControlGroup, { "aria-label": "Navigation", children: [_jsx(ToolbarSidebarToggle, { expanded: true, onExpandedChange: () => undefined }), _jsx(ToolbarControlSeparator, {}), _jsx(ToolbarBackButton, { onClick: () => undefined })] }), _jsx(ToolbarTitleField, { defaultValue: "Open House" }), _jsxs(ToolbarActions, { children: [_jsxs(ToolbarControlGroup, { "aria-label": "Editing tools", 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(ToolbarControlGroup, { "aria-label": "History and sharing", children: _jsx(ToolbarOverflowMenu, { items: [
51
+ { id: 'history', label: 'Version history' },
52
+ { id: 'publish', label: 'Publish' },
53
+ ] }) }), _jsx(ToolbarButton, { variant: "prominent", children: "Present" })] })] })),
54
+ },
43
55
  {
44
56
  id: 'work-surfaces',
45
57
  title: 'Work surfaces',
46
58
  components: ['card', 'panel'],
47
59
  interactions: ['rest', 'empty'],
48
- render: ({ interaction }) => (_jsxs(PanelGroup, { className: "rounded-container h-48 border", children: [_jsxs(Panel, { surface: "sidebar", className: "w-32", children: [_jsx(PanelHeader, { children: _jsx(Text, { variant: "small-strong", children: "Library" }) }), _jsx(PanelContent, { className: "p-3", children: _jsx(Text, { color: "secondary", variant: "small", children: "Projects" }) })] }), _jsx(Panel, { className: "flex-1", children: _jsx(PanelContent, { className: "p-3", children: _jsxs(Card, { className: "shadow-panel gap-3 py-4", children: [_jsxs(CardHeader, { className: "gap-1 px-4", children: [_jsx(CardTitle, { className: "text-sm", children: interaction === 'empty' ? 'No selection' : 'Project brief' }), _jsx(CardDescription, { children: interaction === 'empty'
60
+ render: ({ interaction }) => (_jsxs(PanelGroup, { className: "rounded-container h-48 border", children: [_jsxs(Panel, { surface: "sidebar", className: "w-32", children: [_jsx(PanelHeader, { children: _jsx(Text, { variant: "small-strong", children: "Library" }) }), _jsx(PanelContent, { className: "p-3", children: _jsx(Text, { color: "secondary", variant: "small", children: "Projects" }) })] }), _jsx(Panel, { className: "flex-1", children: _jsx(PanelContent, { className: "p-3", children: _jsxs(Card, { surface: "raised", className: "gap-3 py-4", children: [_jsxs(CardHeader, { className: "gap-1 px-4", children: [_jsx(CardTitle, { className: "text-sm", children: interaction === 'empty' ? 'No selection' : 'Project brief' }), _jsx(CardDescription, { children: interaction === 'empty'
49
61
  ? 'Choose an item from the library.'
50
62
  : 'A quiet, bounded working surface.' })] }), _jsx(CardContent, { className: "px-4", children: _jsx(Text, { variant: "small", color: "secondary", children: "Updated today" }) })] }) }) })] })),
51
63
  },
@@ -1,6 +1,18 @@
1
1
  import * as React from 'react';
2
2
  import type { MaterialVariant } from './material.js';
3
3
  export type AppFrameMode = 'auto' | 'embedded' | 'window';
4
+ export interface AppFrameNativeMaterial {
5
+ /**
6
+ * Reveal the host-rendered frosted window background while keeping the
7
+ * portable canvas fill as the fallback.
8
+ */
9
+ background?: boolean;
10
+ /**
11
+ * Allow a compatible leading `Sidebar` to request host-rendered native
12
+ * material when the app manifest and host both advertise support.
13
+ */
14
+ sidebar?: boolean;
15
+ }
4
16
  declare function resolveAppFrameMode(mode: AppFrameMode): Exclude<AppFrameMode, 'auto'>;
5
17
  export interface AppFrameProps extends React.ComponentProps<'div'> {
6
18
  /**
@@ -8,14 +20,21 @@ export interface AppFrameProps extends React.ComponentProps<'div'> {
8
20
  * in catalogs, previews, and tests where the runtime environment is ambiguous.
9
21
  */
10
22
  mode?: AppFrameMode;
23
+ /**
24
+ * Explicitly opts this app frame into renderer-owned native material
25
+ * regions. The matching region must also be enabled in `moldable.json`.
26
+ */
27
+ nativeMaterial?: AppFrameNativeMaterial;
11
28
  }
12
29
  interface AppFrameRuntimeContextValue {
13
30
  mode: Exclude<AppFrameMode, 'auto'>;
31
+ backgroundMaterialActive: boolean;
14
32
  sidebarMaterialAvailable: boolean;
33
+ sidebarMaterialEnabled: boolean;
15
34
  sidebarMaterialRegionId: string | null;
16
35
  }
17
36
  export declare function useAppFrameRuntime(): AppFrameRuntimeContextValue | null;
18
- declare function AppFrame({ mode, className, style, ...props }: AppFrameProps): import("react/jsx-runtime").JSX.Element;
37
+ declare function AppFrame({ mode, nativeMaterial, className, style, ...props }: AppFrameProps): import("react/jsx-runtime").JSX.Element;
19
38
  export interface AppFrameTitlebarProps extends React.ComponentPropsWithoutRef<'header'> {
20
39
  material?: MaterialVariant | 'none';
21
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"app-frame.d.ts","sourceRoot":"","sources":["../../../src/components/ui/app-frame.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAMjD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEzD,iBAAS,mBAAmB,CAC1B,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAM/B;AAED,MAAM,WAAW,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;IAChE;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,UAAU,2BAA2B;IACnC,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IACnC,wBAAwB,EAAE,OAAO,CAAA;IACjC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAA;CACvC;AAKD,wBAAgB,kBAAkB,IAAI,2BAA2B,GAAG,IAAI,CAEvE;AAsBD,iBAAS,QAAQ,CAAC,EAChB,IAAa,EACb,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,aAAa,2CAoEf;AAED,MAAM,WAAW,qBACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC;IAChD,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,CAAA;CACpC;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAoB,EACpB,aAAa,EACb,WAAW,EACX,KAAK,EACL,GAAG,KAAK,EACT,EAAE,qBAAqB,2CA+BvB;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,2CAWvC;AAED,MAAM,WAAW,oBACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,iBAAS,eAAe,CAAC,EACvB,UAAiB,EACjB,QAAe,EACf,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,oBAAoB,2CAoBtB;AAED,MAAM,WAAW,sBACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC;IAChD,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,CAAA;CACpC;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,QAAoB,EACpB,KAAK,EACL,GAAG,KAAK,EACT,EAAE,sBAAsB,2CAmBxB;AAED,OAAO,EACL,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,CAAA"}
1
+ {"version":3,"file":"app-frame.d.ts","sourceRoot":"","sources":["../../../src/components/ui/app-frame.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAMjD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEzD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,iBAAS,mBAAmB,CAC1B,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAM/B;AAED,MAAM,WAAW,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;IAChE;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAA;CACxC;AAED,UAAU,2BAA2B;IACnC,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IACnC,wBAAwB,EAAE,OAAO,CAAA;IACjC,wBAAwB,EAAE,OAAO,CAAA;IACjC,sBAAsB,EAAE,OAAO,CAAA;IAC/B,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAA;CACvC;AAKD,wBAAgB,kBAAkB,IAAI,2BAA2B,GAAG,IAAI,CAEvE;AA8BD,iBAAS,QAAQ,CAAC,EAChB,IAAa,EACb,cAAc,EACd,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,aAAa,2CAuGf;AAED,MAAM,WAAW,qBACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC;IAChD,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,CAAA;CACpC;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAoB,EACpB,aAAa,EACb,WAAW,EACX,KAAK,EACL,GAAG,KAAK,EACT,EAAE,qBAAqB,2CA+BvB;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,2CAWvC;AAED,MAAM,WAAW,oBACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,iBAAS,eAAe,CAAC,EACvB,UAAiB,EACjB,QAAe,EACf,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,oBAAoB,2CAoBtB;AAED,MAAM,WAAW,sBACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,QAAQ,CAAC;IAChD,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,CAAA;CACpC;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,QAAoB,EACpB,KAAK,EACL,GAAG,KAAK,EACT,EAAE,sBAAsB,2CAmBxB;AAED,OAAO,EACL,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,CAAA"}
@@ -30,13 +30,20 @@ function sidebarMaterialAvailable() {
30
30
  document.documentElement.dataset.moldableNativeMaterialSidebar ===
31
31
  'available');
32
32
  }
33
- function AppFrame({ mode = 'auto', className, style, ...props }) {
33
+ function backgroundMaterialAvailable() {
34
+ return (typeof document !== 'undefined' &&
35
+ document.documentElement.dataset.moldableNativeMaterialBackground ===
36
+ 'available');
37
+ }
38
+ function AppFrame({ mode = 'auto', nativeMaterial, className, style, ...props }) {
34
39
  const [resolvedMode, setResolvedMode] = React.useState(() => resolveAppFrameMode(mode));
35
40
  const [sidebarMaterialRegionId, setSidebarMaterialRegionId] = React.useState(activeSidebarMaterialRegionId);
36
41
  const [nativeSidebarMaterialAvailable, setNativeSidebarMaterialAvailable] = React.useState(sidebarMaterialAvailable);
42
+ const [nativeBackgroundMaterialAvailable, setNativeBackgroundMaterialAvailable,] = React.useState(backgroundMaterialAvailable);
37
43
  React.useEffect(() => {
38
44
  const updateHostState = () => {
39
45
  setResolvedMode(resolveAppFrameMode(mode));
46
+ setNativeBackgroundMaterialAvailable(backgroundMaterialAvailable());
40
47
  setNativeSidebarMaterialAvailable(sidebarMaterialAvailable());
41
48
  setSidebarMaterialRegionId(activeSidebarMaterialRegionId());
42
49
  };
@@ -50,19 +57,42 @@ function AppFrame({ mode = 'auto', className, style, ...props }) {
50
57
  };
51
58
  }, [mode]);
52
59
  const sidebarMaterialActive = resolvedMode === 'window' && sidebarMaterialRegionId !== null;
60
+ const backgroundMaterialActive = resolvedMode === 'window' &&
61
+ nativeMaterial?.background === true &&
62
+ nativeBackgroundMaterialAvailable;
63
+ React.useEffect(() => {
64
+ if (!backgroundMaterialActive)
65
+ return;
66
+ const previousBackgroundColor = document.body.style.backgroundColor;
67
+ document.body.style.backgroundColor = 'transparent';
68
+ return () => {
69
+ if (previousBackgroundColor) {
70
+ document.body.style.backgroundColor = previousBackgroundColor;
71
+ }
72
+ else {
73
+ document.body.style.removeProperty('background-color');
74
+ }
75
+ };
76
+ }, [backgroundMaterialActive]);
53
77
  return (_jsx(AppFrameRuntimeContext.Provider, { value: {
54
78
  mode: resolvedMode,
79
+ backgroundMaterialActive,
55
80
  sidebarMaterialAvailable: nativeSidebarMaterialAvailable,
81
+ sidebarMaterialEnabled: nativeMaterial?.sidebar === true,
56
82
  sidebarMaterialRegionId,
57
- }, children: _jsx("div", { "data-slot": "app-frame", "data-mode": resolvedMode, "data-native-material-sidebar": sidebarMaterialActive ? 'active' : undefined, className: cn('text-foreground flex h-dvh min-h-0 min-w-0 flex-col overflow-hidden bg-[var(--surface-canvas,var(--background))]', className), style: {
83
+ }, children: _jsx("div", { "data-slot": "app-frame", "data-mode": resolvedMode, "data-native-material-background": backgroundMaterialActive ? 'active' : undefined, "data-native-material-sidebar": sidebarMaterialActive ? 'active' : undefined, "data-native-material-sidebar-enabled": nativeMaterial?.sidebar === true ? 'true' : undefined, className: cn('text-foreground flex h-dvh min-h-0 min-w-0 flex-col overflow-hidden', backgroundMaterialActive
84
+ ? 'bg-transparent'
85
+ : 'bg-[var(--surface-canvas,var(--background))]', className), style: {
58
86
  paddingInlineStart: 'var(--window-safe-area-inline-start, 0px)',
59
87
  paddingInlineEnd: 'var(--window-safe-area-inline-end, 0px)',
60
88
  ...style,
61
- ...(sidebarMaterialActive
62
- ? {
63
- background: 'linear-gradient(to right, transparent 0 var(--moldable-material-region-sidebar-width), var(--surface-canvas, var(--background)) var(--moldable-material-region-sidebar-width) 100%)',
64
- }
65
- : {}),
89
+ ...(backgroundMaterialActive
90
+ ? { background: 'transparent' }
91
+ : sidebarMaterialActive
92
+ ? {
93
+ background: 'linear-gradient(to right, transparent 0 var(--moldable-material-region-sidebar-width), var(--surface-canvas, var(--background)) var(--moldable-material-region-sidebar-width) 100%)',
94
+ }
95
+ : {}),
66
96
  }, ...props }) }));
67
97
  }
68
98
  function AppFrameTitlebar({ className, material = 'regular', onDoubleClick, onMouseDown, style, ...props }) {
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
3
  declare const badgeVariants: (props?: ({
4
- variant?: "link" | "default" | "outline" | "destructive" | "secondary" | "ghost" | null | undefined;
4
+ variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
6
  declare function Badge({ className, variant, asChild, ...props }: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & {
7
7
  asChild?: boolean;
@@ -3,7 +3,7 @@ import { jsx as _jsx } 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 badgeVariants = cva('text-ui-caption inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-pill border border-transparent px-2 py-0.5 font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring aria-invalid:border-destructive [&>svg]:pointer-events-none [&>svg]:size-3', {
6
+ const badgeVariants = cva('inline-flex h-[var(--density-badge-height)] w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-pill border border-transparent px-[var(--density-badge-padding-inline)] py-0 text-[length:var(--type-badge-size)] leading-[var(--type-badge-line-height)] font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring aria-invalid:border-destructive [&>svg]:pointer-events-none [&>svg]:size-3', {
7
7
  variants: {
8
8
  variant: {
9
9
  default: 'bg-primary text-primary-foreground [a&]:hover:bg-primary/90',
@@ -1,13 +1,15 @@
1
1
  import * as React from 'react';
2
+ import type { ControlSize } from '../../tokens/contracts.js';
2
3
  import { type VariantProps } from 'class-variance-authority';
3
4
  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;
5
+ variant?: "link" | "toolbar" | "default" | "outline" | "prominent" | "bordered" | "borderless" | "tinted" | "destructive" | "destructive-tinted" | "secondary" | "ghost" | null | undefined;
6
+ size?: "small" | "default" | "sm" | "xs" | "lg" | "xl" | "mini" | "medium" | "large" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | "icon-xl" | null | undefined;
6
7
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
8
  type ButtonProps = React.ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
8
9
  asChild?: boolean;
10
+ controlSize?: ControlSize;
9
11
  loading?: boolean;
10
12
  };
11
- declare function Button({ 'aria-busy': ariaBusy, children, className, disabled, loading, onClick, onKeyDown, variant, size, asChild, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
13
+ declare function Button({ 'aria-busy': ariaBusy, children, className, controlSize, disabled, loading, onClick, onKeyDown, variant, size, asChild, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
12
14
  export { Button, buttonVariants };
13
15
  //# sourceMappingURL=button.d.ts.map
@@ -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;AAE9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,cAAc;;;8EAwDnB,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,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AA4CH,iBAAS,MAAM,CAAC,EACd,WAAW,EAAE,QAAQ,EACrB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,QAAQ,EACR,OAAe,EACf,OAAO,EACP,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,OAAe,EACf,GAAG,KAAK,EACT,EAAE,WAAW,2CA0Eb;AAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA"}
@@ -4,25 +4,37 @@ import * as React from 'react';
4
4
  import { cn } from '../../lib/utils.js';
5
5
  import { Spinner } from './spinner.js';
6
6
  import { cva } from 'class-variance-authority';
7
- const buttonVariants = cva("text-ui-body relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 rounded-control font-medium whitespace-nowrap outline-none transition-all focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring aria-invalid:border-destructive disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
7
+ const buttonVariants = cva("relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 rounded-[var(--m-ui-button-radius)] font-[var(--m-ui-button-font-weight)] whitespace-nowrap outline-none transition-[background-color,border-color,box-shadow,color] text-[length:var(--m-ui-control-font-size)] leading-[var(--m-ui-control-line-height)] focus-visible:ring-[3px] focus-visible:ring-ring aria-invalid:ring-[3px] aria-invalid:ring-destructive/45 disabled:pointer-events-none disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
8
8
  variants: {
9
9
  variant: {
10
- default: 'bg-primary text-primary-foreground hover:bg-primary/90 active:bg-primary/80',
11
- destructive: 'bg-destructive text-white hover:bg-destructive/90 active:bg-destructive/80 dark:bg-destructive/60',
10
+ default: 'bg-[var(--m-ui-button-prominent-fill)] text-[var(--m-ui-button-prominent-label)] active:bg-[var(--m-ui-button-prominent-fill-pressed)] disabled:bg-[var(--m-ui-button-prominent-fill-disabled)] disabled:!text-[var(--m-ui-button-prominent-label-disabled)]',
11
+ prominent: 'bg-[var(--m-ui-button-prominent-fill)] text-[var(--m-ui-button-prominent-label)] active:bg-[var(--m-ui-button-prominent-fill-pressed)] disabled:bg-[var(--m-ui-button-prominent-fill-disabled)] disabled:!text-[var(--m-ui-button-prominent-label-disabled)]',
12
+ bordered: 'bg-[var(--m-ui-button-bordered-fill)] text-[var(--m-ui-button-bordered-label)] active:bg-[var(--m-ui-button-bordered-fill-pressed)] disabled:bg-[var(--m-ui-button-bordered-fill-disabled)] disabled:!text-[var(--m-ui-button-bordered-label-disabled)]',
13
+ borderless: 'bg-transparent text-[var(--m-ui-button-borderless-label)] active:text-[var(--m-ui-button-borderless-label-pressed)] disabled:!text-[var(--m-ui-button-borderless-label-disabled)]',
14
+ tinted: 'bg-[var(--m-ui-button-tinted-fill)] text-[var(--m-ui-button-tinted-label)] active:bg-[var(--m-ui-button-tinted-fill-pressed)] disabled:bg-[var(--m-ui-button-tinted-fill-disabled)] disabled:!text-[var(--m-ui-button-tinted-label-disabled)]',
15
+ toolbar: 'rounded-pill 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)]',
16
+ destructive: 'bg-[var(--m-ui-button-destructive-fill)] text-[var(--m-ui-button-destructive-label)] active:bg-[var(--m-ui-button-destructive-fill-pressed)] disabled:bg-[var(--m-ui-button-destructive-fill-disabled)] disabled:!text-[var(--m-ui-button-destructive-label-disabled)]',
17
+ 'destructive-tinted': 'bg-[var(--m-ui-button-destructive-tinted-fill)] text-[var(--m-ui-button-destructive-tinted-label)] active:bg-[var(--m-ui-button-destructive-tinted-fill-pressed)] disabled:bg-[var(--m-ui-button-destructive-tinted-fill-disabled)] disabled:!text-[var(--m-ui-button-destructive-tinted-label-disabled)]',
12
18
  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
19
  secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80 active:bg-secondary/65',
14
20
  ghost: 'hover:bg-accent hover:text-accent-foreground active:bg-control-pressed dark:hover:bg-accent/50 dark:active:bg-control-pressed',
15
21
  link: 'text-primary underline-offset-4 hover:underline',
16
22
  },
17
23
  size: {
18
- default: 'h-control-md px-control-inline has-[>[data-slot=button-content]>svg]:px-control-inline',
24
+ default: 'h-[var(--m-ui-control-height)] px-[var(--m-ui-control-padding-inline)]',
19
25
  xs: "text-ui-caption h-control-xs gap-1 px-2 has-[>[data-slot=button-content]>svg]:px-2 [&_svg:not([class*='size-'])]:size-3",
20
26
  sm: 'h-control-sm gap-1.5 px-control-inline has-[>[data-slot=button-content]>svg]:px-control-inline',
21
27
  lg: 'h-control-lg px-[calc(var(--density-control-padding-inline)+0.25rem)] has-[>[data-slot=button-content]>svg]:px-control-inline',
22
- icon: 'size-control-md',
23
- 'icon-xs': "size-control-xs [&_svg:not([class*='size-'])]:size-3",
24
- 'icon-sm': 'size-control-sm',
25
- 'icon-lg': 'size-control-lg',
28
+ xl: 'h-control-xl px-[calc(var(--density-control-padding-inline)+0.375rem)] has-[>[data-slot=button-content]>svg]:px-control-inline',
29
+ mini: "h-[var(--m-ui-control-height)] px-[var(--m-ui-control-padding-inline)] text-[length:var(--m-ui-control-font-size)] leading-[var(--m-ui-control-line-height)] [&_svg:not([class*='size-'])]:size-3",
30
+ small: "h-[var(--m-ui-control-height)] px-[var(--m-ui-control-padding-inline)] text-[length:var(--m-ui-control-font-size)] leading-[var(--m-ui-control-line-height)] [&_svg:not([class*='size-'])]:size-3.5",
31
+ medium: 'h-[var(--m-ui-control-height)] px-[var(--m-ui-control-padding-inline)]',
32
+ large: 'h-[var(--m-ui-control-height)] px-[var(--m-ui-control-padding-inline)]',
33
+ icon: 'size-control-md rounded-pill',
34
+ 'icon-xs': "size-control-xs rounded-pill [&_svg:not([class*='size-'])]:size-3",
35
+ 'icon-sm': 'size-control-sm rounded-pill',
36
+ 'icon-lg': 'size-control-lg rounded-pill',
37
+ 'icon-xl': 'size-control-xl rounded-pill',
26
38
  },
27
39
  },
28
40
  defaultVariants: {
@@ -37,7 +49,24 @@ function blockLoadingInteraction(event) {
37
49
  event.preventDefault();
38
50
  event.stopPropagation();
39
51
  }
40
- function Button({ 'aria-busy': ariaBusy, children, className, disabled, loading = false, onClick, onKeyDown, variant = 'default', size = 'default', asChild = false, ...props }) {
52
+ function Button({ 'aria-busy': ariaBusy, children, className, controlSize, disabled, loading = false, onClick, onKeyDown, variant = 'default', size = 'default', asChild = false, ...props }) {
53
+ const resolvedControlSize = controlSize ??
54
+ {
55
+ xs: 'mini',
56
+ 'icon-xs': 'mini',
57
+ sm: 'small',
58
+ 'icon-sm': 'small',
59
+ default: 'medium',
60
+ icon: 'medium',
61
+ medium: 'medium',
62
+ mini: 'mini',
63
+ small: 'small',
64
+ lg: 'large',
65
+ 'icon-lg': 'large',
66
+ large: 'large',
67
+ xl: 'xl',
68
+ 'icon-xl': 'xl',
69
+ }[size ?? 'default'];
41
70
  const Comp = asChild ? Slot : 'button';
42
71
  const buttonChildren = (_jsx(ButtonContent, { loading: loading, children: children }));
43
72
  const renderedChildren = asChild && React.isValidElement(children)
@@ -62,6 +91,6 @@ function Button({ 'aria-busy': ariaBusy, children, className, disabled, loading
62
91
  }
63
92
  onKeyDown?.(event);
64
93
  };
65
- return (_jsx(Comp, { "data-slot": "button", "data-variant": variant, "data-size": size, "data-loading": loading || undefined, "aria-busy": loading || ariaBusy || undefined, disabled: disabled || loading, className: cn(buttonVariants({ variant, size, className })), onClick: handleClick, onKeyDown: handleKeyDown, ...props, children: renderedChildren }));
94
+ return (_jsx(Comp, { "data-slot": "button", "data-variant": variant, "data-size": size, "data-control-size": resolvedControlSize, "data-loading": loading || undefined, "aria-busy": loading || ariaBusy || undefined, disabled: disabled || loading, className: cn(buttonVariants({ variant, size, className })), onClick: handleClick, onKeyDown: handleKeyDown, ...props, children: renderedChildren }));
66
95
  }
67
96
  export { Button, buttonVariants };
@@ -1,10 +1,20 @@
1
1
  import * as React from 'react';
2
- declare function Card({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
2
+ export type CardSurface = 'default' | 'raised' | 'recessed' | 'plain';
3
+ interface CardProps extends React.ComponentProps<'div'> {
4
+ /**
5
+ * Controls the card's place in the surface hierarchy.
6
+ *
7
+ * `raised` is suited to grouped settings and dashboard modules,
8
+ * `recessed` to inset content, and `plain` to structure without chrome.
9
+ */
10
+ surface?: CardSurface;
11
+ }
12
+ declare function Card({ className, surface, ...props }: CardProps): import("react/jsx-runtime").JSX.Element;
3
13
  declare function CardHeader({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
4
14
  declare function CardTitle({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
5
15
  declare function CardDescription({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
6
16
  declare function CardAction({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
7
17
  declare function CardContent({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
8
18
  declare function CardFooter({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
9
- export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, };
19
+ export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, type CardProps, };
10
20
  //# sourceMappingURL=card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../../src/components/ui/card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,iBAAS,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAWjE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAWvE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQtE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ5E;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAWvE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQxE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQvE;AAED,OAAO,EACL,IAAI,EACJ,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,eAAe,EACf,WAAW,GACZ,CAAA"}
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../../src/components/ui/card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAA;AAErE,UAAU,SAAU,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;IACrD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB;AAED,iBAAS,IAAI,CAAC,EAAE,SAAS,EAAE,OAAmB,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,2CAiBpE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAWvE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQtE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ5E;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAWvE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQxE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQvE;AAED,OAAO,EACL,IAAI,EACJ,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,eAAe,EACf,WAAW,EACX,KAAK,SAAS,GACf,CAAA"}
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from '../../lib/utils.js';
3
- function Card({ className, ...props }) {
4
- return (_jsx("div", { "data-slot": "card", className: cn('bg-card text-card-foreground rounded-card flex flex-col gap-6 border py-6 shadow-sm', className), ...props }));
3
+ function Card({ className, surface = 'default', ...props }) {
4
+ return (_jsx("div", { "data-slot": "card", "data-surface": surface, className: cn('text-card-foreground rounded-card flex flex-col gap-6 py-6', surface === 'default' && 'bg-card shadow-card border', surface === 'raised' &&
5
+ 'bg-surface-raised border-separator shadow-card border', surface === 'recessed' && 'bg-surface-recessed', surface === 'plain' && 'bg-transparent', className), ...props }));
5
6
  }
6
7
  function CardHeader({ className, ...props }) {
7
8
  return (_jsx("div", { "data-slot": "card-header", className: cn('@container/card-header has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6 grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6', className), ...props }));
@@ -1,5 +1,8 @@
1
1
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
2
2
  import * as React from 'react';
3
- declare function Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
3
+ import type { ControlSize } from '../../tokens/contracts.js';
4
+ declare function Checkbox({ className, controlSize, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root> & {
5
+ controlSize?: ControlSize;
6
+ }): import("react/jsx-runtime").JSX.Element;
4
7
  export { Checkbox };
5
8
  //# sourceMappingURL=checkbox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../../src/components/ui/checkbox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAA;AAE7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,2CAmBrD;AAED,OAAO,EAAE,QAAQ,EAAE,CAAA"}
1
+ {"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../../src/components/ui/checkbox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAA;AAE7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,WAAW,EACX,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG;IACvD,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B,2CAqBA;AAED,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
4
- import { CheckIcon } from 'lucide-react';
4
+ import { CheckIcon, MinusIcon } from 'lucide-react';
5
5
  import { cn } from '../../lib/utils.js';
6
- function Checkbox({ className, ...props }) {
7
- return (_jsx(CheckboxPrimitive.Root, { "data-slot": "checkbox", className: cn('group/checkbox text-primary-foreground focus-visible:border-ring focus-visible:ring-ring aria-invalid:before:border-destructive rounded-checkbox size-control-xs before:rounded-checkbox before:border-input before:shadow-xs data-[state=checked]:before:border-primary data-[state=checked]:before:bg-primary dark:before:bg-input/30 dark:data-[state=checked]:before:bg-primary peer relative shrink-0 cursor-pointer border border-transparent bg-transparent p-1 outline-none transition-shadow before:pointer-events-none before:absolute before:left-1/2 before:top-1/2 before:size-4 before:-translate-x-1/2 before:-translate-y-1/2 before:border before:bg-transparent focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50', className), ...props, children: _jsx(CheckboxPrimitive.Indicator, { forceMount: true, "data-slot": "checkbox-indicator", className: "pointer-events-none absolute left-1/2 top-1/2 z-10 grid size-4 -translate-x-1/2 -translate-y-1/2 place-content-center text-current transition-none group-data-[state=unchecked]/checkbox:opacity-0", children: _jsx(CheckIcon, { className: "size-3.5" }) }) }));
6
+ function Checkbox({ className, controlSize, ...props }) {
7
+ return (_jsx(CheckboxPrimitive.Root, { "data-slot": "checkbox", "data-control-size": controlSize, className: cn('group/checkbox focus-visible:border-ring focus-visible:ring-ring aria-invalid:border-destructive shadow-xs peer relative h-[var(--m-ui-checkbox-size)] w-[var(--m-ui-checkbox-size)] shrink-0 cursor-pointer rounded-[var(--m-ui-checkbox-radius)] border border-[var(--m-ui-color-fill-primary)] bg-[var(--m-ui-color-fill-quinary)] text-white outline-none transition-shadow focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-[var(--m-ui-color-accent)] data-[state=indeterminate]:border-[var(--m-ui-color-accent)] data-[state=checked]:bg-[var(--m-ui-color-accent)] data-[state=indeterminate]:bg-[var(--m-ui-color-accent)]', className), ...props, children: _jsxs(CheckboxPrimitive.Indicator, { forceMount: true, "data-slot": "checkbox-indicator", className: "pointer-events-none absolute left-1/2 top-1/2 z-10 grid size-full -translate-x-1/2 -translate-y-1/2 place-content-center text-current transition-none group-data-[state=unchecked]/checkbox:opacity-0", children: [_jsx(CheckIcon, { className: "size-[var(--m-ui-checkbox-checkmark-width)] group-data-[state=indeterminate]/checkbox:hidden" }), _jsx(MinusIcon, { className: "hidden size-[var(--m-ui-radio-dash-width)] group-data-[state=indeterminate]/checkbox:block" })] }) }));
8
8
  }
9
9
  export { Checkbox };
@@ -78,22 +78,22 @@ function ContextMenuRadioGroup({ ...props }) {
78
78
  return (_jsx(ContextMenuPrimitive.RadioGroup, { "data-slot": "context-menu-radio-group", ...props }));
79
79
  }
80
80
  function ContextMenuSubTrigger({ className, inset, children, variant = 'default', ...props }) {
81
- return (_jsxs(ContextMenuPrimitive.SubTrigger, { "data-slot": "context-menu-sub-trigger", "data-inset": inset, "data-variant": variant, className: cn("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground outline-hidden rounded-control text-ui-body flex cursor-default select-none items-center px-2 py-1.5 data-[inset]:pl-8 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className), ...props, children: [children, _jsx(ChevronRightIcon, { className: "ml-auto" })] }));
81
+ return (_jsxs(ContextMenuPrimitive.SubTrigger, { "data-slot": "context-menu-sub-trigger", "data-inset": inset, "data-variant": variant, className: cn("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground outline-hidden text-ui-body flex cursor-default select-none items-center rounded-[var(--m-ui-menu-item-radius)] px-2 py-1.5 data-[inset]:pl-8 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className), ...props, children: [children, _jsx(ChevronRightIcon, { className: "ml-auto" })] }));
82
82
  }
83
83
  function ContextMenuSubContent({ className, ...props }) {
84
- return (_jsx(ContextMenuPrimitive.SubContent, { "data-slot": "context-menu-sub-content", className: cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-(--radix-context-menu-content-transform-origin) rounded-overlay shadow-overlay z-50 min-w-[8rem] overflow-hidden border p-1', className), ...props }));
84
+ return (_jsx(ContextMenuPrimitive.SubContent, { "data-slot": "context-menu-sub-content", className: cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-(--radix-context-menu-content-transform-origin) rounded-overlay shadow-overlay z-50 min-w-[8rem] overflow-hidden border px-1 py-[var(--m-ui-menu-padding-block)]', className), ...props }));
85
85
  }
86
86
  function ContextMenuContent({ className, ...props }) {
87
- return (_jsx(ContextMenuPrimitive.Portal, { children: _jsx(ContextMenuPrimitive.Content, { "data-slot": "context-menu-content", className: cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) rounded-overlay shadow-overlay z-50 min-w-[8rem] overflow-y-auto overflow-x-hidden border p-1', className), ...props }) }));
87
+ return (_jsx(ContextMenuPrimitive.Portal, { children: _jsx(ContextMenuPrimitive.Content, { "data-slot": "context-menu-content", className: cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) rounded-overlay shadow-overlay z-50 min-w-[8rem] overflow-y-auto overflow-x-hidden border px-1 py-[var(--m-ui-menu-padding-block)]', className), ...props }) }));
88
88
  }
89
89
  function ContextMenuItem({ className, inset, variant = 'default', ...props }) {
90
- return (_jsx(ContextMenuPrimitive.Item, { "data-slot": "context-menu-item", "data-inset": inset, "data-variant": variant, className: cn("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground outline-hidden rounded-control text-ui-body relative flex cursor-default select-none items-center gap-2 px-2 py-1.5 data-[disabled]:pointer-events-none data-[inset]:pl-8 data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className), ...props }));
90
+ return (_jsx(ContextMenuPrimitive.Item, { "data-slot": "context-menu-item", "data-inset": inset, "data-variant": variant, className: cn("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground outline-hidden text-ui-body relative flex cursor-default select-none items-center gap-2 rounded-[var(--m-ui-menu-item-radius)] px-2 py-1.5 data-[disabled]:pointer-events-none data-[inset]:pl-8 data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className), ...props }));
91
91
  }
92
92
  function ContextMenuCheckboxItem({ className, children, checked, variant = 'default', ...props }) {
93
- return (_jsxs(ContextMenuPrimitive.CheckboxItem, { "data-slot": "context-menu-checkbox-item", "data-variant": variant, className: cn("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive outline-hidden rounded-control text-ui-body relative flex cursor-default select-none items-center gap-2 py-1.5 pl-8 pr-2 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className), checked: checked, ...props, children: [_jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: _jsx(ContextMenuPrimitive.ItemIndicator, { children: _jsx(CheckIcon, { className: "size-4" }) }) }), children] }));
93
+ return (_jsxs(ContextMenuPrimitive.CheckboxItem, { "data-slot": "context-menu-checkbox-item", "data-variant": variant, className: cn("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive outline-hidden text-ui-body relative flex cursor-default select-none items-center gap-2 rounded-[var(--m-ui-menu-item-radius)] py-1.5 pl-8 pr-2 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className), checked: checked, ...props, children: [_jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: _jsx(ContextMenuPrimitive.ItemIndicator, { children: _jsx(CheckIcon, { className: "size-4" }) }) }), children] }));
94
94
  }
95
95
  function ContextMenuRadioItem({ className, children, variant = 'default', ...props }) {
96
- return (_jsxs(ContextMenuPrimitive.RadioItem, { "data-slot": "context-menu-radio-item", "data-variant": variant, className: cn("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive outline-hidden rounded-control text-ui-body relative flex cursor-default select-none items-center gap-2 py-1.5 pl-8 pr-2 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className), ...props, children: [_jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: _jsx(ContextMenuPrimitive.ItemIndicator, { children: _jsx(CircleIcon, { className: "size-2 fill-current" }) }) }), children] }));
96
+ return (_jsxs(ContextMenuPrimitive.RadioItem, { "data-slot": "context-menu-radio-item", "data-variant": variant, className: cn("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive outline-hidden text-ui-body relative flex cursor-default select-none items-center gap-2 rounded-[var(--m-ui-menu-item-radius)] py-1.5 pl-8 pr-2 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className), ...props, children: [_jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: _jsx(ContextMenuPrimitive.ItemIndicator, { children: _jsx(CircleIcon, { className: "size-2 fill-current" }) }) }), children] }));
97
97
  }
98
98
  function ContextMenuLabel({ className, inset, ...props }) {
99
99
  return (_jsx(ContextMenuPrimitive.Label, { "data-slot": "context-menu-label", "data-inset": inset, className: cn('text-foreground text-ui-body px-2 py-1.5 font-medium data-[inset]:pl-8', className), ...props }));
@@ -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. */