@master/internal-site 0.0.0-stage → 0.1.0

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 +66 -2
  3. package/dist/astro.d.mts +3 -0
  4. package/dist/astro.mjs +510 -0
  5. package/dist/config.d.mts +64 -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 +66 -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 +87 -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 +95 -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 +18 -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 +1077 -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 +69 -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
+ ---
2
+ import '@master/internal-site/styles/system/data.css'
3
+ import InlineCode from '@master/internal-site/components/InlineCode.astro'
4
+ import RenderNode from '@master/internal-site/components/RenderNode.astro'
5
+
6
+ export interface DemoTokenRow {
7
+ token: string
8
+ utilities: string[]
9
+ value?: string
10
+ /** Text or markup (an Astro template value or MDX JSX), rendered with RenderNode. */
11
+ description: unknown
12
+ preview?: unknown
13
+ }
14
+
15
+ interface Props {
16
+ rows: DemoTokenRow[]
17
+ descriptionTitle?: string
18
+ }
19
+
20
+ /** A document inventory, separate from any specimen's measured layout. */
21
+ const { rows, descriptionTitle = 'Role' } = Astro.props
22
+ ---
23
+
24
+ {/* Narrow token inventories need native keyboard scrolling. */}
25
+ <div class="ui-table" role="region" aria-label={`${descriptionTitle} token table`} tabindex="0"><table>
26
+ <thead><tr><th scope="col">Token / class</th><th scope="col" class="(min-width:12rem)">{descriptionTitle}</th></tr></thead>
27
+ <tbody>{rows.map(({ token, utilities, value, description, preview }) => <tr>
28
+ <td>
29
+ <div class="whitespace-nowrap">{preview != null && <RenderNode node={preview} />}<code>{token}</code></div>
30
+ {utilities.length > 0 && <div class="flex flex-wrap gap-xs mt-xs">{utilities.map(utility => <InlineCode class="whitespace-nowrap" code={utility} />)}</div>}
31
+ </td>
32
+ <td>{value && <div class="mb-xs"><code>{value}</code></div>}<RenderNode node={description} /></td>
33
+ </tr>)}</tbody>
34
+ </table></div>
@@ -0,0 +1,18 @@
1
+ ---
2
+ import Demo from '@master/internal-site/demo/Demo.svelte'
3
+ import DemoViewport from '@master/internal-site/demo/DemoViewport.svelte'
4
+
5
+ interface Props {
6
+ example?: 'views' | 'articles'
7
+ origin?: string
8
+ }
9
+
10
+ const { example = 'views', origin = '' } = Astro.props
11
+ const articles = example === 'articles'
12
+ const title = articles ? 'From collection to article' : 'A change of view'
13
+ ---
14
+
15
+ <Demo title={title} frame="none" data-view-transition={example}
16
+ caption={articles ? 'Open an article, then return to its card. Each image and title keeps a unique snapshot name. Keyboard focus follows the view change.' : 'Choose a view. The panel and heading use named snapshots; unsupported browsers and reduced motion use the same immediate update.'}>
17
+ <DemoViewport client:idle={{ timeout: 500 }} title={title} src={origin + (articles ? '/examples/article-transitions' : '/examples/view-transitions')} height={articles ? 640 : 340} sizing="viewport" />
18
+ </Demo>
@@ -0,0 +1,324 @@
1
+ <script module lang="ts">
2
+ interface ViewportOptions {
3
+ title: string
4
+ /** Resize the actual iframe viewport. */
5
+ responsive?: boolean
6
+ /** Browser chrome; only where the viewport itself is the lesson. Defaults to `responsive`. The tray head names the document. */
7
+ chrome?: boolean
8
+ /** The width range's caption: what the range sizes. */
9
+ rangeLabel?: string
10
+ /** Named real viewport widths; the first is the initial width when responsive. */
11
+ widthPresets?: readonly { label: string; width: number }[]
12
+ motion?: boolean
13
+ print?: boolean
14
+ theme?: boolean
15
+ /** Pin the initial mode; omit to follow the surrounding document. */
16
+ initialTheme?: 'light' | 'dark'
17
+ inspect?: string[]
18
+ height?: number
19
+ /** Upper bound for the actual iframe width, including wide breakpoint examples. */
20
+ maxWidth?: number
21
+ /** Content sizing is only for normal flow, never viewport-dependent geometry. */
22
+ sizing?: 'viewport' | 'content'
23
+ }
24
+
25
+ export type DemoViewportProps = ViewportOptions & (
26
+ { document: string, src?: never } | { document?: never, src: string }
27
+ )
28
+ </script>
29
+
30
+ <script lang="ts">
31
+ import { untrack } from 'svelte'
32
+ import IconMoon from '@tabler/icons-svelte-runes/icons/moon'
33
+ import IconPlayerPause from '@tabler/icons-svelte-runes/icons/player-pause'
34
+ import IconPlayerPlay from '@tabler/icons-svelte-runes/icons/player-play'
35
+ import IconPrinter from '@tabler/icons-svelte-runes/icons/printer'
36
+ import IconRefresh from '@tabler/icons-svelte-runes/icons/refresh'
37
+ import IconSun from '@tabler/icons-svelte-runes/icons/sun'
38
+ import { demoPlayback, type PlaybackAction } from '@master/internal-site/demo/playback.ts'
39
+ import { demoDragReadings } from '@master/internal-site/demo/drag-readings.ts'
40
+
41
+ let { title, document: source, src, responsive = false, chrome = responsive, rangeLabel = 'Viewport', widthPresets, motion = false, print = false, theme = false, initialTheme, inspect, height = 260, maxWidth = 1600, sizing = 'viewport' }: DemoViewportProps = $props()
42
+ let frame = $state<HTMLIFrameElement>()
43
+ let body = $state<HTMLDivElement>()
44
+ let cleanup = () => {}
45
+ let playback: ReturnType<typeof demoPlayback> | null = null
46
+ // Initial values only, like the props that seed them.
47
+ let width = $state<number | undefined>(untrack(() => responsive ? widthPresets?.[0]?.width : undefined))
48
+ let fitWidth = $state(480)
49
+ let minimumWidth = $state(240)
50
+ let dark = $state<boolean | undefined>(untrack(() => initialTheme === undefined ? undefined : initialTheme === 'dark'))
51
+ let isDark = $state(false)
52
+ let playing = $state(false)
53
+ let ready = $state(false)
54
+ let contentHeight = $state<number>()
55
+ let properties = $state('')
56
+ const widthId = $props.id()
57
+
58
+ function load() {
59
+ cleanup()
60
+ const doc = frame?.contentDocument
61
+ const view = frame?.contentWindow
62
+ if (!frame || !view || !doc?.documentElement || !doc.body?.childElementCount) return
63
+ const iframe = frame
64
+ let active = true
65
+ // Resize/font/event callbacks can run after removal but before effect
66
+ // cleanup, or after the same iframe has loaded a new document.
67
+ const current = () => active && iframe.isConnected && iframe.contentDocument === doc
68
+ const applyTheme = () => {
69
+ if (!current()) return
70
+ const mode = dark ?? document.documentElement.classList.contains('dark')
71
+ doc.documentElement.classList.toggle('dark', mode)
72
+ doc.documentElement.classList.toggle('light', !mode)
73
+ doc.documentElement.style.colorScheme = mode ? 'dark' : 'light'
74
+ isDark = mode
75
+ }
76
+ const writeReading = (output: HTMLElement, value: string) => {
77
+ if (output.textContent !== value) output.textContent = value
78
+ }
79
+ const updateReadings = () => {
80
+ if (!current()) return
81
+ doc.querySelectorAll<HTMLElement>('[data-font-status]').forEach(output => {
82
+ const family = output.dataset.fontStatus!
83
+ const faces = [...doc.fonts].filter(face => face.family.replace(/^["']|["']$/g, '') === family)
84
+ writeReading(output, faces.some(face => face.status === 'loaded') ? 'Loaded'
85
+ : faces.some(face => face.status === 'loading') ? 'Loading…' : 'Unavailable · fallback')
86
+ })
87
+ doc.querySelectorAll<HTMLElement>('[data-size-readout]').forEach(output => {
88
+ const element = doc.getElementById(output.dataset.sizeReadout!)
89
+ if (!element) return
90
+ const box = element.getBoundingClientRect()
91
+ writeReading(output, `${Math.round(box.width * 10) / 10} × ${Math.round(box.height * 10) / 10} px`)
92
+ })
93
+ doc.querySelectorAll<HTMLElement>('[data-layout-axis]').forEach(output => {
94
+ const element = doc.getElementById(output.dataset.layoutAxis!)
95
+ if (!element) return
96
+ const style = view.getComputedStyle(element)
97
+ writeReading(output, style.display.includes('flex')
98
+ ? `Main axis · ${style.flexDirection.startsWith('row') ? 'inline' : 'block'}${style.flexDirection.endsWith('reverse') ? ' · reversed' : ''}`
99
+ : style.display.includes('grid') ? 'Grid auto-placement' : 'Normal block flow')
100
+ })
101
+ doc.querySelectorAll<HTMLElement>('[data-alignment-axis]').forEach(output => {
102
+ const element = doc.getElementById(output.dataset.alignmentAxis!)
103
+ if (!element) return
104
+ const style = view.getComputedStyle(element)
105
+ const main = style.display.includes('flex') && style.flexDirection.startsWith('column') ? 'block' : 'inline'
106
+ const cross = main === 'inline' ? 'block' : 'inline'
107
+ writeReading(output, output.dataset.axisKind === 'both' ? `${cross} + ${main} axes` : `${output.dataset.axisKind === 'cross' ? cross : main} axis`)
108
+ })
109
+ doc.querySelectorAll<HTMLElement>('[data-style-readout]').forEach(output => {
110
+ const element = doc.getElementById(output.dataset.styleReadout!)
111
+ if (!element) return
112
+ const value = view.getComputedStyle(element, output.dataset.stylePseudo || null).getPropertyValue(output.dataset.styleProperty!)
113
+ if (output.hasAttribute('data-round-pixels')) {
114
+ output.title = value
115
+ writeReading(output, (value || output.dataset.emptyValue || '').replace(/(-?\d*\.?\d+)px\b/g, (_, number: string) => `${Math.round(Number(number) * 10) / 10}px`))
116
+ } else writeReading(output, value || output.dataset.emptyValue || '')
117
+ })
118
+ doc.querySelectorAll<HTMLElement>('[data-position-readout]').forEach(output => {
119
+ const element = doc.getElementById(output.dataset.positionReadout!)
120
+ const origin = doc.getElementById(output.dataset.positionOrigin!)
121
+ if (!element || !origin) return
122
+ const box = element.getBoundingClientRect(), parent = origin.getBoundingClientRect()
123
+ writeReading(output, `x ${Math.round((box.left - parent.left - origin.clientLeft) * 10) / 10} · y ${Math.round((box.top - parent.top - origin.clientTop) * 10) / 10} px`)
124
+ })
125
+ doc.querySelectorAll<HTMLElement>('[data-scroll-readout]').forEach(output => {
126
+ const element = doc.getElementById(output.dataset.scrollReadout!)
127
+ if (element) writeReading(output, `x ${Math.round(element.scrollLeft)} · y ${Math.round(element.scrollTop)} px`)
128
+ })
129
+ doc.querySelectorAll<HTMLElement>('[data-scroll-offset]').forEach(output => {
130
+ const target = doc.getElementById(output.dataset.scrollOffset!)
131
+ const port = doc.getElementById(output.dataset.scrollport!)
132
+ if (!target || !port) return
133
+ const box = target.getBoundingClientRect(), container = port.getBoundingClientRect()
134
+ const offset = output.dataset.scrollAxis === 'x' ? box.left - container.left - port.clientLeft : box.top - container.top - port.clientTop
135
+ writeReading(output, `${Math.round(offset)} px`)
136
+ })
137
+ }
138
+ const update = () => {
139
+ if (!current()) return
140
+ updateReadings()
141
+ if (sizing === 'content') {
142
+ // The root's normal-flow box includes collapsed body/child margins.
143
+ // scrollHeight is at least the current viewport and cannot shrink it.
144
+ contentHeight = Math.max(96, Math.ceil(doc.documentElement.getBoundingClientRect().height))
145
+ }
146
+ fitWidth = Math.round(iframe.clientWidth)
147
+ minimumWidth = Math.min(240, body?.clientWidth ?? 240, maxWidth)
148
+ const target = doc.querySelector('[data-target]')
149
+ if (target && inspect?.length) {
150
+ const computed = view.getComputedStyle(target)
151
+ properties = inspect.map(name => `${name}: ${computed.getPropertyValue(name)}`).join(' · ')
152
+ }
153
+ }
154
+ applyTheme()
155
+ update()
156
+ const themeObserver = new MutationObserver(() => { applyTheme(); update() })
157
+ themeObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })
158
+ // Svelte flushes state in a microtask, still inside the observer's delivery,
159
+ // so resizing the iframe there trips WebKit's ResizeObserver loop error.
160
+ let resizeTimer: ReturnType<typeof setTimeout> | undefined
161
+ const resizeObserver = new ResizeObserver(() => {
162
+ clearTimeout(resizeTimer)
163
+ resizeTimer = setTimeout(update)
164
+ })
165
+ resizeObserver.observe(iframe)
166
+ if (body) resizeObserver.observe(body)
167
+ if (sizing === 'content') {
168
+ resizeObserver.observe(doc.body)
169
+ resizeObserver.observe(doc.documentElement)
170
+ }
171
+ doc.querySelectorAll<HTMLElement>('[data-size-readout]').forEach(output => {
172
+ const element = doc.getElementById(output.dataset.sizeReadout!)
173
+ if (element) resizeObserver.observe(element)
174
+ })
175
+ const controller = motion || doc.querySelector('[data-animation-readout]') ? demoPlayback(doc, motion, value => { playing = value }, update) : null
176
+ const disposeDragReadings = doc.querySelector('[data-drag-readout]') ? demoDragReadings(doc) : undefined
177
+ playback = controller
178
+ const preference = matchMedia('(prefers-reduced-motion: reduce)')
179
+ const preferenceChanged = () => {
180
+ // Only playback-controlled demos own their animations. Native transitions
181
+ // follow the authored media queries and must be allowed to finish.
182
+ if (motion) controller?.pause()
183
+ if (controller) controller.refresh()
184
+ else update()
185
+ }
186
+ preference.addEventListener('change', preferenceChanged)
187
+ doc.addEventListener('scroll', updateReadings, true)
188
+ doc.fonts.addEventListener('loadingdone', update)
189
+ doc.fonts.addEventListener('loadingerror', update)
190
+ const events = ['pointerover', 'pointerout', 'pointerdown', 'pointerup', 'focusin', 'focusout', 'input', 'click', 'transitionend', 'transitioncancel']
191
+ const timers = new Set<ReturnType<typeof setTimeout>>()
192
+ const afterEvent = () => {
193
+ if (!current()) return
194
+ const timer = setTimeout(() => { update(); timers.delete(timer) }, 50)
195
+ timers.add(timer)
196
+ }
197
+ events.forEach(event => doc.addEventListener(event, afterEvent))
198
+ const click = (event: MouseEvent) => {
199
+ if (!current()) return
200
+ const target = (event.target as Element).closest<HTMLElement>('[data-scroll-to]')
201
+ if (target) {
202
+ if (target.matches('a')) event.preventDefault()
203
+ const destination = doc.getElementById(target.dataset.scrollTo!)
204
+ if (destination) {
205
+ const alignment = view.getComputedStyle(destination).scrollSnapAlign.split(' ')
206
+ const edge = (value: string): ScrollLogicalPosition => value === 'center' || value === 'end' ? value : 'start'
207
+ const options: ScrollIntoViewOptions & { container: 'nearest' } = {
208
+ block: edge(alignment[0]), inline: edge(alignment[1] ?? alignment[0]), container: 'nearest',
209
+ }
210
+ // Safari versions that ignore (container:nearest) also scroll the host page.
211
+ // Restore only host ancestors; the specimen keeps its native CSS alignment.
212
+ const ancestors: { element: HTMLElement, top: number, left: number }[] = []
213
+ for (let element = iframe.parentElement; element; element = element.parentElement) {
214
+ if (element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth) {
215
+ ancestors.push({ element, top: element.scrollTop, left: element.scrollLeft })
216
+ }
217
+ }
218
+ destination.scrollIntoView(options)
219
+ ancestors.forEach(({ element, top, left }) => element.scrollTo({ top, left, behavior: 'instant' }))
220
+ }
221
+ }
222
+ const advance = (event.target as Element).closest<HTMLElement>('[data-scroll-by]')
223
+ if (advance) {
224
+ const container = doc.getElementById(advance.dataset.scrollBy!)
225
+ const distance = Number(advance.dataset.scrollDistance)
226
+ if (container && Number.isFinite(distance)) container.scrollBy({ left: distance, behavior: 'instant' })
227
+ }
228
+ const scrollButton = (event.target as Element).closest<HTMLElement>('[data-scroll-container]')
229
+ if (scrollButton) {
230
+ const container = doc.getElementById(scrollButton.dataset.scrollContainer!)
231
+ const end = scrollButton.dataset.scrollEdge === 'end'
232
+ container?.scrollTo({ top: end ? container.scrollHeight : 0, left: end ? container.scrollWidth : 0, behavior: 'instant' })
233
+ }
234
+ }
235
+ doc.addEventListener('click', click)
236
+ ready = true
237
+ cleanup = () => {
238
+ active = false
239
+ themeObserver.disconnect()
240
+ resizeObserver.disconnect()
241
+ clearTimeout(resizeTimer)
242
+ preference.removeEventListener('change', preferenceChanged)
243
+ doc.removeEventListener('scroll', updateReadings, true)
244
+ doc.fonts.removeEventListener('loadingdone', update)
245
+ doc.fonts.removeEventListener('loadingerror', update)
246
+ events.forEach(event => doc.removeEventListener(event, afterEvent))
247
+ doc.removeEventListener('click', click)
248
+ timers.forEach(clearTimeout)
249
+ controller?.dispose()
250
+ disposeDragReadings?.()
251
+ if (playback === controller) playback = null
252
+ cleanup = () => {}
253
+ }
254
+ }
255
+
256
+ // Reconnect whenever an option the document readings depend on changes.
257
+ $effect(() => {
258
+ void [dark, inspect, maxWidth, motion, sizing]
259
+ untrack(load)
260
+ return () => cleanup()
261
+ })
262
+
263
+ const animate = (action: PlaybackAction) => playback?.act(action)
264
+ const range = $derived({ min: minimumWidth, max: Math.max(minimumWidth, maxWidth), value: width ?? fitWidth })
265
+ /** The handle mirrors the range input for pointers; the input stays the keyboard control. */
266
+ const drag = (event: PointerEvent & { currentTarget: HTMLSpanElement }) => {
267
+ const handle = event.currentTarget
268
+ const viewport = handle.parentElement!
269
+ const start = { x: event.clientX, width: viewport.getBoundingClientRect().width }
270
+ // A centered viewport grows on both sides, so its edge moves at half the width change.
271
+ const scale = start.width < body!.clientWidth - 1 ? 2 : 1
272
+ handle.setPointerCapture(event.pointerId)
273
+ const move = (next: PointerEvent) => { width = Math.round(Math.min(range.max, Math.max(range.min, start.width + (next.clientX - start.x) * scale))) }
274
+ const end = () => {
275
+ handle.removeEventListener('pointermove', move)
276
+ handle.removeEventListener('pointerup', end)
277
+ handle.removeEventListener('pointercancel', end)
278
+ }
279
+ handle.addEventListener('pointermove', move)
280
+ handle.addEventListener('pointerup', end)
281
+ handle.addEventListener('pointercancel', end)
282
+ }
283
+ </script>
284
+
285
+ <!-- The controls belong to the example, not to the document it shows: they sit on the tray between the stage and the source. -->
286
+ <div class="ui-browser" data-variant={chrome ? undefined : 'plain'} data-ready={ready}>
287
+ {#if chrome}<div class="ui-browser-bar" aria-hidden="true"><span class="ui-browser-dots"><i></i><i></i><i></i></span></div>{/if}
288
+ <div bind:this={body} class="ui-browser-body">
289
+ <div class="ui-browser-viewport" style:width={width ? `${width}px` : `min(100%, ${maxWidth}px)`}>
290
+ <iframe bind:this={frame} {title} srcdoc={source} {src} loading="lazy" data-ready={ready} data-sizing={sizing}
291
+ style:height={`${sizing === 'content' ? contentHeight ?? height : height}px`} onload={load}></iframe>
292
+ {#if responsive}<span class="ui-resize" aria-hidden="true" onpointerdown={drag}></span>{/if}
293
+ </div>
294
+ </div>
295
+ </div>
296
+ {#if responsive || motion || print || theme || Boolean(inspect?.length)}
297
+ <div class="ui-browser-tools" role="group" aria-label={`${title} controls`}>
298
+ {#if responsive}
299
+ {#if widthPresets?.length}<div class="ui-segmented" role="group" aria-label={`${rangeLabel} presets`}>
300
+ {#each widthPresets as preset (preset.label)}<button type="button" disabled={!ready}
301
+ aria-pressed={width === preset.width} onclick={() => { width = preset.width }}>{preset.label}</button>{/each}
302
+ </div>{/if}
303
+ <span class="ui-browser-range">
304
+ <label class="ui-label" data-case="as-is" for={widthId}>{rangeLabel}</label>
305
+ <input id={widthId} class="ui-range" disabled={!ready} type="range" min={range.min} max={range.max} step="1" value={range.value}
306
+ style:--value={`${((range.value - range.min) / Math.max(1, range.max - range.min)) * 100}%`}
307
+ oninput={event => { width = Number(event.currentTarget.value) }} />
308
+ {#if ready}<output class="ui-browser-size" for={widthId}>{fitWidth} px</output>{/if}
309
+ </span>
310
+ <button type="button" disabled={!ready} class="ui-button" data-size="sm" onclick={() => { width = undefined }}>Fit</button>
311
+ {/if}
312
+ {#if theme}<button type="button" disabled={!ready} class="ui-button" data-size="sm" aria-pressed={isDark} title="Toggle dark theme" onclick={() => { dark = !isDark }}>
313
+ {#if isDark}<IconMoon aria-hidden="true" />{:else}<IconSun aria-hidden="true" />{/if}Theme
314
+ </button>{/if}
315
+ {#if motion}
316
+ <button type="button" disabled={!ready} class="ui-button" data-size="sm" onclick={() => animate(playing ? 'pause' : 'play')}>
317
+ {#if playing}<IconPlayerPause aria-hidden="true" />{:else}<IconPlayerPlay aria-hidden="true" />{/if}{playing ? 'Pause' : 'Play'}
318
+ </button>
319
+ <button type="button" disabled={!ready} class="ui-button" data-size="sm" data-variant="quiet" onclick={() => animate('restart')}><IconRefresh aria-hidden="true" />Replay</button>
320
+ {/if}
321
+ {#if print}<button type="button" disabled={!ready} class="ui-button" data-size="sm" onclick={() => frame?.contentWindow?.print()}><IconPrinter aria-hidden="true" />Print preview</button>{/if}
322
+ {#if properties}<output aria-live="polite">{properties}</output>{/if}
323
+ </div>
324
+ {/if}
@@ -0,0 +1,30 @@
1
+ ---
2
+ import '@master/internal-site/styles/system/data.css'
3
+ import Demo from '@master/internal-site/demo/Demo.svelte'
4
+ import type { DemoWaterfallProps } from '@master/internal-site/demo/demo-waterfall.ts'
5
+
6
+ type Props = DemoWaterfallProps
7
+
8
+ /** A conceptual discovery diagram. Keep measured performance in benchmark charts. */
9
+ const { title, description, rows, marker, caption = 'Illustrative order · no time scale' } = Astro.props
10
+ if (marker && (!Number.isFinite(marker.position) || marker.position < 0 || marker.position > 100)) throw new Error('Invalid waterfall marker')
11
+ for (const { label, start, end } of rows) {
12
+ if (!Number.isFinite(start) || !Number.isFinite(end) || start < 0 || end > 100 || end <= start) throw new Error(`Invalid waterfall interval: ${label}`)
13
+ }
14
+ ---
15
+
16
+ <Demo title={title} description={description} caption={caption} padding="sm" aria-label={title}>
17
+ <div class="w-full ui-waterfall">
18
+ <div class="ui-waterfall-axis" aria-hidden="true"><span /><div class="relative"><span>Earlier</span>{marker && <span class="absolute font-medium fg-text-strong (translate:-50%)" style={{ left: `${marker.position}%` }}>{marker.label}</span>}<span>Later</span></div></div>
19
+ {/* Preserve WebKit list semantics without list markers. */}
20
+ <ul role="list" class="grid gap-2xs m(0) p(0) (list-style:none)">
21
+ {rows.map(({ label, start, end, tone = 'blue' }) => <li class="ui-waterfall-row">
22
+ <span>{label}</span>
23
+ <span class="ui-waterfall-track" aria-hidden="true">
24
+ <i data-tone={tone === 'neutral' ? 'muted' : undefined} style={{ left: `${start}%`, width: `${end - start}%`, ...(tone === 'neutral' ? {} : { background: `var(--ui-tone-${tone})` }) }} />
25
+ {marker && <span class="ui-waterfall-mark" style={{ left: `${marker.position}%` }} />}
26
+ </span>
27
+ </li>)}
28
+ </ul>
29
+ </div>
30
+ </Demo>
@@ -0,0 +1,12 @@
1
+ ---
2
+ import Demo from '@master/internal-site/demo/Demo.svelte'
3
+ import DemoViewport from '@master/internal-site/demo/DemoViewport.svelte'
4
+ import { demoDocument } from '@master/internal-site/demo/reference/document.ts'
5
+
6
+ const html = "<h1 data-target class=\"m(0) font-2xl font-3xl@md\">Build for the current viewport</h1>\n<p class=\"mt-sm fg-text-muted\">The heading changes at the md viewport threshold.</p>"
7
+ const document = demoDocument({ page: 'guide/breakpoints', id: 'viewport', title: 'Viewport typography', html: [html], css: '', classes: [], classLists: [], highlighted: [] }, { html, caption: '' })
8
+ ---
9
+
10
+ <Demo title="Viewport typography" frame="none" data-foundation="breakpoint" caption="Resize the actual iframe across md. The surrounding document keeps its own viewport.">
11
+ <DemoViewport client:idle={{ timeout: 500 }} title="Viewport typography" document={document} responsive height={200} inspect={['font-size']} />
12
+ </Demo>
@@ -0,0 +1,13 @@
1
+ ---
2
+ import DemoConfiguredExample from '@master/internal-site/demo/DemoConfiguredExample.astro'
3
+ import { projectStyleExample, type ProjectStyleName } from '@master/internal-site/demo/project-style-examples.ts'
4
+
5
+ interface Props {
6
+ name: ProjectStyleName
7
+ code?: boolean
8
+ }
9
+
10
+ const { name, code = true } = Astro.props
11
+ ---
12
+
13
+ <DemoConfiguredExample name={name} {...projectStyleExample(name)} code={code} />
@@ -0,0 +1,10 @@
1
+ import { getContext, setContext } from 'svelte'
2
+
3
+ export type CopyResult = 'success' | 'error' | undefined
4
+ export type CopyFeedback = (message: string, result: CopyResult) => void
5
+
6
+ const key = Symbol('demo-copy-feedback')
7
+
8
+ /** A copy group's shared status; buttons inside the same Svelte tree report to it. */
9
+ export const setCopyFeedback = (report: CopyFeedback) => setContext(key, report)
10
+ export const getCopyFeedback = () => getContext<CopyFeedback | undefined>(key)
@@ -0,0 +1,17 @@
1
+ import type { DemoTone } from '@master/internal-site/demo/tone.ts'
2
+
3
+ export interface DemoWaterfallRow {
4
+ label: string
5
+ /** Normalized visual positions, not measured durations. */
6
+ start: number
7
+ end: number
8
+ tone?: DemoTone
9
+ }
10
+
11
+ export interface DemoWaterfallProps {
12
+ title: string
13
+ description: string
14
+ rows: readonly DemoWaterfallRow[]
15
+ caption?: string
16
+ marker?: { label: string; position: number }
17
+ }
@@ -0,0 +1,20 @@
1
+ /** Observe native events without enabling, canceling or simulating drag behavior. */
2
+ export function demoDragReadings(doc: Document) {
3
+ const counts = new Map<string, number>()
4
+ const read = (event: DragEvent) => {
5
+ const target = (event.target as Element).closest<HTMLElement>('[data-target]')
6
+ if (!target?.id) return
7
+ if (event.type === 'dragstart') counts.set(target.id, (counts.get(target.id) ?? 0) + 1)
8
+ doc.querySelectorAll<HTMLOutputElement>('[data-drag-readout]').forEach(output => {
9
+ if (output.dataset.dragReadout !== target.id) return
10
+ const count = counts.get(target.id) ?? 0
11
+ output.textContent = `${count} ${count === 1 ? 'start' : 'starts'}${event.type === 'dragend' ? ' · ended' : ''}`
12
+ })
13
+ }
14
+ doc.addEventListener('dragstart', read)
15
+ doc.addEventListener('dragend', read)
16
+ return () => {
17
+ doc.removeEventListener('dragstart', read)
18
+ doc.removeEventListener('dragend', read)
19
+ }
20
+ }
@@ -0,0 +1,12 @@
1
+ ---
2
+ import Demo from '@master/internal-site/demo/Demo.svelte'
3
+ import DemoItem from '@master/internal-site/demo/DemoItem.svelte'
4
+ import DemoLabel from '@master/internal-site/demo/DemoLabel.svelte'
5
+ ---
6
+
7
+ <Demo title="Choose one axis or both" data-foundation="axes">
8
+ <div class="flex items-end gap-md w-full">
9
+ <div class="shrink(0) (width:3.5rem)"><DemoLabel>(width:3.5rem) (height:3.5rem)</DemoLabel><DemoItem class="grid (place-content:center) (height:3.5rem) (width:3.5rem) mt-sm font-mono">FN</DemoItem></div>
10
+ <div class="(flex:1) min-w(0)"><DemoLabel>w-full (height:3.5rem)</DemoLabel><DemoItem tone="violet" class="grid (place-content:center) (height:3.5rem) w-full mt-sm text-sm">Fluid</DemoItem></div>
11
+ </div>
12
+ </Demo>
@@ -0,0 +1,5 @@
1
+ ---
2
+ import DemoThemeComparison from '@master/internal-site/demo/DemoThemeComparison.astro'
3
+ ---
4
+
5
+ <DemoThemeComparison name="color-roles" title="One composition, two modes" html={"<article id=\"color-role\" class=\"p-md r-lg b(1) b-solid b-line-divider bg-surface-raised fg-text-body\">\n<h2 class=\"m(0) text-lg font-regular fg-text-strong\">Project updates</h2>\n<p class=\"mt-xs mb-md text-sm fg-text-muted\">Three milestones changed this week.</p>\n<a class=\"fg-text-link fg-text-link-hover:hover underline\" href=\"/guide/colors#choose-a-color-token\" target=\"_top\">Explore color roles</a>\n<p class=\"mt-sm mb(0) font-xs wrap-anywhere\" data-style-readout=\"color-role\" data-style-property=\"color\"></p>\n</article>"} caption="Both documents use identical classes. The active mode supplies the surface, line and text values." />
@@ -0,0 +1,24 @@
1
+ ---
2
+ import DemoContainer from '@master/internal-site/demo/DemoContainer.svelte'
3
+ ---
4
+
5
+ <DemoContainer client:idle={{ timeout: 500 }} title="A summary follows its container" data-foundation="container-grid" caption="Change the ancestor's width. The summary and status share a row from 28rem; the page viewport stays unchanged.">
6
+ <section class="container-inline">
7
+ <article class="grid-cols(1) gap-lg p-md b-solid b(1) b-line-divider r-lg bg-surface-raised grid-cols(2)@container(--md)">
8
+ <div class="min-w(0)">
9
+ <h3 class="m(0) text-md font-regular fg-text-strong">Release notes</h3>
10
+ <p class="mb(0) mt-xs text-sm fg-text-muted">Review the changes before publishing.</p>
11
+ </div>
12
+ <dl class="grid gap-xs m(0) text-sm">
13
+ <div>
14
+ <dt class="fg-text-muted">Status</dt>
15
+ <dd class="m(0) fg-text-strong">Draft ready</dd>
16
+ </div>
17
+ <div>
18
+ <dt class="fg-text-muted">Next step</dt>
19
+ <dd class="m(0) fg-text-strong">Editorial review</dd>
20
+ </div>
21
+ </dl>
22
+ </article>
23
+ </section>
24
+ </DemoContainer>
@@ -0,0 +1,14 @@
1
+ ---
2
+ import FoundationSpecimen from '@master/internal-site/demo/foundations/FoundationSpecimen.astro'
3
+ ---
4
+
5
+ <FoundationSpecimen name="dialog-entrance" title="Motion follows a real action" scene={{ systemButtons: true, sizing: 'viewport', height: 340, css: `@theme {
6
+ --duration-enter: 180ms;
7
+ --easing-emphasized: cubic-bezier(.16, 1, .3, 1);
8
+ --animate-dialog-in: dialog-in var(--duration-enter) var(--easing-emphasized) both;
9
+ }
10
+ @keyframes dialog-in {
11
+ from { translate: 0 0.5rem; opacity: 0; }
12
+ to { translate: 0; opacity: 1; }
13
+ }
14
+ `, html: "<article class=\"p-md r-sm b(1) b-solid b-line-divider bg-surface-raised\"><h2 class=\"m(0) text-lg font-regular\">Collection settings</h2><p class=\"mt-xs mb-md fg-text-muted\">Open a native dialog to preview its entrance.</p><button id=\"open\" type=\"button\" class=\"ui-button\">Open details</button></article>\n<dialog id=\"details\" aria-labelledby=\"dialog-title\" aria-describedby=\"dialog-description\" class=\"(width:calc(100%-32px)) max-w-xs m-auto p-md r-lg b(1) b-solid b-line-divider bg-surface-floating fg-text-body shadow-xl animate-dialog-in@media(screen)@motion-safe\">\n<h2 id=\"dialog-title\" class=\"m(0) text-lg font-regular fg-text-strong\">Collection details</h2><p id=\"dialog-description\" class=\"mt-sm mb-md\">This dialog has a finite entrance. Closing it is immediate.</p><form method=\"dialog\"><button class=\"ui-button\" autofocus>Close details</button></form>\n</dialog><script>const dialog = document.getElementById('details'); const openButton = document.getElementById('open'); openButton.addEventListener('click', () => dialog.showModal()); dialog.addEventListener('close', () => openButton.focus());</script>", caption: 'The dialog enters once on opening. Escape or Close details returns focus to its trigger. Reduced motion opens it immediately. Its modal boundary stays inside this preview.' }} />
@@ -0,0 +1,5 @@
1
+ ---
2
+ import DemoThemeComparison from '@master/internal-site/demo/DemoThemeComparison.astro'
3
+ ---
4
+
5
+ <DemoThemeComparison name="elevation" title="Quiet separation" html={"<article id=\"shadow-role\" class=\"m-sm p-md r-lg bg-surface-raised shadow-sm\">\n<h2 class=\"m(0) text-lg font-medium fg-text-strong\">Collection notes</h2>\n<p class=\"mt-xs mb(0) fg-text-muted\">A raised surface with a small, consistent shadow.</p>\n<p class=\"mt-sm mb(0) font-xs wrap-anywhere\" data-style-readout=\"shadow-role\" data-style-property=\"box-shadow\"></p>\n</article>"} caption="shadow-sm uses the same offsets across these modes, with different edge and shadow colors." />
@@ -0,0 +1,5 @@
1
+ ---
2
+ import DemoThemeComparison from '@master/internal-site/demo/DemoThemeComparison.astro'
3
+ ---
4
+
5
+ <DemoThemeComparison name="elevation-state" print title="Depth follows interaction" html={"<a class=\"block m-sm p-md r-lg bg-surface-raised fg-text-body shadow-sm shadow-md:hover@media(screen) shadow-md:focus-visible@media(screen) (box-shadow:none)@media(print) (text-decoration:none)\" href=\"/guide/colors#raised-surfaces\" target=\"_top\">\n<strong class=\"block fg-text-strong\">Collection guide ↗</strong>\n<span class=\"block mt-xs fg-text-muted\">Hover or focus this link to lift its surface.</span>\n</a>"} caption="A native link supports pointer and keyboard focus. The focus outline remains visible; printing removes the shadow." />
@@ -0,0 +1,5 @@
1
+ ---
2
+ import DemoThemeComparison from '@master/internal-site/demo/DemoThemeComparison.astro'
3
+ ---
4
+
5
+ <DemoThemeComparison name="base-hue" title="A fixed hue" html={"<div class=\"grid gap-md\">\n<div class=\"(height:4rem) r-sm bg-yellow\" aria-label=\"Yellow background swatch\" role=\"img\"></div>\n<p class=\"m(0) font-mono font-xs fg-text-muted\">bg-yellow</p>\n<svg class=\"(width:3rem) (height:3rem) fg-yellow\" viewBox=\"0 0 48 48\" role=\"img\" aria-label=\"Yellow diamond\"><path d=\"M24 2 46 24 24 46 2 24Z\" fill=\"currentColor\"/></svg>\n<p class=\"m(0) font-mono font-xs fg-text-muted\">fg-yellow · currentColor</p>\n</div>"} caption="General hue aliases keep the same swatch in both schemes. Use text hue aliases for adaptive readable foregrounds." />
@@ -0,0 +1,5 @@
1
+ ---
2
+ import DemoThemeComparison from '@master/internal-site/demo/DemoThemeComparison.astro'
3
+ ---
4
+
5
+ <DemoThemeComparison name="lines" title="Visible boundaries" html={"<div class=\"grid gap-md\">\n<section class=\"p-md r-sm b(1) b-solid b-line-divider bg-surface-raised\"><h2 class=\"m(0) text-md font-medium\">Decorative divider</h2><p class=\"mt-xs mb(0) fg-text-muted\">b-line-divider</p></section>\n<section class=\"p-md r-sm b(1) b-solid b-line-control bg-surface-raised\"><h2 class=\"m(0) text-md font-medium\">Control boundary</h2><p class=\"mt-xs mb(0) fg-text-muted\">b-line-control</p></section>\n</div>"} caption="The line role selects a color. Width and style still need an explicit declaration." />
@@ -0,0 +1,28 @@
1
+ ---
2
+ import DemoContainer from '@master/internal-site/demo/DemoContainer.svelte'
3
+ import DemoLabel from '@master/internal-site/demo/DemoLabel.svelte'
4
+ import DemoMedia from '@master/internal-site/demo/DemoMedia.svelte'
5
+ import type { ComponentProps } from 'svelte'
6
+
7
+ const media: ComponentProps<typeof DemoMedia> = {
8
+ tone: 'blue',
9
+ class: 'h-auto w-full (aspect-ratio:4/3) r-sm shrink(0)@container(width>=28rem) (width:9rem)@container(width>=28rem)',
10
+ 'aria-label': 'Blue mountain illustration'
11
+ }
12
+
13
+ /** The query boundary is an ancestor; it never queries its own width. */
14
+ ---
15
+
16
+ <DemoContainer client:idle={{ timeout: 500 }} title="A component follows its container" data-foundation="media" caption="Below 28rem of container width, the media stacks. At 28rem it keeps a 9rem width beside flexible text.">
17
+ <div class="container-inline">
18
+ <article class="flex flex-col items-start gap-md p-md flex-row@container(width>=28rem) ui-sheet" data-elevation="1">
19
+ <DemoMedia {...media} />
20
+ <div class="(flex:1) min-w(0)">
21
+ <DemoLabel>Collection / 024</DemoLabel>
22
+ <h3 class="mb(0) mx(0) mt-xs text-md font-semibold">Field notes</h3>
23
+ <p class="mb(0) mx(0) mt-xs text-sm fg-text-muted">A small archive of places, textures and quiet details from the trail.</p>
24
+ <div class="flex flex-wrap gap-sm mt-md"><DemoLabel>12 images</DemoLabel><DemoLabel>Updated today</DemoLabel></div>
25
+ </div>
26
+ </article>
27
+ </div>
28
+ </DemoContainer>
@@ -0,0 +1,5 @@
1
+ ---
2
+ import FoundationSpecimen from '@master/internal-site/demo/foundations/FoundationSpecimen.astro'
3
+ ---
4
+
5
+ <FoundationSpecimen name="finite-motion" title="Two finite entrances" scene={{ motion: true, html: "<div class=\"grid gap-lg\">\n<p class=\"m(0) text-sm fg-text-muted hidden@motion-reduce hidden@media(print)\">Press Play to reveal the two cards.</p>\n<section><p class=\"mb-sm text-sm font-medium\">Fade · 300ms</p><div data-ui=\"surface\"><div id=\"fade\" class=\"p-md r-sm bg-surface-raised b(1) b-solid b-line-divider (animation-name:fade)@media(screen)@motion-safe (animation-duration:var(--duration-slow))@media(screen)@motion-safe (animation-timing-function:var(--easing-smooth))@media(screen)@motion-safe\"><strong class=\"fg-text-strong\">Collection saved</strong><p class=\"mt-xs mb(0) fg-text-muted\">A quiet opacity entrance.</p></div></div><p class=\"mt-xs mb(0)\" data-ui=\"label\"><output data-animation-readout=\"fade\">Paused</output></p></section>\n<section><p class=\"mb-sm text-sm font-medium\">Zoom · 150ms</p><div data-ui=\"surface\"><div id=\"zoom\" class=\"p-md r-sm bg-surface-raised b(1) b-solid b-line-divider (animation-name:zoom)@media(screen)@motion-safe (animation-duration:var(--duration-fast))@media(screen)@motion-safe (animation-timing-function:var(--easing-overshoot))@media(screen)@motion-safe\"><strong class=\"fg-text-strong\">New collection</strong><p class=\"mt-xs mb(0) fg-text-muted\">A brief scale entrance.</p></div></div><p class=\"mt-xs mb(0)\" data-ui=\"label\"><output data-animation-readout=\"zoom\">Paused</output></p></section>\n</div>", caption: 'Both animations run once and start paused. Play and Replay control the native timelines. Reduced motion shows the content immediately without animation.' }} />