@master/internal-site 0.0.0-stage → 0.1.1

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 (687) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +68 -2
  3. package/dist/astro.d.mts +3 -0
  4. package/dist/astro.mjs +510 -0
  5. package/dist/config.d.mts +69 -0
  6. package/dist/config.mjs +10 -0
  7. package/package.json +384 -4
  8. package/src/astro/Page.astro +12 -0
  9. package/src/astro/content-pages.ts +75 -0
  10. package/src/astro/index.ts +124 -0
  11. package/src/astro/module-id.ts +4 -0
  12. package/src/astro/propagated-assets.ts +29 -0
  13. package/src/astro/route-paths.ts +78 -0
  14. package/src/astro/routes.template.ts +110 -0
  15. package/src/astro/server-styles.ts +26 -0
  16. package/src/astro/site-context.ts +27 -0
  17. package/src/astro/source-url.ts +22 -0
  18. package/src/astro/svelte-renderer.ts +45 -0
  19. package/src/astro/svg-markup.ts +23 -0
  20. package/src/benchmarks/BenchmarkBarRows.astro +34 -0
  21. package/src/benchmarks/BenchmarkBars.astro +14 -0
  22. package/src/benchmarks/BenchmarkChart.astro +53 -0
  23. package/src/benchmarks/BenchmarkChartGroup.astro +24 -0
  24. package/src/benchmarks/BenchmarkDataTable.astro +24 -0
  25. package/src/benchmarks/BenchmarkDelta.astro +23 -0
  26. package/src/benchmarks/BenchmarkFigure.astro +30 -0
  27. package/src/benchmarks/BenchmarkMetricTable.astro +38 -0
  28. package/src/benchmarks/BenchmarkMetrics.astro +23 -0
  29. package/src/benchmarks/BenchmarkSampleSummary.astro +30 -0
  30. package/src/benchmarks/BenchmarkScrollRegion.svelte +27 -0
  31. package/src/benchmarks/BenchmarkSource.astro +20 -0
  32. package/src/benchmarks/BenchmarkStackedBars.astro +54 -0
  33. package/src/benchmarks/BenchmarkStatus.astro +16 -0
  34. package/src/benchmarks/types.ts +98 -0
  35. package/src/benchmarks/utils.ts +42 -0
  36. package/src/blog/BlogAuthors.astro +25 -0
  37. package/src/blog/article/BlogArticleContents.svelte +24 -0
  38. package/src/blog/article/BlogArticleEnd.astro +55 -0
  39. package/src/blog/article/BlogArticleMasthead.astro +61 -0
  40. package/src/blog/article/language.ts +29 -0
  41. package/src/blog/article/neighbors.ts +27 -0
  42. package/src/blog/article/title-lines.astro +14 -0
  43. package/src/blog/article/title-parts.ts +9 -0
  44. package/src/components.d.ts +5 -0
  45. package/src/config.ts +68 -0
  46. package/src/css/ButtonPreview.astro +22 -0
  47. package/src/css/ConfiguredExample.astro +15 -0
  48. package/src/css/NamespaceUtilityTable.astro +50 -0
  49. package/src/css/StylesheetExample.astro +15 -0
  50. package/src/css/ThemeNumberVariableTable.astro +57 -0
  51. package/src/css/configured-example.ts +53 -0
  52. package/src/css/foundation-data/elevation/shadow-data.ts +52 -0
  53. package/src/css/foundation-data/sizing/scale-data.ts +37 -0
  54. package/src/css/foundation-data/specimen-content.ts +10 -0
  55. package/src/css/foundation-data/specimens.ts +96 -0
  56. package/src/css/foundation-data/tokens.ts +32 -0
  57. package/src/css/generate-preset-css.ts +12 -0
  58. package/src/css/highlight.ts +34 -0
  59. package/src/css/manifest-utilities.ts +29 -0
  60. package/src/css/markdown.ts +279 -0
  61. package/src/css/preset-css.ts +15 -0
  62. package/src/css/preset-manifest.ts +3 -0
  63. package/src/css/stylesheet-example.ts +26 -0
  64. package/src/css/theme-variables.ts +74 -0
  65. package/src/css/variable-namespace-sources.ts +20 -0
  66. package/src/demo/Demo.svelte +55 -0
  67. package/src/demo/DemoAsset.astro +38 -0
  68. package/src/demo/DemoAxes.svelte +22 -0
  69. package/src/demo/DemoBadge.svelte +18 -0
  70. package/src/demo/DemoCatalog.astro +36 -0
  71. package/src/demo/DemoComparison.svelte +36 -0
  72. package/src/demo/DemoConfiguredExample.astro +48 -0
  73. package/src/demo/DemoContainer.svelte +48 -0
  74. package/src/demo/DemoControls.svelte +16 -0
  75. package/src/demo/DemoCopyButton.svelte +50 -0
  76. package/src/demo/DemoCopyGroup.svelte +15 -0
  77. package/src/demo/DemoExample.astro +27 -0
  78. package/src/demo/DemoFeatureSupport.svelte +18 -0
  79. package/src/demo/DemoGeneratedCSS.svelte +8 -0
  80. package/src/demo/DemoIndex.astro +23 -0
  81. package/src/demo/DemoInstallation.astro +17 -0
  82. package/src/demo/DemoItem.svelte +17 -0
  83. package/src/demo/DemoLabel.svelte +15 -0
  84. package/src/demo/DemoLegend.svelte +15 -0
  85. package/src/demo/DemoMeasure.svelte +28 -0
  86. package/src/demo/DemoMedia.svelte +43 -0
  87. package/src/demo/DemoMotion.svelte +41 -0
  88. package/src/demo/DemoPageViewport.astro +17 -0
  89. package/src/demo/DemoPalette.astro +29 -0
  90. package/src/demo/DemoPaletteGroups.svelte +15 -0
  91. package/src/demo/DemoScrollArea.svelte +15 -0
  92. package/src/demo/DemoStyleComparison.astro +25 -0
  93. package/src/demo/DemoSurface.svelte +15 -0
  94. package/src/demo/DemoSwatch.svelte +19 -0
  95. package/src/demo/DemoThemeComparison.astro +30 -0
  96. package/src/demo/DemoTokenTable.astro +34 -0
  97. package/src/demo/DemoViewTransition.astro +18 -0
  98. package/src/demo/DemoViewport.svelte +324 -0
  99. package/src/demo/DemoWaterfall.astro +30 -0
  100. package/src/demo/FoundationBreakpoint.astro +12 -0
  101. package/src/demo/ProjectStyleExample.astro +13 -0
  102. package/src/demo/copy-feedback.ts +10 -0
  103. package/src/demo/demo-waterfall.ts +17 -0
  104. package/src/demo/drag-readings.ts +20 -0
  105. package/src/demo/foundations/FoundationAxes.astro +12 -0
  106. package/src/demo/foundations/FoundationColorRoles.astro +5 -0
  107. package/src/demo/foundations/FoundationContainerGrid.astro +24 -0
  108. package/src/demo/foundations/FoundationDialog.astro +14 -0
  109. package/src/demo/foundations/FoundationElevation.astro +5 -0
  110. package/src/demo/foundations/FoundationElevationState.astro +5 -0
  111. package/src/demo/foundations/FoundationHue.astro +5 -0
  112. package/src/demo/foundations/FoundationLines.astro +5 -0
  113. package/src/demo/foundations/FoundationMedia.astro +28 -0
  114. package/src/demo/foundations/FoundationMotion.astro +5 -0
  115. package/src/demo/foundations/FoundationPalette.astro +8 -0
  116. package/src/demo/foundations/FoundationRadius.astro +13 -0
  117. package/src/demo/foundations/FoundationShapes.astro +12 -0
  118. package/src/demo/foundations/FoundationShrink.astro +14 -0
  119. package/src/demo/foundations/FoundationSizing.astro +19 -0
  120. package/src/demo/foundations/FoundationSpecimen.astro +20 -0
  121. package/src/demo/foundations/FoundationSurfaces.astro +5 -0
  122. package/src/demo/foundations/FoundationTextHue.astro +5 -0
  123. package/src/demo/foundations/FoundationTextRoles.astro +5 -0
  124. package/src/demo/foundations/FoundationTokens.astro +22 -0
  125. package/src/demo/foundations/FoundationTokensView.astro +65 -0
  126. package/src/demo/foundations/FoundationTransition.astro +5 -0
  127. package/src/demo/foundations/FoundationTypeComparison.astro +12 -0
  128. package/src/demo/foundations/FoundationTypography.astro +5 -0
  129. package/src/demo/foundations/Palette.svelte +37 -0
  130. package/src/demo/foundations/ShadowScaleDemo.astro +22 -0
  131. package/src/demo/illustration-materials.ts +180 -0
  132. package/src/demo/maintenance-example.ts +62 -0
  133. package/src/demo/playback.ts +75 -0
  134. package/src/demo/project-style-examples.ts +128 -0
  135. package/src/demo/reference/alignment.ts +42 -0
  136. package/src/demo/reference/animations.ts +30 -0
  137. package/src/demo/reference/backgrounds.ts +39 -0
  138. package/src/demo/reference/border-paint.ts +31 -0
  139. package/src/demo/reference/clipping.ts +26 -0
  140. package/src/demo/reference/document.ts +55 -0
  141. package/src/demo/reference/edges.ts +40 -0
  142. package/src/demo/reference/effects.ts +27 -0
  143. package/src/demo/reference/flexbox.ts +33 -0
  144. package/src/demo/reference/frame.css +118 -0
  145. package/src/demo/reference/grid.ts +42 -0
  146. package/src/demo/reference/html.ts +40 -0
  147. package/src/demo/reference/interaction.ts +42 -0
  148. package/src/demo/reference/layout-html.ts +10 -0
  149. package/src/demo/reference/layout.ts +102 -0
  150. package/src/demo/reference/media.ts +29 -0
  151. package/src/demo/reference/positioning.ts +90 -0
  152. package/src/demo/reference/scenes.ts +197 -0
  153. package/src/demo/reference/scrolling.ts +66 -0
  154. package/src/demo/reference/shapes.ts +22 -0
  155. package/src/demo/reference/sizing.ts +43 -0
  156. package/src/demo/reference/source.ts +8 -0
  157. package/src/demo/reference/text-effects.ts +37 -0
  158. package/src/demo/reference/text-flow.ts +41 -0
  159. package/src/demo/reference/transforms.ts +26 -0
  160. package/src/demo/reference/transitions.ts +24 -0
  161. package/src/demo/reference/type-specimens.ts +56 -0
  162. package/src/demo/reference/types.ts +30 -0
  163. package/src/demo/reference/typography.ts +32 -0
  164. package/src/demo/specimens/accent-color.json +50 -0
  165. package/src/demo/specimens/align-items.json +56 -0
  166. package/src/demo/specimens/animation-delay.json +55 -0
  167. package/src/demo/specimens/animation-direction.json +49 -0
  168. package/src/demo/specimens/animation-fill-mode.json +55 -0
  169. package/src/demo/specimens/animation-iteration-count.json +55 -0
  170. package/src/demo/specimens/animation-play-state.json +83 -0
  171. package/src/demo/specimens/animation-timing-function.json +48 -0
  172. package/src/demo/specimens/appearance.json +44 -0
  173. package/src/demo/specimens/aspect-ratio.json +28 -0
  174. package/src/demo/specimens/backdrop-filter.json +44 -0
  175. package/src/demo/specimens/background-attachment.json +49 -0
  176. package/src/demo/specimens/background-image.json +25 -0
  177. package/src/demo/specimens/background-origin.json +36 -0
  178. package/src/demo/specimens/background-size.json +29 -0
  179. package/src/demo/specimens/border-collapse.json +45 -0
  180. package/src/demo/specimens/border-color.json +35 -0
  181. package/src/demo/specimens/border-image-repeat.json +50 -0
  182. package/src/demo/specimens/border-image-slice.json +45 -0
  183. package/src/demo/specimens/border-radius.json +30 -0
  184. package/src/demo/specimens/box-decoration-break.json +35 -0
  185. package/src/demo/specimens/box-shadow.json +33 -0
  186. package/src/demo/specimens/clear.json +77 -0
  187. package/src/demo/specimens/clip-path.json +38 -0
  188. package/src/demo/specimens/content.json +27 -0
  189. package/src/demo/specimens/counter-set.json +31 -0
  190. package/src/demo/specimens/fill.json +23 -0
  191. package/src/demo/specimens/filter.json +23 -0
  192. package/src/demo/specimens/flex-direction.json +27 -0
  193. package/src/demo/specimens/flex-grow.json +27 -0
  194. package/src/demo/specimens/font-style.json +23 -0
  195. package/src/demo/specimens/font-variant-numeric.json +28 -0
  196. package/src/demo/specimens/grid-auto-columns.json +29 -0
  197. package/src/demo/specimens/grid-auto-flow.json +37 -0
  198. package/src/demo/specimens/grid-template-areas.json +34 -0
  199. package/src/demo/specimens/grid-template-columns.json +36 -0
  200. package/src/demo/specimens/isolation.json +25 -0
  201. package/src/demo/specimens/justify-content.json +36 -0
  202. package/src/demo/specimens/line-height.json +28 -0
  203. package/src/demo/specimens/list-style-position.json +36 -0
  204. package/src/demo/specimens/mask-image.json +54 -0
  205. package/src/demo/specimens/min-width.json +39 -0
  206. package/src/demo/specimens/mix-blend-mode.json +43 -0
  207. package/src/demo/specimens/object-fit.json +27 -0
  208. package/src/demo/specimens/object-position.json +27 -0
  209. package/src/demo/specimens/opacity.json +37 -0
  210. package/src/demo/specimens/order.json +28 -0
  211. package/src/demo/specimens/overflow-wrap.json +26 -0
  212. package/src/demo/specimens/overflow.json +53 -0
  213. package/src/demo/specimens/overscroll-behavior.json +29 -0
  214. package/src/demo/specimens/padding.json +84 -0
  215. package/src/demo/specimens/place-content.json +31 -0
  216. package/src/demo/specimens/pointer-events.json +46 -0
  217. package/src/demo/specimens/position.json +29 -0
  218. package/src/demo/specimens/resize.json +32 -0
  219. package/src/demo/specimens/screen-readers.json +37 -0
  220. package/src/demo/specimens/scroll-padding.json +29 -0
  221. package/src/demo/specimens/scroll-snap-stop.json +33 -0
  222. package/src/demo/specimens/shape-image-threshold.json +37 -0
  223. package/src/demo/specimens/shape-margin.json +40 -0
  224. package/src/demo/specimens/shape-outside.json +37 -0
  225. package/src/demo/specimens/stroke-width.json +27 -0
  226. package/src/demo/specimens/text-fill-color.json +23 -0
  227. package/src/demo/specimens/text-stroke-width.json +32 -0
  228. package/src/demo/specimens/touch-action.json +45 -0
  229. package/src/demo/specimens/transform-box.json +37 -0
  230. package/src/demo/specimens/transform-origin.json +56 -0
  231. package/src/demo/specimens/transform-style.json +55 -0
  232. package/src/demo/specimens/transform.json +47 -0
  233. package/src/demo/specimens/transition-delay.json +57 -0
  234. package/src/demo/specimens/transition-duration.json +60 -0
  235. package/src/demo/specimens/transition-property.json +60 -0
  236. package/src/demo/specimens/transition-timing-function.json +65 -0
  237. package/src/demo/specimens/user-drag.json +28 -0
  238. package/src/demo/specimens/user-select.json +25 -0
  239. package/src/demo/specimens/vertical-align.json +28 -0
  240. package/src/demo/specimens/width.json +56 -0
  241. package/src/demo/specimens/will-change.json +50 -0
  242. package/src/demo/specimens/writing-mode.json +26 -0
  243. package/src/demo/specimens/z-index.json +35 -0
  244. package/src/demo/style.ts +15 -0
  245. package/src/demo/tone.ts +4 -0
  246. package/src/demo/useDemoViewTransition.svelte.ts +71 -0
  247. package/src/docs-shell/common/i18n.config.d.ts +2 -0
  248. package/src/docs-shell/common/i18n.config.js +13 -0
  249. package/src/docs-shell/common/svgo.config.d.ts +2 -0
  250. package/src/docs-shell/common/svgo.config.js +11 -0
  251. package/src/docs-shell/components/ArticleHeader.astro +65 -0
  252. package/src/docs-shell/components/ArticleTOC.astro +18 -0
  253. package/src/docs-shell/components/Callout.astro +26 -0
  254. package/src/docs-shell/components/Code.astro +25 -0
  255. package/src/docs-shell/components/CodeCopyButton.astro +25 -0
  256. package/src/docs-shell/components/CodeTabBar.astro +40 -0
  257. package/src/docs-shell/components/CodeTabs.astro +53 -0
  258. package/src/docs-shell/components/CodeView.astro +23 -0
  259. package/src/docs-shell/components/Do.astro +5 -0
  260. package/src/docs-shell/components/DoNot.astro +5 -0
  261. package/src/docs-shell/components/DocArticle.astro +14 -0
  262. package/src/docs-shell/components/DocHeader.svelte +93 -0
  263. package/src/docs-shell/components/DocHeading.astro +28 -0
  264. package/src/docs-shell/components/DocMain.astro +19 -0
  265. package/src/docs-shell/components/DocMenuButton.svelte +96 -0
  266. package/src/docs-shell/components/DocSidebar.svelte +62 -0
  267. package/src/docs-shell/components/DocVersionSelect.svelte +22 -0
  268. package/src/docs-shell/components/DocWrapper.astro +11 -0
  269. package/src/docs-shell/components/DocumentAPIIndex.astro +24 -0
  270. package/src/docs-shell/components/DocumentChoices.astro +24 -0
  271. package/src/docs-shell/components/DocumentCodeExample.astro +20 -0
  272. package/src/docs-shell/components/DocumentCodeExampleView.astro +35 -0
  273. package/src/docs-shell/components/DocumentCodeTable.astro +19 -0
  274. package/src/docs-shell/components/DocumentComparison.astro +7 -0
  275. package/src/docs-shell/components/DocumentCopyButton.svelte +41 -0
  276. package/src/docs-shell/components/DocumentDeclaration.astro +17 -0
  277. package/src/docs-shell/components/DocumentDeclarationView.astro +12 -0
  278. package/src/docs-shell/components/DocumentDisclosure.astro +14 -0
  279. package/src/docs-shell/components/DocumentFileTree.astro +34 -0
  280. package/src/docs-shell/components/DocumentFlow.astro +27 -0
  281. package/src/docs-shell/components/DocumentIdentifier.astro +14 -0
  282. package/src/docs-shell/components/DocumentIllustration.astro +46 -0
  283. package/src/docs-shell/components/DocumentKeyList.astro +22 -0
  284. package/src/docs-shell/components/DocumentNamespaceTable.astro +20 -0
  285. package/src/docs-shell/components/DocumentOptionEntry.astro +15 -0
  286. package/src/docs-shell/components/DocumentOptionList.astro +11 -0
  287. package/src/docs-shell/components/DocumentOptions.astro +23 -0
  288. package/src/docs-shell/components/DocumentParameters.astro +30 -0
  289. package/src/docs-shell/components/DocumentPrompt.astro +16 -0
  290. package/src/docs-shell/components/DocumentValueList.astro +25 -0
  291. package/src/docs-shell/components/DocumentationIndex.svelte +144 -0
  292. package/src/docs-shell/components/Dropped.astro +21 -0
  293. package/src/docs-shell/components/ExpandContent.svelte +21 -0
  294. package/src/docs-shell/components/ExplorerView.astro +37 -0
  295. package/src/docs-shell/components/FileIcon.astro +123 -0
  296. package/src/docs-shell/components/Footer.svelte +80 -0
  297. package/src/docs-shell/components/GeneratedCSS.astro +8 -0
  298. package/src/docs-shell/components/Header.svelte +121 -0
  299. package/src/docs-shell/components/HeaderIcon.astro +14 -0
  300. package/src/docs-shell/components/HeaderNav.svelte +20 -0
  301. package/src/docs-shell/components/Image.svelte +56 -0
  302. package/src/docs-shell/components/Info.astro +5 -0
  303. package/src/docs-shell/components/InlineCode.astro +30 -0
  304. package/src/docs-shell/components/InteractingIndicator.astro +19 -0
  305. package/src/docs-shell/components/LanguageButton.svelte +18 -0
  306. package/src/docs-shell/components/LanguageSelect.svelte +44 -0
  307. package/src/docs-shell/components/Link.svelte +127 -0
  308. package/src/docs-shell/components/ModeImg.astro +11 -0
  309. package/src/docs-shell/components/NotFound.astro +21 -0
  310. package/src/docs-shell/components/OverviewButtons.astro +36 -0
  311. package/src/docs-shell/components/PMAction.astro +25 -0
  312. package/src/docs-shell/components/PackageBadges.astro +39 -0
  313. package/src/docs-shell/components/PageContent.svelte +38 -0
  314. package/src/docs-shell/components/PageContentBootstrap.astro +13 -0
  315. package/src/docs-shell/components/PageContentDisclosure.astro +25 -0
  316. package/src/docs-shell/components/PageContentList.svelte +70 -0
  317. package/src/docs-shell/components/PageContentProvider.svelte +15 -0
  318. package/src/docs-shell/components/PageContentTitle.svelte +16 -0
  319. package/src/docs-shell/components/PageNavs.astro +40 -0
  320. package/src/docs-shell/components/PreparedCodeView.astro +12 -0
  321. package/src/docs-shell/components/RenderNode.astro +16 -0
  322. package/src/docs-shell/components/RouteLayers.astro +17 -0
  323. package/src/docs-shell/components/SearchButton.svelte +31 -0
  324. package/src/docs-shell/components/SearchDialog.svelte +174 -0
  325. package/src/docs-shell/components/Segments.svelte +62 -0
  326. package/src/docs-shell/components/Step.astro +13 -0
  327. package/src/docs-shell/components/StepL.astro +10 -0
  328. package/src/docs-shell/components/StepR.astro +10 -0
  329. package/src/docs-shell/components/StepSection.astro +12 -0
  330. package/src/docs-shell/components/Tab.astro +8 -0
  331. package/src/docs-shell/components/Tabs.astro +10 -0
  332. package/src/docs-shell/components/ThemeIcon.astro +19 -0
  333. package/src/docs-shell/components/ThemeSelect.svelte +20 -0
  334. package/src/docs-shell/components/TimeAgo.svelte +32 -0
  335. package/src/docs-shell/components/Translate.astro +14 -0
  336. package/src/docs-shell/components/Warn.astro +5 -0
  337. package/src/docs-shell/components/code-props.ts +28 -0
  338. package/src/docs-shell/components/document-types.ts +119 -0
  339. package/src/docs-shell/components/markdown/Anchor.astro +5 -0
  340. package/src/docs-shell/components/markdown/Heading2.astro +5 -0
  341. package/src/docs-shell/components/markdown/Heading3.astro +5 -0
  342. package/src/docs-shell/components/markdown/Table.astro +6 -0
  343. package/src/docs-shell/components/markdown-components.ts +36 -0
  344. package/src/docs-shell/components/page-content-bootstrap.ts +115 -0
  345. package/src/docs-shell/components/page-content.svelte.ts +125 -0
  346. package/src/docs-shell/contexts/search.ts +18 -0
  347. package/src/docs-shell/contexts/theme-mode.svelte.ts +61 -0
  348. package/src/docs-shell/data/authors.ts +17 -0
  349. package/src/docs-shell/data/base-colors.ts +29 -0
  350. package/src/docs-shell/data/brands.ts +79 -0
  351. package/src/docs-shell/data/color-names.ts +1 -0
  352. package/src/docs-shell/data/color-palette.ts +50 -0
  353. package/src/docs-shell/data/colors.ts +1 -0
  354. package/src/docs-shell/factories/Page.astro +35 -0
  355. package/src/docs-shell/factories/create-page.ts +31 -0
  356. package/src/docs-shell/layouts/BlogArticle.astro +53 -0
  357. package/src/docs-shell/layouts/Doc.astro +41 -0
  358. package/src/docs-shell/remark/markdown-components.d.ts +2 -0
  359. package/src/docs-shell/remark/markdown-components.js +101 -0
  360. package/src/docs-shell/remark/slug-and-toc.d.ts +2 -0
  361. package/src/docs-shell/remark/slug-and-toc.js +53 -0
  362. package/src/docs-shell/scripts/code-tabs-bootstrap.ts +34 -0
  363. package/src/docs-shell/scripts/code.ts +124 -0
  364. package/src/docs-shell/scripts/document-anchor.ts +57 -0
  365. package/src/docs-shell/scripts/document.ts +47 -0
  366. package/src/docs-shell/site.ts +67 -0
  367. package/src/docs-shell/types/IllustrationImages.ts +2 -0
  368. package/src/docs-shell/types/Metadata.ts +17 -0
  369. package/src/docs-shell/types/Props.ts +9 -0
  370. package/src/docs-shell/types/StaticImage.ts +6 -0
  371. package/src/docs-shell/uses/use-selected-preview-syntax.svelte.ts +16 -0
  372. package/src/docs-shell/utils/anchor.ts +24 -0
  373. package/src/docs-shell/utils/beautify-css.ts +14 -0
  374. package/src/docs-shell/utils/beautify-html.ts +12 -0
  375. package/src/docs-shell/utils/beautify-js.ts +9 -0
  376. package/src/docs-shell/utils/create-highlighter.ts +50 -0
  377. package/src/docs-shell/utils/css-modern-grammar.ts +339 -0
  378. package/src/docs-shell/utils/documentation-search.ts +68 -0
  379. package/src/docs-shell/utils/generate-metadata.ts +60 -0
  380. package/src/docs-shell/utils/group-page-content.ts +10 -0
  381. package/src/docs-shell/utils/head.ts +72 -0
  382. package/src/docs-shell/utils/highlight-code-core.ts +146 -0
  383. package/src/docs-shell/utils/highlight-code.ts +1 -0
  384. package/src/docs-shell/utils/highlighted-code-text.ts +27 -0
  385. package/src/docs-shell/utils/i18n-pathname.ts +98 -0
  386. package/src/docs-shell/utils/i18n.ts +12 -0
  387. package/src/docs-shell/utils/is-date-within-seven-days.ts +16 -0
  388. package/src/docs-shell/utils/isBrowser.ts +1 -0
  389. package/src/docs-shell/utils/isInteractOutside.ts +16 -0
  390. package/src/docs-shell/utils/markdown-tree.ts +22 -0
  391. package/src/docs-shell/utils/metadata.ts +25 -0
  392. package/src/docs-shell/utils/prepared-code.ts +21 -0
  393. package/src/docs-shell/utils/resolve-heading.d.ts +1 -0
  394. package/src/docs-shell/utils/resolve-heading.js +19 -0
  395. package/src/docs-shell/utils/search-pages.ts +271 -0
  396. package/src/docs-shell/utils/slot-text.ts +15 -0
  397. package/src/docs-shell/utils/snackbar.ts +39 -0
  398. package/src/docs-shell/utils/syntax-theme.ts +53 -0
  399. package/src/docs-shell/utils/transformer-notation-word-mark.ts +146 -0
  400. package/src/docs-shell/utils/unique-id.ts +11 -0
  401. package/src/examples/article-transitions/page.astro +7 -0
  402. package/src/examples/article-transitions/transitions.css +10 -0
  403. package/src/examples/components/ArticleTransitionScene.svelte +83 -0
  404. package/src/examples/components/ViewTransitionScene.svelte +31 -0
  405. package/src/examples/images/article-aurora.jpg +0 -0
  406. package/src/examples/images/article-coast.jpg +0 -0
  407. package/src/examples/images/article-grid.jpg +0 -0
  408. package/src/examples/images/article-studio.jpg +0 -0
  409. package/src/examples/layout-system/page.astro +59 -0
  410. package/src/examples/scene.css +3 -0
  411. package/src/examples/view-transitions/page.astro +7 -0
  412. package/src/examples/view-transitions/transitions.css +9 -0
  413. package/src/home/HeroCanvas.svelte +617 -0
  414. package/src/home/HomeAction.astro +17 -0
  415. package/src/home/HomeBentoFrame.astro +9 -0
  416. package/src/home/HomeBentoGrid.astro +9 -0
  417. package/src/home/HomeCompactIcon.astro +15 -0
  418. package/src/home/HomeFooter.svelte +63 -0
  419. package/src/home/HomeIllustration.astro +17 -0
  420. package/src/home/HomeIllustrationArt.svelte +15 -0
  421. package/src/home/HomeLamp.svelte +18 -0
  422. package/src/home/design.css +532 -0
  423. package/src/home/footer.css +225 -0
  424. package/src/home/hero-shaders.ts +460 -0
  425. package/src/home/hero-title-mask.ts +175 -0
  426. package/src/home/hero.css +547 -0
  427. package/src/home/home-illustration.ts +5 -0
  428. package/src/home/home-lamp.ts +225 -0
  429. package/src/home/home.css +1081 -0
  430. package/src/home/icons/agent-check-preview-apply.svg +24 -0
  431. package/src/home/icons/agent-clients.svg +26 -0
  432. package/src/home/icons/agent-project-tools.svg +23 -0
  433. package/src/home/icons/artwork/agent-check-preview-apply-dark.webp +0 -0
  434. package/src/home/icons/artwork/agent-check-preview-apply-light.webp +0 -0
  435. package/src/home/icons/artwork/agent-clients-dark.webp +0 -0
  436. package/src/home/icons/artwork/agent-clients-light.webp +0 -0
  437. package/src/home/icons/artwork/agent-edit-file-dark.webp +0 -0
  438. package/src/home/icons/artwork/agent-edit-file-light.webp +0 -0
  439. package/src/home/icons/artwork/agent-project-tools-dark.webp +0 -0
  440. package/src/home/icons/artwork/agent-project-tools-light.webp +0 -0
  441. package/src/home/icons/artwork/design-cascade-layers-dark.webp +0 -0
  442. package/src/home/icons/artwork/design-cascade-layers-light.webp +0 -0
  443. package/src/home/icons/artwork/design-layout-motion-dark.webp +0 -0
  444. package/src/home/icons/artwork/design-layout-motion-light.webp +0 -0
  445. package/src/home/icons/artwork/design-p3-gamut-dark.webp +0 -0
  446. package/src/home/icons/artwork/design-p3-gamut-light.webp +0 -0
  447. package/src/home/icons/artwork/design-theme-modes-dark.webp +0 -0
  448. package/src/home/icons/artwork/design-theme-modes-light.webp +0 -0
  449. package/src/home/icons/artwork/design-theme-tokens-dark.webp +0 -0
  450. package/src/home/icons/artwork/design-theme-tokens-light.webp +0 -0
  451. package/src/home/icons/artwork/editor-color-tools-dark.webp +0 -0
  452. package/src/home/icons/artwork/editor-color-tools-light.webp +0 -0
  453. package/src/home/icons/artwork/editor-focused-highlighting-dark.webp +0 -0
  454. package/src/home/icons/artwork/editor-focused-highlighting-light.webp +0 -0
  455. package/src/home/icons/artwork/editor-hover-inspection-dark.webp +0 -0
  456. package/src/home/icons/artwork/editor-hover-inspection-light.webp +0 -0
  457. package/src/home/icons/artwork/editor-manifest-completions-dark.webp +0 -0
  458. package/src/home/icons/artwork/editor-manifest-completions-light.webp +0 -0
  459. package/src/home/icons/artwork/lint-class-order-dark.webp +0 -0
  460. package/src/home/icons/artwork/lint-class-order-light.webp +0 -0
  461. package/src/home/icons/artwork/lint-conflicting-classes-dark.webp +0 -0
  462. package/src/home/icons/artwork/lint-conflicting-classes-light.webp +0 -0
  463. package/src/home/icons/artwork/lint-fix-previews-dark.webp +0 -0
  464. package/src/home/icons/artwork/lint-fix-previews-light.webp +0 -0
  465. package/src/home/icons/artwork/lint-invalid-classes-dark.webp +0 -0
  466. package/src/home/icons/artwork/lint-invalid-classes-light.webp +0 -0
  467. package/src/home/icons/artwork/lint-strict-vocabulary-dark.webp +0 -0
  468. package/src/home/icons/artwork/lint-strict-vocabulary-light.webp +0 -0
  469. package/src/home/icons/artwork/lint-theme-tokens-dark.webp +0 -0
  470. package/src/home/icons/artwork/lint-theme-tokens-light.webp +0 -0
  471. package/src/home/icons/artwork/mcp-apply-preview-dark.webp +0 -0
  472. package/src/home/icons/artwork/mcp-apply-preview-light.webp +0 -0
  473. package/src/home/icons/artwork/mcp-css-compare-dark.webp +0 -0
  474. package/src/home/icons/artwork/mcp-css-compare-light.webp +0 -0
  475. package/src/home/icons/artwork/mcp-inspect-class-dark.webp +0 -0
  476. package/src/home/icons/artwork/mcp-inspect-class-light.webp +0 -0
  477. package/src/home/icons/artwork/mcp-lint-project-dark.webp +0 -0
  478. package/src/home/icons/artwork/mcp-lint-project-light.webp +0 -0
  479. package/src/home/icons/artwork/mcp-manifest-query-dark.webp +0 -0
  480. package/src/home/icons/artwork/mcp-manifest-query-light.webp +0 -0
  481. package/src/home/icons/artwork/mcp-preview-fixes-dark.webp +0 -0
  482. package/src/home/icons/artwork/mcp-preview-fixes-light.webp +0 -0
  483. package/src/home/icons/artwork/mcp-render-css-dark.webp +0 -0
  484. package/src/home/icons/artwork/mcp-render-css-light.webp +0 -0
  485. package/src/home/icons/artwork/mcp-scan-project-dark.webp +0 -0
  486. package/src/home/icons/artwork/mcp-scan-project-light.webp +0 -0
  487. package/src/home/icons/artwork/mcp-trace-class-dark.webp +0 -0
  488. package/src/home/icons/artwork/mcp-trace-class-light.webp +0 -0
  489. package/src/home/icons/artwork/render-progressive-dark.webp +0 -0
  490. package/src/home/icons/artwork/render-progressive-light.webp +0 -0
  491. package/src/home/icons/artwork/render-runtime-dark.webp +0 -0
  492. package/src/home/icons/artwork/render-runtime-light.webp +0 -0
  493. package/src/home/icons/artwork/render-static-dark.webp +0 -0
  494. package/src/home/icons/artwork/render-static-light.webp +0 -0
  495. package/src/home/icons/artwork/section-ai-agents-dark.webp +0 -0
  496. package/src/home/icons/artwork/section-ai-agents-light.webp +0 -0
  497. package/src/home/icons/artwork/section-css-size-dark.webp +0 -0
  498. package/src/home/icons/artwork/section-css-size-light.webp +0 -0
  499. package/src/home/icons/artwork/section-design-system-dark.webp +0 -0
  500. package/src/home/icons/artwork/section-design-system-light.webp +0 -0
  501. package/src/home/icons/artwork/section-editor-dark.webp +0 -0
  502. package/src/home/icons/artwork/section-editor-light.webp +0 -0
  503. package/src/home/icons/artwork/section-lint-dark.webp +0 -0
  504. package/src/home/icons/artwork/section-lint-light.webp +0 -0
  505. package/src/home/icons/artwork/section-rendering-dark.webp +0 -0
  506. package/src/home/icons/artwork/section-rendering-light.webp +0 -0
  507. package/src/home/icons/artwork/section-workflow-dark.webp +0 -0
  508. package/src/home/icons/artwork/section-workflow-light.webp +0 -0
  509. package/src/home/icons/artwork/source.json +303 -0
  510. package/src/home/icons/artwork/workflow-integrations-dark.webp +0 -0
  511. package/src/home/icons/artwork/workflow-integrations-light.webp +0 -0
  512. package/src/home/icons/artwork/workflow-monorepo-dark.webp +0 -0
  513. package/src/home/icons/artwork/workflow-monorepo-light.webp +0 -0
  514. package/src/home/icons/artwork/workflow-route-styles-dark.webp +0 -0
  515. package/src/home/icons/artwork/workflow-route-styles-light.webp +0 -0
  516. package/src/home/icons/artwork/workflow-trace-change-dark.webp +0 -0
  517. package/src/home/icons/artwork/workflow-trace-change-light.webp +0 -0
  518. package/src/home/icons/artwork.css +4 -0
  519. package/src/home/icons/artwork.ts +131 -0
  520. package/src/home/icons/catalog.ts +381 -0
  521. package/src/home/icons/design-cascade-layers.svg +32 -0
  522. package/src/home/icons/design-layout-motion.svg +16 -0
  523. package/src/home/icons/design-p3-gamut.svg +12 -0
  524. package/src/home/icons/design-theme-modes.svg +12 -0
  525. package/src/home/icons/design-theme-tokens.svg +20 -0
  526. package/src/home/icons/editor-color-tools.svg +18 -0
  527. package/src/home/icons/editor-focused-highlighting.svg +15 -0
  528. package/src/home/icons/editor-hover-inspection.svg +19 -0
  529. package/src/home/icons/editor-manifest-completions.svg +24 -0
  530. package/src/home/icons/lint-class-order-compact.svg +15 -0
  531. package/src/home/icons/lint-class-order.svg +28 -0
  532. package/src/home/icons/lint-conflicting-classes-compact.svg +11 -0
  533. package/src/home/icons/lint-conflicting-classes.svg +24 -0
  534. package/src/home/icons/lint-fix-previews-compact.svg +9 -0
  535. package/src/home/icons/lint-fix-previews.svg +19 -0
  536. package/src/home/icons/lint-invalid-classes-compact.svg +7 -0
  537. package/src/home/icons/lint-invalid-classes.svg +17 -0
  538. package/src/home/icons/lint-strict-vocabulary-compact.svg +8 -0
  539. package/src/home/icons/lint-strict-vocabulary.svg +16 -0
  540. package/src/home/icons/lint-theme-tokens-compact.svg +7 -0
  541. package/src/home/icons/lint-theme-tokens.svg +14 -0
  542. package/src/home/icons/mcp-apply-preview-compact.svg +9 -0
  543. package/src/home/icons/mcp-apply-preview.svg +18 -0
  544. package/src/home/icons/mcp-css-compare-compact.svg +9 -0
  545. package/src/home/icons/mcp-css-compare.svg +20 -0
  546. package/src/home/icons/mcp-inspect-class-compact.svg +9 -0
  547. package/src/home/icons/mcp-inspect-class.svg +18 -0
  548. package/src/home/icons/mcp-lint-project-compact.svg +14 -0
  549. package/src/home/icons/mcp-lint-project.svg +30 -0
  550. package/src/home/icons/mcp-manifest-query-compact.svg +14 -0
  551. package/src/home/icons/mcp-manifest-query.svg +27 -0
  552. package/src/home/icons/mcp-preview-fixes-compact.svg +9 -0
  553. package/src/home/icons/mcp-preview-fixes.svg +15 -0
  554. package/src/home/icons/mcp-render-css-compact.svg +13 -0
  555. package/src/home/icons/mcp-render-css.svg +30 -0
  556. package/src/home/icons/mcp-scan-project-compact.svg +7 -0
  557. package/src/home/icons/mcp-scan-project.svg +13 -0
  558. package/src/home/icons/mcp-trace-class-compact.svg +11 -0
  559. package/src/home/icons/mcp-trace-class.svg +24 -0
  560. package/src/home/icons/render-progressive.svg +17 -0
  561. package/src/home/icons/render-runtime.svg +23 -0
  562. package/src/home/icons/render-static.svg +29 -0
  563. package/src/home/icons/section-ai-agents.svg +24 -0
  564. package/src/home/icons/section-css-size.svg +13 -0
  565. package/src/home/icons/section-design-system.svg +24 -0
  566. package/src/home/icons/section-editor.svg +14 -0
  567. package/src/home/icons/section-lint.svg +14 -0
  568. package/src/home/icons/section-rendering.svg +30 -0
  569. package/src/home/icons/section-workflow.svg +22 -0
  570. package/src/home/icons/workflow-integrations.svg +15 -0
  571. package/src/home/icons/workflow-monorepo.svg +27 -0
  572. package/src/home/icons/workflow-route-styles.svg +24 -0
  573. package/src/home/icons/workflow-trace-change.svg +21 -0
  574. package/src/layouts/Document.astro +71 -0
  575. package/src/public/brand/v2/logo/mark/master-mark-small-on-dark.svg +1 -0
  576. package/src/public/brand/v2/logo/master-css/master-css-horizontal-on-dark.svg +1 -0
  577. package/src/public/brand/v2/logo/master-css/master-css-horizontal-on-light.svg +1 -0
  578. package/src/public/demo/border-grid.svg +7 -0
  579. package/src/public/demo/landscape.svg +1 -0
  580. package/src/public/demo/marker.svg +1 -0
  581. package/src/public/demo/mask.svg +1 -0
  582. package/src/public/fonts/Geist-Medium.ttf +0 -0
  583. package/src/public/fonts/Geist-Regular.ttf +0 -0
  584. package/src/public/fonts/GeistVariable.woff2 +0 -0
  585. package/src/public/fonts/IBMPlexMono-Bold.woff2 +0 -0
  586. package/src/public/fonts/IBMPlexMono-Medium.woff2 +0 -0
  587. package/src/public/fonts/IBMPlexMono-Regular.woff2 +0 -0
  588. package/src/public/fonts/IBMPlexMono-SemiBold.woff2 +0 -0
  589. package/src/public/fonts/index.css +40 -0
  590. package/src/public/icons/csharp.svg +1 -0
  591. package/src/public/icons/css.svg +1 -0
  592. package/src/public/icons/eslint.svg +1 -0
  593. package/src/public/icons/folder.svg +12 -0
  594. package/src/public/icons/html.svg +1 -0
  595. package/src/public/icons/php.svg +1 -0
  596. package/src/public/icons/sass.svg +1 -0
  597. package/src/public/icons/storybook.svg +1 -0
  598. package/src/public/icons/visualstudiocode.svg +41 -0
  599. package/src/public/images/authors/aron.jpg +0 -0
  600. package/src/public/images/authors/benseage.jpg +0 -0
  601. package/src/public/images/authors/joy.jpg +0 -0
  602. package/src/public/images/authors/lola.jpg +0 -0
  603. package/src/public/images/authors/miles.jpg +0 -0
  604. package/src/public/images/bootstrap.svg +23 -0
  605. package/src/public/images/build-tools/rsbuild.svg +1 -0
  606. package/src/public/images/build-tools/rspack.svg +1 -0
  607. package/src/public/images/build-tools/vite.svg +15 -0
  608. package/src/public/images/build-tools/webpack.svg +10 -0
  609. package/src/public/images/cdns/esm-sh.svg +1 -0
  610. package/src/public/images/chevron-left.svg +4 -0
  611. package/src/public/images/cover-bg.jpg +0 -0
  612. package/src/public/images/emotion.svg +1 -0
  613. package/src/public/images/frameworks/angular.svg +29 -0
  614. package/src/public/images/frameworks/astro.svg +4 -0
  615. package/src/public/images/frameworks/blazor.svg +22 -0
  616. package/src/public/images/frameworks/express.svg +1 -0
  617. package/src/public/images/frameworks/laravel.svg +8 -0
  618. package/src/public/images/frameworks/line-liff.svg +1 -0
  619. package/src/public/images/frameworks/lit.svg +1 -0
  620. package/src/public/images/frameworks/nextjs.svg +16 -0
  621. package/src/public/images/frameworks/nuxtjs.svg +3 -0
  622. package/src/public/images/frameworks/rails.svg +1 -0
  623. package/src/public/images/frameworks/react.svg +8 -0
  624. package/src/public/images/frameworks/remix.svg +5 -0
  625. package/src/public/images/frameworks/shopify.svg +1 -0
  626. package/src/public/images/frameworks/svelte.svg +6 -0
  627. package/src/public/images/frameworks/tanstack.svg +1 -0
  628. package/src/public/images/frameworks/vuejs.svg +11 -0
  629. package/src/public/images/frameworks/wordpress.svg +1 -0
  630. package/src/public/images/mui.svg +1 -0
  631. package/src/public/images/styled-components.svg +4 -0
  632. package/src/public/images/tailwindcss.svg +1 -0
  633. package/src/scripts/bundler-imports.ts +25 -0
  634. package/src/scripts/static-social.ts +333 -0
  635. package/src/scripts/write-if-changed.ts +26 -0
  636. package/src/sections/blog.astro +11 -0
  637. package/src/sections/design-system.astro +14 -0
  638. package/src/sections/document.astro +8 -0
  639. package/src/sections/examples.astro +6 -0
  640. package/src/sections/guide.astro +26 -0
  641. package/src/sections/home.astro +7 -0
  642. package/src/sections/page.astro +12 -0
  643. package/src/styles/base.css +57 -0
  644. package/src/styles/benchmarks.css +20 -0
  645. package/src/styles/blog-article.css +670 -0
  646. package/src/styles/blog-materials.css +399 -0
  647. package/src/styles/blog.css +568 -0
  648. package/src/styles/demo.css +30 -0
  649. package/src/styles/design-system.css +15 -0
  650. package/src/styles/docs-shell/code.css +61 -0
  651. package/src/styles/docs-shell/docs.css +79 -0
  652. package/src/styles/docs-shell/documentation-search.css +42 -0
  653. package/src/styles/docs-shell/footer.css +38 -0
  654. package/src/styles/docs-shell/header.css +73 -0
  655. package/src/styles/docs-shell/materials.css +25 -0
  656. package/src/styles/docs-shell/menu.css +19 -0
  657. package/src/styles/docs-shell/not-found.css +10 -0
  658. package/src/styles/docs-shell/page-content.css +37 -0
  659. package/src/styles/docs-shell/prose.css +89 -0
  660. package/src/styles/docs-shell/segments.css +13 -0
  661. package/src/styles/docs-shell/steps.css +39 -0
  662. package/src/styles/docs-shell/syntax-theme.css +18 -0
  663. package/src/styles/docs-shell/theme.css +68 -0
  664. package/src/styles/docs-shell/wrapper.css +10 -0
  665. package/src/styles/document-comparison.css +7 -0
  666. package/src/styles/documentation-illustration.css +34 -0
  667. package/src/styles/documentation-index.css +100 -0
  668. package/src/styles/documents.css +4 -0
  669. package/src/styles/documents.ts +2 -0
  670. package/src/styles/foundation.css +4 -0
  671. package/src/styles/globals.css +2 -0
  672. package/src/styles/interface.css +3 -0
  673. package/src/styles/interface.ts +2 -0
  674. package/src/styles/site.ts +2 -0
  675. package/src/styles/system/DESIGN.md +108 -0
  676. package/src/styles/system/buttons.css +51 -0
  677. package/src/styles/system/code.css +85 -0
  678. package/src/styles/system/controls.css +110 -0
  679. package/src/styles/system/data.css +134 -0
  680. package/src/styles/system/mixins.css +7 -0
  681. package/src/styles/system/prose.css +75 -0
  682. package/src/styles/system/shell.css +102 -0
  683. package/src/styles/system/specimens.css +98 -0
  684. package/src/styles/system/surfaces.css +104 -0
  685. package/src/styles/system/tokens.css +136 -0
  686. package/src/utils/cloudflare-image-loader.js +85 -0
  687. package/src/virtual.d.ts +36 -0
@@ -0,0 +1,34 @@
1
+ /* One accessible illustration: the bitmap for the current scheme fills the tray's 18px frame. */
2
+ @layer components {
3
+ .document-illustration { overflow: hidden; border-radius: var(--ui-radius-xl); }
4
+ .document-illustration img { display: block; width: 100%; height: auto; margin: 0; }
5
+ .document-illustration img[data-scheme="dark"] { display: none; }
6
+ .ui-tray[data-illustration-expandable] .ui-tray-title { flex: 1; }
7
+ .document-illustration-expand { flex: none; }
8
+ .document-illustration-expand[data-scheme="dark"] { display: none; }
9
+ /* A quiet caption-level entry, independent of the demo's generated-code panel. */
10
+ .ui-tray > .ui-disclosure[data-variant="text-description"] { margin-top: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }
11
+ .ui-tray > .ui-disclosure[data-variant="text-description"] > summary { width: fit-content; max-width: calc(100% - 2 * var(--ui-space-sm)); min-height: 2rem; margin-inline: var(--ui-space-sm); padding: 0; gap: var(--ui-space-2xs); color: var(--ui-text-muted); font-size: var(--ui-text-label); font-weight: var(--ui-weight-regular); }
12
+ .ui-tray > .ui-disclosure[data-variant="text-description"] > summary::before { width: 12px; height: 12px; }
13
+ .ui-tray > .ui-disclosure[data-variant="text-description"] > summary:hover { color: var(--ui-text-strong); }
14
+ .ui-tray > .ui-disclosure[data-variant="text-description"] > .ui-disclosure-body { margin-inline: 0; padding-top: var(--ui-space-xs); }
15
+ /* The text description reads at caption size inside the tray. */
16
+ .ui-tray-caption > ol { margin: 0; padding-left: 1.25em; }
17
+ .ui-tray-caption > ol > li + li { margin-top: var(--ui-space-2xs); }
18
+ .ui-tray-caption strong { color: var(--ui-text-body); font-weight: var(--ui-weight-strong); }
19
+ .dark .document-illustration img[data-scheme="light"] { display: none; }
20
+ .dark .document-illustration img[data-scheme="dark"] { display: block; }
21
+ .dark .document-illustration-expand[data-scheme="light"] { display: none; }
22
+ .dark .document-illustration-expand[data-scheme="dark"] { display: inline-flex; }
23
+ @media screen and (prefers-color-scheme: dark) {
24
+ :root:not(.light, .dark) .document-illustration img[data-scheme="light"] { display: none; }
25
+ :root:not(.light, .dark) .document-illustration img[data-scheme="dark"] { display: block; }
26
+ :root:not(.light, .dark) .document-illustration-expand[data-scheme="light"] { display: none; }
27
+ :root:not(.light, .dark) .document-illustration-expand[data-scheme="dark"] { display: inline-flex; }
28
+ }
29
+ @media print {
30
+ .document-illustration img[data-scheme="light"] { display: block !important; }
31
+ .document-illustration img[data-scheme="dark"] { display: none !important; }
32
+ .document-illustration-expand { display: none !important; }
33
+ }
34
+ }
@@ -0,0 +1,100 @@
1
+ /*
2
+ * Guide and Reference overviews, set as a book's contents rather than a wall of cards: a numbered directory of the
3
+ * sections on hairlines, a toolbar with the underline tabs, then each section as a ruled spread — its number, name and
4
+ * summary held at the start while its entries run beside them. Links change ink, never lift; nothing here is a frame.
5
+ */
6
+ @layer components {
7
+ .documentation-index { container-type: inline-size; }
8
+ .documentation-index :is(h2, h3, p, ul) { margin: 0; }
9
+ .documentation-index [id] { scroll-margin-top: 6rem; }
10
+ .documentation-index a { text-decoration: none; }
11
+ .documentation-index a:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; border-radius: var(--ui-radius-xs); }
12
+ .documentation-index-count { margin-left: .5em; color: var(--ui-text-muted); font-size: .75rem; font-weight: var(--ui-weight-regular); letter-spacing: .02em; font-variant-numeric: tabular-nums; }
13
+
14
+ /* Directory: one row per section on its own hairline; the row's line inks under the pointer, like the contents ruler. */
15
+ .documentation-index-directory { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 14rem), 1fr)); column-gap: var(--ui-space-xl); }
16
+ .documentation-index-directory > a { display: grid; grid-template-columns: 2rem minmax(0, 1fr) auto; align-items: baseline; padding-block: .875rem; color: var(--ui-text-body); box-shadow: inset 0 1px 0 var(--ui-line-hair); transition: color var(--ui-duration-quick), box-shadow var(--ui-duration-quick); }
17
+ .documentation-index-directory > a > small { color: var(--ui-text-muted); font-size: .75rem; letter-spacing: .04em; font-variant-numeric: tabular-nums; transition: color var(--ui-duration-quick); }
18
+ .documentation-index-directory > a > b { font-size: .9375rem; font-weight: var(--ui-weight-regular); line-height: 1.5; overflow-wrap: anywhere; }
19
+ .documentation-index-directory > a:hover { color: var(--ui-text-strong); box-shadow: inset 0 1px 0 var(--ui-text-strong); }
20
+ .documentation-index-directory > a:hover > small { color: var(--ui-text-strong); }
21
+ /* The sibling index closes the directory on a row of its own, its summary beside the name. */
22
+ .documentation-index-directory > a[data-related] { grid-column: 1 / -1; grid-template-columns: 2rem auto minmax(0, 1fr); }
23
+ .documentation-index-directory > a[data-related] > span { margin-left: var(--ui-space-md); color: var(--ui-text-muted); font-size: var(--ui-text-caption); line-height: 1.5; }
24
+ .documentation-index-directory > a[data-related] > small { font-size: .875rem; letter-spacing: 0; }
25
+
26
+ /* Toolbar: the view tabs stand on the toolbar's own hairline. */
27
+ .documentation-index-toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0 var(--ui-space-md); margin-top: var(--ui-space-3xl); box-shadow: inset 0 -1px 0 var(--ui-line-divider); }
28
+ .documentation-index-toolbar > p { color: var(--ui-text-muted); @apply --ui-eyebrow-type; }
29
+ .documentation-index-toolbar > p > .documentation-index-count { letter-spacing: .02em; }
30
+ .documentation-index-toolbar > .ui-segmented { box-shadow: none; }
31
+
32
+ /* Section: a ruled spread. Below 44rem the head sits over its entries. */
33
+ .documentation-index-section { display: grid; gap: var(--ui-space-lg); padding-block: var(--ui-space-xl) var(--ui-space-2xl); }
34
+ .documentation-index-section + .documentation-index-section { box-shadow: inset 0 1px 0 var(--ui-line-hair); }
35
+ .documentation-index-section > header { display: grid; align-content: start; gap: var(--ui-space-xs); }
36
+ .documentation-index-section > header > small { color: var(--ui-text-muted); font-size: .75rem; line-height: 1rem; letter-spacing: .04em; font-variant-numeric: tabular-nums; }
37
+ /* A catalog set inside an article (the Design System page) heads its spreads with h3 under the article's h2. */
38
+ .documentation-index-section h2, .documentation-index-section > header > h3 { color: var(--ui-text-strong); font-size: var(--ui-text-h3); font-weight: var(--ui-weight-heading); line-height: var(--ui-leading-h3); letter-spacing: var(--ui-tracking-h3); overflow-wrap: anywhere; }
39
+ .documentation-index-section h2 > .documentation-index-count, .documentation-index-section > header > h3 > .documentation-index-count { vertical-align: .125rem; }
40
+ .documentation-index-section > header > p { max-width: 30rem; color: var(--ui-text-muted); font-size: var(--ui-text-caption); line-height: var(--ui-leading-caption); text-wrap: pretty; }
41
+
42
+ /* A section's groups, listed under its summary so a long section can be entered part way. */
43
+ .documentation-index-groups { display: flex; flex-wrap: wrap; gap: 0 var(--ui-space-md); margin-top: var(--ui-space-2xs); }
44
+ .documentation-index-groups > a { padding-block: .3125rem; color: var(--ui-text-muted); font-size: var(--ui-text-caption); line-height: 1.5; transition: color var(--ui-duration-quick); }
45
+ .documentation-index-groups > a:hover { color: var(--ui-text-strong); }
46
+
47
+ .documentation-index-categories { display: grid; gap: var(--ui-space-xl); }
48
+ .documentation-index-categories h3 { margin-bottom: var(--ui-space-2xs); color: var(--ui-text-muted); @apply --ui-eyebrow-type; }
49
+ .documentation-index-categories h3 > .documentation-index-count { letter-spacing: .02em; }
50
+
51
+ /* Entries. Bare titles are a quiet list whose hover wash hangs past the column so the words keep its edge. */
52
+ .documentation-index-links { padding: 0; list-style: none; }
53
+ .documentation-index-links:not([data-described]) { margin-inline: -.625rem; }
54
+ .documentation-index-links li { break-inside: avoid; }
55
+ .documentation-index-links a { display: grid; align-content: center; min-height: 2.25rem; padding: .375rem .625rem; border-radius: var(--ui-radius-sm); color: var(--ui-text-body); font-size: var(--ui-text-small); line-height: 1.5; overflow-wrap: anywhere; transition: color var(--ui-duration-quick), background-color var(--ui-duration-quick); }
56
+ .documentation-index-links a > b { font-weight: var(--ui-weight-regular); }
57
+ .documentation-index-links a > small { color: var(--ui-text-muted); font-size: .75rem; }
58
+ .documentation-index-links a:has(> small) { display: flex; flex-wrap: wrap; align-items: baseline; align-content: center; gap: 0 var(--ui-space-xs); }
59
+ .documentation-index-links:not([data-described]) a:hover { color: var(--ui-text-strong); background: light-dark(oklch(22% .002 265 / .045), oklch(100% 0 none / .05)); }
60
+
61
+ /* Described entries are ruled rows: the title over its summary, an arrow stepping in under the pointer. */
62
+ .documentation-index-links[data-described] li + li { box-shadow: inset 0 1px 0 var(--ui-line-hair); }
63
+ .documentation-index-links[data-described] a { grid-template-columns: minmax(0, 1fr) 1.5rem; column-gap: var(--ui-space-md); padding: var(--ui-space-md) 0; border-radius: 0; }
64
+ .documentation-index-links[data-described] li:first-child a { padding-top: 0; }
65
+ .documentation-index-links[data-described] a > b { grid-column: 1; color: var(--ui-text-strong); font-size: var(--ui-text-base); line-height: 1.75rem; }
66
+ .documentation-index-links[data-described] a > span { grid-column: 1; max-width: 34rem; color: var(--ui-text-muted); font-size: var(--ui-text-small); line-height: 1.7; text-wrap: pretty; transition: color var(--ui-duration-quick); }
67
+ .documentation-index-links[data-described] a::after { content: "→"; grid-area: 1 / 2; justify-self: end; color: var(--ui-text-muted); line-height: 1.75rem; opacity: 0; translate: -.25rem 0; transition: opacity var(--ui-duration-quick) var(--ui-ease), translate var(--ui-duration-quick) var(--ui-ease), color var(--ui-duration-quick); }
68
+ .documentation-index-links[data-described] a:hover > span { color: var(--ui-text-body); }
69
+ .documentation-index-links[data-described] a:is(:hover, :focus-visible)::after { color: var(--ui-text-strong); opacity: 1; translate: 0 0; }
70
+
71
+ /* The jump letters hang by half a target so the first letter keeps the column's edge; each letter's own rule closes them. */
72
+ .documentation-index-letters { display: flex; flex-wrap: wrap; gap: 0 var(--ui-space-3xs); margin-inline-start: -.6875rem; padding-top: var(--ui-space-md); }
73
+ .documentation-index-letters > a { display: grid; place-items: center; min-width: 2rem; min-height: 2rem; color: var(--ui-text-muted); font-size: var(--ui-text-small); font-variant-numeric: tabular-nums; transition: color var(--ui-duration-quick); }
74
+ .documentation-index-letters > a:hover { color: var(--ui-text-strong); }
75
+
76
+ .documentation-index-alphabet { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr)); gap: var(--ui-space-xl) var(--ui-space-xl); padding-block: var(--ui-space-lg) var(--ui-space-2xl); }
77
+ .documentation-index-alphabet h2 { margin-bottom: var(--ui-space-2xs); padding-top: var(--ui-space-sm); color: var(--ui-text-strong); font-size: var(--ui-text-h3); font-weight: var(--ui-weight-heading); line-height: var(--ui-leading-h3); box-shadow: inset 0 1px 0 var(--ui-line-hair); }
78
+
79
+ @container (width >= 30rem) {
80
+ .documentation-index-links[data-columns] { columns: 2; column-gap: var(--ui-space-xl); }
81
+ }
82
+ @container (width >= 44rem) {
83
+ .documentation-index-section { grid-template-columns: 13rem minmax(0, 1fr); column-gap: var(--ui-space-2xl); }
84
+ /* The head stays in view beside a long section, clear of the 60px header. */
85
+ .documentation-index-section > header { position: sticky; top: 5.5rem; align-self: start; }
86
+ .documentation-index-groups { flex-direction: column; align-items: start; }
87
+ /* A bare list's first row stands on the section name's line; a group's eyebrow on the head's number. */
88
+ .documentation-index-section > .documentation-index-links:not([data-described]) { margin-top: 1.25rem; }
89
+ .documentation-index-links[data-described] li:first-child a { padding-top: 1.5rem; }
90
+ }
91
+ @container (width >= 60rem) {
92
+ .documentation-index-links[data-columns] { columns: 3; }
93
+ .documentation-index-categories .documentation-index-links[data-columns] { columns: 2; }
94
+ }
95
+ @container (width < 30rem) {
96
+ .documentation-index-links:not([data-described]) a { min-height: 2.75rem; }
97
+ .documentation-index-directory > a[data-related] { grid-template-columns: 2rem minmax(0, 1fr); }
98
+ .documentation-index-directory > a[data-related] > span { grid-column: 2; margin-left: 0; }
99
+ }
100
+ }
@@ -0,0 +1,4 @@
1
+ /* Surfaces, code and prose: pages that render documents, examples or source. One local stylesheet emits its theme variables once. */
2
+ @import './system/surfaces.css';
3
+ @import './system/code.css';
4
+ @import './system/prose.css';
@@ -0,0 +1,2 @@
1
+ // Document styles, loaded as the boundary after the interface; see routes.ts.
2
+ import './documents.css'
@@ -0,0 +1,4 @@
1
+ @import './docs-shell/theme.css';
2
+ @import './system/mixins.css';
3
+ @import './system/tokens.css';
4
+ @import './base.css';
@@ -0,0 +1,2 @@
1
+ @import '@master/css';
2
+ @import './foundation.css';
@@ -0,0 +1,3 @@
1
+ /* Controls and shell: every page in the site shell renders them. One local stylesheet emits its theme variables once. */
2
+ @import './system/controls.css';
3
+ @import './system/shell.css';
@@ -0,0 +1,2 @@
1
+ // The interface of the site shell, loaded as the second asset boundary; see routes.ts.
2
+ import './interface.css'
@@ -0,0 +1,2 @@
1
+ // The site foundation (the Master CSS entry), loaded first as its own asset boundary; see routes.ts.
2
+ import './globals.css'
@@ -0,0 +1,108 @@
1
+ # Site design system: Moonstone / Obsidian
2
+
3
+ The site's interface vocabulary. Light mode is moonstone (a clean zinc pearl), dark mode is obsidian (zinc-95 glass). The character is restrained and soft: light regular type, hairline contours, small radii, ink rather than blue. The homepage may compose its own layouts but uses these tokens.
4
+
5
+ ## Files
6
+
7
+ | File | Scope | Loaded |
8
+ | --- | --- | --- |
9
+ | `mixins.css` | `--ui-sheet-face`, `--ui-focus-ring`, `--ui-label-type`, `--ui-eyebrow-type`: shared declarations the component files expand with `@apply` | foundation (Master CSS definitions) |
10
+ | `tokens.css` | `--ui-*` roles: surfaces, lines, text, light, elevation, radius, rhythm, motion, tones, status, code | foundation |
11
+ | `surfaces.css` | `ui-sheet`, `ui-well`, `ui-tray`, `ui-stage`, `ui-compare`, `ui-browser`, `ui-scroll`, `ui-expand` | documents |
12
+ | `controls.css` | `ui-button`, `ui-segmented`, `ui-field`, `ui-input`, `ui-select`, `ui-range`, `ui-check`, `ui-switch`, `ui-copy`, `ui-kbd`, `ui-tooltip`, `ui-menu` | interface |
13
+ | `code.css` | `ui-code`, `ui-tabs`, `ui-inline-code`, `ui-disclosure`, `ui-prompt`, `ui-tree` | documents |
14
+ | `prose.css` | `ui-callout`, `ui-hint` and the article flow helpers | documents |
15
+ | `shell.css` | `ui-header`, `ui-sidebar`, `ui-nav-group`, `ui-nav-link`, `ui-toc`, `ui-pagehead`, `ui-pager`, `ui-dialog`, `ui-results` | interface |
16
+ | `specimens.css` | `ui-item`, `ui-badge`, `ui-label`, `ui-legend`, `ui-measure`, `ui-leader`, `ui-axes`, `ui-swatch`, `ui-palette`, `ui-spacing`, `ui-player` | imported by the components that use it |
17
+ | `data.css` | `ui-table`, `ui-metrics`/`ui-metric`, `ui-bar`, `ui-source`, `ui-params`, `ui-steps`, `ui-index`, `ui-logos`, `ui-chart`, `ui-waterfall` | imported by the components that use it |
18
+
19
+ Pages load the system in ordered asset boundaries (`site/routes.ts`), each one stylesheet:
20
+
21
+ - **foundation**: `styles/globals.css`, the only Master CSS entry (`@import '@master/css'`). Every entry joins one project graph, so a second entry delivers the union of both; keep component files out of it.
22
+ - **interface**: `styles/interface.css`, every page in the site shell.
23
+ - **documents**: `styles/documents.css`, unless a page exports `documentStyles = false` because it renders no surfaces, code or prose (the Blog index, 404, the homepage icon handoff).
24
+
25
+ Interface and documents are local stylesheets: each emits the theme variables it uses once, so add a component file to an existing boundary stylesheet rather than as another import. Bare sections (`/examples`) load the foundation and import only the system files their page renders.
26
+
27
+ The approved visual specification is the published "Master CSS Site Design System:Moonstone" artifact.
28
+
29
+ ## Rules
30
+
31
+ 1. **Monochrome interface.** Chrome uses ink and pearl only. Hue appears in teaching specimens (`--ui-tone-*`, always named by a legend or label) and status (`--ui-status-*`). Brand gold (`data-variant="gold"`) belongs to the homepage and the brand page, one gold focus per view.
32
+ 2. **Zinc neutrals.** Every neutral is the preset's zinc: hue 265 at chroma .0005–.003. Lines and shadows carry no hue of their own (`oklch(22% .002 265 / α)` and `oklch(18% 0 none / α)` in light mode, white and black alphas in dark mode). No blue sheen.
33
+ 3. **One material ladder.** canvas → tray → stage → sheet → float; a well sits below its surroundings. Never invent a surface color. Light: canvas 98.6 · tray 96 · stage 98.9 · sheet 100 · well 96.6 · code 99.6. Dark: canvas 19.4 (zinc-95) · tray 17.4 · stage 20.4 · sheet 24.2 · float 26.4 · well 16.4 · code 21.2.
34
+ 4. **Legible dark edges.** Dark lines are firmer than light ones so surfaces never blur into each other: hair .075 · contour .11 · divider .13 · strong .22 · mark .32 (white alpha); light: .065 · .095 · .12 · .2 · .3.
35
+ 5. **Elevation order.** sink < flat < rise-1 < rise-1h < rise-2 < rise-3 < overlay. Hover lifts 0.5px to rise-1h; press sinks to the well. Do not express state by changing hue.
36
+ 6. **Small concentric radii.** 3 / 4 / 6 / 8 / 10 / 14 with a 4px tray inset: tray 14 → stage, code, table and sheet 10; menu 8 → item 4; segmented track 6 + its padding → thumb 6. Nothing rounder except pills and dots.
37
+ 7. **Light regular type.** English text runs at 350 (`:root:lang(en)` lowers `--ui-weight-regular`), Han text at 400. Headings are regular (400): size and ink carry the steps. Medium (460) marks a current entry, a control label or a small title; strong (500) is for `<strong>` and short emphasis only. Captions inside components (table heads, tray titles, metric names) are small sans in sentence case. Captions *over a group or a page* — sidebar groups, footer columns, the page kicker, "On this page", the pager's Previous/Next — are eyebrows (`--ui-eyebrow-type`): 11px sans capitals at medium weight, boldly tracked .14em, 16px line; Han text keeps 12px and .1em. A blog post's kicker (category · date) and its closing caption are eyebrows too. Never mono.
38
+ 8. **Two widths on one edge.** A documentation article starts every block on one edge. Running text — paragraphs, lists, headings, callouts, rules, disclosures — keeps the reading measure (`--docs-text`, 41rem; the 18px lead runs to 1.125× it). Steps, page tabs, the pager and framed surfaces take the wide column (`--docs-wide`, the measure plus the 252px contents rail). Framed surfaces (code, trays, previews, tables, chart figures, media) hang past both edges by the prose bleed (up to 2rem from 52rem, always leaving a 1rem gutter to the window) and keep their own padding: nothing inside a hanging surface is set back to the text's edge; document steps hang on the end side only, so a step's code ends where every surface ends. Index rows are links, not frames: they keep the column's edges. Where the rail shows (80rem up), a page with contents gives the rail the wide column's room; the article and rail centre together, so every page starts on the same x. Gutters: 20px, 40px from 52rem, then 40→80px beside the sidebar.
39
+ 9. **One reading rhythm.** Body 16/32 (line-height 2, `--line`), Han text too; paragraphs part by ¾ line, wide blocks by 1 line, h2 opens on 2 lines and closes on ½ — a section after the first opens on one hairline (`--ui-line-hair`) across the measure, ⅞ line above its heading, none under the page head or after a disclosure that already closes on a hairline — h3 on 1½ and ⅜, h4 on 1¼ and ¼; list items by ¼. Type scale: title 38/44 −.028em · h2 26/35 −.022em · h3 20/28 −.014em · h4 16/24 · lead 18/1.75 · small 14/1.8 · caption 13/1.65 · label 12. The documentation and the blog share it: a post's text is the documentation's measure and prose.
40
+ 10. **Converged shadows.** Every layer doubles offset and blur and pulls its spread in by half the offset. No single large blur.
41
+ 11. **Purposeful previews.** The stage's contents share the system's visual language, not just its outer frame. Controls that operate a preview use system components; self-contained teaching samples express the same restraint through public preset styles. Departures in color, size or material need a teaching purpose. Optional preview actions start absent: Theme is for a lesson about color schemes, resizing for a demonstrated viewport or container change, and replay for a motion sequence. Ordinary previews inherit the site theme. Source tabs, copying and Generated CSS remain useful inspection tools.
42
+
43
+ ## Shell
44
+
45
+ The shell follows the original documentation layout, refined:
46
+
47
+ - **Header** 60px, 32px gutters. Search leads the end group as a quiet hairline pill (glass + ⌘K, 30px tall, 11px / 13px insets — the round end takes a little more), 8px before the community icons; a plain glass in a full target on a phone; the homepage's wide header leaves it out. Section links are plain words (body ink, current one in strong ink at medium weight), no pill. The version is plain text with a chevron. End icons are 18px glyphs in 36px targets that only change ink on hover.
48
+ - **Sidebar** 276px with a 32px start gutter aligned with the logo; it starts with its first group, whose caption stands level with the page kicker and the contents caption (y = header + 56px). Group captions are muted eyebrows; entries are 14px muted on one hairline guide, 32px rows; the current entry inks a short 2px bar on the guide and takes medium weight.
49
+ - **Contents rail** (252px) is a ruler: h2 entries have 24px ticks and h3 entries have 12px ticks with their right ends aligned before the text; titles share a second edge without indentation. The current entry takes strong ink and medium weight without changing its tick length. 13px entries in 34px rows (44px touch targets); "On this page" is a muted eyebrow on the title edge, level with the page kicker. Long lists fold inactive subsections without adding icons; following the section opens them.
50
+ - **Page head** a muted eyebrow kicker, a regular-weight title (fluid 30–38px), an 18px lead (a second lead line, such as a layout's subtitle, at reading size), then 48px of space — no rule — before the reading starts.
51
+ - **Page tabs** between sibling documents (`Tabs`, `ui-segmented[data-variant="underline"]`) are words on one hairline, the current one underlined in ink — the original's tabs, not a raised segmented thumb.
52
+ - **Search trigger** (`ui-search-trigger`, in the phone menu and on the 404) is a quiet row over one hairline with a flat `⌘K` hint; results in the dialog take a chip wash, never a raised frame.
53
+ - **Pager** is one hairline over two links, 80px below the article: an eyebrow (Previous / Next) over a 16px title with a muted arrow; ink on hover, no boxes.
54
+ - **Steps** hang on one hairline rail from flat 28px numbered rings (canvas face, strong contour, sans tabular figures) and take the wide column. A step title is 16px medium; its text is 14/1.8. A row step puts its text on two fifths and its code on three once the list is 46rem wide (narrower, the code stacks under its text). A preview after the steps hangs like any surface and the rail runs into it.
55
+ - **Footer** in the documentation takes the article's wide column from the text's edge; elsewhere it is 72rem. Groups keep 11rem columns from the start (`auto-fill`), so a wide footer leaves the rest to the canvas. Link groups (Docs, Resources, Community, Legal — the license and the trademark policy) under strong-ink eyebrows, 14px links on a 32px pitch. One quiet base row under a hairline, every word 12px tracked .04em: the notice at the start, the theme and language preferences at the end, each an icon and its value with no "Theme:" or "Language:" label (the selects keep those names for assistive technology). No search field — the header carries search.
56
+
57
+ ## Markup
58
+
59
+ | Layer | Convention |
60
+ | --- | --- |
61
+ | Root | One class per component, prefixed `ui-` |
62
+ | Part | `ui-<component>-<part>`, used only inside that component |
63
+ | Variant | Fixed vocabulary on data attributes: `data-variant`, `data-size`, `data-tone`, `data-elevation`, `data-background`, `data-padding`, `data-density`, `data-shape` |
64
+ | State | Native pseudo-classes and ARIA: `aria-pressed`, `aria-selected`, `aria-current`, `aria-checked`, `[open]`, `:checked`, `:disabled`. `data-state` only to show a static state in documentation; `data-result` for an action's outcome |
65
+ | Tokens | `--ui-*` roles; never raw palette steps in component CSS |
66
+ | Utilities | Master CSS classes compose layout inside content and specimens. They do not paint components, and shell components do not carry long utility lists |
67
+ | React | Components map one-to-one to classes; props only become data attributes |
68
+
69
+ Content and example markup keep teaching the preset vocabulary (`bg-surface-raised`, `shadow-lg`, …); `--ui-*` tokens are deliberately not utility tokens.
70
+
71
+ ## Decisions and rejected directions
72
+
73
+ - **Owner direction (2026-11-01 refinement, second pass):** the layout had regressed against a mature documentation site: mixed measures (41rem prose, full-width rules and pager, code bleeding 32px past both edges), a cramped footer, missing tracking, captions competing with entries. Continue the system and refine; captions may be uppercase with proper tracking.
74
+ - Decided (round 1): one 46rem column with no bleed; the page head's closing hairline and the installation layout's italic subtitle removed (the subtitle is now the page head's second lead line); tracked sans eyebrows for group and page captions; borderless pager; footer regrouped into three columns with the search field removed.
75
+ - Rejected (round 1): keeping a 41rem text measure inside a wider column for code and examples — two right edges was the regression the owner saw. A 48rem column (Tailwind's) — at 16px light text it runs past 95 characters a line; 46rem keeps about 88.
76
+ - Rejected (round 1): centring a contents-less page in the full main area — the column jumped sideways between the Installation tabs and the next document.
77
+ - **Owner correction (round 2):** some components bled past the text on purpose — Installation suits the original wider layout, and the messiness came from squeezing steps, previews and code into the reading column. Search moves from the sidebar to the header's end, low-key.
78
+ - Decided (round 2): the two-width grid above, restoring the pre-Moonstone structure (text at 41rem, steps and surfaces wide, previews and code hanging 32px) with every edge aligned; the Installation content back to its original order; search as a header pill; index cards as free-standing hairline sheets (the tray showed empty grey cells under a short last row); rules an author sets before a section heading render as space; list markers in sans (filled disc, tabular figures); code in table cells as a fill without a hairline.
79
+ - Rejected (round 2): one 44–46rem column for everything (round 1) — it cramped steps beside their code and made previews small; the owner preferred the original's breadth. A 42rem text measure inside a 46rem column (critique) — two right edges a few pixels apart read as misalignment; the measure and the wide column now differ by a whole rail.
80
+ - Rejected (round 2): a search field in the sidebar's head — it pushed every group down and duplicated the header's job.
81
+ - Decided (round 3): the corner copy button sits on the first code line's centre and the panel's face fades in behind it, so a long line scrolls under it without running through the glass; a copy group's instruction reads as a sans caption, not as a right-aligned mono status; the 404 search field is 20rem; chart labels and figure notes take the hang.
82
+ - Rule (round 2): a rounded control's inner space is measured, not eyeballed — ink to edge on both sides; a pill's round end gets 1–2px more than its flat-feeling side.
83
+ - **Owner direction (round 4, documentation and blog together):** a surface that hangs wide on purpose must not pull its contents back; the blog's frame opens wider while its text keeps the measure; bolder eyebrow tracking; a 12px tracked footer base row with the license and trademark links merged into the groups; body text at line-height 2 for air; fewer lines inside the browser chrome; a tray and its stage are already two layers, so nothing inside them may form a third.
84
+ - Decided (round 4): `--hang` removed — code lines, file names, table cells, tray heads and captions, chart padding and figure captions keep their own insets; the blog post shares the documentation's 41rem measure inside a frame with 5rem of room on each side (from 64rem); code, examples, media and the next read hang the documentation's 2rem past the text, short of the frame, and the post's header steps out to that same edge with a smaller (28–44px) title that never runs past it and an italic description; the post's close mirrors the header — an eyebrow, the next read as an open title with an italic description, marked on hover by the index's artboard corners, then the way back under one hairline — instead of a raised card; its contents ruler drops the rail's inset so titles keep their room; the browser is one contour drawn over the window, a tray-tone toolbar and a plain address field, and a tray holding only a browser lends it its place without a frame; inside a tray the stage, the source code and its generated-CSS disclosure are told apart by tone, not rings, so the tray's ring is the example's one edge and a framed subject on the stage is the only line within (this reverses round 2's choice to keep the stage contour: the owner judged the third nested line the bigger problem); `DemoAsset` turns the stage itself light or dark instead of placing a sheet on it; a rule before a legacy anchor and its section heading is space only, as before a heading.
85
+ - Rejected (round 4): a toolbar hairline and a sunken address well in the browser chrome — with the tray ring and the window contour they made four nested lines around one example.
86
+ - **Owner direction (round 5, previews):** previews stay brief. No browser chrome unless the viewport is the lesson (`DemoViewport` shows it only when `responsive`; every other preview is `ui-browser[data-variant="plain"]`, a stage parted from the tray by tone), and never an address in it — the tray head names the document and the live width reads beside the range. No Theme toggle unless the example is about color schemes. Selected code tabs take the chip wash with an inset hairline: the tab row scrolls and clips outer shadows, and a raised sheet face is the code panel's own tone.
87
+ - Decided (round 5): every code panel shares one corner (`--code-corner`, ≈11px): the copy action is centred on the first row (the bar, or the first code line) and set in from the end by the same distance; without a bar the code sits in 16px above and below. File names and a prompt's title start on the code's 16px edge; a tab chip is as tall as the copy button (32px) and sits the corner's distance from the start and the top, mirroring the copy action (owner: equal left and top).
88
+ - **Owner direction (round 5, code titles):** a code bar appears only when it carries information — tabs that switch sources, a real file path, or a before/after pair's labels. No language or tool titles (`HTML`, `CSS`, `TypeScript`, `Source`, `Generated CSS`, `Terminal`, `prompt`); the project's CSS is "CSS", never the old "Configuration".
89
+
90
+ - Decided (round 6, overviews): the Guide and Reference overviews (`DocumentationIndex`) read as a book's contents instead of a card grid. The section cards repeated the catalog below them, and a wall of raised sheets with uneven empty cells was the boxed look the shell had already left behind. Now: a numbered directory of sections on hairlines (the row's line inks under the pointer, like the contents ruler) closed by the cross-link on its own row; the view switch is the underline tabs on the toolbar's hairline under an eyebrow; each section a ruled spread whose number, name, summary and group shortcuts stay sticky beside its entries from 44rem; described entries as ruled rows (title over summary, an arrow stepping in); bare links in columns with the hanging wash; the A–Z view as a book's index with letters in columns. Section icons removed — the numbers order the sections.
91
+ - Rejected (round 6): keeping the icon cards and only flattening them — the duplication between the section cards and the sections remained the problem.
92
+ - **Owner direction (2026-11-01 polish):** return the sidebar, contents rail and header to the original documentation's layout; light regular type; finer spacing and rhythm; smaller radii; zinc rather than cool neutrals; clearer dark edges; restrained and soft overall. This overrides the approved spec's 4/6/10/14/18/24 radii, 520/560/600 weights, hue-255 pearl and mono uppercase labels.
93
+ - Rejected: semibold (600) headings and 560 labels — too heavy against the 350 reading text, the "template" look the owner disliked.
94
+ - Rejected: mono uppercase tracked eyebrows for group captions, table heads and kickers — read as an AI-made signature; captions are small sans now.
95
+ - Rejected: the raised-sheet pill for the current sidebar entry and the sunken well for the current header link — the original ink bar and ink word are quieter.
96
+ - Rejected: hue 255 pearl with a .012-chroma ink for lines and .022-chroma shadows — the visible blue cast made the interface cold.
97
+ - Rejected: a darker obsidian canvas (17.4%) with .085 contours — surfaces and edges blurred together; the zinc-95 canvas with firmer lines separates them without raising the noise.
98
+ - Rejected (round 2): a shorter 48px phone header — the blog and homepage offsets are built on the 60px header, and the gain was small.
99
+ - Rejected (round 2): removing the tray's inner stage contour to avoid "card in card" — the tray is the system's example frame and the stage edge is what separates specimen from caption; instead the dark tray was lifted to 17.4% so it no longer reads as a hole.
100
+ - Rejected (round 2): unframed tables as in the original — the framed sheet keeps sticky heads and horizontal scroll legible; its radius and contour are now small and quiet.
101
+ - Rejected (round 3): a dark stage darker than the canvas (18.4% under a .12 black falloff) — specimens sat in a hole. The dark ladder now mirrors light: tray 17.4 < canvas 19.4 < stage 20.4, with a .08 falloff.
102
+ - **Owner direction (2026-11-01, legacy sweep):** redesign the documentation UI and previews still left from the old site. Decided: the integration and migration logo grids (old `IconButtons`, a hairline table whose short last row left empty grey cells) become free-standing tiles — `ui-logos` for marks with names, `ui-index` with icons for described guides; related views (`Segments`) use `ui-segmented`; a clamped long table is `ui-expand` (canvas fade, one small `ui-button`); an example's usage line (`(resize)`, `(click)`, …) is a muted `ui-hint` led by its gesture, not a heavy paragraph; a setup step's result (`DemoHelloWorld`) is a plain stage without window dots; Theme toggles and responsive chrome removed from examples that are not about color schemes or viewports; the Layout example paints its chart with filled bars on one axis, underline section words and regular-weight figures.
103
+ - **Owner direction (2026-11-01, section rules):** a very quiet divider before each article h2. Decided: the faintest line role across the reading measure (never the wide column), set closer to the heading than to the text before it so it reads as the section's opening; the page's first section, a heading after a disclosure (which closes on its own hairline) and the blog's contents disclosure while it shows keep space only. The documentation and the blog share it through `ui-prose`.
104
+ - **Owner direction (2026-11-01, page-by-page polish, in the system's style):** a full review of every documentation page. Decided: a shell command or a plain-text prompt wraps (commands under a hanging indent, flags kept whole) instead of hiding behind the copy button, and the copy face runs to the panel's contour; every code line keeps one line of height; consecutive code panels part by a small gap; a Generated CSS disclosure right after its source closes the same panel; table values may wrap while the first column's names stay whole (paths break after a slash), numbers never wrap, and a column head's code is plain mono; row steps go two-column only from 46rem; a callout inside a step is an unframed note; callouts keep their tone mostly in the icon (2.5% wash, 12% contour); the stage's floor is 10rem so a single row never floats in an empty well; a demo about a container has no browser chrome and names its range "Container", and the range, its caption and its reading stay one group on phones; captions and readings inside specimens, chart subtitles, chart values and legends are small sans with tabular figures, never mono; demo headings are medium, not semibold; benchmark series start with hues that never read as a status; the integration mark beside a page title is 3.5rem; the footer sets its groups two by two on phones; the canvas paints the document itself; the Design System catalog is a ruled contents list like the Guide and Reference overviews.
105
+ - Open (2026-11-01): the Design System handbook still has its own shell (46rem measure, its own page-head offsets); the delivery illustrations are bitmaps whose labels fall to ~6px at 390px; the color palette has no step ruler; the blog's newest-post gold tick conflicts with rule 1 unless recorded as an exception.
106
+ - **Owner direction (2026-11-01, example controls):** the width presets, range and Fit looked odd inside the stage. Decided: a preview's controls belong to the example, not to the document it shows — they form one row on the tray itself, between the stage and the source, with no surface of their own: 12px to the stage, to the source and to a caption's first line, 16px in from both tray edges like the head's title, every control 32px tall, the live width a sans reading with tabular figures; a setup step's result (`DemoHelloWorld`) and the source that renders it share one tray, the stage over the code.
107
+
108
+ - **Owner direction (2026-11-02, installation):** steps use open, tabular `01`, `02`, `03` labels without a circular badge; the shared `ui-steps` owns this across Guide and Design System. Installation links form a grouped directory with small marks, left-aligned names and quiet group rules, replacing the logo tiles. Step spacing resets apply only to panels placed by the step grid; nested trays retain their 4px stage-to-source inset and the joined source/generated-output panel.
@@ -0,0 +1,51 @@
1
+ /* Controls — one material, one state order: pressed (sink) < rest (rise-1) < hover (rise-1h, +0.5px) */
2
+ @layer components {
3
+ .ui-button {
4
+ appearance: none; display: inline-flex; align-items: center; justify-content: center; gap: var(--ui-space-xs);
5
+ min-height: 2.375rem; padding: 0 var(--ui-space-md); border: 0; border-radius: var(--ui-radius-md);
6
+ @apply --ui-sheet-face; color: var(--ui-text-strong);
7
+ box-shadow: var(--ui-elevation-rise-1);
8
+ font: var(--ui-weight-medium) .84375rem/1 var(--font-family-sans); letter-spacing: 0; text-decoration: none; white-space: nowrap;
9
+ cursor: pointer; user-select: none; -webkit-user-select: none;
10
+ transition: box-shadow var(--ui-duration-quick) var(--ui-ease), background var(--ui-duration-quick) var(--ui-ease), translate var(--ui-duration-quick) var(--ui-ease), color var(--ui-duration-quick);
11
+ }
12
+ /* A label longer than its row (large text, narrow screens) wraps inside the button instead of overflowing. */
13
+ .ui-button:not([data-shape="icon"]) { max-width: 100%; white-space: normal; overflow-wrap: anywhere; line-height: 1.2; text-align: center; }
14
+ .ui-button > svg { flex: none; width: 1rem; height: 1rem; }
15
+ .ui-button:where(:hover, [data-state="hover"]):not(:disabled) { translate: 0 -.5px; box-shadow: var(--ui-elevation-rise-1h); }
16
+ .ui-button:where(:active, [data-state="pressed"]):not(:disabled) { translate: 0 .5px; background: var(--ui-surface-well); box-shadow: var(--ui-elevation-sink); transition-duration: var(--ui-duration-press); }
17
+ .ui-button:where(:focus-visible, [data-state="focus"]) { @apply --ui-focus-ring; outline-offset: 2px; }
18
+ .ui-button:disabled { color: var(--ui-text-disabled); background: var(--ui-surface-well); box-shadow: var(--ui-elevation-flat); cursor: not-allowed; }
19
+ .ui-button[data-size="sm"] { min-height: 2rem; padding-inline: var(--ui-space-sm); border-radius: 5px; font-size: .78125rem; }
20
+ .ui-button[data-size="lg"] { min-height: 2.75rem; padding-inline: 1.25rem; font-size: .9375rem; }
21
+
22
+ /* Primary: ink on moonstone, pearl on obsidian */
23
+ .ui-button[data-variant="primary"] {
24
+ color: var(--ui-text-inverse);
25
+ background: linear-gradient(180deg, light-dark(oklch(32% .0026 265), oklch(98.8% 0 none)), light-dark(oklch(19.5% .003 265), oklch(91.6% .0032 265)));
26
+ box-shadow: inset 0 1px 0 light-dark(oklch(100% 0 none / .17), oklch(100% 0 none)), inset 0 -1px 0 light-dark(oklch(0% 0 none / .3), oklch(0% 0 none / .13)),
27
+ 0 0 0 1px light-dark(oklch(14% .003 265), oklch(0% 0 none / .6)), 0 1px 1px -.5px var(--ui-shade-1), 0 3px 3px -1.5px var(--ui-shade-2), 0 6px 6px -3px var(--ui-shade-3);
28
+ }
29
+ .ui-button[data-variant="primary"]:where(:hover, [data-state="hover"]):not(:disabled) {
30
+ background: linear-gradient(180deg, light-dark(oklch(36% .0028 265), oklch(100% 0 none)), light-dark(oklch(22% .0034 265), oklch(94% .003 265)));
31
+ box-shadow: inset 0 1px 0 light-dark(oklch(100% 0 none / .19), oklch(100% 0 none)), inset 0 -1px 0 light-dark(oklch(0% 0 none / .3), oklch(0% 0 none / .13)),
32
+ 0 0 0 1px light-dark(oklch(14% .003 265), oklch(0% 0 none / .6)), 0 1px 1px -.5px var(--ui-shade-1), 0 3px 3px -1.5px var(--ui-shade-2), 0 6px 6px -3px var(--ui-shade-3), 0 10px 10px -5px var(--ui-shade-4);
33
+ }
34
+ .ui-button[data-variant="primary"]:where(:active, [data-state="pressed"]):not(:disabled) {
35
+ background: light-dark(oklch(18% .003 265), oklch(87.5% .0035 265));
36
+ box-shadow: inset 0 1px 3px light-dark(oklch(0% 0 none / .55), oklch(0% 0 none / .3)), 0 0 0 1px light-dark(oklch(14% .003 265), oklch(0% 0 none / .6));
37
+ }
38
+ /* Quiet: no material until touched — toolbars, headers, dense rows */
39
+ .ui-button[data-variant="quiet"] { background: transparent; color: var(--ui-text-muted); box-shadow: none; }
40
+ .ui-button[data-variant="quiet"]:where(:hover, [data-state="hover"]):not(:disabled) { color: var(--ui-text-strong); @apply --ui-sheet-face; box-shadow: var(--ui-elevation-rise-1); translate: none; }
41
+ .ui-button[data-variant="quiet"][aria-pressed="true"] { color: var(--ui-text-strong); background: var(--ui-surface-well); box-shadow: var(--ui-elevation-sink); }
42
+ /* Gold: brand moments only (homepage hero, brand page) */
43
+ .ui-button[data-variant="gold"] {
44
+ color: var(--ui-gold-ink); background: var(--ui-gold-face); text-shadow: 0 1px 0 oklch(100% 0 none / .35);
45
+ box-shadow: inset 0 1px 0 oklch(100% 0 none / .65), inset 0 -1px 0 oklch(52% .12 58 / .28), 0 0 0 1px light-dark(oklch(58% .12 66 / .7), oklch(82% .14 82 / .55)),
46
+ 0 1px 1px -.5px var(--ui-shade-1), 0 3px 3px -1.5px var(--ui-shade-2), 0 10px 18px -8px light-dark(oklch(72% .16 72 / .42), oklch(82% .16 80 / .3));
47
+ }
48
+ .ui-button[data-shape="icon"] { width: 2.375rem; padding: 0; }
49
+ .ui-button[data-shape="icon"][data-size="sm"] { width: 2rem; }
50
+
51
+ }
@@ -0,0 +1,85 @@
1
+ /* Code: a quiet panel that owns its frame. Inside a tray it shares the tray's 10px inner radius and 4px inset. */
2
+ @layer components {
3
+ .ui-code { position: relative; min-width: 0; overflow: hidden; border-radius: var(--ui-radius-xl); background: var(--ui-surface-code); color: var(--ui-code-text); box-shadow: inset 0 0 0 1px var(--ui-line-contour), 0 1px 0 var(--ui-lip); }
4
+ /* One corner for every panel: the copy action is centred on the first line of text (a bar's row or the code's first line)
5
+ and set in from the end by the same distance. A file name starts where the code's lines start; a tab chip, as tall as
6
+ the copy button, takes the corner's distance from the start and the top. */
7
+ .ui-code, .ui-prompt { --code-corner: calc(var(--ui-space-md) + var(--ui-text-code) * var(--ui-leading-code) / 2 - 1rem); }
8
+ .ui-code-bar { display: flex; align-items: center; gap: var(--ui-space-xs); min-height: calc(var(--code-corner) + 2rem); padding: var(--code-corner) var(--code-corner) 0 var(--ui-space-md); }
9
+ .ui-code-bar > .ui-tabs { flex: 1; min-width: 0; margin-left: calc(var(--code-corner) - var(--ui-space-md)); }
10
+ .ui-code-file { display: inline-flex; align-items: center; gap: var(--ui-space-xs); flex: 1; min-width: 0; color: var(--ui-text-muted); font: var(--ui-weight-regular) .75rem/1 var(--font-family-mono); }
11
+ .ui-code-file svg { flex: none; width: 14px; height: 14px; }
12
+ /* Without a bar the code sits in equal space above and below, the same 16px that sets its lines in from the edge. */
13
+ .ui-code pre { margin: 0; padding: var(--ui-space-md) 0; overflow-x: auto; font: var(--ui-weight-regular) var(--ui-text-code)/var(--ui-leading-code) var(--font-family-mono); tab-size: 2; scrollbar-width: thin; }
14
+ .ui-code pre:focus-visible { @apply --ui-focus-ring; outline-offset: -4px; border-radius: var(--ui-radius-md); }
15
+ /* Under a bar the code starts a short step down, so the file name reads as its caption. */
16
+ .ui-code:has(> .ui-code-bar) pre { padding-top: var(--ui-space-2xs); }
17
+ .ui-code-line { display: block; padding: 0 var(--ui-space-lg) 0 var(--ui-space-md); }
18
+ /* A blank source line keeps one line of height, even when the highlighter leaves an empty token in it. */
19
+ .ui-code-line { min-height: 1lh; }
20
+ .ui-code[data-numbers] { counter-reset: line; }
21
+ .ui-code[data-numbers] .ui-code-line::before { counter-increment: line; content: counter(line); display: inline-block; width: 1.75rem; margin-right: var(--ui-space-sm); color: var(--ui-text-disabled); text-align: right; user-select: none; }
22
+ .ui-code-line[data-mark="active"] { background: var(--ui-code-active); box-shadow: inset 2px 0 0 var(--ui-line-mark); }
23
+ .ui-code-line[data-mark="added"] { background: var(--ui-code-added); box-shadow: inset 2px 0 0 color-mix(in oklab, var(--ui-status-success) 70%, transparent); }
24
+ .ui-code-line[data-mark="removed"] { background: var(--ui-code-removed); box-shadow: inset 2px 0 0 color-mix(in oklab, var(--ui-status-danger) 70%, transparent); }
25
+ .ui-code-line[data-mark="added"]::after, .ui-code-line[data-mark="removed"]::after { float: right; color: var(--ui-text-disabled); }
26
+ .ui-code-line[data-mark="added"]::after { content: "+"; }
27
+ .ui-code-line[data-mark="removed"]::after { content: "−"; }
28
+ .ui-code-line mark { padding: 1px 2px; border-radius: 3px; background: light-dark(oklch(22% .002 265 / .08), oklch(100% 0 none / .1)); color: inherit; box-shadow: inset 0 -1px 0 var(--ui-line-mark); }
29
+ .ui-code .t { color: var(--ui-code-function); } .ui-code .a { color: var(--ui-code-property); } .ui-code .s { color: var(--ui-code-string); }
30
+ .ui-code .p { color: var(--ui-code-punctuation); } .ui-code .k { color: var(--ui-code-keyword); } .ui-code .c { color: var(--ui-code-comment); font-style: italic; } .ui-code .n { color: var(--ui-code-number); }
31
+ .ui-code > .ui-disclosure { border-top: 1px solid var(--ui-line-hair); }
32
+ .ui-code > .ui-disclosure > summary { padding-inline: var(--ui-space-md); }
33
+ .ui-code > .ui-disclosure > pre { padding-top: 0; }
34
+ /* In a tray, source code (a file tree, a disclosed result) is a lighter field like the stage beside it: tone, not another ring. */
35
+ .ui-tray > :is(.ui-code, .ui-tree), .ui-tray > .ui-disclosure > .ui-code { box-shadow: none; }
36
+
37
+ /* Tabs: a row of quiet chips; the selected one is filled. The row scrolls and so clips any outer shadow, and a raised
38
+ sheet face is the code panel's own tone: the chip's fill and inset hairline keep it legible in both schemes. */
39
+ .ui-tabs { display: flex; gap: 2px; min-width: 0; overflow-x: auto; scrollbar-width: none; }
40
+ .ui-tabs::-webkit-scrollbar { display: none; }
41
+ .ui-tabs > [role="tab"] {
42
+ appearance: none; display: inline-flex; flex: none; align-items: center; gap: 6px; min-height: 2rem; padding: 0 .625rem; border: 0; border-radius: var(--ui-radius-md);
43
+ background: transparent; color: var(--ui-text-muted); font: var(--ui-weight-regular) .75rem/1 var(--font-family-mono); cursor: pointer; transition: color var(--ui-duration-quick), background-color var(--ui-duration-quick), box-shadow var(--ui-duration-quick);
44
+ }
45
+ .ui-tabs > [role="tab"] svg { width: 14px; height: 14px; }
46
+ .ui-tabs > [role="tab"]:hover { color: var(--ui-text-strong); }
47
+ .ui-tabs > [role="tab"][aria-selected="true"] { background: var(--ui-surface-chip); color: var(--ui-text-strong); box-shadow: inset 0 0 0 1px var(--ui-line-hair); }
48
+ .ui-tabs > [role="tab"]:focus-visible { @apply --ui-focus-ring; outline-offset: -2px; }
49
+
50
+ /* Inline code and file references */
51
+ .ui-inline-code { padding: .125em .375em; border-radius: var(--ui-radius-xs); background: var(--ui-surface-chip); color: var(--ui-text-strong); box-shadow: inset 0 0 0 1px var(--ui-line-hair); font: var(--ui-weight-regular) .84em/1 var(--font-family-mono); overflow-wrap: anywhere; }
52
+
53
+ /* Disclosure: native details, one chevron, calm motion */
54
+ .ui-disclosure { min-width: 0; }
55
+ .ui-disclosure > summary { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ui-space-xs); min-height: 2.75rem; color: var(--ui-text-body); font: var(--ui-weight-medium) .8125rem/1.3 var(--font-family-sans); list-style: none; cursor: pointer; }
56
+ .ui-disclosure > summary::-webkit-details-marker { display: none; }
57
+ .ui-disclosure > summary::before { content: ""; flex: none; width: 14px; height: 14px; background: currentColor; opacity: .6; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m6 3.5 4.5 4.5L6 12.5' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat; transition: rotate var(--ui-duration-base) var(--ui-ease); }
58
+ .ui-disclosure[open] > summary::before { rotate: 90deg; }
59
+ .ui-disclosure > summary:hover { color: var(--ui-text-strong); }
60
+ .ui-disclosure > summary:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; border-radius: var(--ui-radius-md); }
61
+ .ui-disclosure > summary .ui-disclosure-meta { margin-left: auto; color: var(--ui-text-muted); font: var(--ui-weight-regular) .75rem/1 var(--font-family-sans); }
62
+ .ui-disclosure[data-variant="rule"] { border-block: 1px solid var(--ui-line-hair); }
63
+ .ui-disclosure[data-variant="rule"] + .ui-disclosure[data-variant="rule"] { border-top: 0; }
64
+ .ui-disclosure-body { padding-bottom: var(--ui-space-md); }
65
+ .ui-disclosure > .ui-disclosure-body > :first-child { margin-top: 0; }
66
+ .ui-disclosure > .ui-disclosure-body > :last-child { margin-bottom: 0; }
67
+
68
+ /* Prompt: copyable prose for agents — reads as text, copies as text */
69
+ .ui-prompt { display: grid; gap: 0; min-width: 0; overflow: hidden; border-radius: var(--ui-radius-xl); background: var(--ui-surface-code); box-shadow: inset 0 0 0 1px var(--ui-line-contour), 0 1px 0 var(--ui-lip); }
70
+ .ui-prompt-body { margin: 0; padding: var(--ui-space-xs) var(--ui-space-md) var(--ui-space-md); color: var(--ui-text-strong); font: var(--ui-weight-regular) .9375rem/1.7 var(--font-family-sans); white-space: pre-wrap; }
71
+ .ui-prompt-body var { padding: 0 .25em; border-radius: var(--ui-radius-xs); background: var(--ui-surface-chip); color: var(--ui-text-body); box-shadow: inset 0 0 0 1px var(--ui-line-hair); font: var(--ui-weight-regular) .8125rem/1 var(--font-family-mono); font-style: normal; }
72
+
73
+ /* File tree: names in mono, descriptions in the reading face, guides as hairlines */
74
+ .ui-tree { margin: 0; overflow-x: auto; overflow-wrap: anywhere; padding: var(--ui-space-sm) 0; border-radius: var(--ui-radius-xl); background: var(--ui-surface-code); box-shadow: inset 0 0 0 1px var(--ui-line-contour), 0 1px 0 var(--ui-lip); }
75
+ .ui-tree ul { margin: 0; padding: 0; list-style: none; }
76
+ .ui-tree ul ul { margin-left: 1.375rem; box-shadow: inset 1px 0 0 var(--ui-line-hair); }
77
+ .ui-tree li > div > * { min-width: 0; }
78
+ .ui-tree li > div { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px var(--ui-space-sm); padding: .3125rem var(--ui-space-md); }
79
+ .ui-tree ul ul li > div { padding-left: var(--ui-space-sm); }
80
+ .ui-tree svg { flex: none; align-self: center; width: 14px; height: 14px; color: var(--ui-text-muted); }
81
+ .ui-tree b { color: var(--ui-text-strong); font: var(--ui-weight-regular) var(--ui-text-code)/1.5 var(--font-family-mono); }
82
+ .ui-tree span { color: var(--ui-text-muted); font-size: .78125rem; }
83
+ .ui-tree [data-mark="added"] > div { background: var(--ui-code-added); }
84
+ .ui-tree [data-mark="added"] > div > b::after { content: " +"; color: var(--ui-status-success); }
85
+ }
@@ -0,0 +1,110 @@
1
+ @import './buttons.css';
2
+
3
+ @layer components {
4
+ /* Segmented control: a sunken track, a raised thumb */
5
+ .ui-segmented { display: inline-flex; flex-wrap: wrap; gap: 2px; max-width: 100%; padding: 3px; border-radius: calc(var(--ui-radius-md) + 3px); background: var(--ui-surface-well); box-shadow: var(--ui-elevation-sink); }
6
+ /* Links to sibling pages use the same control; the page being read carries aria-current="page". */
7
+ .ui-segmented > :is(button, a) {
8
+ appearance: none; display: inline-flex; align-items: center; justify-content: center; min-height: 1.875rem; min-width: 3.5rem; padding: 0 .75rem; border: 0; border-radius: var(--ui-radius-md); background: transparent;
9
+ color: var(--ui-text-muted); font: var(--ui-weight-medium) .78125rem/1 var(--font-family-sans); text-decoration: none; white-space: nowrap; cursor: pointer; transition: color var(--ui-duration-quick), background-color var(--ui-duration-quick), box-shadow var(--ui-duration-quick);
10
+ }
11
+ .ui-segmented > :is(button, a):hover:not(:disabled) { color: var(--ui-text-strong); }
12
+ .ui-segmented > :is(button, a):is([aria-pressed="true"], [aria-selected="true"], [aria-checked="true"], [aria-current="page"]) { color: var(--ui-text-strong); @apply --ui-sheet-face; box-shadow: var(--ui-elevation-rise-1); }
13
+ .ui-segmented > :is(button, a):focus-visible { @apply --ui-focus-ring; outline-offset: 2px; }
14
+ .ui-segmented > button:disabled { color: var(--ui-text-disabled); cursor: not-allowed; }
15
+ /* Underline: page-level tabs between sibling documents — words on one hairline, the current one underlined in ink. */
16
+ .ui-segmented[data-variant="underline"] { display: flex; gap: 0 var(--ui-space-lg); padding: 0; border-radius: 0; background: none; box-shadow: inset 0 -1px 0 var(--ui-line-divider); }
17
+ .ui-segmented[data-variant="underline"] > :is(button, a) { min-width: 0; min-height: 2.75rem; padding: 0; border-radius: 0; color: var(--ui-text-muted); font: var(--ui-weight-regular) var(--ui-text-small)/1.4 var(--font-family-sans); }
18
+ .ui-segmented[data-variant="underline"] > :is(button, a):is([aria-pressed="true"], [aria-selected="true"], [aria-checked="true"], [aria-current="page"]) { color: var(--ui-text-strong); background: none; box-shadow: inset 0 -2px 0 var(--ui-text-strong); }
19
+ .ui-segmented[data-variant="underline"] > :is(button, a):focus-visible { outline-offset: -2px; border-radius: var(--ui-radius-xs); }
20
+ .ui-segmented[data-size="lg"] { padding: 4px; border-radius: calc(var(--ui-radius-md) + 4px); }
21
+ .ui-segmented[data-size="lg"] > :is(button, a) { min-height: 2.25rem; border-radius: var(--ui-radius-md); font-size: .8125rem; }
22
+
23
+ /* Fields: a well that floats back to the sheet on focus */
24
+ .ui-field { display: grid; gap: var(--ui-space-xs); color: var(--ui-text-strong); font-size: var(--ui-text-small); font-weight: var(--ui-weight-medium); }
25
+ .ui-field-hint { color: var(--ui-text-muted); font-size: .75rem; font-weight: var(--ui-weight-regular); }
26
+ .ui-input, .ui-select {
27
+ width: 100%; min-height: 2.5rem; padding: .5625rem .75rem; border: 0; border-radius: var(--ui-radius-md);
28
+ background: var(--ui-surface-well); color: var(--ui-text-strong); box-shadow: var(--ui-elevation-sink);
29
+ font: var(--ui-weight-regular) var(--ui-text-small)/1.45 var(--font-family-sans); resize: vertical;
30
+ transition: box-shadow var(--ui-duration-quick), background-color var(--ui-duration-quick);
31
+ }
32
+ .ui-input::placeholder { color: var(--ui-text-muted); }
33
+ .ui-input:hover:not(:focus, :disabled), .ui-select:hover:not(:focus, :disabled) { background: var(--ui-surface-well-hover); }
34
+ .ui-input:focus, .ui-select:focus-visible { outline: none; background: var(--ui-surface-sheet); box-shadow: inset 0 0 0 1px var(--ui-line-mark), 0 0 0 3px light-dark(oklch(22% .002 265 / .1), oklch(100% 0 none / .12)); }
35
+ .ui-input:disabled, .ui-select:disabled { color: var(--ui-text-disabled); cursor: not-allowed; }
36
+ .ui-select { appearance: none; padding-right: 2rem; cursor: pointer;
37
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23888' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m4.5 6.5 3.5 3.5 3.5-3.5'/%3E%3C/svg%3E");
38
+ background-repeat: no-repeat; background-position: right .625rem center; background-size: 14px; }
39
+ .ui-select[data-variant="raised"] { background-color: transparent; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23888' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m4.5 6.5 3.5 3.5 3.5-3.5'/%3E%3C/svg%3E"), linear-gradient(180deg, var(--ui-surface-sheet), var(--ui-surface-sheet-lo)); background-position: right .625rem center, 0 0; background-size: 14px, auto; box-shadow: var(--ui-elevation-rise-1); font-weight: var(--ui-weight-medium); }
40
+ /* Overlay: an invisible native select over a positioned label that shows the value (version, language, appearance) */
41
+ .ui-select[data-variant="overlay"] { position: absolute; inset: 0; width: 100%; height: 100%; min-height: 0; padding: 0; opacity: 0; cursor: pointer; }
42
+ :has(> .ui-select[data-variant="overlay"]:focus-visible) { @apply --ui-focus-ring; outline-offset: 2px; }
43
+
44
+ /* Range: hairline track, filled to value, raised thumb */
45
+ .ui-range { --value: 50%; appearance: none; width: 100%; min-width: 6rem; height: 1.75rem; margin: 0; background: transparent; cursor: ew-resize; }
46
+ .ui-range::-webkit-slider-runnable-track { height: 4px; border-radius: var(--ui-radius-pill); background: linear-gradient(90deg, var(--ui-text-strong) var(--value), var(--ui-line-divider) var(--value)); }
47
+ .ui-range::-moz-range-track { height: 4px; border-radius: var(--ui-radius-pill); background: var(--ui-line-divider); }
48
+ .ui-range::-moz-range-progress { height: 4px; border-radius: var(--ui-radius-pill); background: var(--ui-text-strong); }
49
+ .ui-range::-webkit-slider-thumb { appearance: none; width: 16px; height: 16px; margin-top: -6px; border: 0; border-radius: 50%; background: linear-gradient(180deg, oklch(100% 0 none), oklch(96.5% .0011 265)); box-shadow: 0 0 0 1px var(--ui-line-strong), 0 1px 1px var(--ui-shade-1), 0 2px 4px -1px var(--ui-shade-2); }
50
+ .ui-range::-moz-range-thumb { width: 16px; height: 16px; border: 0; border-radius: 50%; background: linear-gradient(180deg, oklch(100% 0 none), oklch(96.5% .0011 265)); box-shadow: 0 0 0 1px var(--ui-line-strong), 0 1px 1px var(--ui-shade-1), 0 2px 4px -1px var(--ui-shade-2); }
51
+ .ui-range:focus-visible { outline: none; }
52
+ .ui-range:focus-visible::-webkit-slider-thumb { box-shadow: 0 0 0 1px var(--ui-line-strong), 0 0 0 2px var(--ui-surface-stage), 0 0 0 4px var(--ui-focus); }
53
+ .ui-range:focus-visible::-moz-range-thumb { box-shadow: 0 0 0 1px var(--ui-line-strong), 0 0 0 2px var(--ui-surface-stage), 0 0 0 4px var(--ui-focus); }
54
+
55
+ /* Check and switch */
56
+ .ui-check { display: inline-flex; align-items: center; gap: var(--ui-space-xs); color: var(--ui-text-strong); font-size: var(--ui-text-small); cursor: pointer; }
57
+ .ui-check > input:not(.ui-switch) { appearance: none; display: grid; place-items: center; flex: none; width: 1.125rem; height: 1.125rem; margin: 0; border-radius: var(--ui-radius-sm); background: var(--ui-surface-well); box-shadow: var(--ui-elevation-sink); cursor: pointer; transition: background-color var(--ui-duration-quick), box-shadow var(--ui-duration-quick); }
58
+ /* An empty box is a small target on a stage of nearly its own tone: a firmer ring keeps it visible in both schemes. */
59
+ .ui-check > input:not(.ui-switch):not(:checked) { box-shadow: var(--ui-elevation-sink), inset 0 0 0 1px var(--ui-line-divider); }
60
+ .ui-check > input:not(.ui-switch)::after { content: ""; width: 10px; height: 10px; opacity: 0; background: var(--ui-text-inverse); mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M2 5.2 4.1 7.3 8 2.8' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat; }
61
+ .ui-check > input:not(.ui-switch):checked { background: var(--ui-surface-ink); box-shadow: inset 0 1px 0 light-dark(oklch(100% 0 none / .16), oklch(100% 0 none)), 0 0 0 1px light-dark(oklch(14% .003 265), oklch(0% 0 none / .5)); }
62
+ .ui-check > input:not(.ui-switch):checked::after { opacity: 1; }
63
+ .ui-check > input[type="radio"] { border-radius: 50%; }
64
+ .ui-check > input[type="radio"]::after { width: 6px; height: 6px; border-radius: 50%; mask: none; }
65
+ .ui-check > input:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; }
66
+ .ui-switch { position: relative; appearance: none; flex: none; width: 2.25rem; height: 1.375rem; margin: 0; border-radius: var(--ui-radius-pill); background: var(--ui-surface-well); box-shadow: var(--ui-elevation-sink); cursor: pointer; transition: background-color var(--ui-duration-base) var(--ui-ease); }
67
+ .ui-switch::before { content: ""; position: absolute; top: 3px; left: 3px; width: 1rem; height: 1rem; border-radius: 50%; background: linear-gradient(180deg, oklch(100% 0 none), oklch(96.5% .0011 265)); box-shadow: 0 0 0 1px var(--ui-line-contour), 0 1px 1px var(--ui-shade-1), 0 2px 3px -1px var(--ui-shade-2); transition: translate var(--ui-duration-base) var(--ui-ease); }
68
+ .ui-switch:checked { background: var(--ui-surface-ink); box-shadow: inset 0 1px 2px oklch(0% 0 none / .3); }
69
+ .ui-switch:checked::before { translate: .875rem 0; background: light-dark(linear-gradient(180deg, oklch(100% 0 none), oklch(96.5% .0011 265)), linear-gradient(180deg, oklch(26% .0024 265), oklch(20% .002 265))); }
70
+ .ui-switch:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; }
71
+
72
+ /* Copy: an honest result next to the action */
73
+ .ui-copy { display: inline-flex; align-items: center; gap: var(--ui-space-xs); }
74
+ .ui-copy-status { color: var(--ui-text-muted); font: var(--ui-weight-regular) .75rem/1 var(--font-family-mono); }
75
+ .ui-copy-status[data-result="success"] { color: var(--ui-status-success); }
76
+ .ui-copy-status[data-result="error"] { color: var(--ui-status-danger); }
77
+
78
+ /* Keyboard key */
79
+ .ui-kbd { display: inline-grid; place-items: center; min-width: 1.375rem; height: 1.375rem; padding: 0 .3125rem; border-radius: var(--ui-radius-xs); background: transparent; color: var(--ui-text-muted); box-shadow: inset 0 0 0 1px var(--ui-line-contour); font: var(--ui-weight-regular) .6875rem/1 var(--font-family-mono); }
80
+
81
+ @media (pointer: coarse) {
82
+ .ui-button, .ui-input, .ui-select { min-height: 2.75rem; }
83
+ .ui-segmented > button { min-height: 2.5rem; }
84
+ }
85
+
86
+ /* Tooltip: a small ink chip; names icon-only controls */
87
+ .ui-tooltip { position: absolute; z-index: 60; padding: .3125rem .5rem; border-radius: var(--ui-radius-sm); background: var(--ui-surface-ink); color: var(--ui-text-inverse); box-shadow: 0 1px 2px var(--ui-shade-1), 0 4px 10px -4px var(--ui-shade-2); font: var(--ui-weight-regular) .71875rem/1.2 var(--font-family-sans); white-space: nowrap; pointer-events: none; }
88
+ .ui-tooltip[data-side="bottom"]::before { content: ""; position: absolute; bottom: 100%; left: 50%; translate: -50% 0; border: 4px solid transparent; border-bottom-color: var(--ui-surface-ink); }
89
+ .ui-tooltip > .ui-kbd { height: 1.125rem; min-width: 1.125rem; margin-left: 6px; background: color-mix(in oklab, var(--ui-text-inverse) 14%, transparent); color: var(--ui-text-inverse); box-shadow: none; }
90
+
91
+ /* Menu: a floating sheet of choices (version, language, appearance) */
92
+ .ui-menu { display: grid; gap: 1px; min-width: 12rem; margin: 0; padding: var(--ui-inset); border-radius: var(--ui-radius-lg); background: var(--ui-surface-float); box-shadow: var(--ui-elevation-rise-3); list-style: none; }
93
+ .ui-menu-label { padding: .375rem .625rem .25rem; color: var(--ui-text-muted); @apply --ui-label-type; }
94
+ .ui-menu-item { appearance: none; display: flex; align-items: center; gap: var(--ui-space-xs); width: 100%; min-height: 2rem; padding: 0 .625rem; border: 0; border-radius: var(--ui-radius-sm); background: transparent; color: var(--ui-text-body); font: var(--ui-weight-regular) var(--ui-text-small)/1 var(--font-family-sans); text-align: start; text-decoration: none; cursor: pointer; }
95
+ .ui-menu-item > svg { flex: none; width: 15px; height: 15px; color: var(--ui-text-muted); }
96
+ .ui-menu-item > small { margin-left: auto; color: var(--ui-text-muted); font: var(--ui-weight-regular) .6875rem/1 var(--font-family-mono); }
97
+ .ui-menu-item:is(:hover, [data-highlighted]) { color: var(--ui-text-strong); background: light-dark(oklch(22% .002 265 / .05), oklch(100% 0 none / .06)); }
98
+ .ui-menu-item[aria-checked="true"] { color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); }
99
+ .ui-menu-item[aria-checked="true"]::after { content: ""; width: 14px; height: 14px; margin-left: auto; background: currentColor; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m3.5 8.5 3 3 6-7' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat; }
100
+ .ui-menu-item:focus-visible { @apply --ui-focus-ring; outline-offset: -2px; }
101
+ .ui-menu-separator { height: 1px; margin: var(--ui-space-3xs) .375rem; background: var(--ui-line-hair); }
102
+
103
+ /* Result feedback on an icon action: the glyph swaps, the label says what happened */
104
+ .ui-button[data-result] > svg:first-of-type { display: none; }
105
+ .ui-button:not([data-result]) > .ui-result-icon { display: none; }
106
+ .ui-button[data-result="success"] { color: var(--ui-status-success); }
107
+ .ui-button[data-result="error"] { color: var(--ui-status-danger); }
108
+ .ui-button[data-result="error"] > svg:first-of-type { display: block; }
109
+ .ui-button[data-result="error"] > .ui-result-icon { display: none; }
110
+ }