@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.
- package/LICENSE +21 -0
- package/README.md +66 -2
- package/dist/astro.d.mts +3 -0
- package/dist/astro.mjs +510 -0
- package/dist/config.d.mts +64 -0
- package/dist/config.mjs +10 -0
- package/package.json +384 -4
- package/src/astro/Page.astro +12 -0
- package/src/astro/content-pages.ts +75 -0
- package/src/astro/index.ts +124 -0
- package/src/astro/module-id.ts +4 -0
- package/src/astro/propagated-assets.ts +29 -0
- package/src/astro/route-paths.ts +78 -0
- package/src/astro/routes.template.ts +110 -0
- package/src/astro/server-styles.ts +26 -0
- package/src/astro/site-context.ts +27 -0
- package/src/astro/source-url.ts +22 -0
- package/src/astro/svelte-renderer.ts +45 -0
- package/src/astro/svg-markup.ts +23 -0
- package/src/benchmarks/BenchmarkBarRows.astro +34 -0
- package/src/benchmarks/BenchmarkBars.astro +14 -0
- package/src/benchmarks/BenchmarkChart.astro +53 -0
- package/src/benchmarks/BenchmarkChartGroup.astro +24 -0
- package/src/benchmarks/BenchmarkDataTable.astro +24 -0
- package/src/benchmarks/BenchmarkDelta.astro +23 -0
- package/src/benchmarks/BenchmarkFigure.astro +30 -0
- package/src/benchmarks/BenchmarkMetricTable.astro +38 -0
- package/src/benchmarks/BenchmarkMetrics.astro +23 -0
- package/src/benchmarks/BenchmarkSampleSummary.astro +30 -0
- package/src/benchmarks/BenchmarkScrollRegion.svelte +27 -0
- package/src/benchmarks/BenchmarkSource.astro +20 -0
- package/src/benchmarks/BenchmarkStackedBars.astro +54 -0
- package/src/benchmarks/BenchmarkStatus.astro +16 -0
- package/src/benchmarks/types.ts +98 -0
- package/src/benchmarks/utils.ts +42 -0
- package/src/blog/BlogAuthors.astro +25 -0
- package/src/blog/article/BlogArticleContents.svelte +24 -0
- package/src/blog/article/BlogArticleEnd.astro +55 -0
- package/src/blog/article/BlogArticleMasthead.astro +61 -0
- package/src/blog/article/language.ts +29 -0
- package/src/blog/article/neighbors.ts +27 -0
- package/src/blog/article/title-lines.astro +14 -0
- package/src/blog/article/title-parts.ts +9 -0
- package/src/components.d.ts +5 -0
- package/src/config.ts +66 -0
- package/src/css/ButtonPreview.astro +22 -0
- package/src/css/ConfiguredExample.astro +15 -0
- package/src/css/NamespaceUtilityTable.astro +50 -0
- package/src/css/StylesheetExample.astro +15 -0
- package/src/css/ThemeNumberVariableTable.astro +57 -0
- package/src/css/configured-example.ts +53 -0
- package/src/css/foundation-data/elevation/shadow-data.ts +52 -0
- package/src/css/foundation-data/sizing/scale-data.ts +37 -0
- package/src/css/foundation-data/specimen-content.ts +10 -0
- package/src/css/foundation-data/specimens.ts +96 -0
- package/src/css/foundation-data/tokens.ts +32 -0
- package/src/css/generate-preset-css.ts +12 -0
- package/src/css/highlight.ts +34 -0
- package/src/css/manifest-utilities.ts +29 -0
- package/src/css/markdown.ts +279 -0
- package/src/css/preset-css.ts +15 -0
- package/src/css/preset-manifest.ts +3 -0
- package/src/css/stylesheet-example.ts +26 -0
- package/src/css/theme-variables.ts +74 -0
- package/src/css/variable-namespace-sources.ts +20 -0
- package/src/demo/Demo.svelte +55 -0
- package/src/demo/DemoAsset.astro +38 -0
- package/src/demo/DemoAxes.svelte +22 -0
- package/src/demo/DemoBadge.svelte +18 -0
- package/src/demo/DemoCatalog.astro +36 -0
- package/src/demo/DemoComparison.svelte +36 -0
- package/src/demo/DemoConfiguredExample.astro +48 -0
- package/src/demo/DemoContainer.svelte +48 -0
- package/src/demo/DemoControls.svelte +16 -0
- package/src/demo/DemoCopyButton.svelte +50 -0
- package/src/demo/DemoCopyGroup.svelte +15 -0
- package/src/demo/DemoExample.astro +27 -0
- package/src/demo/DemoFeatureSupport.svelte +18 -0
- package/src/demo/DemoGeneratedCSS.svelte +8 -0
- package/src/demo/DemoIndex.astro +23 -0
- package/src/demo/DemoInstallation.astro +17 -0
- package/src/demo/DemoItem.svelte +17 -0
- package/src/demo/DemoLabel.svelte +15 -0
- package/src/demo/DemoLegend.svelte +15 -0
- package/src/demo/DemoMeasure.svelte +28 -0
- package/src/demo/DemoMedia.svelte +43 -0
- package/src/demo/DemoMotion.svelte +41 -0
- package/src/demo/DemoPageViewport.astro +17 -0
- package/src/demo/DemoPalette.astro +29 -0
- package/src/demo/DemoPaletteGroups.svelte +15 -0
- package/src/demo/DemoScrollArea.svelte +15 -0
- package/src/demo/DemoStyleComparison.astro +25 -0
- package/src/demo/DemoSurface.svelte +15 -0
- package/src/demo/DemoSwatch.svelte +19 -0
- package/src/demo/DemoThemeComparison.astro +30 -0
- package/src/demo/DemoTokenTable.astro +34 -0
- package/src/demo/DemoViewTransition.astro +18 -0
- package/src/demo/DemoViewport.svelte +324 -0
- package/src/demo/DemoWaterfall.astro +30 -0
- package/src/demo/FoundationBreakpoint.astro +12 -0
- package/src/demo/ProjectStyleExample.astro +13 -0
- package/src/demo/copy-feedback.ts +10 -0
- package/src/demo/demo-waterfall.ts +17 -0
- package/src/demo/drag-readings.ts +20 -0
- package/src/demo/foundations/FoundationAxes.astro +12 -0
- package/src/demo/foundations/FoundationColorRoles.astro +5 -0
- package/src/demo/foundations/FoundationContainerGrid.astro +24 -0
- package/src/demo/foundations/FoundationDialog.astro +14 -0
- package/src/demo/foundations/FoundationElevation.astro +5 -0
- package/src/demo/foundations/FoundationElevationState.astro +5 -0
- package/src/demo/foundations/FoundationHue.astro +5 -0
- package/src/demo/foundations/FoundationLines.astro +5 -0
- package/src/demo/foundations/FoundationMedia.astro +28 -0
- package/src/demo/foundations/FoundationMotion.astro +5 -0
- package/src/demo/foundations/FoundationPalette.astro +8 -0
- package/src/demo/foundations/FoundationRadius.astro +13 -0
- package/src/demo/foundations/FoundationShapes.astro +12 -0
- package/src/demo/foundations/FoundationShrink.astro +14 -0
- package/src/demo/foundations/FoundationSizing.astro +19 -0
- package/src/demo/foundations/FoundationSpecimen.astro +20 -0
- package/src/demo/foundations/FoundationSurfaces.astro +5 -0
- package/src/demo/foundations/FoundationTextHue.astro +5 -0
- package/src/demo/foundations/FoundationTextRoles.astro +5 -0
- package/src/demo/foundations/FoundationTokens.astro +22 -0
- package/src/demo/foundations/FoundationTokensView.astro +65 -0
- package/src/demo/foundations/FoundationTransition.astro +5 -0
- package/src/demo/foundations/FoundationTypeComparison.astro +12 -0
- package/src/demo/foundations/FoundationTypography.astro +5 -0
- package/src/demo/foundations/Palette.svelte +37 -0
- package/src/demo/foundations/ShadowScaleDemo.astro +22 -0
- package/src/demo/illustration-materials.ts +180 -0
- package/src/demo/maintenance-example.ts +62 -0
- package/src/demo/playback.ts +75 -0
- package/src/demo/project-style-examples.ts +128 -0
- package/src/demo/reference/alignment.ts +42 -0
- package/src/demo/reference/animations.ts +30 -0
- package/src/demo/reference/backgrounds.ts +39 -0
- package/src/demo/reference/border-paint.ts +31 -0
- package/src/demo/reference/clipping.ts +26 -0
- package/src/demo/reference/document.ts +55 -0
- package/src/demo/reference/edges.ts +40 -0
- package/src/demo/reference/effects.ts +27 -0
- package/src/demo/reference/flexbox.ts +33 -0
- package/src/demo/reference/frame.css +118 -0
- package/src/demo/reference/grid.ts +42 -0
- package/src/demo/reference/html.ts +40 -0
- package/src/demo/reference/interaction.ts +42 -0
- package/src/demo/reference/layout-html.ts +10 -0
- package/src/demo/reference/layout.ts +102 -0
- package/src/demo/reference/media.ts +29 -0
- package/src/demo/reference/positioning.ts +90 -0
- package/src/demo/reference/scenes.ts +197 -0
- package/src/demo/reference/scrolling.ts +66 -0
- package/src/demo/reference/shapes.ts +22 -0
- package/src/demo/reference/sizing.ts +43 -0
- package/src/demo/reference/source.ts +8 -0
- package/src/demo/reference/text-effects.ts +37 -0
- package/src/demo/reference/text-flow.ts +41 -0
- package/src/demo/reference/transforms.ts +26 -0
- package/src/demo/reference/transitions.ts +24 -0
- package/src/demo/reference/type-specimens.ts +56 -0
- package/src/demo/reference/types.ts +30 -0
- package/src/demo/reference/typography.ts +32 -0
- package/src/demo/specimens/accent-color.json +50 -0
- package/src/demo/specimens/align-items.json +56 -0
- package/src/demo/specimens/animation-delay.json +55 -0
- package/src/demo/specimens/animation-direction.json +49 -0
- package/src/demo/specimens/animation-fill-mode.json +55 -0
- package/src/demo/specimens/animation-iteration-count.json +55 -0
- package/src/demo/specimens/animation-play-state.json +83 -0
- package/src/demo/specimens/animation-timing-function.json +48 -0
- package/src/demo/specimens/appearance.json +44 -0
- package/src/demo/specimens/aspect-ratio.json +28 -0
- package/src/demo/specimens/backdrop-filter.json +44 -0
- package/src/demo/specimens/background-attachment.json +49 -0
- package/src/demo/specimens/background-image.json +25 -0
- package/src/demo/specimens/background-origin.json +36 -0
- package/src/demo/specimens/background-size.json +29 -0
- package/src/demo/specimens/border-collapse.json +45 -0
- package/src/demo/specimens/border-color.json +35 -0
- package/src/demo/specimens/border-image-repeat.json +50 -0
- package/src/demo/specimens/border-image-slice.json +45 -0
- package/src/demo/specimens/border-radius.json +30 -0
- package/src/demo/specimens/box-decoration-break.json +35 -0
- package/src/demo/specimens/box-shadow.json +33 -0
- package/src/demo/specimens/clear.json +77 -0
- package/src/demo/specimens/clip-path.json +38 -0
- package/src/demo/specimens/content.json +27 -0
- package/src/demo/specimens/counter-set.json +31 -0
- package/src/demo/specimens/fill.json +23 -0
- package/src/demo/specimens/filter.json +23 -0
- package/src/demo/specimens/flex-direction.json +27 -0
- package/src/demo/specimens/flex-grow.json +27 -0
- package/src/demo/specimens/font-style.json +23 -0
- package/src/demo/specimens/font-variant-numeric.json +28 -0
- package/src/demo/specimens/grid-auto-columns.json +29 -0
- package/src/demo/specimens/grid-auto-flow.json +37 -0
- package/src/demo/specimens/grid-template-areas.json +34 -0
- package/src/demo/specimens/grid-template-columns.json +36 -0
- package/src/demo/specimens/isolation.json +25 -0
- package/src/demo/specimens/justify-content.json +36 -0
- package/src/demo/specimens/line-height.json +28 -0
- package/src/demo/specimens/list-style-position.json +36 -0
- package/src/demo/specimens/mask-image.json +54 -0
- package/src/demo/specimens/min-width.json +39 -0
- package/src/demo/specimens/mix-blend-mode.json +43 -0
- package/src/demo/specimens/object-fit.json +27 -0
- package/src/demo/specimens/object-position.json +27 -0
- package/src/demo/specimens/opacity.json +37 -0
- package/src/demo/specimens/order.json +28 -0
- package/src/demo/specimens/overflow-wrap.json +26 -0
- package/src/demo/specimens/overflow.json +53 -0
- package/src/demo/specimens/overscroll-behavior.json +29 -0
- package/src/demo/specimens/padding.json +84 -0
- package/src/demo/specimens/place-content.json +31 -0
- package/src/demo/specimens/pointer-events.json +46 -0
- package/src/demo/specimens/position.json +29 -0
- package/src/demo/specimens/resize.json +32 -0
- package/src/demo/specimens/screen-readers.json +37 -0
- package/src/demo/specimens/scroll-padding.json +29 -0
- package/src/demo/specimens/scroll-snap-stop.json +33 -0
- package/src/demo/specimens/shape-image-threshold.json +37 -0
- package/src/demo/specimens/shape-margin.json +40 -0
- package/src/demo/specimens/shape-outside.json +37 -0
- package/src/demo/specimens/stroke-width.json +27 -0
- package/src/demo/specimens/text-fill-color.json +23 -0
- package/src/demo/specimens/text-stroke-width.json +32 -0
- package/src/demo/specimens/touch-action.json +45 -0
- package/src/demo/specimens/transform-box.json +37 -0
- package/src/demo/specimens/transform-origin.json +56 -0
- package/src/demo/specimens/transform-style.json +55 -0
- package/src/demo/specimens/transform.json +47 -0
- package/src/demo/specimens/transition-delay.json +57 -0
- package/src/demo/specimens/transition-duration.json +60 -0
- package/src/demo/specimens/transition-property.json +60 -0
- package/src/demo/specimens/transition-timing-function.json +65 -0
- package/src/demo/specimens/user-drag.json +28 -0
- package/src/demo/specimens/user-select.json +25 -0
- package/src/demo/specimens/vertical-align.json +28 -0
- package/src/demo/specimens/width.json +56 -0
- package/src/demo/specimens/will-change.json +50 -0
- package/src/demo/specimens/writing-mode.json +26 -0
- package/src/demo/specimens/z-index.json +35 -0
- package/src/demo/style.ts +15 -0
- package/src/demo/tone.ts +4 -0
- package/src/demo/useDemoViewTransition.svelte.ts +71 -0
- package/src/docs-shell/common/i18n.config.d.ts +2 -0
- package/src/docs-shell/common/i18n.config.js +13 -0
- package/src/docs-shell/common/svgo.config.d.ts +2 -0
- package/src/docs-shell/common/svgo.config.js +11 -0
- package/src/docs-shell/components/ArticleHeader.astro +65 -0
- package/src/docs-shell/components/ArticleTOC.astro +18 -0
- package/src/docs-shell/components/Callout.astro +26 -0
- package/src/docs-shell/components/Code.astro +25 -0
- package/src/docs-shell/components/CodeCopyButton.astro +25 -0
- package/src/docs-shell/components/CodeTabBar.astro +40 -0
- package/src/docs-shell/components/CodeTabs.astro +53 -0
- package/src/docs-shell/components/CodeView.astro +23 -0
- package/src/docs-shell/components/Do.astro +5 -0
- package/src/docs-shell/components/DoNot.astro +5 -0
- package/src/docs-shell/components/DocArticle.astro +14 -0
- package/src/docs-shell/components/DocHeader.svelte +87 -0
- package/src/docs-shell/components/DocHeading.astro +28 -0
- package/src/docs-shell/components/DocMain.astro +19 -0
- package/src/docs-shell/components/DocMenuButton.svelte +95 -0
- package/src/docs-shell/components/DocSidebar.svelte +62 -0
- package/src/docs-shell/components/DocVersionSelect.svelte +22 -0
- package/src/docs-shell/components/DocWrapper.astro +11 -0
- package/src/docs-shell/components/DocumentAPIIndex.astro +24 -0
- package/src/docs-shell/components/DocumentChoices.astro +24 -0
- package/src/docs-shell/components/DocumentCodeExample.astro +20 -0
- package/src/docs-shell/components/DocumentCodeExampleView.astro +35 -0
- package/src/docs-shell/components/DocumentCodeTable.astro +19 -0
- package/src/docs-shell/components/DocumentComparison.astro +7 -0
- package/src/docs-shell/components/DocumentCopyButton.svelte +41 -0
- package/src/docs-shell/components/DocumentDeclaration.astro +17 -0
- package/src/docs-shell/components/DocumentDeclarationView.astro +12 -0
- package/src/docs-shell/components/DocumentDisclosure.astro +14 -0
- package/src/docs-shell/components/DocumentFileTree.astro +34 -0
- package/src/docs-shell/components/DocumentFlow.astro +27 -0
- package/src/docs-shell/components/DocumentIdentifier.astro +14 -0
- package/src/docs-shell/components/DocumentIllustration.astro +46 -0
- package/src/docs-shell/components/DocumentKeyList.astro +22 -0
- package/src/docs-shell/components/DocumentNamespaceTable.astro +20 -0
- package/src/docs-shell/components/DocumentOptionEntry.astro +15 -0
- package/src/docs-shell/components/DocumentOptionList.astro +11 -0
- package/src/docs-shell/components/DocumentOptions.astro +23 -0
- package/src/docs-shell/components/DocumentParameters.astro +30 -0
- package/src/docs-shell/components/DocumentPrompt.astro +16 -0
- package/src/docs-shell/components/DocumentValueList.astro +25 -0
- package/src/docs-shell/components/DocumentationIndex.svelte +144 -0
- package/src/docs-shell/components/Dropped.astro +21 -0
- package/src/docs-shell/components/ExpandContent.svelte +21 -0
- package/src/docs-shell/components/ExplorerView.astro +37 -0
- package/src/docs-shell/components/FileIcon.astro +123 -0
- package/src/docs-shell/components/Footer.svelte +80 -0
- package/src/docs-shell/components/GeneratedCSS.astro +8 -0
- package/src/docs-shell/components/Header.svelte +121 -0
- package/src/docs-shell/components/HeaderIcon.astro +14 -0
- package/src/docs-shell/components/HeaderNav.svelte +18 -0
- package/src/docs-shell/components/Image.svelte +56 -0
- package/src/docs-shell/components/Info.astro +5 -0
- package/src/docs-shell/components/InlineCode.astro +30 -0
- package/src/docs-shell/components/InteractingIndicator.astro +19 -0
- package/src/docs-shell/components/LanguageButton.svelte +18 -0
- package/src/docs-shell/components/LanguageSelect.svelte +44 -0
- package/src/docs-shell/components/Link.svelte +127 -0
- package/src/docs-shell/components/ModeImg.astro +11 -0
- package/src/docs-shell/components/NotFound.astro +21 -0
- package/src/docs-shell/components/OverviewButtons.astro +36 -0
- package/src/docs-shell/components/PMAction.astro +25 -0
- package/src/docs-shell/components/PackageBadges.astro +39 -0
- package/src/docs-shell/components/PageContent.svelte +38 -0
- package/src/docs-shell/components/PageContentBootstrap.astro +13 -0
- package/src/docs-shell/components/PageContentDisclosure.astro +25 -0
- package/src/docs-shell/components/PageContentList.svelte +70 -0
- package/src/docs-shell/components/PageContentProvider.svelte +15 -0
- package/src/docs-shell/components/PageContentTitle.svelte +16 -0
- package/src/docs-shell/components/PageNavs.astro +40 -0
- package/src/docs-shell/components/PreparedCodeView.astro +12 -0
- package/src/docs-shell/components/RenderNode.astro +16 -0
- package/src/docs-shell/components/RouteLayers.astro +17 -0
- package/src/docs-shell/components/SearchButton.svelte +31 -0
- package/src/docs-shell/components/SearchDialog.svelte +174 -0
- package/src/docs-shell/components/Segments.svelte +62 -0
- package/src/docs-shell/components/Step.astro +13 -0
- package/src/docs-shell/components/StepL.astro +10 -0
- package/src/docs-shell/components/StepR.astro +10 -0
- package/src/docs-shell/components/StepSection.astro +12 -0
- package/src/docs-shell/components/Tab.astro +8 -0
- package/src/docs-shell/components/Tabs.astro +10 -0
- package/src/docs-shell/components/ThemeIcon.astro +19 -0
- package/src/docs-shell/components/ThemeSelect.svelte +20 -0
- package/src/docs-shell/components/TimeAgo.svelte +32 -0
- package/src/docs-shell/components/Translate.astro +14 -0
- package/src/docs-shell/components/Warn.astro +5 -0
- package/src/docs-shell/components/code-props.ts +28 -0
- package/src/docs-shell/components/document-types.ts +119 -0
- package/src/docs-shell/components/markdown/Anchor.astro +5 -0
- package/src/docs-shell/components/markdown/Heading2.astro +5 -0
- package/src/docs-shell/components/markdown/Heading3.astro +5 -0
- package/src/docs-shell/components/markdown/Table.astro +6 -0
- package/src/docs-shell/components/markdown-components.ts +36 -0
- package/src/docs-shell/components/page-content-bootstrap.ts +115 -0
- package/src/docs-shell/components/page-content.svelte.ts +125 -0
- package/src/docs-shell/contexts/search.ts +18 -0
- package/src/docs-shell/contexts/theme-mode.svelte.ts +61 -0
- package/src/docs-shell/data/authors.ts +17 -0
- package/src/docs-shell/data/base-colors.ts +29 -0
- package/src/docs-shell/data/brands.ts +79 -0
- package/src/docs-shell/data/color-names.ts +1 -0
- package/src/docs-shell/data/color-palette.ts +50 -0
- package/src/docs-shell/data/colors.ts +1 -0
- package/src/docs-shell/factories/Page.astro +35 -0
- package/src/docs-shell/factories/create-page.ts +31 -0
- package/src/docs-shell/layouts/BlogArticle.astro +53 -0
- package/src/docs-shell/layouts/Doc.astro +41 -0
- package/src/docs-shell/remark/markdown-components.d.ts +2 -0
- package/src/docs-shell/remark/markdown-components.js +101 -0
- package/src/docs-shell/remark/slug-and-toc.d.ts +2 -0
- package/src/docs-shell/remark/slug-and-toc.js +53 -0
- package/src/docs-shell/scripts/code-tabs-bootstrap.ts +34 -0
- package/src/docs-shell/scripts/code.ts +124 -0
- package/src/docs-shell/scripts/document-anchor.ts +57 -0
- package/src/docs-shell/scripts/document.ts +47 -0
- package/src/docs-shell/site.ts +67 -0
- package/src/docs-shell/types/IllustrationImages.ts +2 -0
- package/src/docs-shell/types/Metadata.ts +17 -0
- package/src/docs-shell/types/Props.ts +9 -0
- package/src/docs-shell/types/StaticImage.ts +6 -0
- package/src/docs-shell/uses/use-selected-preview-syntax.svelte.ts +16 -0
- package/src/docs-shell/utils/anchor.ts +24 -0
- package/src/docs-shell/utils/beautify-css.ts +14 -0
- package/src/docs-shell/utils/beautify-html.ts +12 -0
- package/src/docs-shell/utils/beautify-js.ts +9 -0
- package/src/docs-shell/utils/create-highlighter.ts +50 -0
- package/src/docs-shell/utils/css-modern-grammar.ts +339 -0
- package/src/docs-shell/utils/documentation-search.ts +68 -0
- package/src/docs-shell/utils/generate-metadata.ts +60 -0
- package/src/docs-shell/utils/group-page-content.ts +10 -0
- package/src/docs-shell/utils/head.ts +72 -0
- package/src/docs-shell/utils/highlight-code-core.ts +146 -0
- package/src/docs-shell/utils/highlight-code.ts +1 -0
- package/src/docs-shell/utils/highlighted-code-text.ts +27 -0
- package/src/docs-shell/utils/i18n-pathname.ts +98 -0
- package/src/docs-shell/utils/i18n.ts +12 -0
- package/src/docs-shell/utils/is-date-within-seven-days.ts +16 -0
- package/src/docs-shell/utils/isBrowser.ts +1 -0
- package/src/docs-shell/utils/isInteractOutside.ts +16 -0
- package/src/docs-shell/utils/markdown-tree.ts +22 -0
- package/src/docs-shell/utils/metadata.ts +25 -0
- package/src/docs-shell/utils/prepared-code.ts +21 -0
- package/src/docs-shell/utils/resolve-heading.d.ts +1 -0
- package/src/docs-shell/utils/resolve-heading.js +19 -0
- package/src/docs-shell/utils/search-pages.ts +271 -0
- package/src/docs-shell/utils/slot-text.ts +15 -0
- package/src/docs-shell/utils/snackbar.ts +39 -0
- package/src/docs-shell/utils/syntax-theme.ts +53 -0
- package/src/docs-shell/utils/transformer-notation-word-mark.ts +146 -0
- package/src/docs-shell/utils/unique-id.ts +11 -0
- package/src/examples/article-transitions/page.astro +7 -0
- package/src/examples/article-transitions/transitions.css +10 -0
- package/src/examples/components/ArticleTransitionScene.svelte +83 -0
- package/src/examples/components/ViewTransitionScene.svelte +31 -0
- package/src/examples/images/article-aurora.jpg +0 -0
- package/src/examples/images/article-coast.jpg +0 -0
- package/src/examples/images/article-grid.jpg +0 -0
- package/src/examples/images/article-studio.jpg +0 -0
- package/src/examples/layout-system/page.astro +59 -0
- package/src/examples/scene.css +3 -0
- package/src/examples/view-transitions/page.astro +7 -0
- package/src/examples/view-transitions/transitions.css +9 -0
- package/src/home/HeroCanvas.svelte +617 -0
- package/src/home/HomeAction.astro +17 -0
- package/src/home/HomeBentoFrame.astro +9 -0
- package/src/home/HomeBentoGrid.astro +9 -0
- package/src/home/HomeCompactIcon.astro +15 -0
- package/src/home/HomeFooter.svelte +63 -0
- package/src/home/HomeIllustration.astro +17 -0
- package/src/home/HomeIllustrationArt.svelte +15 -0
- package/src/home/HomeLamp.svelte +18 -0
- package/src/home/design.css +532 -0
- package/src/home/footer.css +225 -0
- package/src/home/hero-shaders.ts +460 -0
- package/src/home/hero-title-mask.ts +175 -0
- package/src/home/hero.css +547 -0
- package/src/home/home-illustration.ts +5 -0
- package/src/home/home-lamp.ts +225 -0
- package/src/home/home.css +1077 -0
- package/src/home/icons/agent-check-preview-apply.svg +24 -0
- package/src/home/icons/agent-clients.svg +26 -0
- package/src/home/icons/agent-project-tools.svg +23 -0
- package/src/home/icons/artwork/agent-check-preview-apply-dark.webp +0 -0
- package/src/home/icons/artwork/agent-check-preview-apply-light.webp +0 -0
- package/src/home/icons/artwork/agent-clients-dark.webp +0 -0
- package/src/home/icons/artwork/agent-clients-light.webp +0 -0
- package/src/home/icons/artwork/agent-edit-file-dark.webp +0 -0
- package/src/home/icons/artwork/agent-edit-file-light.webp +0 -0
- package/src/home/icons/artwork/agent-project-tools-dark.webp +0 -0
- package/src/home/icons/artwork/agent-project-tools-light.webp +0 -0
- package/src/home/icons/artwork/design-cascade-layers-dark.webp +0 -0
- package/src/home/icons/artwork/design-cascade-layers-light.webp +0 -0
- package/src/home/icons/artwork/design-layout-motion-dark.webp +0 -0
- package/src/home/icons/artwork/design-layout-motion-light.webp +0 -0
- package/src/home/icons/artwork/design-p3-gamut-dark.webp +0 -0
- package/src/home/icons/artwork/design-p3-gamut-light.webp +0 -0
- package/src/home/icons/artwork/design-theme-modes-dark.webp +0 -0
- package/src/home/icons/artwork/design-theme-modes-light.webp +0 -0
- package/src/home/icons/artwork/design-theme-tokens-dark.webp +0 -0
- package/src/home/icons/artwork/design-theme-tokens-light.webp +0 -0
- package/src/home/icons/artwork/editor-color-tools-dark.webp +0 -0
- package/src/home/icons/artwork/editor-color-tools-light.webp +0 -0
- package/src/home/icons/artwork/editor-focused-highlighting-dark.webp +0 -0
- package/src/home/icons/artwork/editor-focused-highlighting-light.webp +0 -0
- package/src/home/icons/artwork/editor-hover-inspection-dark.webp +0 -0
- package/src/home/icons/artwork/editor-hover-inspection-light.webp +0 -0
- package/src/home/icons/artwork/editor-manifest-completions-dark.webp +0 -0
- package/src/home/icons/artwork/editor-manifest-completions-light.webp +0 -0
- package/src/home/icons/artwork/lint-class-order-dark.webp +0 -0
- package/src/home/icons/artwork/lint-class-order-light.webp +0 -0
- package/src/home/icons/artwork/lint-conflicting-classes-dark.webp +0 -0
- package/src/home/icons/artwork/lint-conflicting-classes-light.webp +0 -0
- package/src/home/icons/artwork/lint-fix-previews-dark.webp +0 -0
- package/src/home/icons/artwork/lint-fix-previews-light.webp +0 -0
- package/src/home/icons/artwork/lint-invalid-classes-dark.webp +0 -0
- package/src/home/icons/artwork/lint-invalid-classes-light.webp +0 -0
- package/src/home/icons/artwork/lint-strict-vocabulary-dark.webp +0 -0
- package/src/home/icons/artwork/lint-strict-vocabulary-light.webp +0 -0
- package/src/home/icons/artwork/lint-theme-tokens-dark.webp +0 -0
- package/src/home/icons/artwork/lint-theme-tokens-light.webp +0 -0
- package/src/home/icons/artwork/mcp-apply-preview-dark.webp +0 -0
- package/src/home/icons/artwork/mcp-apply-preview-light.webp +0 -0
- package/src/home/icons/artwork/mcp-css-compare-dark.webp +0 -0
- package/src/home/icons/artwork/mcp-css-compare-light.webp +0 -0
- package/src/home/icons/artwork/mcp-inspect-class-dark.webp +0 -0
- package/src/home/icons/artwork/mcp-inspect-class-light.webp +0 -0
- package/src/home/icons/artwork/mcp-lint-project-dark.webp +0 -0
- package/src/home/icons/artwork/mcp-lint-project-light.webp +0 -0
- package/src/home/icons/artwork/mcp-manifest-query-dark.webp +0 -0
- package/src/home/icons/artwork/mcp-manifest-query-light.webp +0 -0
- package/src/home/icons/artwork/mcp-preview-fixes-dark.webp +0 -0
- package/src/home/icons/artwork/mcp-preview-fixes-light.webp +0 -0
- package/src/home/icons/artwork/mcp-render-css-dark.webp +0 -0
- package/src/home/icons/artwork/mcp-render-css-light.webp +0 -0
- package/src/home/icons/artwork/mcp-scan-project-dark.webp +0 -0
- package/src/home/icons/artwork/mcp-scan-project-light.webp +0 -0
- package/src/home/icons/artwork/mcp-trace-class-dark.webp +0 -0
- package/src/home/icons/artwork/mcp-trace-class-light.webp +0 -0
- package/src/home/icons/artwork/render-progressive-dark.webp +0 -0
- package/src/home/icons/artwork/render-progressive-light.webp +0 -0
- package/src/home/icons/artwork/render-runtime-dark.webp +0 -0
- package/src/home/icons/artwork/render-runtime-light.webp +0 -0
- package/src/home/icons/artwork/render-static-dark.webp +0 -0
- package/src/home/icons/artwork/render-static-light.webp +0 -0
- package/src/home/icons/artwork/section-ai-agents-dark.webp +0 -0
- package/src/home/icons/artwork/section-ai-agents-light.webp +0 -0
- package/src/home/icons/artwork/section-css-size-dark.webp +0 -0
- package/src/home/icons/artwork/section-css-size-light.webp +0 -0
- package/src/home/icons/artwork/section-design-system-dark.webp +0 -0
- package/src/home/icons/artwork/section-design-system-light.webp +0 -0
- package/src/home/icons/artwork/section-editor-dark.webp +0 -0
- package/src/home/icons/artwork/section-editor-light.webp +0 -0
- package/src/home/icons/artwork/section-lint-dark.webp +0 -0
- package/src/home/icons/artwork/section-lint-light.webp +0 -0
- package/src/home/icons/artwork/section-rendering-dark.webp +0 -0
- package/src/home/icons/artwork/section-rendering-light.webp +0 -0
- package/src/home/icons/artwork/section-workflow-dark.webp +0 -0
- package/src/home/icons/artwork/section-workflow-light.webp +0 -0
- package/src/home/icons/artwork/source.json +303 -0
- package/src/home/icons/artwork/workflow-integrations-dark.webp +0 -0
- package/src/home/icons/artwork/workflow-integrations-light.webp +0 -0
- package/src/home/icons/artwork/workflow-monorepo-dark.webp +0 -0
- package/src/home/icons/artwork/workflow-monorepo-light.webp +0 -0
- package/src/home/icons/artwork/workflow-route-styles-dark.webp +0 -0
- package/src/home/icons/artwork/workflow-route-styles-light.webp +0 -0
- package/src/home/icons/artwork/workflow-trace-change-dark.webp +0 -0
- package/src/home/icons/artwork/workflow-trace-change-light.webp +0 -0
- package/src/home/icons/artwork.css +4 -0
- package/src/home/icons/artwork.ts +131 -0
- package/src/home/icons/catalog.ts +381 -0
- package/src/home/icons/design-cascade-layers.svg +32 -0
- package/src/home/icons/design-layout-motion.svg +16 -0
- package/src/home/icons/design-p3-gamut.svg +12 -0
- package/src/home/icons/design-theme-modes.svg +12 -0
- package/src/home/icons/design-theme-tokens.svg +20 -0
- package/src/home/icons/editor-color-tools.svg +18 -0
- package/src/home/icons/editor-focused-highlighting.svg +15 -0
- package/src/home/icons/editor-hover-inspection.svg +19 -0
- package/src/home/icons/editor-manifest-completions.svg +24 -0
- package/src/home/icons/lint-class-order-compact.svg +15 -0
- package/src/home/icons/lint-class-order.svg +28 -0
- package/src/home/icons/lint-conflicting-classes-compact.svg +11 -0
- package/src/home/icons/lint-conflicting-classes.svg +24 -0
- package/src/home/icons/lint-fix-previews-compact.svg +9 -0
- package/src/home/icons/lint-fix-previews.svg +19 -0
- package/src/home/icons/lint-invalid-classes-compact.svg +7 -0
- package/src/home/icons/lint-invalid-classes.svg +17 -0
- package/src/home/icons/lint-strict-vocabulary-compact.svg +8 -0
- package/src/home/icons/lint-strict-vocabulary.svg +16 -0
- package/src/home/icons/lint-theme-tokens-compact.svg +7 -0
- package/src/home/icons/lint-theme-tokens.svg +14 -0
- package/src/home/icons/mcp-apply-preview-compact.svg +9 -0
- package/src/home/icons/mcp-apply-preview.svg +18 -0
- package/src/home/icons/mcp-css-compare-compact.svg +9 -0
- package/src/home/icons/mcp-css-compare.svg +20 -0
- package/src/home/icons/mcp-inspect-class-compact.svg +9 -0
- package/src/home/icons/mcp-inspect-class.svg +18 -0
- package/src/home/icons/mcp-lint-project-compact.svg +14 -0
- package/src/home/icons/mcp-lint-project.svg +30 -0
- package/src/home/icons/mcp-manifest-query-compact.svg +14 -0
- package/src/home/icons/mcp-manifest-query.svg +27 -0
- package/src/home/icons/mcp-preview-fixes-compact.svg +9 -0
- package/src/home/icons/mcp-preview-fixes.svg +15 -0
- package/src/home/icons/mcp-render-css-compact.svg +13 -0
- package/src/home/icons/mcp-render-css.svg +30 -0
- package/src/home/icons/mcp-scan-project-compact.svg +7 -0
- package/src/home/icons/mcp-scan-project.svg +13 -0
- package/src/home/icons/mcp-trace-class-compact.svg +11 -0
- package/src/home/icons/mcp-trace-class.svg +24 -0
- package/src/home/icons/render-progressive.svg +17 -0
- package/src/home/icons/render-runtime.svg +23 -0
- package/src/home/icons/render-static.svg +29 -0
- package/src/home/icons/section-ai-agents.svg +24 -0
- package/src/home/icons/section-css-size.svg +13 -0
- package/src/home/icons/section-design-system.svg +24 -0
- package/src/home/icons/section-editor.svg +14 -0
- package/src/home/icons/section-lint.svg +14 -0
- package/src/home/icons/section-rendering.svg +30 -0
- package/src/home/icons/section-workflow.svg +22 -0
- package/src/home/icons/workflow-integrations.svg +15 -0
- package/src/home/icons/workflow-monorepo.svg +27 -0
- package/src/home/icons/workflow-route-styles.svg +24 -0
- package/src/home/icons/workflow-trace-change.svg +21 -0
- package/src/layouts/Document.astro +71 -0
- package/src/public/brand/v2/logo/mark/master-mark-small-on-dark.svg +1 -0
- package/src/public/brand/v2/logo/master-css/master-css-horizontal-on-dark.svg +1 -0
- package/src/public/brand/v2/logo/master-css/master-css-horizontal-on-light.svg +1 -0
- package/src/public/demo/border-grid.svg +7 -0
- package/src/public/demo/landscape.svg +1 -0
- package/src/public/demo/marker.svg +1 -0
- package/src/public/demo/mask.svg +1 -0
- package/src/public/fonts/Geist-Medium.ttf +0 -0
- package/src/public/fonts/Geist-Regular.ttf +0 -0
- package/src/public/fonts/GeistVariable.woff2 +0 -0
- package/src/public/fonts/IBMPlexMono-Bold.woff2 +0 -0
- package/src/public/fonts/IBMPlexMono-Medium.woff2 +0 -0
- package/src/public/fonts/IBMPlexMono-Regular.woff2 +0 -0
- package/src/public/fonts/IBMPlexMono-SemiBold.woff2 +0 -0
- package/src/public/fonts/index.css +40 -0
- package/src/public/icons/csharp.svg +1 -0
- package/src/public/icons/css.svg +1 -0
- package/src/public/icons/eslint.svg +1 -0
- package/src/public/icons/folder.svg +12 -0
- package/src/public/icons/html.svg +1 -0
- package/src/public/icons/php.svg +1 -0
- package/src/public/icons/sass.svg +1 -0
- package/src/public/icons/storybook.svg +1 -0
- package/src/public/icons/visualstudiocode.svg +41 -0
- package/src/public/images/authors/aron.jpg +0 -0
- package/src/public/images/authors/benseage.jpg +0 -0
- package/src/public/images/authors/joy.jpg +0 -0
- package/src/public/images/authors/lola.jpg +0 -0
- package/src/public/images/authors/miles.jpg +0 -0
- package/src/public/images/bootstrap.svg +23 -0
- package/src/public/images/build-tools/rsbuild.svg +1 -0
- package/src/public/images/build-tools/rspack.svg +1 -0
- package/src/public/images/build-tools/vite.svg +15 -0
- package/src/public/images/build-tools/webpack.svg +10 -0
- package/src/public/images/cdns/esm-sh.svg +1 -0
- package/src/public/images/chevron-left.svg +4 -0
- package/src/public/images/cover-bg.jpg +0 -0
- package/src/public/images/emotion.svg +1 -0
- package/src/public/images/frameworks/angular.svg +29 -0
- package/src/public/images/frameworks/astro.svg +4 -0
- package/src/public/images/frameworks/blazor.svg +22 -0
- package/src/public/images/frameworks/express.svg +1 -0
- package/src/public/images/frameworks/laravel.svg +8 -0
- package/src/public/images/frameworks/line-liff.svg +1 -0
- package/src/public/images/frameworks/lit.svg +1 -0
- package/src/public/images/frameworks/nextjs.svg +16 -0
- package/src/public/images/frameworks/nuxtjs.svg +3 -0
- package/src/public/images/frameworks/rails.svg +1 -0
- package/src/public/images/frameworks/react.svg +8 -0
- package/src/public/images/frameworks/remix.svg +5 -0
- package/src/public/images/frameworks/shopify.svg +1 -0
- package/src/public/images/frameworks/svelte.svg +6 -0
- package/src/public/images/frameworks/tanstack.svg +1 -0
- package/src/public/images/frameworks/vuejs.svg +11 -0
- package/src/public/images/frameworks/wordpress.svg +1 -0
- package/src/public/images/mui.svg +1 -0
- package/src/public/images/styled-components.svg +4 -0
- package/src/public/images/tailwindcss.svg +1 -0
- package/src/scripts/bundler-imports.ts +25 -0
- package/src/scripts/static-social.ts +333 -0
- package/src/scripts/write-if-changed.ts +26 -0
- package/src/sections/blog.astro +11 -0
- package/src/sections/design-system.astro +14 -0
- package/src/sections/document.astro +8 -0
- package/src/sections/examples.astro +6 -0
- package/src/sections/guide.astro +26 -0
- package/src/sections/home.astro +7 -0
- package/src/sections/page.astro +12 -0
- package/src/styles/base.css +57 -0
- package/src/styles/benchmarks.css +20 -0
- package/src/styles/blog-article.css +670 -0
- package/src/styles/blog-materials.css +399 -0
- package/src/styles/blog.css +568 -0
- package/src/styles/demo.css +30 -0
- package/src/styles/design-system.css +15 -0
- package/src/styles/docs-shell/code.css +61 -0
- package/src/styles/docs-shell/docs.css +79 -0
- package/src/styles/docs-shell/documentation-search.css +42 -0
- package/src/styles/docs-shell/footer.css +38 -0
- package/src/styles/docs-shell/header.css +69 -0
- package/src/styles/docs-shell/materials.css +25 -0
- package/src/styles/docs-shell/menu.css +19 -0
- package/src/styles/docs-shell/not-found.css +10 -0
- package/src/styles/docs-shell/page-content.css +37 -0
- package/src/styles/docs-shell/prose.css +89 -0
- package/src/styles/docs-shell/segments.css +13 -0
- package/src/styles/docs-shell/steps.css +39 -0
- package/src/styles/docs-shell/syntax-theme.css +18 -0
- package/src/styles/docs-shell/theme.css +68 -0
- package/src/styles/docs-shell/wrapper.css +10 -0
- package/src/styles/document-comparison.css +7 -0
- package/src/styles/documentation-illustration.css +34 -0
- package/src/styles/documentation-index.css +100 -0
- package/src/styles/documents.css +4 -0
- package/src/styles/documents.ts +2 -0
- package/src/styles/foundation.css +4 -0
- package/src/styles/globals.css +2 -0
- package/src/styles/interface.css +3 -0
- package/src/styles/interface.ts +2 -0
- package/src/styles/site.ts +2 -0
- package/src/styles/system/DESIGN.md +108 -0
- package/src/styles/system/buttons.css +51 -0
- package/src/styles/system/code.css +85 -0
- package/src/styles/system/controls.css +110 -0
- package/src/styles/system/data.css +134 -0
- package/src/styles/system/mixins.css +7 -0
- package/src/styles/system/prose.css +75 -0
- package/src/styles/system/shell.css +102 -0
- package/src/styles/system/specimens.css +98 -0
- package/src/styles/system/surfaces.css +104 -0
- package/src/styles/system/tokens.css +136 -0
- package/src/utils/cloudflare-image-loader.js +85 -0
- 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.' }} />
|