@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.
Files changed (181) 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 +5 -5
  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 -11
  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/dropdown-menu.js +6 -6
  24. package/dist/components/ui/icon-button.d.ts +1 -1
  25. package/dist/components/ui/icon-button.d.ts.map +1 -1
  26. package/dist/components/ui/icon-button.js +1 -0
  27. package/dist/components/ui/input.d.ts +6 -2
  28. package/dist/components/ui/input.d.ts.map +1 -1
  29. package/dist/components/ui/input.js +2 -2
  30. package/dist/components/ui/material.d.ts +8 -3
  31. package/dist/components/ui/material.d.ts.map +1 -1
  32. package/dist/components/ui/material.js +2 -2
  33. package/dist/components/ui/search-field.d.ts +3 -1
  34. package/dist/components/ui/search-field.d.ts.map +1 -1
  35. package/dist/components/ui/search-field.js +16 -6
  36. package/dist/components/ui/segmented-control.d.ts +3 -1
  37. package/dist/components/ui/segmented-control.d.ts.map +1 -1
  38. package/dist/components/ui/segmented-control.js +23 -17
  39. package/dist/components/ui/select.js +2 -2
  40. package/dist/components/ui/sidebar.d.ts +5 -3
  41. package/dist/components/ui/sidebar.d.ts.map +1 -1
  42. package/dist/components/ui/sidebar.js +53 -15
  43. package/dist/components/ui/status.d.ts +1 -1
  44. package/dist/components/ui/status.js +1 -1
  45. package/dist/components/ui/switch.d.ts +3 -1
  46. package/dist/components/ui/switch.d.ts.map +1 -1
  47. package/dist/components/ui/switch.js +3 -2
  48. package/dist/components/ui/toolbar-controls.d.ts +3 -1
  49. package/dist/components/ui/toolbar-controls.d.ts.map +1 -1
  50. package/dist/components/ui/toolbar-controls.js +14 -7
  51. package/dist/components/ui/toolbar.d.ts +5 -4
  52. package/dist/components/ui/toolbar.d.ts.map +1 -1
  53. package/dist/components/ui/toolbar.js +3 -3
  54. package/dist/index.d.ts +2 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +3 -1
  57. package/dist/lib/frame-lifecycle.d.ts +1 -0
  58. package/dist/lib/frame-lifecycle.d.ts.map +1 -1
  59. package/dist/lib/frame-lifecycle.js +7 -0
  60. package/dist/lib/theme.d.ts +39 -5
  61. package/dist/lib/theme.d.ts.map +1 -1
  62. package/dist/lib/theme.js +105 -17
  63. package/dist/tokens/contracts.d.ts +79 -0
  64. package/dist/tokens/contracts.d.ts.map +1 -0
  65. package/dist/tokens/contracts.js +57 -0
  66. package/dist/tokens/index.d.ts +2 -0
  67. package/dist/tokens/index.d.ts.map +1 -0
  68. package/dist/tokens/index.js +1 -0
  69. package/docs/README.md +2 -0
  70. package/docs/adaptive-materials.md +14 -9
  71. package/docs/design-tokens.md +10 -6
  72. package/docs/foundations.md +3 -3
  73. package/docs/macos-design-audit.md +144 -0
  74. package/docs/native-integration.md +4 -4
  75. package/docs/platform-architecture.md +189 -0
  76. package/docs/standalone-app-windows.md +37 -0
  77. package/docs/visual-regression.md +6 -8
  78. package/package.json +13 -1
  79. package/src/components/ui/accordion.md +46 -0
  80. package/src/components/ui/alert.md +12 -4
  81. package/src/components/ui/app-frame.md +8 -5
  82. package/src/components/ui/aspect-ratio.md +37 -0
  83. package/src/components/ui/avatar.md +48 -0
  84. package/src/components/ui/breadcrumb.md +52 -0
  85. package/src/components/ui/button-group.md +43 -0
  86. package/src/components/ui/button.md +20 -4
  87. package/src/components/ui/calendar.md +42 -0
  88. package/src/components/ui/card.md +43 -0
  89. package/src/components/ui/carousel.md +47 -0
  90. package/src/components/ui/chart.md +52 -0
  91. package/src/components/ui/checkbox.md +36 -0
  92. package/src/components/ui/collapsible.md +2 -3
  93. package/src/components/ui/color-well.md +14 -4
  94. package/src/components/ui/combobox.md +3 -3
  95. package/src/components/ui/confirm-dialog.md +5 -4
  96. package/src/components/ui/context-menu.md +3 -2
  97. package/src/components/ui/date-field.md +6 -1
  98. package/src/components/ui/date-picker.md +6 -3
  99. package/src/components/ui/dialog.md +14 -12
  100. package/src/components/ui/drawer.md +58 -0
  101. package/src/components/ui/error-boundary-view.md +1 -1
  102. package/src/components/ui/field.md +2 -1
  103. package/src/components/ui/form.md +71 -0
  104. package/src/components/ui/grid.md +4 -3
  105. package/src/components/ui/icon-button.md +4 -1
  106. package/src/components/ui/input-group.md +49 -0
  107. package/src/components/ui/input-otp.md +56 -0
  108. package/src/components/ui/input.md +40 -0
  109. package/src/components/ui/inspector.md +47 -7
  110. package/src/components/ui/item.md +5 -3
  111. package/src/components/ui/kbd.md +30 -0
  112. package/src/components/ui/label.md +29 -0
  113. package/src/components/ui/list.md +2 -2
  114. package/src/components/ui/material.md +25 -12
  115. package/src/components/ui/menu-items.md +60 -0
  116. package/src/components/ui/menubar.md +58 -0
  117. package/src/components/ui/message-scroller-primitive.md +70 -0
  118. package/src/components/ui/message-scroller.md +86 -0
  119. package/src/components/ui/navigation-button-group.md +4 -3
  120. package/src/components/ui/navigation-menu.md +52 -0
  121. package/src/components/ui/number-input.md +8 -0
  122. package/src/components/ui/pagination.md +51 -0
  123. package/src/components/ui/panel.md +6 -0
  124. package/src/components/ui/popover.md +10 -7
  125. package/src/components/ui/progress.md +31 -0
  126. package/src/components/ui/radio-group.md +36 -0
  127. package/src/components/ui/resizable.md +2 -1
  128. package/src/components/ui/scroll-area.md +3 -1
  129. package/src/components/ui/search-field.md +6 -1
  130. package/src/components/ui/segmented-control.md +6 -1
  131. package/src/components/ui/separator.md +35 -0
  132. package/src/components/ui/sidebar.md +20 -3
  133. package/src/components/ui/skeleton.md +36 -0
  134. package/src/components/ui/slider.md +58 -0
  135. package/src/components/ui/spinner.md +41 -0
  136. package/src/components/ui/split-view.md +8 -4
  137. package/src/components/ui/switch.md +44 -0
  138. package/src/components/ui/table.md +7 -7
  139. package/src/components/ui/tabs.md +3 -1
  140. package/src/components/ui/textarea.md +41 -0
  141. package/src/components/ui/toggle-group.md +2 -2
  142. package/src/components/ui/toggle.md +9 -9
  143. package/src/components/ui/toolbar-controls.md +17 -9
  144. package/src/components/ui/toolbar.md +6 -6
  145. package/src/styles/index.css +171 -117
  146. package/src/tokens/contracts.ts +131 -0
  147. package/src/tokens/index.css +6 -0
  148. package/src/tokens/index.ts +23 -0
  149. package/src/tokens/macos-26/README.md +37 -0
  150. package/src/tokens/macos-26/aliases.css +53 -0
  151. package/src/tokens/macos-26/compatibility.css +7 -0
  152. package/src/tokens/macos-26/index.css +3 -0
  153. package/src/tokens/macos-26/source/provenance.generated.json +28 -0
  154. package/src/tokens/macos-26/source/sidebar.generated.css +29 -0
  155. package/src/tokens/macos-26/source.css +7 -0
  156. package/src/tokens/macos-26/web-adaptations.json +25 -0
  157. package/src/tokens/macos-26/web-adaptations.md +15 -0
  158. package/src/tokens/macos-27/accessibility.css +11 -0
  159. package/src/tokens/macos-27/aliases.css +304 -0
  160. package/src/tokens/macos-27/compatibility.css +212 -0
  161. package/src/tokens/macos-27/index.css +15 -0
  162. package/src/tokens/macos-27/recipes.css +23 -0
  163. package/src/tokens/macos-27/source/chrome.generated.css +338 -0
  164. package/src/tokens/macos-27/source/colors.generated.css +140 -0
  165. package/src/tokens/macos-27/source/context.generated.css +18 -0
  166. package/src/tokens/macos-27/source/controls.generated.css +764 -0
  167. package/src/tokens/macos-27/source/effects.generated.css +68 -0
  168. package/src/tokens/macos-27/source/kit.generated.css +50 -0
  169. package/src/tokens/macos-27/source/overlays-status.generated.css +931 -0
  170. package/src/tokens/macos-27/source/paint-styles.generated.css +81 -0
  171. package/src/tokens/macos-27/source/provenance.generated.json +62 -0
  172. package/src/tokens/macos-27/source/sizes.generated.css +385 -0
  173. package/src/tokens/macos-27/source/source.generated.json +554 -0
  174. package/src/tokens/macos-27/source/text-styles.generated.css +116 -0
  175. package/src/tokens/macos-27/source.css +17 -0
  176. package/src/tokens/macos-27/web-adaptations.css +98 -0
  177. package/src/tokens/macos-27/web-adaptations.json +163 -0
  178. package/src/tokens/macos-27/web-adaptations.md +117 -0
  179. package/src/tokens/moldable/brand.css +48 -0
  180. package/src/tokens/moldable/index.css +1 -0
  181. package/src/tokens/platform-contract.test.ts +290 -0
@@ -1,5 +1,6 @@
1
1
  @import 'tailwindcss';
2
2
  @import 'tw-animate-css';
3
+ @import '../tokens/index.css';
3
4
 
4
5
  @plugin "@tailwindcss/typography";
5
6
 
@@ -186,11 +187,17 @@
186
187
  --font-sans: var(--font-family-ui);
187
188
  --font-mono: var(--font-family-mono);
188
189
 
190
+ --text-10: 10px;
189
191
  --text-11: 11px;
192
+ --text-12: 12px;
190
193
  --text-13: 13px;
194
+ --text-15: 15px;
191
195
  --text-16: 16px;
196
+ --text-17: 17px;
192
197
  --text-18: 18px;
198
+ --text-22: 22px;
193
199
  --text-24: 24px;
200
+ --text-26: 26px;
194
201
  --text-ui-display: var(--type-display-size);
195
202
  --text-ui-display--line-height: var(--type-display-line-height);
196
203
  --text-ui-display--font-weight: var(--type-display-weight);
@@ -232,6 +239,7 @@
232
239
  --spacing-control-sm: var(--density-control-height-sm);
233
240
  --spacing-control-md: var(--density-control-height-md);
234
241
  --spacing-control-lg: var(--density-control-height-lg);
242
+ --spacing-control-xl: var(--density-control-height-xl);
235
243
  --spacing-row: var(--density-row-height);
236
244
  --spacing-toolbar: var(--density-toolbar-height);
237
245
  --spacing-pane: var(--density-pane-padding);
@@ -241,6 +249,7 @@
241
249
  --ease-enter: var(--motion-ease-enter);
242
250
  --ease-exit: var(--motion-ease-exit);
243
251
  --ease-spring: var(--motion-ease-spring);
252
+ --shadow-card: var(--material-shadow-card);
244
253
  --shadow-panel: var(--material-shadow-panel);
245
254
  --shadow-overlay: var(--material-shadow-overlay);
246
255
  --shadow-dialog: var(--material-shadow-dialog);
@@ -282,6 +291,8 @@
282
291
  --color-popover-foreground: var(--popover-foreground);
283
292
  --color-primary: var(--primary);
284
293
  --color-primary-foreground: var(--primary-foreground);
294
+ --color-prominent: var(--prominent);
295
+ --color-prominent-foreground: var(--prominent-foreground);
285
296
  --color-secondary: var(--secondary);
286
297
  --color-secondary-foreground: var(--secondary-foreground);
287
298
  --color-muted: var(--muted);
@@ -722,38 +733,43 @@
722
733
  system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
723
734
  --font-family-mono: ui-monospace, Menlo, Consolas, monospace;
724
735
 
725
- --type-display-size: var(--text-24);
726
- --type-display-line-height: 28px;
727
- --type-display-weight: 600;
728
- --type-display-tracking: -0.02em;
729
- --type-heading-size: var(--text-18);
736
+ --type-display-size: var(--text-26);
737
+ --type-display-line-height: 32px;
738
+ --type-display-weight: 700;
739
+ --type-display-tracking: 0;
740
+ --type-heading-size: var(--text-17);
730
741
  --type-heading-line-height: 22px;
731
- --type-heading-weight: 600;
732
- --type-heading-tracking: -0.012em;
733
- --type-title-size: var(--text-16);
742
+ --type-heading-weight: 700;
743
+ --type-heading-tracking: 0;
744
+ --type-title-size: var(--text-15);
734
745
  --type-title-line-height: 20px;
735
746
  --type-title-weight: 600;
736
- --type-title-tracking: -0.006em;
747
+ --type-title-tracking: 0;
737
748
  --type-body-size: var(--text-13);
738
- --type-body-line-height: 18px;
749
+ --type-body-line-height: 16px;
739
750
  --type-label-size: var(--text-13);
740
751
  --type-label-line-height: 16px;
741
752
  --type-caption-size: var(--text-11);
742
753
  --type-caption-line-height: 14px;
743
-
744
- --density-control-height-xs: 1.5rem;
745
- --density-control-height-sm: 1.75rem;
746
- --density-control-height-md: 2rem;
747
- --density-control-height-lg: 2.25rem;
748
- --density-control-gap: 0.3125rem;
754
+ --type-badge-size: var(--text-11);
755
+ --type-badge-line-height: 14px;
756
+
757
+ --density-control-height-xs: 1rem;
758
+ --density-control-height-sm: 1.25rem;
759
+ --density-control-height-md: 1.5rem;
760
+ --density-control-height-lg: 1.75rem;
761
+ --density-control-height-xl: 2.25rem;
762
+ --density-control-gap: 0.25rem;
749
763
  --density-control-padding-inline: 0.625rem;
764
+ --density-badge-height: 1.125rem;
765
+ --density-badge-padding-inline: 0.375rem;
750
766
  --density-row-height: 2rem;
751
767
  --density-toolbar-height: 2.375rem;
752
768
  --density-pane-padding: 0.625rem;
753
769
  --density-section-gap: 0.875rem;
754
770
 
755
- --shape-control: 10px;
756
- --shape-checkbox: 4px;
771
+ --shape-control: 6px;
772
+ --shape-checkbox: 5px;
757
773
  --shape-popover: 12px;
758
774
  --shape-card: 12px;
759
775
  --shape-group: 12px;
@@ -773,24 +789,26 @@
773
789
  --motion-ease-spring: cubic-bezier(0.22, 1.15, 0.36, 1);
774
790
 
775
791
  --radius: var(--shape-card);
776
- --background: oklch(1 0 0);
777
- --foreground: oklch(0.141 0.005 285.823);
778
- --card: oklch(1 0 0);
779
- --card-foreground: oklch(0.141 0.005 285.823);
780
- --popover: oklch(1 0 0);
781
- --popover-foreground: oklch(0.141 0.005 285.823);
792
+ --background: #fff;
793
+ --foreground: rgb(0 0 0 / 85%);
794
+ --card: #fff;
795
+ --card-foreground: rgb(0 0 0 / 85%);
796
+ --popover: #fff;
797
+ --popover-foreground: rgb(0 0 0 / 85%);
782
798
  --primary: oklch(0.205 0 0);
783
799
  --primary-foreground: oklch(0.985 0 0);
784
- --secondary: oklch(0.967 0.001 286.375);
785
- --secondary-foreground: oklch(0.21 0.006 285.885);
786
- --muted: oklch(0.967 0.001 286.375);
787
- --muted-foreground: oklch(0.5 0.016 285.938);
788
- --accent: oklch(0.967 0.001 286.375);
789
- --accent-foreground: oklch(0.21 0.006 285.885);
800
+ --prominent: #0088ff;
801
+ --prominent-foreground: #fff;
802
+ --secondary: rgb(0 0 0 / 8%);
803
+ --secondary-foreground: rgb(0 0 0 / 85%);
804
+ --muted: rgb(0 0 0 / 5%);
805
+ --muted-foreground: rgb(0 0 0 / 50%);
806
+ --accent: rgb(0 0 0 / 10%);
807
+ --accent-foreground: rgb(0 0 0 / 85%);
790
808
  --destructive: oklch(0.5866 0.1994 31.76);
791
809
  --destructive-foreground: oklch(0.985 0 0);
792
- --border: oklch(0.92 0.004 286.32);
793
- --input: oklch(0.92 0.004 286.32);
810
+ --border: rgb(0 0 0 / 10%);
811
+ --input: rgb(0 0 0 / 10%);
794
812
  --ring: oklch(0.2 0 0 / 48%);
795
813
  --model-effort-blue: #339cff;
796
814
  --model-effort-purple: #924ff7;
@@ -855,11 +873,7 @@
855
873
  );
856
874
  --control-focus: var(--ring);
857
875
  --control-invalid: var(--destructive);
858
- --toolbar-control-background: color-mix(
859
- in oklch,
860
- var(--background) 74%,
861
- transparent
862
- );
876
+ --toolbar-control-background: rgb(255 255 255 / 42%);
863
877
  --toolbar-control-hover: color-mix(
864
878
  in oklch,
865
879
  var(--background) 84%,
@@ -870,54 +884,49 @@
870
884
  var(--background) 74%,
871
885
  var(--foreground) 14%
872
886
  );
873
- --toolbar-control-border: color-mix(
874
- in oklch,
875
- var(--foreground) 11%,
876
- transparent
877
- );
887
+ --toolbar-control-border: rgb(0 0 0 / 10%);
878
888
  --toolbar-control-shadow:
879
889
  inset 0 1px 0 color-mix(in oklch, white 42%, transparent),
880
890
  0 1px 2px oklch(0.15 0.005 285 / 8%);
881
891
 
882
- --material-blur-toolbar: 16px;
883
- --material-blur-overlay: 20px;
884
- --material-saturation: 1.12;
885
- --material-regular-fill: color-mix(
886
- in oklch,
887
- var(--background) 76%,
888
- transparent
889
- );
890
- --material-regular-fallback: color-mix(
891
- in oklch,
892
- var(--background) 94%,
893
- var(--foreground) 6%
894
- );
892
+ --material-blur-toolbar: 6px;
893
+ --material-blur-overlay: 30px;
894
+ --material-saturation: 1;
895
+ --material-ultra-thick-fill: rgb(236 236 236 / 88%);
896
+ --material-thick-fill: rgb(246 246 246 / 72%);
897
+ --material-medium-fill: rgb(246 246 246 / 60%);
898
+ --material-thin-fill: rgb(246 246 246 / 48%);
899
+ --material-ultra-thin-fill: rgb(246 246 246 / 36%);
900
+ --material-ultra-thick-fallback: #ececec;
901
+ --material-thick-fallback: #f6f6f6;
902
+ --material-medium-fallback: #f6f6f6;
903
+ --material-thin-fallback: #f6f6f6;
904
+ --material-ultra-thin-fallback: #f6f6f6;
905
+ --material-standard-blur: 30px;
906
+ --material-regular-fill: var(--material-medium-fill);
907
+ --material-regular-fallback: var(--material-medium-fallback);
895
908
  --material-regular-border: color-mix(
896
909
  in oklch,
897
910
  var(--foreground) 10%,
898
911
  transparent
899
912
  );
900
913
  --material-regular-highlight: oklch(1 0 0 / 42%);
901
- --material-regular-blur: 20px;
902
- --material-regular-saturation: 1.18;
903
- --material-clear-fill: color-mix(
904
- in oklch,
905
- var(--background) 24%,
906
- transparent
907
- );
908
- --material-clear-fallback: color-mix(
909
- in oklch,
910
- var(--background) 88%,
911
- var(--foreground) 12%
912
- );
914
+ --material-regular-blur: var(--material-standard-blur);
915
+ --material-regular-saturation: 1;
916
+ --material-clear-fill: var(--material-ultra-thin-fill);
917
+ --material-clear-fallback: var(--material-ultra-thin-fallback);
913
918
  --material-clear-border: color-mix(
914
919
  in oklch,
915
920
  var(--foreground) 14%,
916
921
  transparent
917
922
  );
918
923
  --material-clear-highlight: oklch(1 0 0 / 28%);
919
- --material-clear-blur: 12px;
920
- --material-clear-saturation: 1.24;
924
+ --material-clear-blur: var(--material-standard-blur);
925
+ --material-clear-saturation: 1;
926
+ /* In-flow structure: never map this role to overlay or glass elevation. */
927
+ --material-shadow-card: 0 1px 2px oklch(0.15 0.005 285 / 6%);
928
+ --material-shadow-sidebar:
929
+ 0 1px 2px oklch(0.15 0.005 285 / 4%), 0 3px 10px oklch(0.15 0.005 285 / 4%);
921
930
  --material-shadow-panel:
922
931
  inset 0 0 0 1px var(--separator), 0 1px 2px oklch(0.15 0.005 285 / 5%),
923
932
  0 5px 14px oklch(0.15 0.005 285 / 5%);
@@ -1000,10 +1009,11 @@
1000
1009
  }
1001
1010
 
1002
1011
  :where([data-density='compact']) {
1003
- --density-control-height-xs: 1.375rem;
1004
- --density-control-height-sm: 1.75rem;
1005
- --density-control-height-md: 2rem;
1006
- --density-control-height-lg: 2.25rem;
1012
+ --density-control-height-xs: 1rem;
1013
+ --density-control-height-sm: 1.25rem;
1014
+ --density-control-height-md: 1.5rem;
1015
+ --density-control-height-lg: 1.75rem;
1016
+ --density-control-height-xl: 2.25rem;
1007
1017
  --density-control-gap: 0.25rem;
1008
1018
  --density-control-padding-inline: 0.625rem;
1009
1019
  --density-row-height: 1.875rem;
@@ -1017,6 +1027,7 @@
1017
1027
  --density-control-height-sm: 2.25rem;
1018
1028
  --density-control-height-md: 2.5rem;
1019
1029
  --density-control-height-lg: 2.75rem;
1030
+ --density-control-height-xl: 3rem;
1020
1031
  --density-control-gap: 0.5rem;
1021
1032
  --density-control-padding-inline: 1rem;
1022
1033
  --density-row-height: 2.75rem;
@@ -1026,20 +1037,22 @@
1026
1037
  }
1027
1038
 
1028
1039
  .dark {
1029
- --background: oklch(0.235 0 0);
1030
- --foreground: oklch(0.985 0 0);
1031
- --card: oklch(0.269 0.0018 286.28);
1032
- --card-foreground: oklch(0.985 0 0);
1033
- --popover: oklch(0.269 0.0018 286.28);
1034
- --popover-foreground: oklch(0.985 0 0);
1040
+ --background: #1d1f1f;
1041
+ --foreground: rgb(255 255 255 / 85%);
1042
+ --card: #242424;
1043
+ --card-foreground: rgb(255 255 255 / 85%);
1044
+ --popover: #242424;
1045
+ --popover-foreground: rgb(255 255 255 / 85%);
1035
1046
  --primary: oklch(0.985 0 0);
1036
1047
  --primary-foreground: oklch(0.205 0 0);
1037
- --secondary: oklch(0.3375 0.0035 286.21);
1038
- --secondary-foreground: oklch(0.985 0 0);
1039
- --muted: oklch(0.3375 0.0035 286.21);
1040
- --muted-foreground: oklch(0.74 0.012 286);
1041
- --accent: oklch(0.3375 0.0035 286.21);
1042
- --accent-foreground: oklch(0.985 0 0);
1048
+ --prominent: #0091ff;
1049
+ --prominent-foreground: #fff;
1050
+ --secondary: rgb(255 255 255 / 8%);
1051
+ --secondary-foreground: rgb(255 255 255 / 85%);
1052
+ --muted: rgb(255 255 255 / 5%);
1053
+ --muted-foreground: rgb(255 255 255 / 55%);
1054
+ --accent: rgb(255 255 255 / 10%);
1055
+ --accent-foreground: rgb(255 255 255 / 85%);
1043
1056
  --destructive: oklch(0.704 0.191 22.216);
1044
1057
  --destructive-foreground: oklch(0.985 0 0);
1045
1058
  --border: oklch(1 0 0 / 10%);
@@ -1053,13 +1066,13 @@
1053
1066
  --chart-3: var(--pending);
1054
1067
  --chart-4: var(--neutral);
1055
1068
  --chart-5: var(--accent-foreground);
1056
- --sidebar: oklch(0.235 0 0);
1069
+ --sidebar: #1b1d1e;
1057
1070
  --sidebar-foreground: oklch(0.985 0 0);
1058
1071
  --sidebar-primary: oklch(0.7145 0.185 45.03);
1059
1072
  --sidebar-primary-foreground: oklch(0.985 0 0);
1060
- --sidebar-accent: oklch(0.3375 0.0035 286.21);
1061
- --sidebar-accent-foreground: oklch(0.985 0 0);
1062
- --sidebar-border: oklch(1 0 0 / 10%);
1073
+ --sidebar-accent: color-mix(in srgb, #0091ff 14%, transparent);
1074
+ --sidebar-accent-foreground: #0091ff;
1075
+ --sidebar-border: #394043;
1063
1076
  --sidebar-ring: var(--ring);
1064
1077
  --info: oklch(0.72 0.15 250);
1065
1078
  --info-foreground: oklch(0.78 0.11 250);
@@ -1075,30 +1088,30 @@
1075
1088
  --status-stopped: var(--neutral);
1076
1089
  --status-pending: var(--pending);
1077
1090
  --status-error: var(--destructive);
1078
- --material-regular-fill: color-mix(
1079
- in oklch,
1080
- var(--background) 68%,
1081
- transparent
1082
- );
1083
- --material-regular-fallback: color-mix(
1084
- in oklch,
1085
- var(--background) 88%,
1086
- var(--foreground) 12%
1087
- );
1091
+ --toolbar-control-background: rgb(153 153 153 / 17%);
1092
+ --toolbar-control-border: rgb(255 255 255 / 10%);
1093
+ --material-ultra-thick-fill: rgb(0 0 0 / 50%);
1094
+ --material-thick-fill: rgb(0 0 0 / 40%);
1095
+ --material-medium-fill: rgb(0 0 0 / 29%);
1096
+ --material-thin-fill: rgb(0 0 0 / 20%);
1097
+ --material-ultra-thin-fill: rgb(0 0 0 / 10%);
1098
+ --material-ultra-thick-fallback: #000;
1099
+ --material-thick-fallback: #000;
1100
+ --material-medium-fallback: #000;
1101
+ --material-thin-fallback: #000;
1102
+ --material-ultra-thin-fallback: #000;
1103
+ --material-regular-fill: var(--material-medium-fill);
1104
+ --material-regular-fallback: var(--material-medium-fallback);
1088
1105
  --material-regular-border: oklch(1 0 0 / 14%);
1089
1106
  --material-regular-highlight: oklch(1 0 0 / 12%);
1090
- --material-clear-fill: color-mix(
1091
- in oklch,
1092
- var(--background) 20%,
1093
- transparent
1094
- );
1095
- --material-clear-fallback: color-mix(
1096
- in oklch,
1097
- var(--background) 78%,
1098
- var(--foreground) 22%
1099
- );
1107
+ --material-clear-fill: var(--material-ultra-thin-fill);
1108
+ --material-clear-fallback: var(--material-ultra-thin-fallback);
1100
1109
  --material-clear-border: oklch(1 0 0 / 18%);
1101
1110
  --material-clear-highlight: oklch(1 0 0 / 10%);
1111
+ /* In-flow structure: never map this role to overlay or glass elevation. */
1112
+ --material-shadow-card: 0 1px 2px oklch(0 0 0 / 24%);
1113
+ --material-shadow-sidebar:
1114
+ 0 1px 2px oklch(0 0 0 / 18%), 0 3px 10px oklch(0 0 0 / 12%);
1102
1115
  --material-shadow-panel:
1103
1116
  inset 0 0 0 1px var(--separator), 0 2px 5px oklch(0 0 0 / 28%),
1104
1117
  0 8px 22px oklch(0 0 0 / 22%);
@@ -1157,6 +1170,7 @@
1157
1170
  transparent
1158
1171
  );
1159
1172
  --material-clear-border: var(--separator-strong);
1173
+ --material-shadow-card: none;
1160
1174
  --material-shadow-panel: inset 0 0 0 1px var(--separator-strong);
1161
1175
  --material-shadow-overlay: inset 0 0 0 1px var(--separator-strong);
1162
1176
  --material-shadow-dialog: inset 0 0 0 1px var(--separator-strong);
@@ -1200,6 +1214,7 @@
1200
1214
  transparent
1201
1215
  );
1202
1216
  --material-clear-border: var(--separator-strong);
1217
+ --material-shadow-card: none;
1203
1218
  --material-shadow-panel: inset 0 0 0 1px var(--separator-strong);
1204
1219
  --material-shadow-overlay: inset 0 0 0 1px var(--separator-strong);
1205
1220
  --material-shadow-dialog: inset 0 0 0 1px var(--separator-strong);
@@ -1249,6 +1264,7 @@
1249
1264
  --material-blur-toolbar: 0px;
1250
1265
  --material-blur-overlay: 0px;
1251
1266
  --material-saturation: 1;
1267
+ --material-shadow-card: none;
1252
1268
  --material-shadow-panel: none;
1253
1269
  --material-shadow-overlay: none;
1254
1270
  --material-shadow-dialog: none;
@@ -1316,8 +1332,6 @@
1316
1332
  .moldable-material {
1317
1333
  --material-active-fill: var(--material-regular-fill);
1318
1334
  --material-active-fallback: var(--material-regular-fallback);
1319
- --material-active-border: var(--material-regular-border);
1320
- --material-active-highlight: var(--material-regular-highlight);
1321
1335
  --material-active-blur: var(--material-regular-blur);
1322
1336
  --material-active-saturation: var(--material-regular-saturation);
1323
1337
  --material-active-shadow: none;
@@ -1325,21 +1339,61 @@
1325
1339
  position: relative;
1326
1340
  isolation: isolate;
1327
1341
  background-color: var(--material-active-fallback);
1328
- border-color: var(--material-active-border);
1329
- box-shadow:
1330
- inset 0 1px 0 var(--material-active-highlight),
1331
- var(--material-active-shadow);
1342
+ box-shadow: var(--material-active-shadow);
1332
1343
  }
1333
1344
 
1334
1345
  .moldable-material[data-material='clear'] {
1335
1346
  --material-active-fill: var(--material-clear-fill);
1336
1347
  --material-active-fallback: var(--material-clear-fallback);
1337
- --material-active-border: var(--material-clear-border);
1338
- --material-active-highlight: var(--material-clear-highlight);
1339
1348
  --material-active-blur: var(--material-clear-blur);
1340
1349
  --material-active-saturation: var(--material-clear-saturation);
1341
1350
  }
1342
1351
 
1352
+ .moldable-material[data-material='ultra-thick'] {
1353
+ --material-active-fill: var(--material-ultra-thick-fill);
1354
+ --material-active-fallback: var(--material-ultra-thick-fallback);
1355
+ --material-active-blur: var(--material-standard-blur);
1356
+ --material-active-saturation: 1;
1357
+ }
1358
+
1359
+ .moldable-material[data-material='thick'] {
1360
+ --material-active-fill: var(--material-thick-fill);
1361
+ --material-active-fallback: var(--material-thick-fallback);
1362
+ --material-active-blur: var(--material-standard-blur);
1363
+ --material-active-saturation: 1;
1364
+ }
1365
+
1366
+ .moldable-material[data-material='medium'] {
1367
+ --material-active-fill: var(--material-medium-fill);
1368
+ --material-active-fallback: var(--material-medium-fallback);
1369
+ --material-active-blur: var(--material-standard-blur);
1370
+ --material-active-saturation: 1;
1371
+ }
1372
+
1373
+ .moldable-material[data-material='thin'] {
1374
+ --material-active-fill: var(--material-thin-fill);
1375
+ --material-active-fallback: var(--material-thin-fallback);
1376
+ --material-active-blur: var(--material-standard-blur);
1377
+ --material-active-saturation: 1;
1378
+ }
1379
+
1380
+ .moldable-material[data-material='ultra-thin'] {
1381
+ --material-active-fill: var(--material-ultra-thin-fill);
1382
+ --material-active-fallback: var(--material-ultra-thin-fallback);
1383
+ --material-active-blur: var(--material-standard-blur);
1384
+ --material-active-saturation: 1;
1385
+ }
1386
+
1387
+ :where(
1388
+ [data-slot='button'][data-variant='toolbar'],
1389
+ [data-slot='toolbar-control-group'][data-appearance='chrome']
1390
+ ) {
1391
+ -webkit-backdrop-filter: blur(var(--material-blur-toolbar))
1392
+ saturate(var(--material-saturation));
1393
+ backdrop-filter: blur(var(--material-blur-toolbar))
1394
+ saturate(var(--material-saturation));
1395
+ }
1396
+
1343
1397
  .moldable-material[data-material-elevation='panel'] {
1344
1398
  --material-active-shadow: var(--material-shadow-panel);
1345
1399
  }
@@ -0,0 +1,131 @@
1
+ export type UITheme = 'platform' | 'moldable'
2
+
3
+ export type UIPlatform = 'macos' | 'windows' | 'web'
4
+
5
+ export type UIPlatformVersion = string
6
+
7
+ /**
8
+ * A component recipe can intentionally come from a different versioned
9
+ * platform source than the application's base platform pack.
10
+ *
11
+ * Public names describe the anatomy an app is choosing. The registry below
12
+ * records which immutable platform source defines each recipe.
13
+ */
14
+ export type UISidebarStyle = 'platform' | 'floating' | 'edge-to-edge'
15
+
16
+ export type PlatformPackId = `${UIPlatform}-${string}`
17
+
18
+ export interface UIPlatformPack {
19
+ id: PlatformPackId
20
+ platform: UIPlatform
21
+ version: UIPlatformVersion
22
+ capabilities: {
23
+ nativeMaterials: boolean
24
+ nativeWindowChrome: boolean
25
+ overlayScrollbars: boolean
26
+ }
27
+ }
28
+
29
+ export type UIAppearance = 'light' | 'dark' | 'system'
30
+
31
+ export type ResolvedUIAppearance = Exclude<UIAppearance, 'system'>
32
+
33
+ export type ControlSize = 'mini' | 'small' | 'medium' | 'large' | 'xl'
34
+
35
+ export type LayoutDensity = 'compact' | 'regular' | 'comfortable'
36
+
37
+ export type MaterialThickness =
38
+ | 'ultra-thick'
39
+ | 'thick'
40
+ | 'medium'
41
+ | 'thin'
42
+ | 'ultra-thin'
43
+
44
+ export type MaterialContext = 'content' | 'over-glass'
45
+
46
+ export type ContrastPreference = 'system' | 'standard' | 'increased'
47
+
48
+ export type TransparencyPreference = 'system' | 'standard' | 'reduced'
49
+
50
+ export type MotionPreference = 'system' | 'standard' | 'reduced'
51
+
52
+ export interface UIPreferences {
53
+ contrast?: ContrastPreference
54
+ transparency?: TransparencyPreference
55
+ motion?: MotionPreference
56
+ }
57
+
58
+ export const CONTROL_SIZES = [
59
+ 'mini',
60
+ 'small',
61
+ 'medium',
62
+ 'large',
63
+ 'xl',
64
+ ] as const satisfies readonly ControlSize[]
65
+
66
+ export const MATERIAL_THICKNESSES = [
67
+ 'ultra-thick',
68
+ 'thick',
69
+ 'medium',
70
+ 'thin',
71
+ 'ultra-thin',
72
+ ] as const satisfies readonly MaterialThickness[]
73
+
74
+ export const SIDEBAR_STYLES = {
75
+ platform: {
76
+ id: 'platform',
77
+ sourcePlatform: null,
78
+ sourceVersion: null,
79
+ },
80
+ floating: {
81
+ id: 'floating',
82
+ sourcePlatform: 'macos',
83
+ sourceVersion: '26',
84
+ },
85
+ 'edge-to-edge': {
86
+ id: 'edge-to-edge',
87
+ sourcePlatform: 'macos',
88
+ sourceVersion: '27',
89
+ },
90
+ } as const satisfies Record<
91
+ UISidebarStyle,
92
+ {
93
+ id: UISidebarStyle
94
+ sourcePlatform: UIPlatform | null
95
+ sourceVersion: UIPlatformVersion | null
96
+ }
97
+ >
98
+
99
+ export const PLATFORM_PACKS = {
100
+ 'macos-27': {
101
+ id: 'macos-27',
102
+ platform: 'macos',
103
+ version: '27',
104
+ capabilities: {
105
+ nativeMaterials: true,
106
+ nativeWindowChrome: true,
107
+ overlayScrollbars: true,
108
+ },
109
+ },
110
+ 'web-default': {
111
+ id: 'web-default',
112
+ platform: 'web',
113
+ version: 'default',
114
+ capabilities: {
115
+ nativeMaterials: false,
116
+ nativeWindowChrome: false,
117
+ overlayScrollbars: false,
118
+ },
119
+ },
120
+ } as const satisfies Record<string, UIPlatformPack>
121
+
122
+ export function resolvePlatformPack(
123
+ platform: UIPlatform,
124
+ version: UIPlatformVersion,
125
+ ): UIPlatformPack {
126
+ const exact = Object.values(PLATFORM_PACKS).find(
127
+ (pack) => pack.platform === platform && pack.version === version,
128
+ )
129
+
130
+ return exact ?? PLATFORM_PACKS['web-default']
131
+ }
@@ -0,0 +1,6 @@
1
+ /* Immutable platform packs. */
2
+ @import './macos-27/index.css';
3
+ @import './macos-26/index.css';
4
+
5
+ /* Stable Moldable semantic and brand layer. */
6
+ @import './moldable/index.css';
@@ -0,0 +1,23 @@
1
+ export {
2
+ CONTROL_SIZES,
3
+ MATERIAL_THICKNESSES,
4
+ PLATFORM_PACKS,
5
+ SIDEBAR_STYLES,
6
+ resolvePlatformPack,
7
+ type ContrastPreference,
8
+ type ControlSize,
9
+ type LayoutDensity,
10
+ type MaterialContext,
11
+ type MaterialThickness,
12
+ type MotionPreference,
13
+ type PlatformPackId,
14
+ type ResolvedUIAppearance,
15
+ type TransparencyPreference,
16
+ type UIAppearance,
17
+ type UIPlatform,
18
+ type UIPlatformPack,
19
+ type UIPlatformVersion,
20
+ type UIPreferences,
21
+ type UISidebarStyle,
22
+ type UITheme,
23
+ } from './contracts'
@@ -0,0 +1,37 @@
1
+ # macOS 26 source pack
2
+
3
+ This versioned source is separate from macOS 27 and does not correct or mutate
4
+ that pack. The initial coverage is the inset floating sidebar used by
5
+ Moldable.
6
+
7
+ ## Source
8
+
9
+ - Source: macOS 26.
10
+ - Values only.
11
+ - No source artwork, symbols, vectors, image assets, or font files.
12
+
13
+ ## Composition
14
+
15
+ Applications continue to select a base platform pack normally. A component
16
+ recipe can be selected independently:
17
+
18
+ ```tsx
19
+ <ThemeProvider
20
+ platform="macos"
21
+ platformVersion="27"
22
+ uiTheme="moldable"
23
+ sidebarStyle="floating"
24
+ />
25
+ ```
26
+
27
+ This resolves the general UI from macOS 27 while resolving only the sidebar
28
+ geometry and effects from the immutable macOS 26 source.
29
+
30
+ Use `sidebarStyle="edge-to-edge"` for the macOS 27 anatomy, or
31
+ `sidebarStyle="platform"` to follow the selected base pack.
32
+
33
+ ## Adaptations
34
+
35
+ Intentional web divergences use stable `M26-WEB-{AREA}-{NNN}` identifiers and
36
+ are documented in `web-adaptations.json` and `web-adaptations.md`. Source files
37
+ remain unchanged.