@master/internal-site 0.1.1 → 0.1.3

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 (187) hide show
  1. package/README.md +17 -0
  2. package/dist/astro.mjs +145 -10
  3. package/package.json +1 -1
  4. package/src/astro/index.ts +2 -0
  5. package/src/astro/routes.template.ts +1 -0
  6. package/src/astro/style-assets.ts +107 -0
  7. package/src/benchmarks/BenchmarkBarRows.astro +3 -2
  8. package/src/benchmarks/BenchmarkBars.astro +1 -1
  9. package/src/benchmarks/BenchmarkChart.astro +1 -0
  10. package/src/benchmarks/BenchmarkChartGroup.astro +1 -1
  11. package/src/benchmarks/BenchmarkDataTable.astro +1 -1
  12. package/src/benchmarks/BenchmarkFigure.astro +2 -1
  13. package/src/benchmarks/BenchmarkMetricTable.astro +1 -1
  14. package/src/benchmarks/BenchmarkMetrics.astro +1 -1
  15. package/src/benchmarks/BenchmarkSampleSummary.astro +1 -1
  16. package/src/benchmarks/BenchmarkScrollRegion.svelte +2 -1
  17. package/src/benchmarks/BenchmarkSource.astro +1 -1
  18. package/src/benchmarks/BenchmarkStackedBars.astro +2 -1
  19. package/src/benchmarks/types.ts +2 -0
  20. package/src/blog/article/BlogArticleContents.svelte +1 -1
  21. package/src/blog/article/BlogArticleMasthead.astro +12 -1
  22. package/src/css/NamespaceUtilityTable.astro +1 -1
  23. package/src/css/ThemeNumberVariableTable.astro +1 -1
  24. package/src/css/markdown.ts +14 -5
  25. package/src/demo/Demo.svelte +4 -0
  26. package/src/demo/DemoAsset.astro +1 -0
  27. package/src/demo/DemoCatalog.astro +1 -0
  28. package/src/demo/DemoComparison.svelte +3 -0
  29. package/src/demo/DemoContainer.svelte +3 -0
  30. package/src/demo/DemoControls.svelte +2 -0
  31. package/src/demo/DemoCopyButton.svelte +3 -0
  32. package/src/demo/DemoCopyGroup.svelte +2 -0
  33. package/src/demo/DemoFeatureSupport.svelte +2 -0
  34. package/src/demo/DemoGeneratedCSS.svelte +2 -0
  35. package/src/demo/DemoIndex.astro +1 -0
  36. package/src/demo/DemoMotion.svelte +1 -0
  37. package/src/demo/DemoScrollArea.svelte +2 -0
  38. package/src/demo/DemoStyleComparison.astro +1 -0
  39. package/src/demo/DemoSurface.svelte +2 -0
  40. package/src/demo/DemoThemeComparison.astro +1 -0
  41. package/src/demo/DemoTokenTable.astro +1 -1
  42. package/src/demo/DemoViewport.svelte +5 -0
  43. package/src/demo/DemoWaterfall.astro +1 -1
  44. package/src/demo/foundations/FoundationDialog.astro +1 -0
  45. package/src/demo/foundations/FoundationMedia.astro +1 -0
  46. package/src/demo/foundations/FoundationShrink.astro +1 -0
  47. package/src/demo/foundations/Palette.svelte +2 -0
  48. package/src/demo/illustration-materials.ts +1 -1
  49. package/src/demo/illustration.css +218 -0
  50. package/src/docs-shell/components/ArticleHeader.astro +2 -0
  51. package/src/docs-shell/components/Callout.astro +1 -0
  52. package/src/docs-shell/components/CodeCopyButton.astro +2 -0
  53. package/src/docs-shell/components/CodeTabBar.astro +2 -0
  54. package/src/docs-shell/components/CodeTabs.astro +2 -1
  55. package/src/docs-shell/components/CodeView.astro +1 -1
  56. package/src/docs-shell/components/DocHeader.svelte +10 -13
  57. package/src/docs-shell/components/DocMenuButton.svelte +126 -60
  58. package/src/docs-shell/components/DocSidebar.svelte +2 -0
  59. package/src/docs-shell/components/DocVersionSelect.svelte +2 -0
  60. package/src/docs-shell/components/DocumentAPIIndex.astro +1 -1
  61. package/src/docs-shell/components/DocumentChoices.astro +1 -1
  62. package/src/docs-shell/components/DocumentCodeExampleView.astro +3 -1
  63. package/src/docs-shell/components/DocumentCodeTable.astro +1 -1
  64. package/src/docs-shell/components/DocumentCopyButton.svelte +3 -0
  65. package/src/docs-shell/components/DocumentDisclosure.astro +2 -0
  66. package/src/docs-shell/components/DocumentFileTree.astro +3 -0
  67. package/src/docs-shell/components/DocumentFlow.astro +4 -1
  68. package/src/docs-shell/components/DocumentIllustration.astro +5 -11
  69. package/src/docs-shell/components/DocumentKeyList.astro +1 -1
  70. package/src/docs-shell/components/DocumentNamespaceTable.astro +1 -1
  71. package/src/docs-shell/components/DocumentOptionEntry.astro +0 -1
  72. package/src/docs-shell/components/DocumentOptionList.astro +1 -1
  73. package/src/docs-shell/components/DocumentOptions.astro +0 -1
  74. package/src/docs-shell/components/DocumentParameters.astro +1 -1
  75. package/src/docs-shell/components/DocumentPrompt.astro +2 -0
  76. package/src/docs-shell/components/DocumentValueList.astro +1 -1
  77. package/src/docs-shell/components/DocumentationIndex.svelte +2 -0
  78. package/src/docs-shell/components/ExpandContent.svelte +3 -0
  79. package/src/docs-shell/components/ExplorerView.astro +1 -0
  80. package/src/docs-shell/components/Footer.svelte +2 -2
  81. package/src/docs-shell/components/FooterLink.svelte +17 -0
  82. package/src/docs-shell/components/GeneratedCSS.astro +1 -0
  83. package/src/docs-shell/components/Header.svelte +1 -1
  84. package/src/docs-shell/components/InlineCode.astro +1 -0
  85. package/src/docs-shell/components/InteractingIndicator.astro +1 -0
  86. package/src/docs-shell/components/LanguageButton.svelte +1 -0
  87. package/src/docs-shell/components/LanguageSelect.svelte +2 -0
  88. package/src/docs-shell/components/NotFound.astro +3 -0
  89. package/src/docs-shell/components/PMAction.astro +1 -0
  90. package/src/docs-shell/components/PageContent.svelte +1 -1
  91. package/src/docs-shell/components/PageContentDisclosure.astro +2 -1
  92. package/src/docs-shell/components/PageContentList.svelte +2 -0
  93. package/src/docs-shell/components/PageNavs.astro +1 -0
  94. package/src/docs-shell/components/SearchButton.svelte +3 -0
  95. package/src/docs-shell/components/SearchDialog.svelte +6 -1
  96. package/src/docs-shell/components/Segments.svelte +2 -0
  97. package/src/docs-shell/components/StepSection.astro +1 -2
  98. package/src/docs-shell/components/Tabs.astro +1 -0
  99. package/src/docs-shell/components/ThemeSelect.svelte +2 -0
  100. package/src/docs-shell/components/markdown/Table.astro +1 -0
  101. package/src/docs-shell/components/markdown-components.ts +0 -1
  102. package/src/docs-shell/remark/markdown-components.js +28 -7
  103. package/src/docs-shell/scripts/document.ts +1 -1
  104. package/src/docs-shell/types/Metadata.ts +11 -0
  105. package/src/docs-shell/utils/generate-metadata.ts +3 -1
  106. package/src/docs-shell/utils/head.ts +5 -2
  107. package/src/examples/components/ArticleTransitionScene.svelte +4 -0
  108. package/src/examples/layout-system/page.astro +0 -1
  109. package/src/home/HomeBentoFrame.astro +1 -0
  110. package/src/home/HomeBentoGrid.astro +1 -0
  111. package/src/home/HomeFooter.svelte +2 -2
  112. package/src/home/bento.css +167 -0
  113. package/src/home/design.css +1 -1
  114. package/src/home/home.css +4 -576
  115. package/src/home/segmented-control.css +94 -0
  116. package/src/layouts/Document.astro +3 -1
  117. package/src/public/icons/json.svg +1 -0
  118. package/src/scripts/atomic-class-authoring.ts +98 -0
  119. package/src/scripts/style-delivery.mjs +110 -0
  120. package/src/sections/blog.astro +1 -1
  121. package/src/sections/guide.astro +1 -2
  122. package/src/styles/blog-article.css +10 -7
  123. package/src/styles/blog-materials.css +13 -0
  124. package/src/styles/demo.css +0 -1
  125. package/src/styles/docs-shell/code.css +5 -61
  126. package/src/styles/docs-shell/documentation-search.css +1 -0
  127. package/src/styles/docs-shell/footer-link.css +5 -0
  128. package/src/styles/docs-shell/header.css +2 -73
  129. package/src/styles/docs-shell/menu.css +37 -17
  130. package/src/styles/docs-shell/page-content.css +2 -37
  131. package/src/styles/docs-shell/prose.css +18 -9
  132. package/src/styles/docs-shell/steps.css +2 -39
  133. package/src/styles/document-comparison.css +5 -2
  134. package/src/styles/documentation-illustration.css +1 -9
  135. package/src/styles/documentation-index.css +2 -1
  136. package/src/styles/documents.css +2 -4
  137. package/src/styles/interface.css +5 -3
  138. package/src/styles/system/DESIGN.md +34 -14
  139. package/src/styles/system/browser.css +21 -0
  140. package/src/styles/system/button-feedback.css +13 -0
  141. package/src/styles/system/callout.css +14 -0
  142. package/src/styles/system/chart.css +18 -0
  143. package/src/styles/system/checks.css +18 -0
  144. package/src/styles/system/code-panel.css +82 -0
  145. package/src/styles/system/code-tabs.css +40 -0
  146. package/src/styles/system/code.css +8 -85
  147. package/src/styles/system/compare.css +7 -0
  148. package/src/styles/system/controls.css +10 -109
  149. package/src/styles/system/copy.css +32 -0
  150. package/src/styles/system/data.css +10 -134
  151. package/src/styles/system/dialog.css +16 -0
  152. package/src/styles/system/disclosure.css +19 -0
  153. package/src/styles/system/expand.css +11 -0
  154. package/src/styles/system/fields.css +25 -0
  155. package/src/styles/system/header-core.css +101 -0
  156. package/src/styles/system/hint.css +5 -0
  157. package/src/styles/system/index.css +13 -0
  158. package/src/styles/system/inline-code.css +4 -0
  159. package/src/styles/system/kbd.css +4 -0
  160. package/src/styles/system/logos.css +10 -0
  161. package/src/styles/system/menu.css +14 -0
  162. package/src/styles/system/metrics.css +22 -0
  163. package/src/styles/system/pagehead.css +13 -0
  164. package/src/styles/system/pager.css +13 -0
  165. package/src/styles/system/parameters.css +17 -0
  166. package/src/styles/system/prompt.css +7 -0
  167. package/src/styles/system/prose.css +4 -75
  168. package/src/styles/system/range.css +12 -0
  169. package/src/styles/system/reading.css +44 -0
  170. package/src/styles/system/scroll.css +6 -0
  171. package/src/styles/system/search-trigger.css +10 -0
  172. package/src/styles/system/segmented.css +22 -0
  173. package/src/styles/system/sheet.css +8 -0
  174. package/src/styles/system/shell.css +8 -102
  175. package/src/styles/system/sidebar.css +14 -0
  176. package/src/styles/system/source.css +5 -0
  177. package/src/styles/system/specimens.css +3 -0
  178. package/src/styles/system/stage.css +18 -0
  179. package/src/styles/system/steps.css +51 -0
  180. package/src/styles/system/surfaces.css +8 -104
  181. package/src/styles/system/table.css +23 -0
  182. package/src/styles/system/toc.css +59 -0
  183. package/src/styles/system/tooltip.css +6 -0
  184. package/src/styles/system/tray-code.css +6 -0
  185. package/src/styles/system/tray.css +20 -0
  186. package/src/styles/system/tree.css +15 -0
  187. package/src/styles/system/waterfall.css +14 -0
@@ -0,0 +1,101 @@
1
+ /* header-core: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-app { min-height: 100dvh; background: var(--ui-surface-canvas); color: var(--ui-text-body); }
4
+
5
+ .ui-header { position: sticky; top: 0; z-index: 40; display: flex; align-items: center; gap: var(--ui-space-lg); height: 3.75rem; padding: 0 var(--ui-space-lg);
6
+ background: color-mix(in oklab, var(--ui-surface-canvas) 82%, transparent); -webkit-backdrop-filter: blur(16px) saturate(1.3); backdrop-filter: blur(16px) saturate(1.3);
7
+ box-shadow: inset 0 -1px 0 var(--ui-line-hair); }
8
+ .ui-header-brand { display: inline-flex; align-items: center; gap: var(--ui-space-xs); color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); font-size: 1.0625rem; letter-spacing: -.02em; text-decoration: none; white-space: nowrap; }
9
+ .ui-header-nav { display: flex; align-items: center; gap: var(--ui-space-3xs); }
10
+ .ui-header-nav > a { display: inline-flex; align-items: center; height: 2.25rem; padding: 0 .75rem; border-radius: var(--ui-radius-md); color: var(--ui-text-body); font-size: var(--ui-text-small); font-weight: var(--ui-weight-regular); text-decoration: none; transition: color var(--ui-duration-quick); }
11
+ .ui-header-nav > a:hover { color: var(--ui-text-strong); }
12
+ .ui-header-nav > a:is([aria-current="page"], [aria-current="true"]) { color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); }
13
+ .ui-header-nav > a:focus-visible { @apply --ui-focus-ring; outline-offset: 0; }
14
+ .ui-header-nav > a > small { margin-left: var(--ui-space-2xs); padding: 1px 5px; border-radius: var(--ui-radius-xs); background: var(--ui-surface-chip); color: var(--ui-text-muted); box-shadow: inset 0 0 0 1px var(--ui-line-hair); font: var(--ui-weight-medium) .6875rem/1.4 var(--font-family-sans); letter-spacing: .02em; }
15
+ .ui-header-end { display: flex; align-items: center; gap: var(--ui-space-3xs); margin-left: auto; }
16
+ .ui-header-divider { width: 1px; height: 1rem; margin-inline: var(--ui-space-xs); background: var(--ui-line-divider); }
17
+ .ui-version { display: inline-flex; align-items: center; gap: var(--ui-space-3xs); height: 2.25rem; padding: 0 .375rem; border-radius: var(--ui-radius-md); color: var(--ui-text-body); font: var(--ui-weight-regular) var(--ui-text-small)/1 var(--font-family-sans); font-variant-numeric: tabular-nums; }
18
+ }
19
+
20
+ /*
21
+ * The site header (`ui-header`, styles/system/shell.css) placed for the site: it sticks above documentation pages and
22
+ * overlays the homepage and blog as a stickable header that slides away while reading down (`data-tucked`) and is
23
+ * transparent at the top of the page (`data-background="transparent"`).
24
+ */
25
+ @layer components {
26
+ /* A single rhythm for the page header and the modal's matching top bar. */
27
+ .ui-header, .ui-mobile-menu-bar { --ui-header-target: 2.25rem; --ui-header-icon: 1.125rem; --ui-header-control-gap: .5rem; }
28
+ .ui-header .ui-button.ui-header-control[data-shape="icon"], .ui-mobile-menu-bar .ui-button.ui-header-control[data-shape="icon"] {
29
+ position: relative; box-sizing: border-box; flex: 0 0 var(--ui-header-target); width: var(--ui-header-target); min-width: var(--ui-header-target); height: var(--ui-header-target); min-height: var(--ui-header-target); margin: 0; padding: 0; align-items: center; justify-content: center; border-radius: var(--ui-radius-md); line-height: 1;
30
+ }
31
+ .ui-header-control.ui-button[data-variant="quiet"]:not(:disabled) { background: transparent; box-shadow: none; translate: none; color: var(--ui-text-muted); }
32
+ .ui-header-control.ui-button[data-variant="quiet"]:where(:hover, :active, :focus-visible, :has(select:focus-visible)):not(:disabled) { color: var(--ui-text-strong); }
33
+ .ui-header-control.ui-button > svg:not(.ui-header-external) { flex: none; width: var(--ui-header-icon); height: var(--ui-header-icon); }
34
+ .ui-header .ui-header-end, .ui-header .ui-header-nav { align-items: center; gap: var(--ui-header-control-gap); }
35
+ .ui-header .ui-header-divider { flex: none; margin: 0 .25rem; height: var(--ui-header-icon); }
36
+ .ui-header .ui-header-nav > a, .ui-header .ui-version { height: var(--ui-header-target); }
37
+ .ui-header { padding-top: env(safe-area-inset-top); padding-inline: max(var(--ui-space-xl), env(safe-area-inset-left)) max(var(--ui-space-xl), env(safe-area-inset-right)); height: calc(3.75rem + env(safe-area-inset-top)); box-sizing: border-box; }
38
+ .ui-header[data-variant="stickable"] { position: fixed; inset: 0 0 auto; width: 100%; transition: translate var(--ui-duration-base) var(--ui-ease), background-color var(--ui-duration-base), box-shadow var(--ui-duration-base); }
39
+ .ui-header[data-tucked] { translate: 0 -100%; }
40
+ /* A focused control stays on screen after the header has tucked away, revealed at once. */
41
+ .ui-header:focus-within { translate: none; transition-duration: 0s; }
42
+ .ui-header[data-background="transparent"] { background: transparent; box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none; }
43
+ /* Without scripts the header never leaves its transparent top state, so it scrolls away instead of covering content. */
44
+ @media (scripting: none) { .ui-header[data-background="transparent"] { position: absolute; } }
45
+ @media (prefers-reduced-motion: reduce) { .ui-header, .ui-header[data-variant="stickable"] { transition: none; } }
46
+ @media print { .ui-header { display: none; } }
47
+
48
+ .ui-header-brand { display: inline-flex; align-items: center; min-height: var(--ui-header-target); border-radius: var(--ui-radius-sm); }
49
+ .ui-header-brand:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; }
50
+ /* The version chip opens the native version list laid over it. */
51
+ .ui-header .ui-version { position: relative; cursor: pointer; }
52
+ .ui-header .ui-version > svg { width: 12px; height: 12px; color: var(--ui-text-muted); }
53
+ .ui-header .ui-version:hover { color: var(--ui-text-strong); }
54
+ .ui-header-nav > a > .ui-badge { margin-left: var(--ui-space-2xs); }
55
+ /* External destinations carry a small raised arrow beside the label or icon. */
56
+ .ui-header-nav > a:has(.ui-header-external) { position: relative; padding-right: 1.125rem; }
57
+ .ui-header-nav > a > .ui-header-external, .ui-header-end > .ui-button > .ui-header-external { position: absolute; top: .375rem; right: .125rem; width: .625rem; height: .625rem; pointer-events: none; }
58
+ /* Anchor the small external mark to the icon centre, independent of the 36/44px target. */
59
+ .ui-header-end > .ui-button > .ui-header-external { top: calc(50% - .875rem); right: calc(50% - 1rem); }
60
+ .ui-header-end > .ui-button[data-disabled] { color: var(--ui-text-disabled); pointer-events: none; }
61
+ /* Icon-only controls name themselves with an ink tooltip under the pointer or keyboard focus. */
62
+ .ui-header-end > :is(a, button, label) { position: relative; }
63
+ .ui-header-end > * > .ui-tooltip { top: calc(100% + 8px); left: 50%; translate: -50% 0; opacity: 0; visibility: hidden; transition: opacity var(--ui-duration-quick), visibility 0s linear var(--ui-duration-quick); }
64
+ .ui-header-end > :is(:hover, :focus-visible, :has(:focus-visible)) > .ui-tooltip { opacity: 1; visibility: visible; transition-delay: 400ms, 400ms; }
65
+ .ui-header-end > :last-child > .ui-tooltip { left: auto; right: 0; translate: none; }
66
+ .ui-header-end > :last-child > .ui-tooltip::before { left: auto; right: calc(1rem - 4px); translate: none; }
67
+ @media (hover: none) { .ui-header-end > * > .ui-tooltip { display: none; } }
68
+
69
+ /* Desktop search retains its original hairline pill and visible shortcut. */
70
+ .ui-header-search { appearance: none; box-sizing: border-box; display: inline-flex; align-items: center; gap: .4375rem; flex: none; height: 1.875rem; margin: 0; padding: 0 .8125rem 0 .6875rem; border: 0; border-radius: var(--ui-radius-pill);
71
+ background: transparent; color: var(--ui-text-muted); box-shadow: inset 0 0 0 1px var(--ui-line-contour); font: var(--ui-weight-regular) .75rem/1 var(--font-family-sans); cursor: pointer;
72
+ transition: color var(--ui-duration-quick), box-shadow var(--ui-duration-quick), background-color var(--ui-duration-quick); }
73
+ .ui-header-search:hover { color: var(--ui-text-strong); background: var(--ui-surface-chip); box-shadow: inset 0 0 0 1px var(--ui-line-strong); }
74
+ .ui-header-search:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; }
75
+ .ui-header-search > svg { flex: none; width: 1rem; height: 1rem; }
76
+ .ui-header-search > .ui-kbd { min-width: 0; height: auto; padding: 0; background: none; color: inherit; box-shadow: none; font: var(--ui-weight-regular) .6875rem/1 var(--font-family-sans); letter-spacing: .04em; }
77
+
78
+ /* The compact header: the menu at the start, the brand centred, search at the end. */
79
+ .ui-header .ui-header-menu { display: none; }
80
+ @media (width < 64rem) {
81
+ .ui-header, .ui-mobile-menu-bar { --ui-header-target: 2.75rem; }
82
+ .ui-header { gap: var(--ui-space-xs); padding-inline: max(var(--ui-space-xs), env(safe-area-inset-left)) max(var(--ui-space-xs), env(safe-area-inset-right)); }
83
+ .ui-header .ui-header-menu { display: inline-flex; }
84
+ .ui-header-brand { margin-inline: auto; }
85
+ .ui-header > :is(.ui-version, .ui-header-nav), .ui-header-end > :not(.ui-header-search) { display: none; }
86
+ .ui-header-end { margin-left: 0; }
87
+ .ui-header-search { justify-content: center; width: var(--ui-header-target); height: var(--ui-header-target); padding: 0; border-radius: var(--ui-radius-md); box-shadow: none; }
88
+ .ui-header-search:hover { background: transparent; box-shadow: none; }
89
+ .ui-header-search > svg { width: var(--ui-header-icon); height: var(--ui-header-icon); }
90
+ .ui-header-search > .ui-kbd { display: none; }
91
+ /* Search can be the last visible action while hidden siblings still follow it. */
92
+ .ui-header-end > * > .ui-tooltip { left: auto; right: 0; translate: none; }
93
+ .ui-header-end > * > .ui-tooltip::before { left: auto; right: calc(var(--ui-header-target) / 2 - 4px); translate: none; }
94
+ /* Equal ends keep the brand centred, including the homepage's GitHub action. */
95
+ .ui-header .ui-header-end { width: var(--ui-header-target); }
96
+ }
97
+ @media (width >= 64rem) {
98
+ /* The homepage's wide header leaves search out. */
99
+ .ui-header-search[data-compact] { display: none; }
100
+ }
101
+ }
@@ -0,0 +1,5 @@
1
+ /* hint: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-hint { display: flex; align-items: flex-start; gap: var(--ui-space-xs); color: var(--ui-text-muted); font-size: var(--ui-text-small); line-height: var(--ui-leading-small); }
4
+ .ui-hint > svg { flex: none; width: 1rem; height: 1rem; margin-top: calc((1lh - 1rem) / 2); color: var(--ui-text-body); stroke-width: 1.5; }
5
+ }
@@ -0,0 +1,13 @@
1
+ /* index: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-index { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 14rem), 1fr)); gap: var(--ui-space-sm); }
4
+ .ui-index > a { display: grid; align-content: start; gap: var(--ui-space-2xs); padding: var(--ui-space-md) var(--ui-space-md) 1.125rem; border-radius: var(--ui-radius-xl); background: var(--ui-surface-sheet); color: var(--ui-text-body); box-shadow: inset 0 0 0 1px var(--ui-line-contour), 0 1px 0 var(--ui-lip); text-decoration: none; transition: box-shadow var(--ui-duration-quick) var(--ui-ease), translate var(--ui-duration-quick) var(--ui-ease); }
5
+ .ui-index > a:hover { translate: 0 -.5px; box-shadow: var(--ui-elevation-rise-1h); }
6
+ .ui-index > a:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; }
7
+ .ui-index > a > svg { width: 18px; height: 18px; margin-bottom: var(--ui-space-2xs); color: var(--ui-text-strong); stroke-width: 1.5; }
8
+ .ui-index > a > b { color: var(--ui-text-strong); font-size: .9375rem; font-weight: var(--ui-weight-medium); line-height: 1.4; letter-spacing: -.006em; }
9
+ .ui-index > a > span { font-size: .8125rem; line-height: 1.6; color: var(--ui-text-muted); }
10
+ .ui-index > a > b code { font: var(--ui-weight-medium) .875rem/1.45 var(--font-family-mono); letter-spacing: 0; overflow-wrap: anywhere; }
11
+ .ui-index[data-density="compact"] { grid-template-columns: repeat(auto-fill, minmax(min(100%, 12rem), 1fr)); gap: var(--ui-space-xs); }
12
+ .ui-index[data-density="compact"] > a { gap: 2px; padding: var(--ui-space-sm) var(--ui-space-md); }
13
+ }
@@ -0,0 +1,4 @@
1
+ /* inline-code: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-inline-code { padding: .125em .375em; border-radius: var(--ui-radius-xs); background: var(--ui-surface-chip); color: var(--ui-text-strong); box-shadow: inset 0 0 0 1px var(--ui-line-hair); font: var(--ui-weight-regular) .84em/1 var(--font-family-mono); overflow-wrap: anywhere; }
4
+ }
@@ -0,0 +1,4 @@
1
+ /* kbd: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-kbd { display: inline-grid; place-items: center; min-width: 1.375rem; height: 1.375rem; padding: 0 .3125rem; border-radius: var(--ui-radius-xs); background: transparent; color: var(--ui-text-muted); box-shadow: inset 0 0 0 1px var(--ui-line-contour); font: var(--ui-weight-regular) .6875rem/1 var(--font-family-mono); }
4
+ }
@@ -0,0 +1,10 @@
1
+ @prune native;
2
+ /* logos: owned component styles; shared definitions come from the foundation. */
3
+ @layer components {
4
+ .ui-logos { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 9rem), 1fr)); gap: var(--ui-space-2xs) var(--ui-space-md); }
5
+ .ui-logos > a { display: flex; align-items: center; gap: var(--ui-space-sm); min-width: 0; min-height: 2.75rem; padding: .5rem var(--ui-space-xs); border-radius: var(--ui-radius-sm); color: var(--ui-text-body); font-size: .8125rem; line-height: 1.5; text-decoration: none; transition: background var(--ui-duration-quick) var(--ui-ease), color var(--ui-duration-quick) var(--ui-ease); }
6
+ .ui-logos > a:hover { color: var(--ui-text-strong); background: var(--ui-surface-chip); }
7
+ .ui-logos > a:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; }
8
+ .ui-logos > a > svg { flex: none; width: 1.25rem; height: 1.25rem; }
9
+ .ui-logos > a > span { min-width: 0; overflow-wrap: anywhere; }
10
+ }
@@ -0,0 +1,14 @@
1
+ @prune native;
2
+ /* menu: owned component styles; shared definitions come from the foundation. */
3
+ @layer components {
4
+ .ui-menu { display: grid; gap: 1px; min-width: 12rem; margin: 0; padding: var(--ui-inset); border-radius: var(--ui-radius-lg); background: var(--ui-surface-float); box-shadow: var(--ui-elevation-rise-3); list-style: none; }
5
+ .ui-menu-label { padding: .375rem .625rem .25rem; color: var(--ui-text-muted); @apply --ui-label-type; }
6
+ .ui-menu-item { appearance: none; display: flex; align-items: center; gap: var(--ui-space-xs); width: 100%; min-height: 2rem; padding: 0 .625rem; border: 0; border-radius: var(--ui-radius-sm); background: transparent; color: var(--ui-text-body); font: var(--ui-weight-regular) var(--ui-text-small)/1 var(--font-family-sans); text-align: start; text-decoration: none; cursor: pointer; }
7
+ .ui-menu-item > svg { flex: none; width: 15px; height: 15px; color: var(--ui-text-muted); }
8
+ .ui-menu-item > small { margin-left: auto; color: var(--ui-text-muted); font: var(--ui-weight-regular) .6875rem/1 var(--font-family-mono); }
9
+ .ui-menu-item:is(:hover, [data-highlighted]) { color: var(--ui-text-strong); background: light-dark(oklch(22% .002 265 / .05), oklch(100% 0 none / .06)); }
10
+ .ui-menu-item[aria-checked="true"] { color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); }
11
+ .ui-menu-item[aria-checked="true"]::after { content: ""; width: 14px; height: 14px; margin-left: auto; background: currentColor; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m3.5 8.5 3 3 6-7' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat; }
12
+ .ui-menu-item:focus-visible { @apply --ui-focus-ring; outline-offset: -2px; }
13
+ .ui-menu-separator { height: 1px; margin: var(--ui-space-3xs) .375rem; background: var(--ui-line-hair); }
14
+ }
@@ -0,0 +1,22 @@
1
+ /* metrics: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 10rem), 1fr)); gap: var(--ui-inset); }
4
+ .ui-metric { display: grid; align-content: start; min-width: 0; gap: 6px; overflow-wrap: anywhere; padding: var(--ui-space-md); border-radius: var(--ui-radius-lg); @apply --ui-sheet-face; box-shadow: var(--ui-elevation-rise-1); }
5
+ .ui-metric > small { color: var(--ui-text-muted); @apply --ui-label-type; }
6
+ .ui-metric > b { color: var(--ui-text-strong); font-size: 1.625rem; font-weight: var(--ui-weight-heading); letter-spacing: -.03em; line-height: 1.1; font-variant-numeric: tabular-nums; }
7
+ .ui-metric > b > span { color: var(--ui-text-muted); font-size: .875rem; font-weight: var(--ui-weight-medium); letter-spacing: 0; }
8
+ .ui-metric > p { margin: 0; color: var(--ui-text-muted); font-size: .75rem; line-height: 1.5; }
9
+ .ui-bar { height: 6px; border-radius: var(--ui-radius-pill); background: var(--ui-surface-well); box-shadow: var(--ui-elevation-sink); overflow: hidden; }
10
+ .ui-bar > i { display: block; height: 100%; border-radius: inherit; background: var(--ui-text-strong); }
11
+ .ui-bar > i[data-tone="muted"] { background: var(--ui-line-mark); }
12
+ .ui-bar > i[data-tone="blue"] { background: var(--ui-tone-blue); }
13
+ .ui-bar > i[data-tone="violet"] { background: var(--ui-tone-violet); }
14
+ .ui-bar > i[data-tone="amber"] { background: var(--ui-tone-amber); }
15
+ .ui-bar > i[data-tone="green"] { background: var(--ui-tone-green); }
16
+ .ui-bar > i[data-tone="red"] { background: var(--ui-tone-red); }
17
+ .ui-bar > i[data-tone="neutral"] { background: var(--ui-tone-neutral); }
18
+ .ui-bar[data-variant="stacked"] { display: flex; gap: 1px; }
19
+ .ui-bar[data-variant="stacked"] > i { flex: none; border-radius: 0; }
20
+ .ui-bar[data-variant="stacked"] > i:first-child { border-start-start-radius: inherit; border-end-start-radius: inherit; }
21
+ .ui-bar[data-variant="stacked"] > i:last-child { border-start-end-radius: inherit; border-end-end-radius: inherit; }
22
+ }
@@ -0,0 +1,13 @@
1
+ /* pagehead: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-pagehead { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--ui-space-md); margin-bottom: var(--ui-space-2xl); }
4
+ .ui-pagehead-kicker { margin-bottom: calc(var(--ui-space-3xs) * -1); color: var(--ui-text-muted); @apply --ui-eyebrow-type; }
5
+ .ui-pagehead h1 { margin: 0; color: var(--ui-text-strong); font-size: var(--ui-text-title); font-weight: var(--ui-weight-heading); line-height: var(--ui-leading-title); letter-spacing: var(--ui-tracking-title); text-wrap: balance; overflow-wrap: break-word; }
6
+ .ui-pagehead p { max-width: calc(var(--measure, 41rem) * 1.125); margin: 0; color: var(--ui-text-body); font-size: var(--ui-text-lead); line-height: var(--ui-leading-lead); letter-spacing: -.004em; text-wrap: pretty; overflow-wrap: break-word; }
7
+ .ui-pagehead p + p:not([class]) { max-width: var(--measure, 41rem); margin-top: calc(var(--ui-space-xs) * -1); font-size: var(--ui-text-base); line-height: var(--ui-leading-body); letter-spacing: 0; }
8
+
9
+ .ui-pagehead-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ui-space-xs) var(--ui-space-md); padding-top: var(--ui-space-xs); color: var(--ui-text-muted); font-size: .78125rem; }
10
+ .ui-pagehead-meta > a { color: inherit; text-decoration: none; }
11
+ .ui-pagehead-meta > a:hover { color: var(--ui-text-strong); }
12
+ .ui-pagehead-meta > span + span::before, .ui-pagehead-meta > * + a::before { content: "·"; margin-right: var(--ui-space-md); color: var(--ui-text-disabled); }
13
+ }
@@ -0,0 +1,13 @@
1
+ /* pager: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-pager { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--ui-space-xl); margin-top: 5rem; padding-top: var(--ui-space-lg); box-shadow: inset 0 1px 0 var(--ui-line-hair); }
4
+ .ui-pager > a { display: grid; align-content: start; gap: var(--ui-space-2xs); color: var(--ui-text-body); text-decoration: none; transition: color var(--ui-duration-quick); }
5
+ .ui-pager > a:hover { color: var(--ui-text-strong); }
6
+ .ui-pager > a:focus-visible { @apply --ui-focus-ring; outline-offset: 4px; border-radius: var(--ui-radius-xs); }
7
+ .ui-pager > a[rel="next"] { justify-items: end; text-align: right; }
8
+ .ui-pager small { color: var(--ui-text-muted); @apply --ui-eyebrow-type; }
9
+ .ui-pager b { font-weight: var(--ui-weight-regular); font-size: var(--ui-text-base); line-height: 1.5; text-wrap: balance; }
10
+ .ui-pager > a[rel="prev"] > b::before { content: "←"; margin-right: .5em; color: var(--ui-text-muted); }
11
+ .ui-pager > a[rel="next"] > b::after { content: "→"; margin-left: .5em; color: var(--ui-text-muted); }
12
+ .ui-pager > a:hover > b::before, .ui-pager > a:hover > b::after { color: var(--ui-text-strong); }
13
+ }
@@ -0,0 +1,17 @@
1
+ /* parameters: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-params { display: grid; margin: 0; border-radius: var(--ui-radius-xl); background: var(--ui-surface-sheet); box-shadow: inset 0 0 0 1px var(--ui-line-contour); }
4
+ .ui-params > div { display: grid; grid-template-columns: minmax(8rem, 13rem) minmax(0, 1fr); gap: var(--ui-space-xs) var(--ui-space-lg); padding: var(--ui-space-sm) var(--ui-space-md); border-top: 1px solid var(--ui-line-hair); }
5
+ .ui-params > div:first-child { border-top: 0; }
6
+ .ui-params dt { display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px; min-width: 0; overflow-wrap: anywhere; color: var(--ui-text-strong); font: var(--ui-weight-medium) .8125rem/1.5 var(--font-family-mono); }
7
+ .ui-params dt small { color: var(--ui-text-muted); font-weight: var(--ui-weight-regular); }
8
+ .ui-params dd { margin: 0; color: var(--ui-text-body); font-size: var(--ui-text-small); line-height: 1.6; overflow-wrap: anywhere; }
9
+ .ui-params dd > * { margin: 0; }
10
+ .ui-params dd > * + * { margin-top: var(--ui-space-xs); }
11
+ .ui-params dd small { color: var(--ui-text-muted); font-size: .75rem; }
12
+ .ui-params dd a:not([class]) { color: var(--ui-text-strong); text-decoration: underline 1px var(--ui-line-strong); text-underline-offset: .24em; }
13
+ .ui-params dd a:not([class]):hover { text-decoration-color: currentColor; }
14
+ .ui-params :is(dt, dd) :is(h3, h4) { margin: 0; font: inherit; color: inherit; letter-spacing: inherit; }
15
+ .ui-params dd code { padding: .125em .375em; border-radius: var(--ui-radius-xs); background: var(--ui-surface-chip); color: var(--ui-text-strong); box-shadow: inset 0 0 0 1px var(--ui-line-hair); font: var(--ui-weight-regular) .8125rem/1 var(--font-family-mono); }
16
+ @media (width < 35rem) { .ui-params > div { grid-template-columns: 1fr; } }
17
+ }
@@ -0,0 +1,7 @@
1
+ /* prompt: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-prompt { --code-corner: calc(var(--ui-space-md) + var(--ui-text-code) * var(--ui-leading-code) / 2 - 1rem); }
4
+ .ui-prompt { display: grid; gap: 0; min-width: 0; overflow: hidden; border-radius: var(--ui-radius-xl); background: var(--ui-surface-code); box-shadow: inset 0 0 0 1px var(--ui-line-contour), 0 1px 0 var(--ui-lip); }
5
+ .ui-prompt-body { margin: 0; padding: var(--ui-space-xs) var(--ui-space-md) var(--ui-space-md); color: var(--ui-text-strong); font: var(--ui-weight-regular) .9375rem/1.7 var(--font-family-sans); white-space: pre-wrap; }
6
+ .ui-prompt-body var { padding: 0 .25em; border-radius: var(--ui-radius-xs); background: var(--ui-surface-chip); color: var(--ui-text-body); box-shadow: inset 0 0 0 1px var(--ui-line-hair); font: var(--ui-weight-regular) .8125rem/1 var(--font-family-mono); font-style: normal; }
7
+ }
@@ -1,75 +1,4 @@
1
- /* Prose: the reading column. Rules reach only the article's own flow, never into components.
2
- Framed surfaces (tray, code, table, parameters, prompt, tree) bleed past the text by one gutter; index cards are links and keep its edges. */
3
- @layer components {
4
- /* One line unit (--line, 32px at 16px: body text set at line-height 2) sets the vertical rhythm: paragraphs part by
5
- three quarters of it, sections open on two lines, wide blocks keep one line of air. */
6
- .ui-prose { --measure: 41rem; --bleed: 2rem; --line: 2rem; color: var(--ui-text-body); font-size: var(--ui-text-base); line-height: var(--ui-leading-body); }
7
- .ui-prose > :is(p, ul, ol, h2, h3, h4, blockquote, .ui-callout, .ui-disclosure, hr):not(:where(.ui-steps)) { max-width: var(--measure); }
8
- .ui-prose > :is(.ui-tray, .ui-code, .ui-table, .ui-params, .ui-prompt, .ui-tree) { margin-inline: calc(var(--bleed) * -1); }
9
- @media (width < 52rem) { .ui-prose { --bleed: 0rem; } }
10
- .ui-prose > :is(p, ul, ol, blockquote) { margin-block: calc(var(--line) * .75); }
11
- .ui-prose > :is(.ui-tray, .ui-code, .ui-table, .ui-callout, .ui-steps, .ui-index, .ui-logos, .ui-params, .ui-prompt, .ui-tree) { margin-block: var(--line); }
12
- /* Files that answer one instruction sit together: consecutive code panels part by a small gap, not a line. */
13
- .ui-prose > .ui-code:has(+ .ui-code) { margin-bottom: var(--ui-space-sm); }
14
- .ui-prose > .ui-code + .ui-code { margin-top: var(--ui-space-sm); }
15
- .ui-prose > h2 { margin: calc(var(--line) * 2) 0 calc(var(--line) * .5); color: var(--ui-text-strong); font-size: var(--ui-text-h2); font-weight: var(--ui-weight-heading); line-height: var(--ui-leading-h2); letter-spacing: var(--ui-tracking-h2); text-wrap: balance; }
16
- .ui-prose > h3 { margin: calc(var(--line) * 1.5) 0 calc(var(--line) * .375); color: var(--ui-text-strong); font-size: var(--ui-text-h3); font-weight: var(--ui-weight-heading); line-height: var(--ui-leading-h3); letter-spacing: var(--ui-tracking-h3); }
17
- .ui-prose > h4 { margin: calc(var(--line) * 1.25) 0 calc(var(--line) * .25); color: var(--ui-text-strong); font-size: var(--ui-text-base); font-weight: var(--ui-weight-strong); line-height: 1.5rem; }
18
- /* A subsection that opens its section sits close under it, as one heading group. */
19
- .ui-prose > h2 + h3, .ui-prose > h3 + :is(h3, h4) { margin-top: calc(var(--line) * .5); }
20
- .ui-prose > :is(h2, h3) { position: relative; width: fit-content; scroll-margin-top: 5rem; }
21
- /* A section opens on one hairline across the reading measure, closer to its heading than to the text before it. */
22
- .ui-prose > h2 { width: auto; }
23
- .ui-prose > h2:not(:first-child)::before { content: ""; display: var(--section-rule, block); position: absolute; top: calc(var(--line) * -.875); inset-inline: 0 var(--rule-end, 0); height: 1px; background: var(--ui-line-hair); pointer-events: none; }
24
- /* The page's first section keeps only its space (after the page head too), and so does one after a disclosure, which
25
- already closes on a hairline, even as the last part of a section wrapper;
26
- legacy anchors and space-only rules in between do not count. A disclosure joined under its code is a framed panel, not
27
- a rule, so the heading after it keeps its own. */
28
- .ui-prose > :is(a[id]:empty, .sr-only):first-child + h2,
29
- .ui-prose > .ui-disclosure:not(.ui-code + *) + h2, .ui-prose > .ui-disclosure:not(.ui-code + *) + a[id]:empty + h2,
30
- .ui-prose > .ui-disclosure:not(.ui-code + *) + hr + h2, .ui-prose > .ui-disclosure:not(.ui-code + *) + hr + a[id]:empty + h2,
31
- .ui-prose > .ui-pagehead + h2, .ui-prose > .ui-pagehead + a[id]:empty + h2,
32
- .ui-prose > :has(> .ui-disclosure:last-child) + h2 { --section-rule: none; }
33
- .ui-anchor { position: absolute; right: 100%; top: 50%; translate: -.375rem -50%; display: grid; place-items: center; width: 1.5rem; height: 1.5rem; border-radius: var(--ui-radius-sm); color: var(--ui-text-disabled); font: var(--ui-weight-regular) .875rem/1 var(--font-family-mono); opacity: 0; text-decoration: none; transition: opacity var(--ui-duration-quick), color var(--ui-duration-quick); }
34
- .ui-anchor:hover { color: var(--ui-text-muted); }
35
- .ui-prose > :is(h2, h3):is(:hover, :target, :focus-within) > .ui-anchor { opacity: 1; }
36
- .ui-anchor:focus-visible { opacity: 1; @apply --ui-focus-ring; outline-offset: 1px; }
37
- .ui-prose > :is(p, ul, ol, blockquote, h2, h3, h4) :is(strong, b) { color: var(--ui-text-strong); font-weight: var(--ui-weight-strong); }
38
- .ui-prose > :is(p, ul, ol, blockquote) a:not([class]) { color: var(--ui-text-strong); text-decoration: underline; text-decoration-color: var(--ui-line-strong); text-decoration-thickness: 1px; text-underline-offset: .24em; transition: text-decoration-color var(--ui-duration-quick); }
39
- .ui-prose > :is(p, ul, ol, blockquote) a:not([class]):hover { text-decoration-color: currentColor; }
40
- .ui-prose > :is(p, ul, ol, blockquote) a:not([class]):focus-visible { @apply --ui-focus-ring; outline-offset: 2px; border-radius: var(--ui-radius-xs); }
41
- /* Inline code is set apart by a hairline chip in a mid ink, never the darkest spot of a paragraph. */
42
- .ui-prose > :is(p, ul, ol, blockquote, h2, h3, h4) code:not(pre code), .ui-callout code { padding: .125em .375em; border-radius: var(--ui-radius-xs); background: var(--ui-surface-chip); color: color-mix(in oklab, var(--ui-text-strong) 60%, var(--ui-text-body)); box-shadow: inset 0 0 0 1px var(--ui-line-hair); font: var(--ui-weight-regular) .84em/1 var(--font-family-mono); overflow-wrap: anywhere; }
43
- /* In a heading, code is the heading's own words in the mono face. */
44
- .ui-prose > :is(h2, h3, h4) code:not(pre code) { padding: 0; background: none; box-shadow: none; color: inherit; font-size: .9em; }
45
- .ui-prose > :is(ul, ol):not([class]) { padding-left: 1.25em; }
46
- .ui-prose > :is(ul, ol):not([class]) li { margin-block: calc(var(--line) * .25); padding-left: .375em; }
47
- .ui-prose > :is(ul, ol):not([class]) li > :is(p, ul, ol) { margin-block: calc(var(--line) * .25); }
48
- .ui-prose > ul:not([class]) { list-style: disc; }
49
- .ui-prose > ul:not([class]) li::marker { color: var(--ui-text-disabled); font-size: .8em; }
50
- .ui-prose > ol:not([class]) li::marker { color: var(--ui-text-muted); font: var(--ui-weight-regular) .875em var(--font-family-sans); font-variant-numeric: tabular-nums; }
51
- .ui-prose > hr { height: 1px; margin: calc(var(--line) * 1.75) 0 calc(var(--line) * 1.25); border: 0; background: var(--ui-line-divider); }
52
- .ui-prose > hr + * { margin-top: 0; }
53
- /* A rule an author sets before a section heading (or the legacy anchor before it) is space only: the heading's own opening already parts the sections. */
54
- .ui-prose > hr:has(+ h2, + a[id]:empty + h2) { height: 0; margin: 0; background: none; }
55
- .ui-prose > hr + h2 { margin-top: calc(var(--line) * 2); }
56
- .ui-prose > blockquote { margin-inline: 0; padding: .25rem 0 .25rem 1.25rem; box-shadow: inset 1px 0 0 var(--ui-line-strong); color: color-mix(in oklab, var(--ui-text-strong) 50%, var(--ui-text-body)); }
57
- .ui-prose > blockquote > p { margin-block: 0; } .ui-prose > blockquote > p + p { margin-top: .75em; }
58
- .ui-prose > figure { margin: var(--line) 0; }
59
- .ui-prose > figure:not(.ui-tray) > figcaption { margin-top: var(--ui-space-sm); color: var(--ui-text-muted); font-size: var(--ui-text-caption); line-height: var(--ui-leading-caption); }
60
-
61
- /* Callout: one icon, one tint, a hairline — never a thick left border */
62
- /* Hint: how to use the example that follows, a muted line led by its gesture */
63
- .ui-hint { display: flex; align-items: flex-start; gap: var(--ui-space-xs); color: var(--ui-text-muted); font-size: var(--ui-text-small); line-height: var(--ui-leading-small); }
64
- .ui-hint > svg { flex: none; width: 1rem; height: 1rem; margin-top: calc((1lh - 1rem) / 2); color: var(--ui-text-body); stroke-width: 1.5; }
65
- .ui-callout { --tone: var(--ui-tone-neutral); display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--ui-space-sm); padding: .875rem var(--ui-space-md); border-radius: var(--ui-radius-lg);
66
- background: color-mix(in oklab, var(--tone) 2.5%, var(--ui-surface-canvas)); box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--tone) 12%, var(--ui-line-contour)); color: var(--ui-text-body); font-size: var(--ui-text-small); line-height: var(--ui-leading-small); }
67
- .ui-callout > svg { width: 1rem; height: 1rem; margin-top: .21875rem; color: color-mix(in oklab, var(--tone) 80%, var(--ui-text-strong)); }
68
- .ui-callout > div { min-width: 0; overflow-wrap: anywhere; }
69
- .ui-callout > div > :first-child { margin-top: 0; } .ui-callout > div > :last-child { margin-bottom: 0; }
70
- .ui-callout b { color: var(--ui-text-strong); font-weight: var(--ui-weight-strong); }
71
- .ui-callout[data-tone="info"] { --tone: var(--ui-status-info); }
72
- .ui-callout[data-tone="success"], .ui-callout[data-tone="do"] { --tone: var(--ui-status-success); }
73
- .ui-callout[data-tone="warning"] { --tone: var(--ui-status-warning); }
74
- .ui-callout[data-tone="danger"], .ui-callout[data-tone="dont"] { --tone: var(--ui-status-danger); }
75
- }
1
+ /* Explicit full prose collection. Components import their own leaf stylesheet. */
2
+ @import './reading.css';
3
+ @import './callout.css';
4
+ @import './hint.css';
@@ -0,0 +1,12 @@
1
+ /* range: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-range { --value: 50%; appearance: none; width: 100%; min-width: 6rem; height: 1.75rem; margin: 0; background: transparent; cursor: ew-resize; }
4
+ .ui-range::-webkit-slider-runnable-track { height: 4px; border-radius: var(--ui-radius-pill); background: linear-gradient(90deg, var(--ui-text-strong) var(--value), var(--ui-line-divider) var(--value)); }
5
+ .ui-range::-moz-range-track { height: 4px; border-radius: var(--ui-radius-pill); background: var(--ui-line-divider); }
6
+ .ui-range::-moz-range-progress { height: 4px; border-radius: var(--ui-radius-pill); background: var(--ui-text-strong); }
7
+ .ui-range::-webkit-slider-thumb { appearance: none; width: 16px; height: 16px; margin-top: -6px; border: 0; border-radius: 50%; background: linear-gradient(180deg, oklch(100% 0 none), oklch(96.5% .0011 265)); box-shadow: 0 0 0 1px var(--ui-line-strong), 0 1px 1px var(--ui-shade-1), 0 2px 4px -1px var(--ui-shade-2); }
8
+ .ui-range::-moz-range-thumb { width: 16px; height: 16px; border: 0; border-radius: 50%; background: linear-gradient(180deg, oklch(100% 0 none), oklch(96.5% .0011 265)); box-shadow: 0 0 0 1px var(--ui-line-strong), 0 1px 1px var(--ui-shade-1), 0 2px 4px -1px var(--ui-shade-2); }
9
+ .ui-range:focus-visible { outline: none; }
10
+ .ui-range:focus-visible::-webkit-slider-thumb { box-shadow: 0 0 0 1px var(--ui-line-strong), 0 0 0 2px var(--ui-surface-stage), 0 0 0 4px var(--ui-focus); }
11
+ .ui-range:focus-visible::-moz-range-thumb { box-shadow: 0 0 0 1px var(--ui-line-strong), 0 0 0 2px var(--ui-surface-stage), 0 0 0 4px var(--ui-focus); }
12
+ }
@@ -0,0 +1,44 @@
1
+ /* reading: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-prose { --measure: 41rem; --bleed: 2rem; --line: 2rem; color: var(--ui-text-body); font-size: var(--ui-text-base); line-height: var(--ui-leading-body); }
4
+ .ui-prose > :is(p, ul, ol, h2, h3, h4, blockquote, .ui-callout, .ui-disclosure, hr):not(:where(.ui-steps)) { max-width: var(--measure); }
5
+ /* A comparison owns the table’s outer spacing; its inner frame must not bleed a second time. */
6
+ .ui-prose > :is(.ui-tray, .ui-code, .ui-table, .document-comparison, .ui-params, .ui-prompt, .ui-tree) { margin-inline: calc(var(--bleed) * -1); }
7
+ @media (width < 52rem) { .ui-prose { --bleed: 0rem; } }
8
+ .ui-prose > :is(p, ul, ol, blockquote) { margin-block: calc(var(--line) * .75); }
9
+ .ui-prose > :is(.ui-tray, .ui-code, .ui-table, .document-comparison, .ui-callout, .ui-steps, .ui-index, .ui-logos, .ui-params, .ui-prompt, .ui-tree) { margin-block: var(--line); }
10
+ .ui-prose > .ui-code:has(+ .ui-code) { margin-bottom: var(--ui-space-sm); }
11
+ .ui-prose > .ui-code + .ui-code { margin-top: var(--ui-space-sm); }
12
+ .ui-prose > h2 { margin: calc(var(--line) * 2) 0 calc(var(--line) * .5); color: var(--ui-text-strong); font-size: var(--ui-text-h2); font-weight: var(--ui-weight-heading); line-height: var(--ui-leading-h2); letter-spacing: var(--ui-tracking-h2); text-wrap: balance; }
13
+ .ui-prose > h3 { margin: calc(var(--line) * 1.5) 0 calc(var(--line) * .375); color: var(--ui-text-strong); font-size: var(--ui-text-h3); font-weight: var(--ui-weight-heading); line-height: var(--ui-leading-h3); letter-spacing: var(--ui-tracking-h3); }
14
+ .ui-prose > h4 { margin: calc(var(--line) * 1.25) 0 calc(var(--line) * .25); color: var(--ui-text-strong); font-size: var(--ui-text-base); font-weight: var(--ui-weight-strong); line-height: 1.5rem; }
15
+ .ui-prose > h2 + h3, .ui-prose > h3 + :is(h3, h4) { margin-top: calc(var(--line) * .5); }
16
+ .ui-prose > :is(h2, h3) { position: relative; width: fit-content; scroll-margin-top: 5rem; }
17
+ .ui-prose > h2 { width: auto; }
18
+ .ui-prose > h2:not(:first-child)::before { content: ""; display: var(--section-rule, block); position: absolute; top: calc(var(--line) * -.875); inset-inline: 0 var(--rule-end, 0); height: 1px; background: var(--ui-line-hair); pointer-events: none; }
19
+ .ui-prose > :is(a[id]:empty, .sr-only):first-child + h2, .ui-prose > .ui-disclosure:not(.ui-code + *) + h2, .ui-prose > .ui-disclosure:not(.ui-code + *) + a[id]:empty + h2, .ui-prose > .ui-disclosure:not(.ui-code + *) + hr + h2, .ui-prose > .ui-disclosure:not(.ui-code + *) + hr + a[id]:empty + h2, .ui-prose > .ui-pagehead + h2, .ui-prose > .ui-pagehead + a[id]:empty + h2, .ui-prose > :has(> .ui-disclosure:last-child) + h2 { --section-rule: none; }
20
+ .ui-anchor { position: absolute; right: 100%; top: 50%; translate: -.375rem -50%; display: grid; place-items: center; width: 1.5rem; height: 1.5rem; border-radius: var(--ui-radius-sm); color: var(--ui-text-disabled); font: var(--ui-weight-regular) .875rem/1 var(--font-family-mono); opacity: 0; text-decoration: none; transition: opacity var(--ui-duration-quick), color var(--ui-duration-quick); }
21
+ .ui-anchor:hover { color: var(--ui-text-muted); }
22
+ .ui-prose > :is(h2, h3):is(:hover, :target, :focus-within) > .ui-anchor { opacity: 1; }
23
+ .ui-anchor:focus-visible { opacity: 1; @apply --ui-focus-ring; outline-offset: 1px; }
24
+ .ui-prose > :is(p, ul, ol, blockquote, h2, h3, h4) :is(strong, b) { color: var(--ui-text-strong); font-weight: var(--ui-weight-strong); }
25
+ .ui-prose > :is(p, ul, ol, blockquote) a:not([class]) { color: var(--ui-text-strong); text-decoration: underline; text-decoration-color: var(--ui-line-strong); text-decoration-thickness: 1px; text-underline-offset: .24em; transition: text-decoration-color var(--ui-duration-quick); }
26
+ .ui-prose > :is(p, ul, ol, blockquote) a:not([class]):hover { text-decoration-color: currentColor; }
27
+ .ui-prose > :is(p, ul, ol, blockquote) a:not([class]):focus-visible { @apply --ui-focus-ring; outline-offset: 2px; border-radius: var(--ui-radius-xs); }
28
+ .ui-prose > :is(p, ul, ol, blockquote, h2, h3, h4) code:not(pre code) { padding: .125em .375em; border-radius: var(--ui-radius-xs); background: var(--ui-surface-chip); color: color-mix(in oklab, var(--ui-text-strong) 60%, var(--ui-text-body)); box-shadow: inset 0 0 0 1px var(--ui-line-hair); font: var(--ui-weight-regular) .84em/1 var(--font-family-mono); overflow-wrap: anywhere; }
29
+ .ui-prose > :is(h2, h3, h4) code:not(pre code) { padding: 0; background: none; box-shadow: none; color: inherit; font-size: .9em; }
30
+ .ui-prose > :is(ul, ol):not([class]) { padding-left: 1.25em; }
31
+ .ui-prose > :is(ul, ol):not([class]) li { margin-block: calc(var(--line) * .25); padding-left: .375em; }
32
+ .ui-prose > :is(ul, ol):not([class]) li > :is(p, ul, ol) { margin-block: calc(var(--line) * .25); }
33
+ .ui-prose > ul:not([class]) { list-style: disc; }
34
+ .ui-prose > ul:not([class]) li::marker { color: var(--ui-text-disabled); font-size: .8em; }
35
+ .ui-prose > ol:not([class]) li::marker { color: var(--ui-text-muted); font: var(--ui-weight-regular) .875em var(--font-family-sans); font-variant-numeric: tabular-nums; }
36
+ .ui-prose > hr { height: 1px; margin: calc(var(--line) * 1.75) 0 calc(var(--line) * 1.25); border: 0; background: var(--ui-line-divider); }
37
+ .ui-prose > hr + * { margin-top: 0; }
38
+ .ui-prose > hr:has(+ h2, + a[id]:empty + h2) { height: 0; margin: 0; background: none; }
39
+ .ui-prose > hr + h2 { margin-top: calc(var(--line) * 2); }
40
+ .ui-prose > blockquote { margin-inline: 0; padding: .25rem 0 .25rem 1.25rem; box-shadow: inset 1px 0 0 var(--ui-line-strong); color: color-mix(in oklab, var(--ui-text-strong) 50%, var(--ui-text-body)); }
41
+ .ui-prose > blockquote > p { margin-block: 0; } .ui-prose > blockquote > p + p { margin-top: .75em; }
42
+ .ui-prose > figure { margin: var(--line) 0; }
43
+ .ui-prose > figure:not(.ui-tray) > figcaption { margin-top: var(--ui-space-sm); color: var(--ui-text-muted); font-size: var(--ui-text-caption); line-height: var(--ui-leading-caption); }
44
+ }
@@ -0,0 +1,6 @@
1
+ @prune native;
2
+ /* scroll: owned component styles; shared definitions come from the foundation. */
3
+ @layer components {
4
+ .ui-scroll { overflow: auto; overscroll-behavior: contain; max-height: 16rem; border-radius: var(--ui-radius-lg); background: var(--ui-surface-well); box-shadow: var(--ui-elevation-sink); }
5
+ .ui-scroll:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; }
6
+ }
@@ -0,0 +1,10 @@
1
+ /* search-trigger: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-search-trigger { appearance: none; display: flex; align-items: center; gap: .625rem; width: 100%; height: 2.5rem; padding: 0; border: 0; border-radius: 0;
4
+ background: transparent; color: var(--ui-text-muted); box-shadow: inset 0 -1px 0 var(--ui-line-hair); font: var(--ui-weight-regular) var(--ui-text-small)/1 var(--font-family-sans); cursor: pointer; transition: color var(--ui-duration-quick), box-shadow var(--ui-duration-quick); }
5
+ .ui-search-trigger:hover { color: var(--ui-text-strong); box-shadow: inset 0 -1px 0 var(--ui-line-strong); }
6
+ .ui-search-trigger > .ui-kbd { box-shadow: none; }
7
+ .ui-search-trigger:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; border-radius: var(--ui-radius-sm); }
8
+ .ui-search-trigger > svg { flex: none; width: 15px; height: 15px; }
9
+ .ui-search-trigger > .ui-kbd { margin-left: auto; }
10
+ }
@@ -0,0 +1,22 @@
1
+ /* segmented: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-segmented { display: inline-flex; flex-wrap: wrap; gap: 2px; max-width: 100%; padding: 3px; border-radius: calc(var(--ui-radius-md) + 3px); background: var(--ui-surface-well); box-shadow: var(--ui-elevation-sink); }
4
+ .ui-segmented > :is(button, a) {
5
+ appearance: none; display: inline-flex; align-items: center; justify-content: center; min-height: 1.875rem; min-width: 3.5rem; padding: 0 .75rem; border: 0; border-radius: var(--ui-radius-md); background: transparent;
6
+ color: var(--ui-text-muted); font: var(--ui-weight-medium) .78125rem/1 var(--font-family-sans); text-decoration: none; white-space: nowrap; cursor: pointer; transition: color var(--ui-duration-quick), background-color var(--ui-duration-quick), box-shadow var(--ui-duration-quick);
7
+ }
8
+ .ui-segmented > :is(button, a):hover:not(:disabled) { color: var(--ui-text-strong); }
9
+ .ui-segmented > :is(button, a):is([aria-pressed="true"], [aria-selected="true"], [aria-checked="true"], [aria-current="page"]) { color: var(--ui-text-strong); @apply --ui-sheet-face; box-shadow: var(--ui-elevation-rise-1); }
10
+ .ui-segmented > :is(button, a):focus-visible { @apply --ui-focus-ring; outline-offset: 2px; }
11
+ .ui-segmented > button:disabled { color: var(--ui-text-disabled); cursor: not-allowed; }
12
+ .ui-segmented[data-variant="underline"] { display: flex; gap: 0 var(--ui-space-lg); padding: 0; border-radius: 0; background: none; box-shadow: inset 0 -1px 0 var(--ui-line-divider); }
13
+ .ui-segmented[data-variant="underline"] > :is(button, a) { min-width: 0; min-height: 2.75rem; padding: 0; border-radius: 0; color: var(--ui-text-muted); font: var(--ui-weight-regular) var(--ui-text-small)/1.4 var(--font-family-sans); }
14
+ .ui-segmented[data-variant="underline"] > :is(button, a):is([aria-pressed="true"], [aria-selected="true"], [aria-checked="true"], [aria-current="page"]) { color: var(--ui-text-strong); background: none; box-shadow: inset 0 -2px 0 var(--ui-text-strong); }
15
+ .ui-segmented[data-variant="underline"] > :is(button, a):focus-visible { outline-offset: -2px; border-radius: var(--ui-radius-xs); }
16
+ .ui-segmented[data-size="lg"] { padding: 4px; border-radius: calc(var(--ui-radius-md) + 4px); }
17
+ .ui-segmented[data-size="lg"] > :is(button, a) { min-height: 2.25rem; border-radius: var(--ui-radius-md); font-size: .8125rem; }
18
+
19
+ @media (pointer: coarse) {
20
+ .ui-segmented > button { min-height: 2.5rem; }
21
+ }
22
+ }
@@ -0,0 +1,8 @@
1
+ /* sheet: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-sheet { position: relative; border-radius: var(--ui-radius-xl); @apply --ui-sheet-face; color: var(--ui-text-body); box-shadow: var(--ui-elevation-rise-2); }
4
+ .ui-sheet[data-elevation="1"] { box-shadow: var(--ui-elevation-rise-1); }
5
+ .ui-sheet[data-elevation="3"] { box-shadow: var(--ui-elevation-rise-3); }
6
+ .ui-sheet[data-elevation="flat"] { background: var(--ui-surface-sheet); box-shadow: var(--ui-elevation-flat); }
7
+ .ui-well { border-radius: var(--ui-radius-md); background: var(--ui-surface-well); box-shadow: var(--ui-elevation-sink); }
8
+ }
@@ -1,102 +1,8 @@
1
- /* Docs shell: header, sidebar, contents, page head, pager, search. Chrome stays on the canvas; only content gets material. */
2
- @layer components {
3
- .ui-app { min-height: 100dvh; background: var(--ui-surface-canvas); color: var(--ui-text-body); }
4
-
5
- .ui-header { position: sticky; top: 0; z-index: 40; display: flex; align-items: center; gap: var(--ui-space-lg); height: 3.75rem; padding: 0 var(--ui-space-lg);
6
- background: color-mix(in oklab, var(--ui-surface-canvas) 82%, transparent); -webkit-backdrop-filter: blur(16px) saturate(1.3); backdrop-filter: blur(16px) saturate(1.3);
7
- box-shadow: inset 0 -1px 0 var(--ui-line-hair); }
8
- .ui-header-brand { display: inline-flex; align-items: center; gap: var(--ui-space-xs); color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); font-size: 1.0625rem; letter-spacing: -.02em; text-decoration: none; white-space: nowrap; }
9
- /* Section links are plain words: ink marks the section being read, no pill. */
10
- .ui-header-nav { display: flex; align-items: center; gap: var(--ui-space-3xs); }
11
- .ui-header-nav > a { display: inline-flex; align-items: center; height: 2.25rem; padding: 0 .75rem; border-radius: var(--ui-radius-md); color: var(--ui-text-body); font-size: var(--ui-text-small); font-weight: var(--ui-weight-regular); text-decoration: none; transition: color var(--ui-duration-quick); }
12
- .ui-header-nav > a:hover { color: var(--ui-text-strong); }
13
- .ui-header-nav > a:is([aria-current="page"], [aria-current="true"]) { color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); }
14
- .ui-header-nav > a:focus-visible { @apply --ui-focus-ring; outline-offset: 0; }
15
- /* A recent section: one small chip-washed word after its name */
16
- .ui-header-nav > a > small { margin-left: var(--ui-space-2xs); padding: 1px 5px; border-radius: var(--ui-radius-xs); background: var(--ui-surface-chip); color: var(--ui-text-muted); box-shadow: inset 0 0 0 1px var(--ui-line-hair); font: var(--ui-weight-medium) .6875rem/1.4 var(--font-family-sans); letter-spacing: .02em; }
17
- .ui-header-end { display: flex; align-items: center; gap: var(--ui-space-3xs); margin-left: auto; }
18
- .ui-header-divider { width: 1px; height: 1rem; margin-inline: var(--ui-space-xs); background: var(--ui-line-divider); }
19
- .ui-version { display: inline-flex; align-items: center; gap: var(--ui-space-3xs); height: 2.25rem; padding: 0 .375rem; border-radius: var(--ui-radius-md); color: var(--ui-text-body); font: var(--ui-weight-regular) var(--ui-text-small)/1 var(--font-family-sans); font-variant-numeric: tabular-nums; }
20
-
21
- /* The sidebar: quiet group captions over entries hung on one hairline; the page being read inks a short bar on it. */
22
- .ui-sidebar { display: grid; align-content: start; gap: var(--ui-space-lg); padding: var(--ui-space-lg) var(--ui-space-lg) var(--ui-space-2xl) var(--ui-space-xl); }
23
- .ui-search-trigger { appearance: none; display: flex; align-items: center; gap: .625rem; width: 100%; height: 2.5rem; padding: 0; border: 0; border-radius: 0;
24
- background: transparent; color: var(--ui-text-muted); box-shadow: inset 0 -1px 0 var(--ui-line-hair); font: var(--ui-weight-regular) var(--ui-text-small)/1 var(--font-family-sans); cursor: pointer; transition: color var(--ui-duration-quick), box-shadow var(--ui-duration-quick); }
25
- .ui-search-trigger:hover { color: var(--ui-text-strong); box-shadow: inset 0 -1px 0 var(--ui-line-strong); }
26
- .ui-search-trigger > .ui-kbd { box-shadow: none; }
27
- .ui-search-trigger:focus-visible { @apply --ui-focus-ring; outline-offset: 2px; border-radius: var(--ui-radius-sm); }
28
- .ui-search-trigger > svg { flex: none; width: 15px; height: 15px; }
29
- .ui-search-trigger > .ui-kbd { margin-left: auto; }
30
- .ui-nav-group { display: grid; }
31
- .ui-nav-group > h4 { display: flex; align-items: center; min-height: 2rem; margin: 0 0 var(--ui-space-3xs); color: var(--ui-text-muted); @apply --ui-eyebrow-type; }
32
- .ui-nav-link { position: relative; display: flex; align-items: center; min-height: 2rem; padding: .3125rem 0 .3125rem 1rem; color: var(--ui-text-muted); font-size: var(--ui-text-small); line-height: 1.4; text-decoration: none; box-shadow: inset 1px 0 0 var(--ui-line-divider); transition: color var(--ui-duration-quick); }
33
- .ui-nav-link::before { content: ""; position: absolute; top: .4375rem; bottom: .4375rem; left: 0; width: 2px; margin-left: -.5px; border-radius: 1px; background: transparent; transition: background-color var(--ui-duration-quick); }
34
- .ui-nav-link:hover { color: var(--ui-text-strong); }
35
- .ui-nav-link:hover::before { background: var(--ui-line-mark); }
36
- .ui-nav-link:is([aria-current="page"], [aria-current="true"]) { color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); }
37
- .ui-nav-link:is([aria-current="page"], [aria-current="true"])::before { background: var(--ui-text-strong); }
38
- .ui-nav-link:focus-visible { @apply --ui-focus-ring; outline-offset: 1px; border-radius: var(--ui-radius-sm); }
39
- .ui-nav-link > .ui-badge { margin-left: auto; }
40
-
41
- /* One ruler: long section ticks and short subsection ticks share a right edge before the text. Titles share a second edge;
42
- current location changes ink, never the tick's length or the title's position. */
43
- .ui-toc { --toc-tick: 1.5rem; --toc-tick-subsection: .75rem; --toc-gap: .75rem; --toc-gutter: calc(var(--toc-tick) + var(--toc-gap)); --toc-row-padding: .5rem;
44
- display: grid; align-content: start; gap: var(--ui-space-xs); padding: var(--ui-space-xl) var(--ui-space-lg); font-size: var(--ui-text-caption); }
45
- .ui-toc > h4 { margin: 0 0 var(--ui-space-2xs); padding-left: var(--toc-gutter); color: var(--ui-text-muted); @apply --ui-eyebrow-type; }
46
- .ui-toc ol { display: grid; margin: 0; padding: 0; list-style: none; }
47
- .ui-toc a { position: relative; display: block; padding: var(--toc-row-padding) 0 var(--toc-row-padding) var(--toc-gutter); color: var(--ui-text-muted); line-height: 1.125rem; text-decoration: none; transition: color var(--ui-duration-quick); }
48
- .ui-toc a::before { content: ""; position: absolute; top: calc(var(--toc-row-padding) + .5lh - 1px); right: calc(100% - var(--toc-tick)); width: var(--toc-tick); height: 2px; border-radius: 1px; background: var(--ui-line-divider); pointer-events: none; transition: background-color var(--ui-duration-quick); }
49
- .ui-toc :is(ol ol a, a[data-level="3"])::before { width: var(--toc-tick-subsection); }
50
- .ui-toc a:hover { color: var(--ui-text-strong); }
51
- .ui-toc a:hover::before { background: var(--ui-line-mark); }
52
- .ui-toc a[aria-current="location"] { color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); }
53
- .ui-toc a[aria-current="location"]::before { background: var(--ui-text-strong); }
54
- .ui-toc a:focus-visible { @apply --ui-focus-ring; outline-offset: 1px; border-radius: var(--ui-radius-xs); }
55
- .ui-toc ol ol a:not([aria-current]) { color: color-mix(in oklab, var(--ui-text-muted) 72%, var(--ui-text-disabled)); }
56
- .ui-toc ol ol a:not([aria-current])::before { background: var(--ui-line-hair); }
57
- .ui-toc ol ol a:not([aria-current]):hover { color: var(--ui-text-strong); }
58
- .ui-toc-actions { display: grid; padding: var(--ui-space-sm) 0 0 var(--toc-gutter); }
59
- .ui-toc-actions a { padding: .3125rem 0; color: var(--ui-text-muted); font-size: .75rem; line-height: 1.5; }
60
- .ui-toc-actions a::before { content: none; }
61
-
62
- /* The page head: an eyebrow, the title and its lead. Space, not a rule, parts it from the reading. */
63
- .ui-pagehead { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--ui-space-md); margin-bottom: var(--ui-space-2xl); }
64
- .ui-pagehead-kicker { margin-bottom: calc(var(--ui-space-3xs) * -1); color: var(--ui-text-muted); @apply --ui-eyebrow-type; }
65
- .ui-pagehead h1 { margin: 0; color: var(--ui-text-strong); font-size: var(--ui-text-title); font-weight: var(--ui-weight-heading); line-height: var(--ui-leading-title); letter-spacing: var(--ui-tracking-title); text-wrap: balance; overflow-wrap: break-word; }
66
- /* The lead runs a little past the reading measure: at 18px it keeps the same number of words a line. */
67
- .ui-pagehead p { max-width: calc(var(--measure, 41rem) * 1.125); margin: 0; color: var(--ui-text-body); font-size: var(--ui-text-lead); line-height: var(--ui-leading-lead); letter-spacing: -.004em; text-wrap: pretty; overflow-wrap: break-word; }
68
- /* A second line of the lead, at reading size. */
69
- .ui-pagehead p + p:not([class]) { max-width: var(--measure, 41rem); margin-top: calc(var(--ui-space-xs) * -1); font-size: var(--ui-text-base); line-height: var(--ui-leading-body); letter-spacing: 0; }
70
-
71
- /* The pager: the previous and next documents under one hairline, an eyebrow over each title; no boxes. */
72
- .ui-pager { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--ui-space-xl); margin-top: 5rem; padding-top: var(--ui-space-lg); box-shadow: inset 0 1px 0 var(--ui-line-hair); }
73
- .ui-pager > a { display: grid; align-content: start; gap: var(--ui-space-2xs); color: var(--ui-text-body); text-decoration: none; transition: color var(--ui-duration-quick); }
74
- .ui-pager > a:hover { color: var(--ui-text-strong); }
75
- .ui-pager > a:focus-visible { @apply --ui-focus-ring; outline-offset: 4px; border-radius: var(--ui-radius-xs); }
76
- .ui-pager > a[rel="next"] { justify-items: end; text-align: right; }
77
- .ui-pager small { color: var(--ui-text-muted); @apply --ui-eyebrow-type; }
78
- .ui-pager b { font-weight: var(--ui-weight-regular); font-size: var(--ui-text-base); line-height: 1.5; text-wrap: balance; }
79
- .ui-pager > a[rel="prev"] > b::before { content: "←"; margin-right: .5em; color: var(--ui-text-muted); }
80
- .ui-pager > a[rel="next"] > b::after { content: "→"; margin-left: .5em; color: var(--ui-text-muted); }
81
- .ui-pager > a:hover > b::before, .ui-pager > a:hover > b::after { color: var(--ui-text-strong); }
82
-
83
- /* Overlay dialog (search, image preview) */
84
- .ui-dialog { width: min(40rem, calc(100vw - 2rem)); max-height: min(36rem, calc(100dvh - 4rem)); padding: 0; overflow: hidden; border: 0; border-radius: var(--ui-radius-2xl); background: var(--ui-surface-float); color: var(--ui-text-body); box-shadow: var(--ui-elevation-overlay); }
85
- .ui-dialog::backdrop { background: var(--ui-surface-scrim); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
86
- .ui-dialog-search { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ui-space-sm); min-height: 3.5rem; padding: 0 var(--ui-space-md); box-shadow: inset 0 -1px 0 var(--ui-line-hair); }
87
- .ui-dialog-search input { flex: 1 1 8rem; min-width: 0; border: 0; background: transparent; color: var(--ui-text-strong); font: var(--ui-weight-regular) 1rem/1 var(--font-family-sans); }
88
- .ui-dialog-search input:focus { outline: none; }
89
- @media (forced-colors: active) { .ui-dialog-search input:focus-visible { outline: 2px solid Highlight; outline-offset: 2px; } }
90
- .ui-results { display: grid; gap: 2px; margin: 0; padding: var(--ui-inset); list-style: none; }
91
- .ui-results > li > a { display: grid; gap: 2px; padding: .625rem .75rem; border-radius: var(--ui-radius-md); color: var(--ui-text-body); text-decoration: none; }
92
- .ui-results > li > a small { color: var(--ui-text-muted); font: var(--ui-weight-regular) .75rem/1.4 var(--font-family-sans); }
93
- .ui-results > li > a b { color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); font-size: var(--ui-text-small); }
94
- .ui-results > li > a[aria-selected="true"], .ui-results > li > a:hover { background: var(--ui-surface-chip); box-shadow: inset 0 0 0 1px var(--ui-line-hair); }
95
- .ui-dialog-foot { display: flex; flex-wrap: wrap; gap: var(--ui-space-md); padding: var(--ui-space-sm) var(--ui-space-md); box-shadow: inset 0 1px 0 var(--ui-line-hair); color: var(--ui-text-muted); font-size: .71875rem; }
96
- .ui-dialog-foot span { display: inline-flex; align-items: center; gap: 6px; }
97
-
98
- .ui-pagehead-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ui-space-xs) var(--ui-space-md); padding-top: var(--ui-space-xs); color: var(--ui-text-muted); font-size: .78125rem; }
99
- .ui-pagehead-meta > a { color: inherit; text-decoration: none; }
100
- .ui-pagehead-meta > a:hover { color: var(--ui-text-strong); }
101
- .ui-pagehead-meta > span + span::before, .ui-pagehead-meta > * + a::before { content: "·"; margin-right: var(--ui-space-md); color: var(--ui-text-disabled); }
102
- }
1
+ /* Explicit full shell collection. Components import their own leaf stylesheet. */
2
+ @import './header-core.css';
3
+ @import './sidebar.css';
4
+ @import './search-trigger.css';
5
+ @import './toc.css';
6
+ @import './pagehead.css';
7
+ @import './pager.css';
8
+ @import './dialog.css';
@@ -0,0 +1,14 @@
1
+ /* sidebar: owned component styles; shared definitions come from the foundation. */
2
+ @layer components {
3
+ .ui-sidebar { display: grid; align-content: start; gap: var(--ui-space-lg); padding: var(--ui-space-lg) var(--ui-space-lg) var(--ui-space-2xl) var(--ui-space-xl); }
4
+ .ui-nav-group { display: grid; }
5
+ .ui-nav-group > h4 { display: flex; align-items: center; min-height: 2rem; margin: 0 0 var(--ui-space-3xs); color: var(--ui-text-muted); @apply --ui-eyebrow-type; }
6
+ .ui-nav-link { position: relative; display: flex; align-items: center; min-height: 2rem; padding: .3125rem 0 .3125rem 1rem; color: var(--ui-text-muted); font-size: var(--ui-text-small); line-height: 1.4; text-decoration: none; box-shadow: inset 1px 0 0 var(--ui-line-divider); transition: color var(--ui-duration-quick); }
7
+ .ui-nav-link::before { content: ""; position: absolute; top: .4375rem; bottom: .4375rem; left: 0; width: 2px; margin-left: -.5px; border-radius: 1px; background: transparent; transition: background-color var(--ui-duration-quick); }
8
+ .ui-nav-link:hover { color: var(--ui-text-strong); }
9
+ .ui-nav-link:hover::before { background: var(--ui-line-mark); }
10
+ .ui-nav-link:is([aria-current="page"], [aria-current="true"]) { color: var(--ui-text-strong); font-weight: var(--ui-weight-medium); }
11
+ .ui-nav-link:is([aria-current="page"], [aria-current="true"])::before { background: var(--ui-text-strong); }
12
+ .ui-nav-link:focus-visible { @apply --ui-focus-ring; outline-offset: 1px; border-radius: var(--ui-radius-sm); }
13
+ .ui-nav-link > .ui-badge { margin-left: auto; }
14
+ }