@misoto22/folio 0.16.0 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dist/agent/Accordion.md +1 -1
  2. package/dist/agent/Actions.md +1 -1
  3. package/dist/agent/Alert.md +1 -1
  4. package/dist/agent/AppShell.md +1 -1
  5. package/dist/agent/ArchitectureFigure.md +1 -1
  6. package/dist/agent/AreaChart.md +1 -1
  7. package/dist/agent/Article.md +1 -1
  8. package/dist/agent/AspectRatio.md +1 -1
  9. package/dist/agent/Avatar.md +1 -1
  10. package/dist/agent/Badge.md +1 -1
  11. package/dist/agent/BarChart.md +1 -1
  12. package/dist/agent/BarList.md +1 -1
  13. package/dist/agent/BigNumber.md +1 -1
  14. package/dist/agent/BoxPlot.md +1 -1
  15. package/dist/agent/Breadcrumb.md +1 -1
  16. package/dist/agent/BulletChart.md +1 -1
  17. package/dist/agent/Button.md +1 -1
  18. package/dist/agent/Calendar.md +1 -1
  19. package/dist/agent/CalendarHeatmap.md +1 -1
  20. package/dist/agent/Card.md +1 -1
  21. package/dist/agent/Checkbox.md +1 -1
  22. package/dist/agent/Code.md +1 -1
  23. package/dist/agent/CodeBlock.md +1 -1
  24. package/dist/agent/Collapsible.md +1 -1
  25. package/dist/agent/Collection.md +1 -1
  26. package/dist/agent/ColorPicker.md +1 -1
  27. package/dist/agent/Combobox.md +1 -1
  28. package/dist/agent/Command.md +1 -1
  29. package/dist/agent/ComposedChart.md +1 -1
  30. package/dist/agent/Contact.md +1 -1
  31. package/dist/agent/Content.md +1 -1
  32. package/dist/agent/ContextMenu.md +1 -1
  33. package/dist/agent/Conversation.md +1 -1
  34. package/dist/agent/DataflowFigure.md +1 -1
  35. package/dist/agent/DatePicker.md +1 -1
  36. package/dist/agent/DescriptionList.md +1 -1
  37. package/dist/agent/Diagram.md +1 -1
  38. package/dist/agent/DiagramCanvas.md +1 -1
  39. package/dist/agent/DiagramExportMenu.md +1 -1
  40. package/dist/agent/DiagramInspector.md +1 -1
  41. package/dist/agent/DiagramLegend.md +1 -1
  42. package/dist/agent/DiagramMinimap.md +1 -1
  43. package/dist/agent/DiagramToolbar.md +1 -1
  44. package/dist/agent/Dialog.md +1 -1
  45. package/dist/agent/DropdownMenu.md +1 -1
  46. package/dist/agent/EmptyState.md +1 -1
  47. package/dist/agent/ErrorState.md +1 -1
  48. package/dist/agent/Evidence.md +1 -1
  49. package/dist/agent/Facet.md +1 -1
  50. package/dist/agent/Field.md +1 -1
  51. package/dist/agent/FigureBand.md +1 -1
  52. package/dist/agent/FloatingIconButton.md +1 -1
  53. package/dist/agent/FunnelChart.md +1 -1
  54. package/dist/agent/Heading.md +1 -1
  55. package/dist/agent/Heatmap.md +1 -1
  56. package/dist/agent/Histogram.md +1 -1
  57. package/dist/agent/Input.md +1 -1
  58. package/dist/agent/Kbd.md +1 -1
  59. package/dist/agent/LifecycleFigure.md +1 -1
  60. package/dist/agent/LineChart.md +1 -1
  61. package/dist/agent/LinkArrow.md +1 -1
  62. package/dist/agent/Markdown.md +1 -1
  63. package/dist/agent/Media.md +1 -1
  64. package/dist/agent/Metric.md +1 -1
  65. package/dist/agent/Metrics.md +1 -1
  66. package/dist/agent/Music.md +1 -1
  67. package/dist/agent/NativeSelect.md +1 -1
  68. package/dist/agent/NavItem.md +1 -1
  69. package/dist/agent/NumberField.md +1 -1
  70. package/dist/agent/PageHeader.md +1 -1
  71. package/dist/agent/Pagination.md +1 -1
  72. package/dist/agent/PieChart.md +1 -1
  73. package/dist/agent/Popover.md +1 -1
  74. package/dist/agent/Portfolio.md +1 -1
  75. package/dist/agent/PortfolioIndex.md +1 -1
  76. package/dist/agent/Progress.md +1 -1
  77. package/dist/agent/RadarChart.md +1 -1
  78. package/dist/agent/RadialChart.md +1 -1
  79. package/dist/agent/RadioGroup.md +1 -1
  80. package/dist/agent/Reading.md +1 -1
  81. package/dist/agent/Recovery.md +1 -1
  82. package/dist/agent/SankeyChart.md +1 -1
  83. package/dist/agent/ScatterChart.md +1 -1
  84. package/dist/agent/ScrollArea.md +1 -1
  85. package/dist/agent/SearchPalette.md +1 -1
  86. package/dist/agent/SearchableMenu.md +1 -1
  87. package/dist/agent/Select.md +1 -1
  88. package/dist/agent/Separator.md +1 -1
  89. package/dist/agent/SequenceFigure.md +1 -1
  90. package/dist/agent/Sheet.md +1 -1
  91. package/dist/agent/Sidebar.md +1 -1
  92. package/dist/agent/SiteNavigation.md +1 -1
  93. package/dist/agent/SiteShell.md +1 -1
  94. package/dist/agent/Skeleton.md +1 -1
  95. package/dist/agent/Slider.md +1 -1
  96. package/dist/agent/Sparkline.md +1 -1
  97. package/dist/agent/Spinner.md +1 -1
  98. package/dist/agent/StatusDot.md +1 -1
  99. package/dist/agent/StatusPill.md +1 -1
  100. package/dist/agent/Steps.md +1 -1
  101. package/dist/agent/Switch.md +1 -1
  102. package/dist/agent/Table.md +1 -1
  103. package/dist/agent/Tabs.md +1 -1
  104. package/dist/agent/Tag.md +1 -1
  105. package/dist/agent/Text.md +1 -1
  106. package/dist/agent/Textarea.md +1 -1
  107. package/dist/agent/Timeline.md +1 -1
  108. package/dist/agent/Timestamp.md +1 -1
  109. package/dist/agent/Toast.md +1 -1
  110. package/dist/agent/ToggleGroup.md +1 -1
  111. package/dist/agent/Toolbar.md +1 -1
  112. package/dist/agent/Tooltip.md +1 -1
  113. package/dist/agent/TreemapChart.md +1 -1
  114. package/dist/agent/WaterfallChart.md +1 -1
  115. package/dist/agent/Workbench.md +142 -0
  116. package/dist/agent/WorkflowFigure.md +1 -1
  117. package/dist/agent/catalog.json +51 -2
  118. package/dist/agent/index.md +6 -3
  119. package/dist/article.css +1 -1
  120. package/dist/components/Badge/Badge.js +1 -1
  121. package/dist/components/Badge/Badge.js.map +1 -1
  122. package/dist/components/Button/Button.js +1 -1
  123. package/dist/components/Button/Button.js.map +1 -1
  124. package/dist/components/FigureBand/FigureBand.js +1 -1
  125. package/dist/components/FigureBand/FigureBand.js.map +1 -1
  126. package/dist/components/Heading/Heading.js +1 -1
  127. package/dist/components/Heading/Heading.js.map +1 -1
  128. package/dist/components/Pagination/Pagination.js +2 -2
  129. package/dist/components/Pagination/Pagination.js.map +1 -1
  130. package/dist/components/Table/Table.js +1 -1
  131. package/dist/components/Table/Table.js.map +1 -1
  132. package/dist/components/Tag/Tag.js +3 -3
  133. package/dist/components/Tag/Tag.js.map +1 -1
  134. package/dist/components/Text/Text.js +2 -2
  135. package/dist/components/Text/Text.js.map +1 -1
  136. package/dist/components/ToggleGroup/ToggleGroup.js +2 -2
  137. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  138. package/dist/semantic.css +9 -0
  139. package/dist/styles.css +1 -1
  140. package/dist/themes.css +99 -0
  141. package/dist/tokens.css +29 -2
  142. package/dist/tokens.d.ts +9 -0
  143. package/dist/tokens.js +51 -2
  144. package/dist/tokens.json +51 -2
  145. package/dist/website/Workbench/Chronology.d.ts +32 -0
  146. package/dist/website/Workbench/Chronology.js +32 -0
  147. package/dist/website/Workbench/Chronology.js.map +1 -0
  148. package/dist/website/Workbench/ContactRow.d.ts +13 -0
  149. package/dist/website/Workbench/ContactRow.js +11 -0
  150. package/dist/website/Workbench/ContactRow.js.map +1 -0
  151. package/dist/website/Workbench/PhotoMosaic.d.ts +13 -0
  152. package/dist/website/Workbench/PhotoMosaic.js +15 -0
  153. package/dist/website/Workbench/PhotoMosaic.js.map +1 -0
  154. package/dist/website/Workbench/Reveal.d.ts +19 -0
  155. package/dist/website/Workbench/Reveal.js +29 -0
  156. package/dist/website/Workbench/Reveal.js.map +1 -0
  157. package/dist/website/Workbench/ToolStrip.d.ts +18 -0
  158. package/dist/website/Workbench/ToolStrip.js +15 -0
  159. package/dist/website/Workbench/ToolStrip.js.map +1 -0
  160. package/dist/website/Workbench/Workbench.d.ts +23 -0
  161. package/dist/website/Workbench/Workbench.js +22 -0
  162. package/dist/website/Workbench/Workbench.js.map +1 -0
  163. package/dist/website/Workbench/WorkbenchCard.d.ts +29 -0
  164. package/dist/website/Workbench/WorkbenchCard.js +21 -0
  165. package/dist/website/Workbench/WorkbenchCard.js.map +1 -0
  166. package/dist/website/Workbench/WorkbenchEntries.d.ts +22 -0
  167. package/dist/website/Workbench/WorkbenchEntries.js +24 -0
  168. package/dist/website/Workbench/WorkbenchEntries.js.map +1 -0
  169. package/dist/website/Workbench/WorkbenchFigure.d.ts +20 -0
  170. package/dist/website/Workbench/WorkbenchFigure.js +15 -0
  171. package/dist/website/Workbench/WorkbenchFigure.js.map +1 -0
  172. package/dist/website/Workbench/WorkbenchHero.d.ts +24 -0
  173. package/dist/website/Workbench/WorkbenchHero.js +24 -0
  174. package/dist/website/Workbench/WorkbenchHero.js.map +1 -0
  175. package/dist/website/Workbench/theme.d.ts +22 -0
  176. package/dist/website/Workbench/theme.js +12 -0
  177. package/dist/website/Workbench/theme.js.map +1 -0
  178. package/dist/website/index.d.ts +11 -0
  179. package/dist/website/index.js +11 -0
  180. package/dist/website/index.js.map +1 -1
  181. package/dist/website-collection.css +8 -8
  182. package/dist/website-contact.css +9 -3
  183. package/dist/website-content.css +4 -1
  184. package/dist/website-conversation.css +6 -6
  185. package/dist/website-evidence.css +1 -1
  186. package/dist/website-media.css +13 -13
  187. package/dist/website-metrics.css +1 -1
  188. package/dist/website-music.css +1 -1
  189. package/dist/website-portfolio.css +4 -4
  190. package/dist/website-reading.css +13 -13
  191. package/dist/website-recovery.css +1 -1
  192. package/dist/website-shell.css +1 -1
  193. package/dist/website-timeline.css +3 -3
  194. package/dist/website-workbench.css +162 -0
  195. package/dist/website.css +1 -0
  196. package/package.json +1 -1
  197. package/skills/folio-design/rules/tokens.md +4 -2
@@ -18,8 +18,8 @@
18
18
 
19
19
  .folio-media-detail-page { min-block-size: 100svh; }
20
20
  .folio-media-masthead { padding-block: clamp(4.5rem, 8vw, 6.5rem) clamp(1.75rem, 3.5vw, 2.75rem); }
21
- .folio-media-eyebrow { margin: 0; color: var(--secondary-text); font-family: var(--font-mono); font-size: 0.625rem; letter-spacing: 0.16em; text-transform: uppercase; }
22
- .folio-media-masthead-title { max-inline-size: 22ch; margin: 0.75rem 0 0; color: var(--foreground); font-family: var(--font-heading); font-size: clamp(2rem, 3.4vw, 2.875rem); font-weight: 300; letter-spacing: -0.034em; line-height: 1.04; text-wrap: balance; }
21
+ .folio-media-eyebrow { margin: 0; color: var(--secondary-text); font-family: var(--label-font); font-size: 0.625rem; letter-spacing: calc(0.16em * var(--label-tracking-scale)); text-transform: var(--label-case); }
22
+ .folio-media-masthead-title { max-inline-size: 22ch; margin: 0.75rem 0 0; color: var(--foreground); font-family: var(--font-heading); font-size: clamp(2rem, 3.4vw, 2.875rem); font-weight: var(--display-weight); letter-spacing: -0.034em; line-height: 1.04; text-wrap: balance; }
23
23
  .folio-media-description { max-inline-size: 52ch; margin-block: 1.25rem 0; color: var(--foreground-muted); font-size: 1rem; line-height: 1.7; }
24
24
  .folio-media-gallery-content { padding-block: clamp(2.25rem, 4vw, 3.5rem) clamp(4rem, 9vw, 8rem); }
25
25
  .folio-media-gallery { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: clamp(2.75rem, 5.5vw, 4.5rem) 1.5rem; margin: 0; padding: 0; list-style: none; }
@@ -33,13 +33,13 @@
33
33
  .folio-media-pager-link:focus-visible { outline: 2px solid var(--focus); outline-offset: 4px; }
34
34
  .folio-media-gallery-caption { display: grid; grid-template-columns: 2rem minmax(0, 1fr); align-items: baseline; gap: 0.25rem 0.625rem; padding-block-start: 0.875rem; }
35
35
  .folio-media-gallery-index,
36
- .folio-media-gallery-location { overflow: hidden; color: var(--secondary-text); font-family: var(--font-mono); font-size: 0.625rem; letter-spacing: 0.1em; text-overflow: ellipsis; white-space: nowrap; }
37
- .folio-media-gallery-location { grid-column: 2; letter-spacing: 0.14em; }
38
- .folio-media-gallery-title { display: -webkit-box; overflow: hidden; color: var(--foreground); font-family: var(--font-heading); font-size: 0.9375rem; font-weight: 300; line-height: 1.22; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
36
+ .folio-media-gallery-location { overflow: hidden; color: var(--secondary-text); font-family: var(--label-font); font-size: 0.625rem; letter-spacing: calc(0.1em * var(--label-tracking-scale)); text-overflow: ellipsis; white-space: nowrap; }
37
+ .folio-media-gallery-location { grid-column: 2; letter-spacing: calc(0.14em * var(--label-tracking-scale)); }
38
+ .folio-media-gallery-title { display: -webkit-box; overflow: hidden; color: var(--foreground); font-family: var(--font-heading); font-size: 0.9375rem; font-weight: var(--display-weight); line-height: 1.22; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
39
39
  .folio-media-gallery-mount { block-size: auto; aspect-ratio: 1; }
40
40
 
41
41
  .folio-photograph-feature { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); align-items: center; gap: clamp(2rem, 6vw, 6rem); padding-block: clamp(3rem, 8vw, 7rem); }
42
- .folio-photograph-feature-title { margin-block: 1rem; color: var(--foreground); font-family: var(--font-heading); font-size: clamp(2rem, 4vw, 4rem); font-weight: 300; letter-spacing: -0.035em; line-height: 1.08; }
42
+ .folio-photograph-feature-title { margin-block: 1rem; color: var(--foreground); font-family: var(--font-heading); font-size: clamp(2rem, 4vw, 4rem); font-weight: var(--display-weight); letter-spacing: -0.035em; line-height: 1.08; }
43
43
  .folio-photograph-feature-action { margin-block-start: 2rem; }
44
44
  .folio-photograph-feature-figure { min-inline-size: 0; margin: 0; }
45
45
  .folio-photograph-feature-image img { display: block; inline-size: 100%; block-size: auto; object-fit: contain; }
@@ -48,7 +48,7 @@
48
48
  .folio-media-detail { padding-block: clamp(2rem, 5vw, 4.5rem) clamp(4rem, 8vw, 7rem); }
49
49
  .folio-media-index-bar { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding-block-end: 1rem; border-block-end: 1px solid var(--border-subtle); }
50
50
  .folio-media-index-bar > :is(a, button) { min-inline-size: 44.25px; min-block-size: 44.25px; }
51
- .folio-media-index { color: var(--foreground-muted); font-family: var(--font-mono); font-size: 0.6875rem; font-variant-numeric: tabular-nums; letter-spacing: 0.13em; }
51
+ .folio-media-index { color: var(--foreground-muted); font-family: var(--label-font); font-size: 0.6875rem; font-variant-numeric: tabular-nums; letter-spacing: calc(0.13em * var(--label-tracking-scale)); }
52
52
  .folio-media-spread { display: grid; grid-template-columns: minmax(0, 1fr) clamp(20rem, 29vw, 27rem); align-items: start; gap: clamp(1.5rem, 3.5vw, 4.5rem); padding-block: clamp(1.5rem, 3.5vw, 3.75rem); }
53
53
  .folio-media-well { display: flex; min-inline-size: 0; align-items: flex-start; }
54
54
  .folio-media-frame {
@@ -76,7 +76,7 @@
76
76
  .folio-media-metadata > div { display: flex; align-items: baseline; justify-content: space-between; gap: 1.25rem; padding-block: 0.6875rem; border-block-end: 1px solid var(--border-subtle); }
77
77
  .folio-media-metadata > div:first-child { padding-block-start: 0.6875rem; }
78
78
  .folio-media-metadata > div:last-child { padding-block-end: 0.6875rem; border-block-end: 1px solid var(--border-subtle); }
79
- .folio-media-metadata dt { flex: none; color: var(--secondary-text); font-family: var(--font-mono); font-size: 0.625rem; letter-spacing: 0.14em; text-transform: uppercase; }
79
+ .folio-media-metadata dt { flex: none; color: var(--secondary-text); font-family: var(--label-font); font-size: 0.625rem; letter-spacing: calc(0.14em * var(--label-tracking-scale)); text-transform: var(--label-case); }
80
80
  .folio-media-metadata dd { min-inline-size: 0; margin: 0; color: var(--foreground); font-family: var(--font-mono); font-size: 0.78125rem; text-align: end; overflow-wrap: anywhere; }
81
81
  .folio-media-light { display: flex; flex-direction: column; align-items: flex-start; gap: 0.5rem; padding-block: 1.1rem; border-block-end: 1px solid var(--border-subtle); }
82
82
  .folio-media-light-line { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem; color: var(--foreground-muted); font-family: var(--font-mono); font-size: 0.6875rem; }
@@ -117,7 +117,7 @@
117
117
  .folio-media-lightbox-close { position: absolute; inset-block-start: 1rem; inset-inline-end: 1rem; color: var(--on-dark); border-color: color-mix(in srgb, var(--on-dark) 40%, transparent); }
118
118
  .folio-media-lightbox-close:hover { border-color: var(--on-dark); }
119
119
  .folio-media-lightbox-close:focus-visible { outline: 2px solid var(--on-dark); outline-offset: 3px; }
120
- .folio-media-lightbox-caption { position: absolute; inset-block-end: 1.25rem; inset-inline: 1.25rem; overflow: hidden; margin: 0; color: var(--on-dark); font-family: var(--font-mono); font-size: 0.6875rem; letter-spacing: 0.13em; text-transform: uppercase; text-overflow: ellipsis; white-space: nowrap; pointer-events: none; }
120
+ .folio-media-lightbox-caption { position: absolute; inset-block-end: 1.25rem; inset-inline: 1.25rem; overflow: hidden; margin: 0; color: var(--on-dark); font-family: var(--label-font); font-size: 0.6875rem; letter-spacing: calc(0.13em * var(--label-tracking-scale)); text-transform: var(--label-case); text-overflow: ellipsis; white-space: nowrap; pointer-events: none; }
121
121
 
122
122
  .folio-media-pager { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); margin-block-start: clamp(2rem, 4vw, 3.5rem); border-block-start: 1px solid var(--border-color); border-block-end: 1px solid var(--border-subtle); }
123
123
  .folio-media-pager-link { display: grid; grid-template-columns: 4.5rem minmax(0, 1fr); min-block-size: 44px; align-items: center; gap: 1rem; padding-block: 1.125rem; padding-inline-end: 1.5rem; color: inherit; text-decoration: none; }
@@ -127,10 +127,10 @@
127
127
  .folio-media-pager-link[data-direction='next'] .folio-media-pager-copy { text-align: end; }
128
128
  .folio-media-pager-image { position: relative; display: block; block-size: 3.25rem; overflow: hidden; background: var(--background-elevated); }
129
129
  .folio-media-pager-image img { object-fit: contain; }
130
- .folio-media-pager-label { display: block; color: var(--secondary-text); font-family: var(--font-mono); font-size: 0.625rem; letter-spacing: 0.16em; text-transform: uppercase; }
131
- .folio-media-pager-title { display: block; overflow: hidden; margin-block-start: 0.3125rem; color: var(--foreground); font-family: var(--font-heading); font-size: 1.0625rem; font-weight: 300; line-height: 1.2; text-overflow: ellipsis; white-space: nowrap; }
130
+ .folio-media-pager-label { display: block; color: var(--secondary-text); font-family: var(--label-font); font-size: 0.625rem; letter-spacing: calc(0.16em * var(--label-tracking-scale)); text-transform: var(--label-case); }
131
+ .folio-media-pager-title { display: block; overflow: hidden; margin-block-start: 0.3125rem; color: var(--foreground); font-family: var(--font-heading); font-size: 1.0625rem; font-weight: var(--display-weight); line-height: 1.2; text-overflow: ellipsis; white-space: nowrap; }
132
132
  .folio-media-thumbnails { padding-block-start: clamp(1.5rem, 3vw, 2.5rem); border-block-start: 1px solid var(--border-subtle); }
133
- .folio-media-thumbnails h2 { margin-block: 0 0.75rem; color: var(--foreground-muted); font-family: var(--font-mono); font-size: 0.6875rem; font-weight: 400; letter-spacing: 0.13em; text-transform: uppercase; }
133
+ .folio-media-thumbnails h2 { margin-block: 0 0.75rem; color: var(--foreground-muted); font-family: var(--label-font); font-size: 0.6875rem; font-weight: 400; letter-spacing: calc(0.13em * var(--label-tracking-scale)); text-transform: var(--label-case); }
134
134
  .folio-media-thumbnail-list { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: clamp(0.4rem, 1vw, 0.8rem); }
135
135
  .folio-media-thumbnail { position: relative; min-inline-size: 44px; min-block-size: 44px; aspect-ratio: 1; overflow: hidden; background: var(--background-elevated); }
136
136
  .folio-media-thumbnail img { object-fit: contain; }
@@ -171,7 +171,7 @@
171
171
  .folio-media-map-pin[data-active] > span,
172
172
  .folio-media-map-marker:hover .folio-media-map-pin > span { transform: scale(1.3); }
173
173
  .folio-media-map-frame-compact { display: grid; gap: 0.75rem; margin-block-start: 1.5rem; }
174
- .folio-media-map-label { color: var(--secondary-text); font-family: var(--font-mono); font-size: 0.625rem; letter-spacing: 0.14em; text-transform: uppercase; }
174
+ .folio-media-map-label { color: var(--secondary-text); font-family: var(--label-font); font-size: 0.625rem; letter-spacing: calc(0.14em * var(--label-tracking-scale)); text-transform: var(--label-case); }
175
175
  .folio-media-map-frame-compact .folio-media-map-stage { block-size: 9.375rem; }
176
176
  .folio-media-map-frame-compact .folio-media-map-stage img { display: block; inline-size: 100%; block-size: 100%; object-fit: cover; }
177
177
  .folio-media-map-frame-compact .folio-media-map-pin { position: absolute; inset-block-start: 50%; inset-inline-start: 50%; transform: translate(-50%, -50%); }
@@ -1,6 +1,6 @@
1
1
  .folio-metrics-range { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem 1.25rem; border-block: 1px solid var(--rule); padding-block: 1rem; margin-block-start: 2rem; }
2
2
  .folio-metrics-section { padding-block: clamp(3rem, 6vw, 5rem); }
3
- .folio-metrics-section__header { display: flex; flex-wrap: wrap; align-items: end; justify-content: space-between; gap: 1.5rem; padding-block-end: 1rem; margin-block-end: 1.5rem; border-block-end: 1px solid var(--rule-hard); }
3
+ .folio-metrics-section__header { display: flex; flex-wrap: wrap; align-items: end; justify-content: space-between; gap: 1.5rem; padding-block-end: 1rem; margin-block-end: 1.5rem; border-block-end: 1px solid var(--rule-divider); }
4
4
  .folio-metrics-panel { min-inline-size: 0; }
5
5
  .folio-metrics-panel > header { margin-block-end: 1.25rem; }
6
6
  .folio-metrics-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: 3rem; }
@@ -20,7 +20,7 @@
20
20
  .folio-media-collection__copy h3 a { font: inherit; white-space: normal; text-align: start; }
21
21
  .folio-media-collection__metadata { display: flex; flex-wrap: wrap; justify-content: space-between; gap: .5rem; }
22
22
  .folio-music-section { min-inline-size: 0; }
23
- .folio-music-section__header { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: .75rem; padding-block-end: 1rem; border-block-end: 1px solid var(--rule-hard); }
23
+ .folio-music-section__header { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: .75rem; padding-block-end: 1rem; border-block-end: 1px solid var(--rule-divider); }
24
24
  .folio-music-section__collections { display: grid; grid-template-columns: minmax(0, 1fr); gap: 0 clamp(2rem, 5vw, 5rem); }
25
25
  @media (min-width: 640px) { .folio-media-row { gap: 1rem; }.folio-media-collection { grid-template-columns: 9rem minmax(0, 1fr); }.folio-media-collection__copy { padding-inline: 1.5rem; } }
26
26
  @media (min-width: 768px) { .folio-media-feature { grid-template-columns: minmax(15rem, 5fr) minmax(0, 7fr); }.folio-music-section__collections { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@@ -20,11 +20,11 @@
20
20
  .folio-portfolio-intro { max-inline-size: var(--w-page); margin-inline: auto; padding: clamp(7.5rem, 11vw, 10rem) var(--page-pad) clamp(3rem, 7vw, 5rem); display: grid; grid-template-columns: minmax(0, 1fr) minmax(18rem, .85fr); align-items: stretch; gap: clamp(3rem, 7vw, 7rem); }
21
21
  .folio-portfolio-intro-copy { display: flex; flex-direction: column; align-items: start; }
22
22
  .folio-portfolio-byline { display: flex; align-items: center; gap: 1.25rem; }
23
- .folio-portfolio-byline h1 { font-weight: 300; font-size: clamp(2.7rem, 5vw, 4rem); }
23
+ .folio-portfolio-byline h1 { font-weight: var(--display-weight); font-size: clamp(2.7rem, 5vw, 4rem); }
24
24
  .folio-portfolio-monogram { display: grid; place-items: center; inline-size: 44px; block-size: 44px; flex: none; border: 1px solid var(--rule); border-radius: var(--radius-pill); color: var(--ink-3-aa); font-family: var(--mono); font-size: .7rem; }
25
25
  .folio-portfolio-biography { max-inline-size: 35em; margin-block-start: 2rem; font-size: 1.05rem; line-height: 1.85; color: var(--ink-2); text-wrap: pretty; }
26
26
  .folio-portfolio-facts { display: flex; flex-wrap: wrap; gap: .5rem 1.75rem; margin-block: 1.5rem 3rem; }
27
- .folio-portfolio-intro blockquote { margin: auto 0 0; padding-block-start: 1.5rem; border-block-start: 1px solid var(--rule); inline-size: 100%; font-family: var(--serif); font-size: 1.125rem; line-height: 1.7; color: var(--ink-3-aa); }
27
+ .folio-portfolio-intro blockquote { margin: auto 0 0; padding-block-start: 1.5rem; border-block-start: 1px solid var(--rule); inline-size: 100%; font-family: var(--font-heading); font-size: 1.125rem; line-height: 1.7; color: var(--ink-3-aa); }
28
28
  .folio-portfolio-feature { min-inline-size: 0; }
29
29
  .folio-portfolio-index { max-inline-size: var(--w-page); margin-inline: auto; padding: 1rem var(--page-pad) clamp(5rem, 9vw, 8rem); }
30
30
  .folio-portfolio-columns { display: grid; grid-template-columns: minmax(0, 1fr) 19rem; gap: clamp(3rem, 5vw, 5rem); align-items: start; padding-block-start: 1.5rem; }
@@ -36,7 +36,7 @@
36
36
  .folio-portfolio-image-frame img { object-fit: cover; }
37
37
  .folio-portfolio-image[data-size='feature'] .folio-portfolio-image-frame { aspect-ratio: 1; }
38
38
  .folio-portfolio-image[data-size='thumbnail'] .folio-portfolio-image-frame { aspect-ratio: 3 / 2; }
39
- .folio-portfolio-image figcaption { display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem .5rem; padding-block-start: .625rem; color: var(--ink); font-family: var(--serif); font-size: .9375rem; line-height: 1.4; }
39
+ .folio-portfolio-image figcaption { display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem .5rem; padding-block-start: .625rem; color: var(--ink); font-family: var(--font-heading); font-size: .9375rem; line-height: 1.4; }
40
40
  .folio-portfolio-image figcaption > [aria-hidden] { font-family: var(--mono); font-size: .7rem; color: var(--ink-3-aa); }
41
41
  .folio-portfolio-image figcaption small { flex-basis:100%; margin-inline-start:0; text-align:start; color: var(--ink-3-aa); font-family: var(--sans); font-size: .75rem; }
42
42
  .folio-portfolio-record { display: grid; gap: 1.5rem; }
@@ -56,7 +56,7 @@
56
56
  .folio-portfolio-list > h2, .folio-portfolio-categories h2 { margin: 0 0 1rem; font-family: var(--sans); font-size: .85rem; color: var(--ink-3-aa); font-weight: 500; }
57
57
  .folio-portfolio-categories dl { margin: 0; }
58
58
  .folio-portfolio-categories dl > div { display: flex; justify-content: space-between; align-items: center; gap: 1rem; border-block-end: 1px solid var(--rule); padding-block: .35rem; }
59
- .folio-portfolio-categories dt { font-family: var(--serif); font-size: 1.125rem; }
59
+ .folio-portfolio-categories dt { font-family: var(--font-heading); font-size: 1.125rem; }
60
60
  .folio-portfolio-categories dt a { display: flex; align-items: center; min-block-size: 44px; }
61
61
  .folio-portfolio-categories dd { margin: 0; font-family: var(--mono); font-size: .75rem; color: var(--ink-3-aa); }
62
62
  @media (max-width: 1023px) {
@@ -3,31 +3,31 @@
3
3
  .folio-detail-masthead[data-width=fill],.folio-reading-figure[data-width=fill]{padding-inline:0;max-width:none}
4
4
  .folio-detail-back{margin-block-end:clamp(2rem,5vw,3rem)}
5
5
  .folio-detail-back a{display:inline-flex;align-items:center;min-height:44px;gap:.5rem;color:var(--ink-3-aa);font-size:.875rem;text-decoration:none}
6
- .folio-detail-context{font-family:var(--mono-i18n,var(--font-mono));font-size:.6875rem;color:var(--ink-3-aa);letter-spacing:.12em;margin-block:0 1.25rem}
6
+ .folio-detail-context{font-family:var(--mono-i18n,var(--label-font));font-size:.6875rem;color:var(--ink-3-aa);letter-spacing:calc(.12em * var(--label-tracking-scale));margin-block:0 1.25rem}
7
7
  .folio-detail-opening{display:grid;gap:2.5rem}
8
8
  .folio-detail-opening[data-aside]{grid-template-columns:minmax(0,1fr) minmax(19rem,26rem);gap:clamp(3rem,7vw,6rem)}
9
9
  .folio-detail-opening>div{min-width:0}
10
- .folio-detail-masthead h1{font-family:var(--serif-i18n,var(--font-heading));font-size:var(--fs-title);font-weight:300;line-height:1.05;letter-spacing:-.032em;text-wrap:balance;margin:0}
10
+ .folio-detail-masthead h1{font-family:var(--serif-i18n,var(--font-heading));font-size:var(--fs-title);font-weight:var(--display-weight);line-height:1.05;letter-spacing:-.032em;text-wrap:balance;margin:0}
11
11
  .folio-detail-masthead[data-display] h1{font-size:clamp(2.5rem,7vw,5.5rem)}
12
12
  .folio-detail-dek{max-width:64ch;font-size:clamp(1.0625rem,1.6vw,1.25rem);line-height:1.65;color:var(--ink-2);margin-block:1.75rem 0;text-wrap:pretty}
13
13
  .folio-detail-metabar{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:end;gap:1rem 2.5rem;border-block:1px solid var(--rule);padding-block:1.25rem;margin-block-start:clamp(2rem,4vw,3rem)}
14
14
  .folio-detail-metabar dl{display:flex;flex-wrap:wrap;gap:1.25rem 2.75rem;margin:0;min-width:0}
15
- .folio-detail-metabar dt{font-family:var(--mono-i18n,var(--font-mono));font-size:.625rem;letter-spacing:.12em;color:var(--ink-3-aa)}
15
+ .folio-detail-metabar dt{font-family:var(--mono-i18n,var(--label-font));font-size:.625rem;letter-spacing:calc(.12em * var(--label-tracking-scale));color:var(--ink-3-aa)}
16
16
  .folio-detail-metabar dd{display:flex;align-items:center;gap:.5rem;margin:.375rem 0 0;font-size:.9375rem}
17
17
  .folio-detail-actions{display:flex;flex-wrap:wrap;gap:.625rem;margin-inline-start:auto}
18
18
  .folio-reading-layout{padding-block-start:clamp(2.75rem,5vw,4rem)}
19
19
  .folio-reading-body{min-width:0}
20
20
  .folio-reading-section{padding-block-start:clamp(3rem,7vw,5.5rem);scroll-margin-block-start:var(--scroll-offset,6rem)}
21
21
  .folio-reading-section[data-compact]{padding-block-start:2rem}
22
- .folio-reading-heading{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:1rem;border-block-end:1px solid var(--rule-hard);padding-block-end:1rem;margin-block-end:1.75rem}
22
+ .folio-reading-heading{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:1rem;border-block-end:1px solid var(--rule-divider);padding-block-end:1rem;margin-block-end:1.75rem}
23
23
  .folio-reading-section[data-seamless] .folio-reading-heading{margin-block-end:0}
24
24
  .folio-reading-heading:has(+ .folio-reference-rows, + .folio-feature-pairs){margin-block-end:0}
25
25
  .folio-reading-heading + :is(.folio-reference-rows,.folio-feature-pairs){border-block-start:0}
26
26
  .folio-reading-heading:has(+ .folio-figure-band){margin-block-end:1.25rem;padding-block-end:0;border-block-end:0}
27
- .folio-reading-heading h2{margin:0;font-family:var(--serif-i18n,var(--font-heading));font-size:var(--fs-lead);font-weight:300;line-height:1.1;letter-spacing:-.028em}
27
+ .folio-reading-heading h2{margin:0;font-family:var(--serif-i18n,var(--font-heading));font-size:var(--fs-lead);font-weight:var(--display-weight);line-height:1.1;letter-spacing:-.028em}
28
28
  .folio-reading-heading>span{font-family:var(--mono-i18n,var(--font-mono));font-size:.6875rem;color:var(--ink-3-aa)}
29
29
  .folio-reading-lead{font-size:1.0625rem;line-height:1.75;color:var(--ink-2);margin-block:0 2rem}
30
- .folio-reading-lede>p:first-child{font-family:var(--serif-i18n,var(--font-heading));font-weight:300;font-size:var(--fs-lead);line-height:1.28;letter-spacing:-.01em;margin:0}
30
+ .folio-reading-lede>p:first-child{font-family:var(--serif-i18n,var(--font-heading));font-weight:var(--display-weight);font-size:var(--fs-lead);line-height:1.28;letter-spacing:-.01em;margin:0}
31
31
  .folio-reading-lede>p:first-child>span{color:var(--ink-3-aa)}
32
32
  .folio-reading-lede>p+p{font-size:1.0625rem;line-height:1.7;color:var(--ink-2);margin-block-start:1.5rem}
33
33
  .folio-record-pager{display:grid;grid-template-columns:1fr 1fr;margin-block-start:clamp(3.5rem,7vw,5rem)}
@@ -35,12 +35,12 @@
35
35
  .folio-record-pager-link[data-direction=prev]{border-inline-end:1px solid var(--rule);padding-inline-end:1.5rem}
36
36
  .folio-record-pager-link[data-direction=next]{text-align:end;justify-content:end;padding-inline-start:1.5rem}
37
37
  .folio-record-pager-direction{display:block;font-family:var(--mono-i18n,var(--font-mono));font-size:.6875rem;color:var(--ink-3-aa)}
38
- .folio-record-pager strong{display:block;margin-block-start:.5rem;font-family:var(--serif-i18n,var(--font-heading));font-weight:300;font-size:var(--fs-item);line-height:1.25}
38
+ .folio-record-pager strong{display:block;margin-block-start:.5rem;font-family:var(--serif-i18n,var(--font-heading));font-weight:var(--display-weight);font-size:var(--fs-item);line-height:1.25}
39
39
  .folio-record-pager-media{position:relative;width:4.5rem;height:3rem;overflow:hidden}
40
40
  .folio-record-pager-media img{width:100%;height:100%;object-fit:cover}
41
41
  .folio-toc{color:var(--ink-3-aa)}
42
42
  .folio-toc>div{position:sticky;inset-block-start:7rem}
43
- .folio-toc p{font-family:var(--mono-i18n,var(--font-mono));font-size:.625rem;letter-spacing:.12em;margin-block:0 1rem}
43
+ .folio-toc p{font-family:var(--mono-i18n,var(--label-font));font-size:.625rem;letter-spacing:calc(.12em * var(--label-tracking-scale));margin-block:0 1rem}
44
44
  .folio-toc ul{list-style:none;margin:0;padding:0;border-inline-start:1px solid var(--rule)}
45
45
  .folio-toc ul ul{border:0;padding-inline-start:1rem}
46
46
  .folio-toc a{display:flex;align-items:baseline;gap:.625rem;min-height:2rem;padding:.375rem .5rem .375rem 1rem;color:inherit;font-size:.8125rem;line-height:1.5;text-decoration:none}
@@ -67,16 +67,16 @@
67
67
  .folio-media-playback{position:relative;width:100%;height:100%}
68
68
  .folio-media-playback video{display:block;width:100%;height:100%;object-fit:cover}
69
69
  .folio-media-playback button{position:absolute;inset-inline-end:.75rem;inset-block-end:.75rem;background:var(--paper)}
70
- .folio-action-band{display:grid;grid-template-columns:minmax(0,1fr);gap:1.5rem;border-block:1px solid var(--rule-hard);padding-block:clamp(2.5rem,6vw,4.5rem);margin-block-start:clamp(3.5rem,8vw,6rem)}
71
- .folio-action-band__eyebrow{font-family:var(--mono-i18n,var(--font-mono));font-size:.6875rem;letter-spacing:.1em;color:var(--ink-3-aa)}
72
- .folio-action-band h2{font-family:var(--serif-i18n,var(--font-heading));font-size:var(--fs-lead);font-weight:300;line-height:1.15;margin:0;text-wrap:balance}
70
+ .folio-action-band{display:grid;grid-template-columns:minmax(0,1fr);gap:1.5rem;border-block:1px solid var(--rule-divider);padding-block:clamp(2.5rem,6vw,4.5rem);margin-block-start:clamp(3.5rem,8vw,6rem)}
71
+ .folio-action-band__eyebrow{font-family:var(--mono-i18n,var(--label-font));font-size:.6875rem;letter-spacing:calc(.1em * var(--label-tracking-scale));color:var(--ink-3-aa)}
72
+ .folio-action-band h2{font-family:var(--serif-i18n,var(--font-heading));font-size:var(--fs-lead);font-weight:var(--display-weight);line-height:1.15;margin:0;text-wrap:balance}
73
73
  .folio-action-band p{max-width:46ch;color:var(--ink-3-aa);line-height:1.7;margin:1rem 0 0}
74
74
  .folio-action-band__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem}
75
- .folio-feature-pairs{display:grid;grid-template-columns:1fr 1fr;gap:0 clamp(2rem,5vw,4.5rem);border-block-start:1px solid var(--rule-hard)}
75
+ .folio-feature-pairs{display:grid;grid-template-columns:1fr 1fr;gap:0 clamp(2rem,5vw,4.5rem);border-block-start:1px solid var(--rule-divider)}
76
76
  .folio-reading-section[data-seamless] .folio-feature-pairs{border-block-start:0}
77
77
  .folio-feature-pairs>div{padding-block:clamp(1.5rem,3vw,2rem);border-block-end:1px solid var(--rule)}
78
78
  .folio-feature-pairs span{font-family:var(--mono-i18n,var(--font-mono));font-size:.6875rem;color:var(--ink-3-aa)}
79
- .folio-feature-pairs h3{font-family:var(--serif-i18n,var(--font-heading));font-size:var(--fs-item);font-weight:300;line-height:1.2;margin-block:0 .75rem}
79
+ .folio-feature-pairs h3{font-family:var(--serif-i18n,var(--font-heading));font-size:var(--fs-item);font-weight:var(--display-weight);line-height:1.2;margin-block:0 .75rem}
80
80
  .folio-feature-pairs p{color:var(--ink-2);font-size:1rem;line-height:1.7;margin:0}
81
81
  .folio-preview-pair{display:grid;gap:2rem;align-items:end;padding-block-start:1.75rem}
82
82
  .folio-preview-pair[data-mobile]{grid-template-columns:minmax(0,1fr) minmax(13.5rem,.3fr)}
@@ -6,7 +6,7 @@
6
6
  .folio-loading-intro { display: grid; align-items: end; gap: clamp(2rem, 5vw, 5rem); padding-block: clamp(4.5rem, 9vw, 7rem) clamp(2.75rem, 5vw, 4.5rem); }
7
7
  .folio-loading-records, .folio-loading-gallery, .folio-loading-metrics { padding-block-end: clamp(4rem, 9vw, 8rem); }
8
8
  .folio-loading-records__row { display: grid; gap: 1rem 2.25rem; border-block-end: 1px solid var(--rule); padding-block: 2rem; }
9
- .folio-loading-records__row:first-child { border-block-start: 1px solid var(--rule-hard); }
9
+ .folio-loading-records__row:first-child { border-block-start: 1px solid var(--rule-divider); }
10
10
  .folio-loading-filters { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 1.5rem; padding-block: 1rem; }
11
11
  .folio-loading-gallery { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2rem .75rem; }
12
12
  .folio-loading-media { border-block: 1px solid var(--rule); background: var(--paper-2); }
@@ -19,7 +19,7 @@
19
19
  }
20
20
  .folio-site-navigation[data-overlay]::before { content: ''; position: absolute; inset: 0 0 -3rem; z-index: -1; pointer-events: none; background: linear-gradient(color-mix(in srgb, var(--photo-scrim) 45%, transparent), transparent); }
21
21
  .folio-site-navigation-inner { max-inline-size: var(--w-page); padding-inline: var(--page-pad); margin-inline: auto; min-block-size: 4.25rem; display: flex; align-items: center; gap: 2rem; }
22
- .folio-site-wordmark { font-family: var(--serif); font-size: 1.4rem; letter-spacing: -.025em; white-space: nowrap; }
22
+ .folio-site-wordmark { font-family: var(--font-heading); font-size: 1.4rem; letter-spacing: -.025em; white-space: nowrap; }
23
23
  .folio-site-wordmark a { display: inline-flex; align-items: center; min-block-size: 44px; }
24
24
  .folio-site-navigation-desktop { margin-inline-start: auto; }
25
25
  .folio-site-navigation-desktop ul { list-style: none; padding: 0; margin: 0; display: flex; gap: 1.6rem; }
@@ -1,5 +1,5 @@
1
1
  .folio-record-section { scroll-margin-block-start: var(--scroll-offset); }
2
- .folio-record-section__header { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; padding-block-end: 1rem; border-block-end: 1px solid var(--rule-hard); }
2
+ .folio-record-section__header { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; padding-block-end: 1rem; border-block-end: 1px solid var(--rule-divider); }
3
3
  .folio-career-record { display: grid; gap: 1rem; border-block-end: 1px solid var(--rule); padding-block: clamp(2rem, 3.5vw, 3rem); }
4
4
  .folio-career-record__dates { display: flex; flex-wrap: wrap; align-items: baseline; gap: 1rem; }
5
5
  .folio-career-record__dates dl, .folio-career-record__dates dd { margin: 0; }
@@ -18,7 +18,7 @@
18
18
  .folio-profile-figure__image { overflow: hidden; border-radius: var(--radius); }
19
19
  .folio-profile-figure__image img { display: block; inline-size: 100%; block-size: auto; }
20
20
  .folio-profile-skills__group { display: grid; gap: 1rem; border-block-end: 1px solid var(--rule); padding-block: 1.5rem; }
21
- .folio-profile-skills__group:first-child { border-block-start: 1px solid var(--rule-hard); }
21
+ .folio-profile-skills__group:first-child { border-block-start: 1px solid var(--rule-divider); }
22
22
  .folio-profile-skills__items { display: flex; flex-wrap: wrap; gap: .75rem 1.5rem; list-style: none; margin: 0; padding: 0; }
23
23
  .folio-profile-skills__items > li { display: inline-flex; align-items: center; gap: .5rem; }
24
24
  .folio-profile-skill__icon { display: inline-flex; }
@@ -29,7 +29,7 @@
29
29
  [data-mode='dark'] .folio-profile-skill__icon[data-invert]:not([data-has-dark]) img { filter: invert(1); }
30
30
  .folio-profile-interests { display: grid; gap: 2rem; }
31
31
  .folio-profile-interests article { border-block-start: 1px solid var(--rule); padding-block-start: 1.5rem; }
32
- .folio-timeline { border-block-start: 1px solid var(--rule-hard); }
32
+ .folio-timeline { border-block-start: 1px solid var(--rule-divider); }
33
33
  .folio-timeline__item { min-inline-size: 0; }
34
34
  @media (min-width: 768px) {
35
35
  .folio-career-record { grid-template-columns: 11rem minmax(0, 1fr) 4rem; column-gap: clamp(2rem, 4vw, 3.5rem); }
@@ -0,0 +1,162 @@
1
+ /*
2
+ * Workbench compositions.
3
+ *
4
+ * One grid for the whole page: 12 columns with a 24px gutter inside the page
5
+ * width. A section's heading takes columns 1–4 and its content an 8-column
6
+ * subgrid on columns 5–12, so every list, card and caption on the page shares
7
+ * the same vertical lines. Colour, rules and type come from the theme axes;
8
+ * the Workbench preset is `linen` + `ember` + `grotesk` + `quiet`, but these
9
+ * compositions read only roles and work under any preset.
10
+ */
11
+ @layer components {
12
+ .folio-wb-section,
13
+ .folio-wb-hero {
14
+ --wb-gap: 24px;
15
+ max-inline-size: var(--w-page);
16
+ margin-inline: auto;
17
+ padding-inline: var(--page-pad);
18
+ display: grid;
19
+ grid-template-columns: repeat(12, minmax(0, 1fr));
20
+ column-gap: var(--wb-gap);
21
+ }
22
+
23
+ /* ─── Section ─────────────────────────────────────────────────────────── */
24
+ .folio-wb-section { margin-block-start: 7.5rem; }
25
+ .folio-wb-section:last-child { margin-block-end: 7.5rem; }
26
+ .folio-wb-section::before { content: ''; grid-column: 1 / -1; border-block-start: 1px solid var(--rule); margin-block-end: 2rem; }
27
+ .folio-wb-section-head { grid-column: 1 / span 4; display: flex; flex-direction: column; gap: 1rem; padding-inline-end: 1.5rem; }
28
+ .folio-wb-section-body { grid-column: 5 / -1; min-inline-size: 0; }
29
+ .folio-wb-heading { margin: 0; font-family: var(--font-heading); font-weight: 400; font-size: 1.375rem; line-height: 1.3; letter-spacing: -0.015em; color: var(--ink); text-wrap: pretty; }
30
+ .folio-wb-heading-lead { color: var(--ink-3-aa); }
31
+ .folio-wb-section-action a,
32
+ .folio-wb-link { display: inline-flex; align-items: center; min-block-size: 44px; color: var(--accent-on-muted); text-decoration: none; font-size: .9375rem; }
33
+ .folio-wb-section-action a:hover,
34
+ .folio-wb-link:hover { text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px; }
35
+
36
+ /* ─── Hero ────────────────────────────────────────────────────────────── */
37
+ .folio-wb-hero { padding-block-start: clamp(4rem, 8vw, 6rem); row-gap: 3rem; align-items: end; }
38
+ .folio-wb-hero-copy { grid-column: 1 / span 7; display: flex; flex-direction: column; gap: 1.75rem; }
39
+ .folio-wb-hero-statement { font-size: clamp(1.5rem, 2.2vw, 1.75rem); line-height: 1.3; }
40
+ .folio-wb-hero-actions { display: flex; flex-wrap: wrap; gap: .5rem; }
41
+ .folio-wb-hero-stats { grid-column: 10 / -1; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--wb-gap); margin: 0; align-self: end; }
42
+ .folio-wb-hero-stats > div { display: flex; flex-direction: column-reverse; gap: .125rem; }
43
+ .folio-wb-hero-stats dd { margin: 0; font-size: 1.25rem; color: var(--ink); font-variant-numeric: tabular-nums; }
44
+ .folio-wb-hero-stats dt { font-size: .8125rem; color: var(--ink-3-aa); }
45
+ .folio-wb-hero-figure { grid-column: 1 / -1; }
46
+
47
+ /* ─── Figure ──────────────────────────────────────────────────────────── */
48
+ .folio-wb-figure { margin: 0; }
49
+ .folio-wb-figure-frame { position: relative; display: block; overflow: hidden; border-radius: var(--radius); background: var(--paper-2); aspect-ratio: 3 / 2; }
50
+ .folio-wb-figure[data-ratio='wide'] .folio-wb-figure-frame { aspect-ratio: 16 / 9; }
51
+ .folio-wb-figure[data-ratio='portrait'] .folio-wb-figure-frame { aspect-ratio: 4 / 5; }
52
+ .folio-wb-figure[data-ratio='panorama'] .folio-wb-figure-frame { aspect-ratio: 3 / 1; }
53
+ .folio-wb-figure-frame img,
54
+ .folio-wb-mosaic-frame img,
55
+ .folio-wb-card-cover img { inline-size: 100%; block-size: 100%; object-fit: cover; transition: scale var(--slow) var(--ease); }
56
+ .folio-wb-figure figcaption { display: flex; justify-content: space-between; gap: 1rem; margin-block-start: .75rem; font-size: .8125rem; color: var(--ink-3-aa); }
57
+
58
+ /* ─── Tools ───────────────────────────────────────────────────────────── */
59
+ .folio-wb-tools { max-inline-size: var(--w-page); margin: 4.5rem auto 0; padding-inline: var(--page-pad); }
60
+ .folio-wb-tools-label { margin: 0 0 1.25rem; text-align: center; font-size: .8125rem; color: var(--ink-3-aa); }
61
+ .folio-wb-tools ul { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 24px; }
62
+ .folio-wb-tools li { display: grid; place-items: center; block-size: 4rem; border-radius: var(--radius); background: var(--paper-2); color: var(--ink-3-aa); transition: color var(--mid) var(--ease), background-color var(--mid) var(--ease); }
63
+ .folio-wb-tools li:hover { color: var(--ink); background: var(--stone); }
64
+ .folio-wb-tools li svg { inline-size: 1.375rem; block-size: 1.375rem; }
65
+
66
+ /* ─── Cards ───────────────────────────────────────────────────────────── */
67
+ .folio-wb-card-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2.5rem 24px; }
68
+ .folio-wb-card { position: relative; display: flex; flex-direction: column; gap: .375rem; }
69
+ .folio-wb-card-cover { position: relative; overflow: hidden; aspect-ratio: 16 / 10; margin-block-end: .625rem; border: 1px solid var(--rule); border-radius: var(--radius); background: var(--paper-2); transition: border-color var(--mid) var(--ease), translate var(--mid) var(--ease); }
70
+ .folio-wb-card-title { margin: 0; font-family: var(--font-heading); font-weight: 400; font-size: 1rem; line-height: 1.4; color: var(--ink); }
71
+ .folio-wb-card-title a { display: inline-flex; align-items: center; min-block-size: 44px; color: inherit; text-decoration: none; }
72
+ .folio-wb-card-title a::after { content: ''; position: absolute; inset: 0; border-radius: var(--radius); }
73
+ .folio-wb-card:has(a:focus-visible) .folio-wb-card-cover { outline: var(--focus-w) solid var(--focus); outline-offset: 2px; }
74
+ .folio-wb-card-description,
75
+ .folio-wb-card-meta { margin: 0; font-size: .875rem; line-height: 1.5; color: var(--ink-3-aa); }
76
+ .folio-wb-card-meta { font-size: .8125rem; }
77
+ .folio-wb-card:hover .folio-wb-card-cover { translate: 0 -2px; border-color: var(--rule-2); }
78
+ .folio-wb-card:hover .folio-wb-card-cover img,
79
+ .folio-wb-figure:hover .folio-wb-figure-frame img,
80
+ .folio-wb-mosaic-frame:hover img { scale: 1.02; }
81
+ .folio-wb-tile { display: grid; align-items: end; block-size: 100%; padding: 1.25rem; color: var(--paper); background-color: var(--ink); background-image: linear-gradient(color-mix(in srgb, var(--paper) 10%, transparent) 1px, transparent 1px), linear-gradient(90deg, color-mix(in srgb, var(--paper) 10%, transparent) 1px, transparent 1px); background-size: 24px 24px; }
82
+ .folio-wb-tile span { font-size: 1.25rem; letter-spacing: .08em; text-transform: uppercase; }
83
+
84
+ /* ─── Entries ─────────────────────────────────────────────────────────── */
85
+ .folio-wb-entries { display: grid; grid-template-columns: repeat(8, minmax(0, 1fr)); column-gap: 24px; row-gap: 2rem; }
86
+ .folio-wb-entries > ul { grid-column: 1 / -1; list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
87
+ .folio-wb-entries[data-has-featured] > ul { grid-column: 5 / -1; }
88
+ .folio-wb-entries > ul > li + li { border-block-start: 1px solid var(--rule); }
89
+ .folio-wb-entries > ul > li { padding-block: 1.25rem; }
90
+ .folio-wb-entries > ul > li:first-child { padding-block-start: 0; }
91
+ .folio-wb-entry-featured { grid-column: 1 / span 4; position: relative; display: flex; flex-direction: column; gap: 1rem; padding: 1.5rem; border: 1px solid var(--rule); border-radius: var(--radius); background-color: var(--paper-2); background-image: repeating-linear-gradient(to bottom, transparent 0 calc(1.625rem - 1px), var(--rule) calc(1.625rem - 1px) 1.625rem); transition: border-color var(--mid) var(--ease), translate var(--mid) var(--ease); }
92
+ .folio-wb-entry-featured:hover { translate: 0 -2px; border-color: var(--rule-2); }
93
+ .folio-wb-entry-featured h3 { margin: 0 0 auto; font-family: var(--font-heading); font-weight: 400; font-size: 1.375rem; line-height: 1.3; color: var(--ink); }
94
+ .folio-wb-entry-featured p { margin: 0; font-size: .9375rem; line-height: 1.625rem; color: var(--ink-2); }
95
+ .folio-wb-entry-featured h3 a::after { content: ''; position: absolute; inset: 0; }
96
+ .folio-wb-entry h3 { margin: 0; font-family: var(--font-heading); font-weight: 400; font-size: 1rem; line-height: 1.4; }
97
+ .folio-wb-entry h3 a,
98
+ .folio-wb-entry-featured h3 a { display: inline-flex; align-items: center; min-block-size: 44px; color: var(--ink); text-decoration: none; }
99
+ .folio-wb-entry h3 a:hover { text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px; }
100
+ .folio-wb-entry-date { margin: 0 0 .25rem; font-size: .8125rem; color: var(--ink-3-aa); }
101
+ .folio-wb-entry-excerpt { margin: .375rem 0 0; font-size: .875rem; line-height: 1.5; color: var(--ink-3-aa); }
102
+ .folio-wb-entry-meta { margin: .375rem 0 0; font-size: .8125rem; color: var(--ink-3-aa); }
103
+
104
+ /* ─── Chronology ──────────────────────────────────────────────────────── */
105
+ .folio-wb-chronology { margin: 0; }
106
+ .folio-wb-chronology ol { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 1.25rem; }
107
+ .folio-wb-chronology li p { margin: 0 0 .375rem; font-size: .8125rem; line-height: 1.4; color: var(--ink); white-space: nowrap; }
108
+ .folio-wb-chronology li[data-align='start'] p { margin-inline-start: var(--start); }
109
+ .folio-wb-chronology li[data-align='end'] p { text-align: end; padding-inline-end: calc(100% - var(--end)); }
110
+ .folio-wb-chronology-org { color: var(--ink-3-aa); }
111
+ .folio-wb-chronology-now { color: var(--accent-on-muted); }
112
+ .folio-wb-chronology-bar { display: block; margin-inline-start: var(--start); block-size: .5rem; inline-size: calc(var(--end) - var(--start)); min-inline-size: .75rem; border-radius: var(--radius-pill); }
113
+ .folio-wb-chronology li[data-kind='role'] .folio-wb-chronology-bar { background: var(--stone); }
114
+ .folio-wb-chronology li[data-kind='study'] .folio-wb-chronology-bar { box-shadow: inset 0 0 0 1px var(--rule-2); }
115
+ .folio-wb-chronology li[data-current] .folio-wb-chronology-bar { background: linear-gradient(90deg, var(--ink) calc(100% - .5rem), var(--accent) 0); }
116
+ .folio-wb-chronology-axis { display: flex; overflow: hidden; margin-block-start: 1.5rem; border-block-start: 1px solid var(--rule-2); }
117
+ .folio-wb-chronology-axis span { flex: 1; min-inline-size: 0; white-space: nowrap; padding: .5rem 0 0 .375rem; border-inline-start: 1px solid var(--rule); font-size: .8125rem; color: var(--ink-3-aa); font-variant-numeric: tabular-nums; }
118
+
119
+ /* ─── Mosaic ──────────────────────────────────────────────────────────── */
120
+ .folio-wb-mosaic { display: grid; grid-template-columns: 2fr 1fr 1fr; grid-template-rows: auto auto; gap: 24px; }
121
+ .folio-wb-mosaic-lead { grid-row: span 2; margin: 0; display: flex; flex-direction: column; }
122
+ .folio-wb-mosaic-lead .folio-wb-mosaic-frame { flex: 1; }
123
+ .folio-wb-mosaic-frame { position: relative; overflow: hidden; border-radius: var(--radius); background: var(--paper-2); aspect-ratio: 4 / 5; }
124
+ .folio-wb-mosaic-lead .folio-wb-mosaic-frame { aspect-ratio: auto; min-block-size: 100%; }
125
+ .folio-wb-mosaic-frame > a { position: absolute; inset: 0; display: block; }
126
+ .folio-wb-mosaic-lead figcaption { margin-block-start: .75rem; font-size: .8125rem; color: var(--ink-3-aa); }
127
+
128
+ /* ─── Contact ─────────────────────────────────────────────────────────── */
129
+ .folio-wb-contact { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 1rem 2rem; }
130
+ .folio-wb-contact-address a { display: inline-flex; align-items: center; min-block-size: 44px; font-size: clamp(1.25rem, 2vw, 1.625rem); color: var(--ink); text-decoration: underline; text-underline-offset: 6px; text-decoration-thickness: 1px; text-decoration-color: var(--rule-2); transition: text-decoration-color var(--mid) var(--ease); }
131
+ .folio-wb-contact-address a:hover { text-decoration-color: var(--ink); }
132
+
133
+
134
+ /* ─── Reveal ──────────────────────────────────────────────────────────── */
135
+ .folio-wb-reveal[data-reveal] { transition: opacity calc(var(--slow) * 1.2) var(--ease), translate calc(var(--slow) * 1.2) var(--ease); }
136
+ .folio-wb-reveal[data-reveal='hidden'] { opacity: 0; translate: 0 12px; }
137
+
138
+ .folio-wb-visually-hidden { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
139
+
140
+ /* ─── Narrow screens ──────────────────────────────────────────────────── */
141
+ @media (max-width: 47.5rem) {
142
+ .folio-wb-section { margin-block-start: 5rem; }
143
+ .folio-wb-section-head,
144
+ .folio-wb-section-body,
145
+ .folio-wb-hero-copy,
146
+ .folio-wb-hero-stats { grid-column: 1 / -1; }
147
+ .folio-wb-section-head { margin-block-end: 2rem; padding-inline-end: 0; }
148
+ .folio-wb-tools ul { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 12px; }
149
+ .folio-wb-card-grid { grid-template-columns: minmax(0, 1fr); }
150
+ .folio-wb-entries > ul,
151
+ .folio-wb-entries[data-has-featured] > ul,
152
+ .folio-wb-entry-featured { grid-column: 1 / -1; }
153
+ .folio-wb-mosaic { grid-template-columns: 1fr 1fr; }
154
+ .folio-wb-mosaic-lead { grid-column: 1 / -1; grid-row: auto; }
155
+ .folio-wb-mosaic-lead .folio-wb-mosaic-frame { aspect-ratio: 4 / 5; }
156
+ .folio-wb-chronology li p { white-space: normal; }
157
+ /* A long career puts a dozen years on a phone-width axis; every other
158
+ label keeps them legible without pushing the page sideways. */
159
+ .folio-wb-chronology-axis span:nth-child(even) { color: transparent; }
160
+ }
161
+ }
162
+
package/dist/website.css CHANGED
@@ -23,3 +23,4 @@
23
23
  @import './website-conversation.css';
24
24
  @import './website-evidence.css';
25
25
  @import './website-controls.css';
26
+ @import './website-workbench.css';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@misoto22/folio",
3
- "version": "0.16.0",
3
+ "version": "0.17.1",
4
4
  "private": false,
5
5
  "description": "Monochrome design system — CSS tokens and accessible React primitives",
6
6
  "license": "MIT",
@@ -63,12 +63,14 @@ not just `:root`. An unset axis is the default.
63
63
  | Attribute | Values | Unset means |
64
64
  | --- | --- | --- |
65
65
  | `data-mode` | `light` `dark` | follows the app |
66
- | `data-accent` | `clay` `cobalt` `forest` `moss` `plum` | ink |
67
- | `data-surface` | `warm` `cool` `glass` | paper |
66
+ | `data-accent` | `clay` `cobalt` `ember` `forest` `moss` `plum` | ink |
67
+ | `data-action` | `ink` | accent |
68
+ | `data-surface` | `warm` `cool` `glass` `linen` | paper |
68
69
  | `data-radius` | `sharp` `round` | the default ladder |
69
70
  | `data-rules` | `quiet` `firm` | hairline |
70
71
  | `data-type` | `grotesk` `bookish` | editorial |
71
72
  | `data-motion` | `still` `snappy` | calm |
73
+ | `data-voice` | `quiet` | display |
72
74
  | `data-density` | `compact` | comfortable |
73
75
 
74
76
  ```tsx