@dillingerstaffing/strand-vue 0.16.1 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/dist/components/CardSection/CardSection.vue.d.ts +27 -0
  2. package/dist/components/CardSection/CardSection.vue.d.ts.map +1 -0
  3. package/dist/components/CardSection/index.d.ts +2 -0
  4. package/dist/components/CardSection/index.d.ts.map +1 -0
  5. package/dist/components/ContainerScale/ContainerScale.vue.d.ts +23 -0
  6. package/dist/components/ContainerScale/ContainerScale.vue.d.ts.map +1 -0
  7. package/dist/components/ContainerScale/ContainerScaleAxis.vue.d.ts +23 -0
  8. package/dist/components/ContainerScale/ContainerScaleAxis.vue.d.ts.map +1 -0
  9. package/dist/components/ContainerScale/ContainerScaleBar.vue.d.ts +24 -0
  10. package/dist/components/ContainerScale/ContainerScaleBar.vue.d.ts.map +1 -0
  11. package/dist/components/ContainerScale/ContainerScaleCaption.vue.d.ts +23 -0
  12. package/dist/components/ContainerScale/ContainerScaleCaption.vue.d.ts.map +1 -0
  13. package/dist/components/ContainerScale/ContainerScaleLabel.vue.d.ts +23 -0
  14. package/dist/components/ContainerScale/ContainerScaleLabel.vue.d.ts.map +1 -0
  15. package/dist/components/ContainerScale/ContainerScalePx.vue.d.ts +23 -0
  16. package/dist/components/ContainerScale/ContainerScalePx.vue.d.ts.map +1 -0
  17. package/dist/components/ContainerScale/ContainerScaleRow.vue.d.ts +23 -0
  18. package/dist/components/ContainerScale/ContainerScaleRow.vue.d.ts.map +1 -0
  19. package/dist/components/ContainerScale/ContainerScaleTrack.vue.d.ts +23 -0
  20. package/dist/components/ContainerScale/ContainerScaleTrack.vue.d.ts.map +1 -0
  21. package/dist/components/ContainerScale/index.d.ts +9 -0
  22. package/dist/components/ContainerScale/index.d.ts.map +1 -0
  23. package/dist/components/KvEditorial/KvEditorial.vue.d.ts +32 -0
  24. package/dist/components/KvEditorial/KvEditorial.vue.d.ts.map +1 -0
  25. package/dist/components/KvEditorial/index.d.ts +2 -0
  26. package/dist/components/KvEditorial/index.d.ts.map +1 -0
  27. package/dist/components/LabFrame/LabFrame.vue.d.ts +23 -0
  28. package/dist/components/LabFrame/LabFrame.vue.d.ts.map +1 -0
  29. package/dist/components/LabFrame/LabFrameActions.vue.d.ts +23 -0
  30. package/dist/components/LabFrame/LabFrameActions.vue.d.ts.map +1 -0
  31. package/dist/components/LabFrame/LabFrameBody.vue.d.ts +23 -0
  32. package/dist/components/LabFrame/LabFrameBody.vue.d.ts.map +1 -0
  33. package/dist/components/LabFrame/LabFrameChrome.vue.d.ts +23 -0
  34. package/dist/components/LabFrame/LabFrameChrome.vue.d.ts.map +1 -0
  35. package/dist/components/LabFrame/LabFrameContent.vue.d.ts +25 -0
  36. package/dist/components/LabFrame/LabFrameContent.vue.d.ts.map +1 -0
  37. package/dist/components/LabFrame/LabFrameContentHead.vue.d.ts +23 -0
  38. package/dist/components/LabFrame/LabFrameContentHead.vue.d.ts.map +1 -0
  39. package/dist/components/LabFrame/LabFrameDot.vue.d.ts +9 -0
  40. package/dist/components/LabFrame/LabFrameDot.vue.d.ts.map +1 -0
  41. package/dist/components/LabFrame/LabFrameOverlay.vue.d.ts +23 -0
  42. package/dist/components/LabFrame/LabFrameOverlay.vue.d.ts.map +1 -0
  43. package/dist/components/LabFrame/LabFramePanel.vue.d.ts +23 -0
  44. package/dist/components/LabFrame/LabFramePanel.vue.d.ts.map +1 -0
  45. package/dist/components/LabFrame/LabFramePanelBody.vue.d.ts +23 -0
  46. package/dist/components/LabFrame/LabFramePanelBody.vue.d.ts.map +1 -0
  47. package/dist/components/LabFrame/LabFramePanelClose.vue.d.ts +25 -0
  48. package/dist/components/LabFrame/LabFramePanelClose.vue.d.ts.map +1 -0
  49. package/dist/components/LabFrame/LabFramePanelFooter.vue.d.ts +23 -0
  50. package/dist/components/LabFrame/LabFramePanelFooter.vue.d.ts.map +1 -0
  51. package/dist/components/LabFrame/LabFramePanelHeader.vue.d.ts +23 -0
  52. package/dist/components/LabFrame/LabFramePanelHeader.vue.d.ts.map +1 -0
  53. package/dist/components/LabFrame/LabFramePanelTitle.vue.d.ts +23 -0
  54. package/dist/components/LabFrame/LabFramePanelTitle.vue.d.ts.map +1 -0
  55. package/dist/components/LabFrame/LabFrameTitle.vue.d.ts +23 -0
  56. package/dist/components/LabFrame/LabFrameTitle.vue.d.ts.map +1 -0
  57. package/dist/components/LabFrame/index.d.ts +16 -0
  58. package/dist/components/LabFrame/index.d.ts.map +1 -0
  59. package/dist/components/LabGlassStage/LabGlassPanel.vue.d.ts +23 -0
  60. package/dist/components/LabGlassStage/LabGlassPanel.vue.d.ts.map +1 -0
  61. package/dist/components/LabGlassStage/LabGlassStage.vue.d.ts +23 -0
  62. package/dist/components/LabGlassStage/LabGlassStage.vue.d.ts.map +1 -0
  63. package/dist/components/LabGlassStage/index.d.ts +3 -0
  64. package/dist/components/LabGlassStage/index.d.ts.map +1 -0
  65. package/dist/components/LabRevealStage/LabRevealLine.vue.d.ts +23 -0
  66. package/dist/components/LabRevealStage/LabRevealLine.vue.d.ts.map +1 -0
  67. package/dist/components/LabRevealStage/LabRevealStage.vue.d.ts +23 -0
  68. package/dist/components/LabRevealStage/LabRevealStage.vue.d.ts.map +1 -0
  69. package/dist/components/LabRevealStage/index.d.ts +3 -0
  70. package/dist/components/LabRevealStage/index.d.ts.map +1 -0
  71. package/dist/components/LabShell/LabBrand.vue.d.ts +23 -0
  72. package/dist/components/LabShell/LabBrand.vue.d.ts.map +1 -0
  73. package/dist/components/LabShell/LabBrandMark.vue.d.ts +23 -0
  74. package/dist/components/LabShell/LabBrandMark.vue.d.ts.map +1 -0
  75. package/dist/components/LabShell/LabBrandSub.vue.d.ts +23 -0
  76. package/dist/components/LabShell/LabBrandSub.vue.d.ts.map +1 -0
  77. package/dist/components/LabShell/LabBrandTitle.vue.d.ts +23 -0
  78. package/dist/components/LabShell/LabBrandTitle.vue.d.ts.map +1 -0
  79. package/dist/components/LabShell/LabExample.vue.d.ts +23 -0
  80. package/dist/components/LabShell/LabExample.vue.d.ts.map +1 -0
  81. package/dist/components/LabShell/LabExampleCaption.vue.d.ts +23 -0
  82. package/dist/components/LabShell/LabExampleCaption.vue.d.ts.map +1 -0
  83. package/dist/components/LabShell/LabExampleCode.vue.d.ts +23 -0
  84. package/dist/components/LabShell/LabExampleCode.vue.d.ts.map +1 -0
  85. package/dist/components/LabShell/LabExampleDemo.vue.d.ts +27 -0
  86. package/dist/components/LabShell/LabExampleDemo.vue.d.ts.map +1 -0
  87. package/dist/components/LabShell/LabExampleLabel.vue.d.ts +23 -0
  88. package/dist/components/LabShell/LabExampleLabel.vue.d.ts.map +1 -0
  89. package/dist/components/LabShell/LabExampleMeta.vue.d.ts +23 -0
  90. package/dist/components/LabShell/LabExampleMeta.vue.d.ts.map +1 -0
  91. package/dist/components/LabShell/LabHeader.vue.d.ts +23 -0
  92. package/dist/components/LabShell/LabHeader.vue.d.ts.map +1 -0
  93. package/dist/components/LabShell/LabHeaderLead.vue.d.ts +23 -0
  94. package/dist/components/LabShell/LabHeaderLead.vue.d.ts.map +1 -0
  95. package/dist/components/LabShell/LabHeaderMeta.vue.d.ts +23 -0
  96. package/dist/components/LabShell/LabHeaderMeta.vue.d.ts.map +1 -0
  97. package/dist/components/LabShell/LabHeaderMetaItem.vue.d.ts +23 -0
  98. package/dist/components/LabShell/LabHeaderMetaItem.vue.d.ts.map +1 -0
  99. package/dist/components/LabShell/LabHeaderMetaLabel.vue.d.ts +23 -0
  100. package/dist/components/LabShell/LabHeaderMetaLabel.vue.d.ts.map +1 -0
  101. package/dist/components/LabShell/LabHeaderMetaValue.vue.d.ts +23 -0
  102. package/dist/components/LabShell/LabHeaderMetaValue.vue.d.ts.map +1 -0
  103. package/dist/components/LabShell/LabHeaderTitle.vue.d.ts +23 -0
  104. package/dist/components/LabShell/LabHeaderTitle.vue.d.ts.map +1 -0
  105. package/dist/components/LabShell/LabMain.vue.d.ts +23 -0
  106. package/dist/components/LabShell/LabMain.vue.d.ts.map +1 -0
  107. package/dist/components/LabShell/LabSection.vue.d.ts +23 -0
  108. package/dist/components/LabShell/LabSection.vue.d.ts.map +1 -0
  109. package/dist/components/LabShell/LabSectionBody.vue.d.ts +23 -0
  110. package/dist/components/LabShell/LabSectionBody.vue.d.ts.map +1 -0
  111. package/dist/components/LabShell/LabSectionHead.vue.d.ts +23 -0
  112. package/dist/components/LabShell/LabSectionHead.vue.d.ts.map +1 -0
  113. package/dist/components/LabShell/LabSectionHeadNote.vue.d.ts +23 -0
  114. package/dist/components/LabShell/LabSectionHeadNote.vue.d.ts.map +1 -0
  115. package/dist/components/LabShell/LabShell.vue.d.ts +23 -0
  116. package/dist/components/LabShell/LabShell.vue.d.ts.map +1 -0
  117. package/dist/components/LabShell/LabSidebar.vue.d.ts +23 -0
  118. package/dist/components/LabShell/LabSidebar.vue.d.ts.map +1 -0
  119. package/dist/components/LabShell/LabSidebarGroup.vue.d.ts +23 -0
  120. package/dist/components/LabShell/LabSidebarGroup.vue.d.ts.map +1 -0
  121. package/dist/components/LabShell/LabSidebarGroupDot.vue.d.ts +8 -0
  122. package/dist/components/LabShell/LabSidebarGroupDot.vue.d.ts.map +1 -0
  123. package/dist/components/LabShell/LabSidebarGroupLabel.vue.d.ts +23 -0
  124. package/dist/components/LabShell/LabSidebarGroupLabel.vue.d.ts.map +1 -0
  125. package/dist/components/LabShell/LabSidebarGroupLink.vue.d.ts +25 -0
  126. package/dist/components/LabShell/LabSidebarGroupLink.vue.d.ts.map +1 -0
  127. package/dist/components/LabShell/LabSidebarGroupList.vue.d.ts +23 -0
  128. package/dist/components/LabShell/LabSidebarGroupList.vue.d.ts.map +1 -0
  129. package/dist/components/LabShell/LabSidebarHead.vue.d.ts +23 -0
  130. package/dist/components/LabShell/LabSidebarHead.vue.d.ts.map +1 -0
  131. package/dist/components/LabShell/LabSidebarScroll.vue.d.ts +23 -0
  132. package/dist/components/LabShell/LabSidebarScroll.vue.d.ts.map +1 -0
  133. package/dist/components/LabShell/LabTaxonomy.vue.d.ts +23 -0
  134. package/dist/components/LabShell/LabTaxonomy.vue.d.ts.map +1 -0
  135. package/dist/components/LabShell/LabTaxonomyList.vue.d.ts +23 -0
  136. package/dist/components/LabShell/LabTaxonomyList.vue.d.ts.map +1 -0
  137. package/dist/components/LabShell/LabTaxonomyTitle.vue.d.ts +23 -0
  138. package/dist/components/LabShell/LabTaxonomyTitle.vue.d.ts.map +1 -0
  139. package/dist/components/LabShell/index.d.ts +35 -0
  140. package/dist/components/LabShell/index.d.ts.map +1 -0
  141. package/dist/components/LabTip/LabTip.vue.d.ts +25 -0
  142. package/dist/components/LabTip/LabTip.vue.d.ts.map +1 -0
  143. package/dist/components/LabTip/LabTipBubble.vue.d.ts +26 -0
  144. package/dist/components/LabTip/LabTipBubble.vue.d.ts.map +1 -0
  145. package/dist/components/LabTip/index.d.ts +3 -0
  146. package/dist/components/LabTip/index.d.ts.map +1 -0
  147. package/dist/components/LabUtilCell/LabUtilCell.vue.d.ts +23 -0
  148. package/dist/components/LabUtilCell/LabUtilCell.vue.d.ts.map +1 -0
  149. package/dist/components/LabUtilCell/LabUtilCellBlock.vue.d.ts +23 -0
  150. package/dist/components/LabUtilCell/LabUtilCellBlock.vue.d.ts.map +1 -0
  151. package/dist/components/LabUtilCell/LabUtilCellCaption.vue.d.ts +23 -0
  152. package/dist/components/LabUtilCell/LabUtilCellCaption.vue.d.ts.map +1 -0
  153. package/dist/components/LabUtilCell/LabUtilCellCode.vue.d.ts +23 -0
  154. package/dist/components/LabUtilCell/LabUtilCellCode.vue.d.ts.map +1 -0
  155. package/dist/components/LabUtilCell/LabUtilCellDemo.vue.d.ts +23 -0
  156. package/dist/components/LabUtilCell/LabUtilCellDemo.vue.d.ts.map +1 -0
  157. package/dist/components/LabUtilCell/LabUtilRow.vue.d.ts +23 -0
  158. package/dist/components/LabUtilCell/LabUtilRow.vue.d.ts.map +1 -0
  159. package/dist/components/LabUtilCell/index.d.ts +7 -0
  160. package/dist/components/LabUtilCell/index.d.ts.map +1 -0
  161. package/dist/components/Swatch/Swatch.vue.d.ts +12 -0
  162. package/dist/components/Swatch/Swatch.vue.d.ts.map +1 -0
  163. package/dist/components/Swatch/SwatchGrid.vue.d.ts +23 -0
  164. package/dist/components/Swatch/SwatchGrid.vue.d.ts.map +1 -0
  165. package/dist/components/Swatch/index.d.ts +3 -0
  166. package/dist/components/Swatch/index.d.ts.map +1 -0
  167. package/dist/components/TokenSpecimen/TokenSpecimen.vue.d.ts +23 -0
  168. package/dist/components/TokenSpecimen/TokenSpecimen.vue.d.ts.map +1 -0
  169. package/dist/components/TokenSpecimen/TokenSpecimenBox.vue.d.ts +10 -0
  170. package/dist/components/TokenSpecimen/TokenSpecimenBox.vue.d.ts.map +1 -0
  171. package/dist/components/TokenSpecimen/TokenSpecimenGrid.vue.d.ts +23 -0
  172. package/dist/components/TokenSpecimen/TokenSpecimenGrid.vue.d.ts.map +1 -0
  173. package/dist/components/TokenSpecimen/TokenSpecimenSpacer.vue.d.ts +9 -0
  174. package/dist/components/TokenSpecimen/TokenSpecimenSpacer.vue.d.ts.map +1 -0
  175. package/dist/components/TokenSpecimen/index.d.ts +5 -0
  176. package/dist/components/TokenSpecimen/index.d.ts.map +1 -0
  177. package/dist/components/TypeSpecimen/TypeSpecimen.vue.d.ts +23 -0
  178. package/dist/components/TypeSpecimen/TypeSpecimen.vue.d.ts.map +1 -0
  179. package/dist/components/TypeSpecimen/TypeSpecimenMeta.vue.d.ts +23 -0
  180. package/dist/components/TypeSpecimen/TypeSpecimenMeta.vue.d.ts.map +1 -0
  181. package/dist/components/TypeSpecimen/index.d.ts +3 -0
  182. package/dist/components/TypeSpecimen/index.d.ts.map +1 -0
  183. package/dist/css/strand-ui.css +1248 -82
  184. package/dist/index.d.ts +12 -0
  185. package/dist/index.d.ts.map +1 -1
  186. package/dist/index.js +1797 -756
  187. package/dist/index.js.map +1 -1
  188. package/package.json +2 -2
  189. package/src/components/CardSection/CardSection.test.ts +51 -0
  190. package/src/components/CardSection/CardSection.vue +42 -0
  191. package/src/components/CardSection/index.ts +1 -0
  192. package/src/components/ContainerScale/ContainerScale.test.ts +42 -0
  193. package/src/components/ContainerScale/ContainerScale.vue +8 -0
  194. package/src/components/ContainerScale/ContainerScaleAxis.vue +8 -0
  195. package/src/components/ContainerScale/ContainerScaleBar.vue +17 -0
  196. package/src/components/ContainerScale/ContainerScaleCaption.vue +8 -0
  197. package/src/components/ContainerScale/ContainerScaleLabel.vue +8 -0
  198. package/src/components/ContainerScale/ContainerScalePx.vue +8 -0
  199. package/src/components/ContainerScale/ContainerScaleRow.vue +8 -0
  200. package/src/components/ContainerScale/ContainerScaleTrack.vue +8 -0
  201. package/src/components/ContainerScale/index.ts +8 -0
  202. package/src/components/KvEditorial/KvEditorial.test.ts +43 -0
  203. package/src/components/KvEditorial/KvEditorial.vue +56 -0
  204. package/src/components/KvEditorial/index.ts +1 -0
  205. package/src/components/LabFrame/LabFrame.test.ts +89 -0
  206. package/src/components/LabFrame/LabFrame.vue +8 -0
  207. package/src/components/LabFrame/LabFrameActions.vue +8 -0
  208. package/src/components/LabFrame/LabFrameBody.vue +8 -0
  209. package/src/components/LabFrame/LabFrameChrome.vue +8 -0
  210. package/src/components/LabFrame/LabFrameContent.vue +17 -0
  211. package/src/components/LabFrame/LabFrameContentHead.vue +8 -0
  212. package/src/components/LabFrame/LabFrameDot.vue +15 -0
  213. package/src/components/LabFrame/LabFrameOverlay.vue +8 -0
  214. package/src/components/LabFrame/LabFramePanel.vue +11 -0
  215. package/src/components/LabFrame/LabFramePanelBody.vue +8 -0
  216. package/src/components/LabFrame/LabFramePanelClose.vue +26 -0
  217. package/src/components/LabFrame/LabFramePanelFooter.vue +8 -0
  218. package/src/components/LabFrame/LabFramePanelHeader.vue +8 -0
  219. package/src/components/LabFrame/LabFramePanelTitle.vue +8 -0
  220. package/src/components/LabFrame/LabFrameTitle.vue +8 -0
  221. package/src/components/LabFrame/index.ts +15 -0
  222. package/src/components/LabGlassStage/LabGlassPanel.vue +8 -0
  223. package/src/components/LabGlassStage/LabGlassStage.test.ts +16 -0
  224. package/src/components/LabGlassStage/LabGlassStage.vue +8 -0
  225. package/src/components/LabGlassStage/index.ts +2 -0
  226. package/src/components/LabRevealStage/LabRevealLine.vue +8 -0
  227. package/src/components/LabRevealStage/LabRevealStage.test.ts +16 -0
  228. package/src/components/LabRevealStage/LabRevealStage.vue +8 -0
  229. package/src/components/LabRevealStage/index.ts +2 -0
  230. package/src/components/LabShell/LabBrand.vue +8 -0
  231. package/src/components/LabShell/LabBrandMark.vue +8 -0
  232. package/src/components/LabShell/LabBrandSub.vue +8 -0
  233. package/src/components/LabShell/LabBrandTitle.vue +8 -0
  234. package/src/components/LabShell/LabExample.vue +8 -0
  235. package/src/components/LabShell/LabExampleCaption.vue +8 -0
  236. package/src/components/LabShell/LabExampleCode.vue +8 -0
  237. package/src/components/LabShell/LabExampleDemo.vue +30 -0
  238. package/src/components/LabShell/LabExampleLabel.vue +8 -0
  239. package/src/components/LabShell/LabExampleMeta.vue +8 -0
  240. package/src/components/LabShell/LabHeader.vue +8 -0
  241. package/src/components/LabShell/LabHeaderLead.vue +8 -0
  242. package/src/components/LabShell/LabHeaderMeta.vue +8 -0
  243. package/src/components/LabShell/LabHeaderMetaItem.vue +8 -0
  244. package/src/components/LabShell/LabHeaderMetaLabel.vue +8 -0
  245. package/src/components/LabShell/LabHeaderMetaValue.vue +8 -0
  246. package/src/components/LabShell/LabHeaderTitle.vue +8 -0
  247. package/src/components/LabShell/LabMain.vue +8 -0
  248. package/src/components/LabShell/LabSection.vue +8 -0
  249. package/src/components/LabShell/LabSectionBody.vue +8 -0
  250. package/src/components/LabShell/LabSectionHead.vue +8 -0
  251. package/src/components/LabShell/LabSectionHeadNote.vue +8 -0
  252. package/src/components/LabShell/LabShell.test.ts +166 -0
  253. package/src/components/LabShell/LabShell.vue +12 -0
  254. package/src/components/LabShell/LabSidebar.vue +8 -0
  255. package/src/components/LabShell/LabSidebarGroup.vue +8 -0
  256. package/src/components/LabShell/LabSidebarGroupDot.vue +8 -0
  257. package/src/components/LabShell/LabSidebarGroupLabel.vue +8 -0
  258. package/src/components/LabShell/LabSidebarGroupLink.vue +14 -0
  259. package/src/components/LabShell/LabSidebarGroupList.vue +8 -0
  260. package/src/components/LabShell/LabSidebarHead.vue +8 -0
  261. package/src/components/LabShell/LabSidebarScroll.vue +8 -0
  262. package/src/components/LabShell/LabTaxonomy.vue +8 -0
  263. package/src/components/LabShell/LabTaxonomyList.vue +8 -0
  264. package/src/components/LabShell/LabTaxonomyTitle.vue +8 -0
  265. package/src/components/LabShell/index.ts +34 -0
  266. package/src/components/LabTip/LabTip.test.ts +39 -0
  267. package/src/components/LabTip/LabTip.vue +18 -0
  268. package/src/components/LabTip/LabTipBubble.vue +19 -0
  269. package/src/components/LabTip/index.ts +2 -0
  270. package/src/components/LabUtilCell/LabUtilCell.test.ts +25 -0
  271. package/src/components/LabUtilCell/LabUtilCell.vue +8 -0
  272. package/src/components/LabUtilCell/LabUtilCellBlock.vue +8 -0
  273. package/src/components/LabUtilCell/LabUtilCellCaption.vue +8 -0
  274. package/src/components/LabUtilCell/LabUtilCellCode.vue +8 -0
  275. package/src/components/LabUtilCell/LabUtilCellDemo.vue +8 -0
  276. package/src/components/LabUtilCell/LabUtilRow.vue +8 -0
  277. package/src/components/LabUtilCell/index.ts +6 -0
  278. package/src/components/Swatch/Swatch.test.ts +29 -0
  279. package/src/components/Swatch/Swatch.vue +23 -0
  280. package/src/components/Swatch/SwatchGrid.vue +8 -0
  281. package/src/components/Swatch/index.ts +2 -0
  282. package/src/components/TokenSpecimen/TokenSpecimen.test.ts +41 -0
  283. package/src/components/TokenSpecimen/TokenSpecimen.vue +8 -0
  284. package/src/components/TokenSpecimen/TokenSpecimenBox.vue +23 -0
  285. package/src/components/TokenSpecimen/TokenSpecimenGrid.vue +8 -0
  286. package/src/components/TokenSpecimen/TokenSpecimenSpacer.vue +20 -0
  287. package/src/components/TokenSpecimen/index.ts +4 -0
  288. package/src/components/TypeSpecimen/TypeSpecimen.test.ts +17 -0
  289. package/src/components/TypeSpecimen/TypeSpecimen.vue +8 -0
  290. package/src/components/TypeSpecimen/TypeSpecimenMeta.vue +8 -0
  291. package/src/components/TypeSpecimen/index.ts +2 -0
  292. package/src/index.ts +18 -0
@@ -735,6 +735,34 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
735
735
  outline-offset: 2px;
736
736
  }
737
737
 
738
+ /* ── Card section (BEM element, stacked rows inside a card) ──
739
+ A horizontal row inside a composed card. Use multiple
740
+ .strand-card__section children inside a .strand-card--pad-none
741
+ to stack header / body / cta rows separated by horizontal rules.
742
+ First child renders without the top border so the top edge of
743
+ the card is clean. The --header modifier turns a section into a
744
+ top-row header with baseline space-between layout for title
745
+ plus trailing chrome (e.g., overline + chip). This is distinct
746
+ from the standalone .strand-card-section molecule (DL 11.10
747
+ section-boundary production), which is a same-named BEM block
748
+ used outside cards. */
749
+ .strand-card__section {
750
+ display: block;
751
+ padding: var(--strand-space-5) var(--strand-space-6);
752
+ border-top: 1px solid var(--strand-gray-200);
753
+ }
754
+
755
+ .strand-card__section:first-child {
756
+ border-top: 0;
757
+ }
758
+
759
+ .strand-card__section--header {
760
+ display: flex;
761
+ align-items: flex-start;
762
+ justify-content: space-between;
763
+ gap: var(--strand-space-4);
764
+ }
765
+
738
766
  /* ── Channel grid helpers ──
739
767
  Equal-height card row with a natural top-to-bottom stack inside each
740
768
  card and the final horizontal row (the CTA) anchored to the card's
@@ -1139,6 +1167,91 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
1139
1167
  }
1140
1168
 
1141
1169
 
1170
+ /* ContainerScale */
1171
+ /*! Strand UI | MIT License | dillingerstaffing.com */
1172
+
1173
+ /*! Strand UI | MIT License | dillingerstaffing.com */
1174
+
1175
+ /* ══════════════════════════════════════════════════
1176
+ CONTAINER SCALE (width visualizer)
1177
+ ══════════════════════════════════════════════════
1178
+ A stacked set of horizontal bars demonstrating container
1179
+ widths (narrow / default / wide / full). Each bar's width
1180
+ is set inline per row via its consumer. */
1181
+
1182
+ .strand-container-scale {
1183
+ display: flex;
1184
+ flex-direction: column;
1185
+ gap: var(--strand-space-4);
1186
+ }
1187
+
1188
+ .strand-container-scale__row {
1189
+ display: flex;
1190
+ flex-direction: column;
1191
+ gap: 6px;
1192
+ }
1193
+
1194
+ .strand-container-scale__label {
1195
+ display: flex;
1196
+ justify-content: space-between;
1197
+ align-items: baseline;
1198
+ font-size: 11px;
1199
+ }
1200
+
1201
+ .strand-container-scale__label code {
1202
+ font-family: var(--strand-font-mono);
1203
+ font-size: 11px;
1204
+ color: var(--strand-blue-primary);
1205
+ font-weight: var(--strand-weight-medium);
1206
+ background: transparent;
1207
+ padding: 0;
1208
+ }
1209
+
1210
+ .strand-container-scale__caption {
1211
+ color: var(--strand-gray-500);
1212
+ }
1213
+
1214
+ .strand-container-scale__track {
1215
+ height: 22px;
1216
+ background: var(--strand-surface-recessed);
1217
+ border-radius: var(--strand-radius-sm);
1218
+ position: relative;
1219
+ border: 1px solid var(--strand-gray-200);
1220
+ }
1221
+
1222
+ .strand-container-scale__bar {
1223
+ height: 100%;
1224
+ background: linear-gradient(
1225
+ 90deg,
1226
+ rgba(37, 99, 235, 0.14),
1227
+ rgba(37, 99, 235, 0.22)
1228
+ );
1229
+ border-right: 2px solid var(--strand-blue-primary);
1230
+ display: flex;
1231
+ align-items: center;
1232
+ justify-content: flex-end;
1233
+ padding-right: var(--strand-space-2);
1234
+ transition: width 300ms var(--strand-ease-out-expo);
1235
+ }
1236
+
1237
+ .strand-container-scale__px {
1238
+ font-family: var(--strand-font-mono);
1239
+ font-size: 10px;
1240
+ font-weight: var(--strand-weight-medium);
1241
+ color: var(--strand-blue-primary);
1242
+ }
1243
+
1244
+ .strand-container-scale__axis {
1245
+ display: flex;
1246
+ justify-content: space-between;
1247
+ margin-top: var(--strand-space-1);
1248
+ font-family: var(--strand-font-mono);
1249
+ font-size: 9px;
1250
+ letter-spacing: 0.06em;
1251
+ color: var(--strand-gray-400);
1252
+ }
1253
+
1254
+
1142
1255
  /* DataReadout */
1143
1256
  /*! Strand UI | MIT License | dillingerstaffing.com */
1144
1257
 
@@ -1562,6 +1675,26 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
1562
1675
  .strand-instrument-viewport .strand-kv__label { color: var(--strand-gray-400); }
1563
1676
  .strand-instrument-viewport .strand-kv__value { color: var(--strand-gray-200); }
1564
1677
 
1678
+ /* Dark-surface cascades for status chips and ghost buttons.
1679
+ The light-surface defaults of .strand-status-chip--neutral and
1680
+ .strand-btn--ghost lose contrast when placed on the dark
1681
+ instrument viewport (full-bleed body or recessed panel). Apply
1682
+ matching on-dark treatments so consumers never need inline
1683
+ style overrides. Scoped to both .strand-body--instrument (full
1684
+ page mode) and .strand-instrument-viewport (recessed panel). */
1685
+ .strand-body--instrument .strand-status-chip--neutral,
1686
+ .strand-instrument-viewport .strand-status-chip--neutral {
1687
+ background: color-mix(in srgb, var(--strand-gray-400) 12%, transparent);
1688
+ color: var(--strand-gray-300);
1689
+ border: 1px solid color-mix(in srgb, var(--strand-gray-400) 20%, transparent);
1690
+ }
1691
+
1692
+ .strand-body--instrument .strand-btn--ghost,
1693
+ .strand-instrument-viewport .strand-btn--ghost {
1694
+ color: var(--strand-on-blue-primary);
1695
+ border-color: rgba(255, 255, 255, 0.2);
1696
+ }
1697
+
1565
1698
  .strand-instrument-viewport__label {
1566
1699
  color: var(--strand-gray-400);
1567
1700
  font-family: var(--strand-font-mono);
@@ -2815,108 +2948,962 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
2815
2948
  margin-bottom: var(--strand-space-4);
2816
2949
  }
2817
2950
 
2818
- .strand-detail-panel__close:hover {
2819
- background: var(--strand-blue-glow);
2820
- }
2951
+ .strand-detail-panel__close:hover {
2952
+ background: var(--strand-blue-glow);
2953
+ }
2954
+
2955
+ .strand-detail-panel__close-icon {
2956
+ display: none;
2957
+ }
2958
+
2959
+ .strand-detail-panel__close-text {
2960
+ display: inline;
2961
+ }
2962
+
2963
+ .strand-detail-panel > .strand-overline {
2964
+ margin-bottom: var(--strand-space-2);
2965
+ }
2966
+
2967
+ .strand-map-legend,
2968
+ .strand-coord-readout {
2969
+ display: none;
2970
+ }
2971
+
2972
+ .strand-search-bar__input {
2973
+ font-size: 16px;
2974
+ }
2975
+ }
2976
+
2977
+ /* ──────────────────────────────────────────────
2978
+ REDUCED MOTION
2979
+ ──────────────────────────────────────────────
2980
+ Strip every animation and transition from the FUI primitives
2981
+ when the user has prefers-reduced-motion. The instrument is
2982
+ still readable, just static. */
2983
+
2984
+ @media (prefers-reduced-motion: reduce) {
2985
+ .strand-scanline,
2986
+ .strand-scanline--ambient {
2987
+ display: none;
2988
+ }
2989
+
2990
+ .strand-instrument-viewport--full-bleed::after {
2991
+ animation: none;
2992
+ }
2993
+
2994
+ .strand-map-pin {
2995
+ animation: none;
2996
+ }
2997
+
2998
+ .strand-map-pin::before,
2999
+ .strand-map-pin::after {
3000
+ animation: none;
3001
+ }
3002
+
3003
+ .strand-map-pin:hover {
3004
+ animation: none;
3005
+ }
3006
+
3007
+ .strand-map-pin:hover::before,
3008
+ .strand-map-pin:hover::after {
3009
+ animation: none;
3010
+ }
3011
+
3012
+ .strand-detail-panel {
3013
+ transition: none;
3014
+ }
3015
+
3016
+ .strand-detail-panel.is-open > .strand-overline,
3017
+ .strand-detail-panel--open > .strand-overline,
3018
+ .strand-detail-panel.open > .strand-overline,
3019
+ .strand-detail-panel.is-open .strand-detail-panel__title,
3020
+ .strand-detail-panel--open .strand-detail-panel__title,
3021
+ .strand-detail-panel.open .strand-detail-panel__title,
3022
+ .strand-detail-panel.is-open .strand-detail-panel__meta,
3023
+ .strand-detail-panel--open .strand-detail-panel__meta,
3024
+ .strand-detail-panel.open .strand-detail-panel__meta,
3025
+ .strand-detail-panel.is-open .strand-detail-panel__salary,
3026
+ .strand-detail-panel--open .strand-detail-panel__salary,
3027
+ .strand-detail-panel.open .strand-detail-panel__salary,
3028
+ .strand-detail-panel.is-open .strand-detail-panel__cta,
3029
+ .strand-detail-panel--open .strand-detail-panel__cta,
3030
+ .strand-detail-panel.open .strand-detail-panel__cta,
3031
+ .strand-detail-panel.is-open .strand-detail-panel__source,
3032
+ .strand-detail-panel--open .strand-detail-panel__source,
3033
+ .strand-detail-panel.open .strand-detail-panel__source {
3034
+ animation: none;
3035
+ }
3036
+
3037
+ .strand-map-legend__title::before {
3038
+ animation: none;
3039
+ }
3040
+
3041
+ .strand-coord-readout::before {
3042
+ animation: none;
3043
+ }
3044
+
3045
+ .strand-map-loading__spinner {
3046
+ animation: none;
3047
+ border-color: rgba(59, 142, 246, 0.4);
3048
+ }
3049
+
3050
+ .strand-search-bar__action--locating {
3051
+ animation: none;
3052
+ }
3053
+ }
3054
+
3055
+
3056
+ /* LabFrame */
3057
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3058
+
3059
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3060
+
3061
+ /* ══════════════════════════════════════════════════
3062
+ LAB FRAME (fake in-page window hosting a modal demo)
3063
+ ══════════════════════════════════════════════════
3064
+ Doc-specific framing primitive. Real Strand Dialog steals
3065
+ the whole viewport; this frame hosts a dialog-style demo
3066
+ inline so docs can show the open state without replacing
3067
+ the page. Uses macOS-style traffic-light chrome with dot
3068
+ colors set inline per dot. */
3069
+
3070
+ .strand-ref-frame {
3071
+ background: var(--strand-surface-recessed);
3072
+ border-radius: var(--strand-radius-lg);
3073
+ overflow: hidden;
3074
+ }
3075
+
3076
+ .strand-ref-frame__chrome {
3077
+ display: flex;
3078
+ align-items: center;
3079
+ gap: 6px;
3080
+ padding: 10px 14px;
3081
+ background: var(--strand-surface-subtle);
3082
+ border-bottom: 1px solid var(--strand-gray-200);
3083
+ }
3084
+
3085
+ .strand-ref-frame__dot {
3086
+ width: 10px;
3087
+ height: 10px;
3088
+ border-radius: 50%;
3089
+ display: inline-block;
3090
+ flex: none;
3091
+ }
3092
+
3093
+ .strand-ref-frame__title {
3094
+ margin-left: var(--strand-space-3);
3095
+ font-family: var(--strand-font-mono);
3096
+ font-size: 11px;
3097
+ letter-spacing: 0.04em;
3098
+ color: var(--strand-gray-600);
3099
+ }
3100
+
3101
+ .strand-ref-frame__body {
3102
+ position: relative;
3103
+ min-height: 280px;
3104
+ background: var(--strand-surface-elevated);
3105
+ }
3106
+
3107
+ .strand-ref-frame__content {
3108
+ display: flex;
3109
+ align-items: center;
3110
+ justify-content: space-between;
3111
+ gap: var(--strand-space-5);
3112
+ padding: var(--strand-space-8) 36px;
3113
+ transition: filter 180ms var(--strand-ease-out-quart),
3114
+ opacity 180ms var(--strand-ease-out-quart);
3115
+ }
3116
+
3117
+ .strand-ref-frame__content[aria-hidden="true"] {
3118
+ filter: blur(2px);
3119
+ opacity: 0.55;
3120
+ pointer-events: none;
3121
+ }
3122
+
3123
+ .strand-ref-frame__content-head {
3124
+ /* container for overline + heading; no explicit styles */
3125
+ }
3126
+
3127
+ .strand-ref-frame__actions {
3128
+ display: flex;
3129
+ gap: 10px;
3130
+ }
3131
+
3132
+ .strand-ref-frame__overlay {
3133
+ position: absolute;
3134
+ inset: 0;
3135
+ background: rgba(15, 25, 42, 0.45);
3136
+ display: flex;
3137
+ align-items: center;
3138
+ justify-content: center;
3139
+ animation: strand-ref-frame-overlay-in 160ms var(--strand-ease-out-quart) forwards;
3140
+ padding: var(--strand-space-6);
3141
+ }
3142
+
3143
+ @keyframes strand-ref-frame-overlay-in {
3144
+ from { opacity: 0; }
3145
+ to { opacity: 1; }
3146
+ }
3147
+
3148
+ .strand-ref-frame__panel {
3149
+ background: var(--strand-surface-elevated);
3150
+ border-radius: var(--strand-radius-lg);
3151
+ box-shadow: 0 20px 50px rgba(15, 25, 42, 0.25),
3152
+ 0 2px 6px rgba(15, 25, 42, 0.12);
3153
+ width: min(440px, 100%);
3154
+ overflow: hidden;
3155
+ animation: strand-ref-frame-panel-in 180ms var(--strand-ease-out-expo) forwards;
3156
+ transform-origin: center;
3157
+ }
3158
+
3159
+ @keyframes strand-ref-frame-panel-in {
3160
+ from { opacity: 0; transform: translateY(8px) scale(0.98); }
3161
+ to { opacity: 1; transform: translateY(0) scale(1); }
3162
+ }
3163
+
3164
+ .strand-ref-frame__panel-header {
3165
+ display: flex;
3166
+ align-items: flex-start;
3167
+ justify-content: space-between;
3168
+ padding: var(--strand-space-5) 22px 14px;
3169
+ gap: var(--strand-space-4);
3170
+ }
3171
+
3172
+ .strand-ref-frame__panel-title {
3173
+ margin: 4px 0 0;
3174
+ font-family: var(--strand-font-sans);
3175
+ font-size: 18px;
3176
+ font-weight: var(--strand-weight-medium);
3177
+ line-height: 1.3;
3178
+ color: var(--strand-blue-midnight);
3179
+ letter-spacing: -0.01em;
3180
+ }
3181
+
3182
+ .strand-ref-frame__panel-close {
3183
+ background: transparent;
3184
+ border: 0;
3185
+ width: 28px;
3186
+ height: 28px;
3187
+ border-radius: var(--strand-radius-md);
3188
+ display: grid;
3189
+ place-items: center;
3190
+ font-size: 18px;
3191
+ line-height: 1;
3192
+ color: var(--strand-gray-500);
3193
+ cursor: pointer;
3194
+ flex: none;
3195
+ transition: background var(--strand-duration-fast) var(--strand-ease-out-quart),
3196
+ color var(--strand-duration-fast) var(--strand-ease-out-quart);
3197
+ }
3198
+
3199
+ .strand-ref-frame__panel-close:hover {
3200
+ background: var(--strand-surface-recessed);
3201
+ color: var(--strand-blue-midnight);
3202
+ }
3203
+
3204
+ .strand-ref-frame__panel-close:focus-visible {
3205
+ outline: 2px solid var(--strand-blue-primary);
3206
+ outline-offset: 2px;
3207
+ }
3208
+
3209
+ .strand-ref-frame__panel-body {
3210
+ padding: 0 22px var(--strand-space-5);
3211
+ font-size: 14px;
3212
+ line-height: 1.55;
3213
+ color: var(--strand-gray-700);
3214
+ }
3215
+
3216
+ .strand-ref-frame__panel-footer {
3217
+ display: flex;
3218
+ justify-content: flex-end;
3219
+ gap: 10px;
3220
+ padding: var(--strand-space-4) 22px var(--strand-space-5);
3221
+ border-top: 1px solid var(--strand-gray-100);
3222
+ background: var(--strand-surface-recessed);
3223
+ }
3224
+
3225
+ @media (prefers-reduced-motion: reduce) {
3226
+ .strand-ref-frame__overlay,
3227
+ .strand-ref-frame__panel {
3228
+ animation: none;
3229
+ }
3230
+
3231
+ .strand-ref-frame__content {
3232
+ transition: none;
3233
+ }
3234
+ }
3235
+
3236
+
3237
+ /* LabGlassStage */
3238
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3239
+
3240
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3241
+
3242
+ /* ══════════════════════════════════════════════════
3243
+ LAB GLASS STAGE (frosted-glass specimen container)
3244
+ ══════════════════════════════════════════════════
3245
+ A layered blue-gradient backdrop with an embedded glass
3246
+ panel on top, used by docs pages to demonstrate frosted
3247
+ glass surfaces against a cinematic backdrop. */
3248
+
3249
+ .strand-ref-glass-stage {
3250
+ position: relative;
3251
+ padding: var(--strand-space-10) var(--strand-space-8);
3252
+ border-radius: var(--strand-radius-lg);
3253
+ overflow: hidden;
3254
+ background:
3255
+ radial-gradient(circle at 20% 30%, rgba(59, 142, 246, 0.45) 0%, transparent 55%),
3256
+ radial-gradient(circle at 80% 70%, rgba(20, 184, 166, 0.35) 0%, transparent 55%),
3257
+ linear-gradient(135deg, var(--strand-blue-midnight) 0%, var(--strand-blue-abyss) 100%);
3258
+ }
3259
+
3260
+ .strand-ref-glass-panel {
3261
+ position: relative;
3262
+ padding: 22px var(--strand-space-6);
3263
+ border-radius: var(--strand-radius-lg);
3264
+ background: rgba(15, 25, 42, 0.42);
3265
+ -webkit-backdrop-filter: blur(14px) saturate(1.2);
3266
+ backdrop-filter: blur(14px) saturate(1.2);
3267
+ border: 1px solid rgba(255, 255, 255, 0.16);
3268
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.35),
3269
+ inset 0 1px 0 rgba(255, 255, 255, 0.12);
3270
+ color: var(--strand-on-blue-primary);
3271
+ }
3272
+
3273
+
3274
+ /* LabRevealStage */
3275
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3276
+
3277
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3278
+
3279
+ /* ══════════════════════════════════════════════════
3280
+ LAB REVEAL STAGE (staggered entry animation specimen)
3281
+ ══════════════════════════════════════════════════
3282
+ Demonstrates the Principle 7 alive-signal staggered reveal
3283
+ pattern. Four lines animate in at 0 / 180 / 360 / 540 ms.
3284
+ Consumers remount the stage (via a key/ref) to replay. */
3285
+
3286
+ .strand-ref-reveal-stage {
3287
+ display: flex;
3288
+ flex-direction: column;
3289
+ gap: 10px;
3290
+ padding: var(--strand-space-5) 0;
3291
+ }
3292
+
3293
+ .strand-ref-reveal-line {
3294
+ opacity: 0;
3295
+ transform: translateY(8px);
3296
+ animation: strand-ref-reveal-in 2400ms var(--strand-ease-out-quart) forwards;
3297
+ font-family: var(--strand-font-mono);
3298
+ font-size: 12px;
3299
+ letter-spacing: 0.04em;
3300
+ color: var(--strand-blue-midnight);
3301
+ padding: 10px 14px;
3302
+ background: var(--strand-surface-elevated);
3303
+ border-left: 2px solid var(--strand-blue-primary);
3304
+ }
3305
+
3306
+ .strand-ref-reveal-line:nth-child(1) { animation-delay: 0ms; }
3307
+ .strand-ref-reveal-line:nth-child(2) { animation-delay: 180ms; }
3308
+ .strand-ref-reveal-line:nth-child(3) { animation-delay: 360ms; }
3309
+ .strand-ref-reveal-line:nth-child(4) { animation-delay: 540ms; }
3310
+
3311
+ @keyframes strand-ref-reveal-in {
3312
+ 0% { opacity: 0; transform: translateY(8px); }
3313
+ 25% { opacity: 1; transform: translateY(0); }
3314
+ 85% { opacity: 1; transform: translateY(0); }
3315
+ 100% { opacity: 1; transform: translateY(0); }
3316
+ }
3317
+
3318
+ @media (prefers-reduced-motion: reduce) {
3319
+ .strand-ref-reveal-line {
3320
+ animation: none;
3321
+ opacity: 1;
3322
+ transform: none;
3323
+ }
3324
+ }
3325
+
3326
+
3327
+ /* LabShell */
3328
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3329
+
3330
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3331
+
3332
+ /* ══════════════════════════════════════════════════
3333
+ LAB SHELL / COMPONENT-REFERENCE PAGE CHROME
3334
+ ══════════════════════════════════════════════════
3335
+ A named primitive family for a component-reference page
3336
+ layout: sticky sidebar + scrollable main + header + section
3337
+ + example. Used by the Strand docs site itself, by any
3338
+ consumer building a component showcase, and by the DS Strand
3339
+ lab. 40+ classes map 1:1 to the handoff's showcase-* chrome.
3340
+
3341
+ Computed styles match the baseline at viewport 1440 per
3342
+ `.strand-handoff-render/ledger/focused.json`.
3343
+
3344
+ The sidebar sticky-top offset is set via the CSS custom
3345
+ property `--strand-ref-sticky-top` (default 0) so consumers
3346
+ can push the sidebar below fixed page chrome (e.g. a glass
3347
+ nav) without hardcoding any DS-specific value. Set on the
3348
+ shell root: `<div class="strand-ref-shell"
3349
+ style="--strand-ref-sticky-top: var(--strand-nav-height);">`.
3350
+ ══════════════════════════════════════════════════ */
3351
+
3352
+ /* Shell root: two-column grid, sidebar left, main right. */
3353
+ .strand-ref-shell {
3354
+ display: grid;
3355
+ grid-template-columns: 256px 1fr;
3356
+ min-height: 100vh;
3357
+ }
3358
+
3359
+ /* Sidebar: sticky column, full viewport height, hairline right border. */
3360
+ .strand-ref-shell__sidebar {
3361
+ position: sticky;
3362
+ top: var(--strand-ref-sticky-top, 0);
3363
+ height: 100vh;
3364
+ background: var(--strand-surface-elevated);
3365
+ border-right: 1px solid var(--strand-gray-200);
3366
+ display: flex;
3367
+ flex-direction: column;
3368
+ overflow: hidden;
3369
+ }
3370
+
3371
+ /* Sidebar head: fixed top block with brand and hairline bottom. */
3372
+ .strand-ref-shell__sidebar-head {
3373
+ padding: var(--strand-space-6) var(--strand-space-5) 18px;
3374
+ border-bottom: 1px solid var(--strand-gray-100);
3375
+ flex: none;
3376
+ background: var(--strand-surface-elevated);
3377
+ }
3378
+
3379
+ /* Sidebar scroll region: groups of nav links, overflow-y auto. */
3380
+ .strand-ref-shell__sidebar-scroll {
3381
+ flex: 1;
3382
+ min-height: 0;
3383
+ overflow-y: auto;
3384
+ overflow-anchor: none;
3385
+ overscroll-behavior: contain;
3386
+ padding: var(--strand-space-4) var(--strand-space-5) var(--strand-space-6);
3387
+ display: flex;
3388
+ flex-direction: column;
3389
+ gap: 18px;
3390
+ }
3391
+
3392
+ /* Brand row: mark + title + sub stacked horizontally. */
3393
+ .strand-ref-shell__brand {
3394
+ display: flex;
3395
+ align-items: center;
3396
+ gap: var(--strand-space-3);
3397
+ }
3398
+
3399
+ .strand-ref-shell__brand-mark {
3400
+ width: 36px;
3401
+ height: 36px;
3402
+ border-radius: var(--strand-radius-md);
3403
+ background: var(--strand-blue-midnight);
3404
+ color: var(--strand-on-blue-primary);
3405
+ display: grid;
3406
+ place-items: center;
3407
+ font-family: var(--strand-font-mono);
3408
+ font-weight: var(--strand-weight-semibold);
3409
+ font-size: 13px;
3410
+ letter-spacing: 0.04em;
3411
+ }
3412
+
3413
+ .strand-ref-shell__brand-title {
3414
+ font-family: var(--strand-font-mono);
3415
+ font-weight: var(--strand-weight-medium);
3416
+ color: var(--strand-blue-midnight);
3417
+ font-size: 15px;
3418
+ }
3419
+
3420
+ .strand-ref-shell__brand-sub {
3421
+ font-family: var(--strand-font-mono);
3422
+ font-size: 10px;
3423
+ text-transform: uppercase;
3424
+ letter-spacing: var(--strand-tracking-ultra);
3425
+ color: var(--strand-gray-500);
3426
+ }
3427
+
3428
+ /* Sidebar nav group: divider between groups, label + list. */
3429
+ .strand-ref-shell__group {
3430
+ display: flex;
3431
+ flex-direction: column;
3432
+ gap: var(--strand-space-1);
3433
+ padding-top: 10px;
3434
+ border-top: 1px solid var(--strand-gray-100);
3435
+ }
3436
+
3437
+ .strand-ref-shell__group:first-of-type {
3438
+ border-top: 0;
3439
+ padding-top: 0;
3440
+ }
3441
+
3442
+ .strand-ref-shell__group-label {
3443
+ font-family: var(--strand-font-mono);
3444
+ font-size: 10px;
3445
+ letter-spacing: 0.18em;
3446
+ text-transform: uppercase;
3447
+ color: var(--strand-blue-midnight);
3448
+ font-weight: var(--strand-weight-semibold);
3449
+ padding: 6px 10px 8px;
3450
+ }
3451
+
3452
+ .strand-ref-shell__group-list {
3453
+ display: flex;
3454
+ flex-direction: column;
3455
+ gap: 1px;
3456
+ }
3457
+
3458
+ .strand-ref-shell__group-link {
3459
+ display: flex;
3460
+ align-items: center;
3461
+ gap: 10px;
3462
+ padding: 7px 10px;
3463
+ border-radius: var(--strand-radius-md);
3464
+ font-family: var(--strand-font-sans);
3465
+ font-size: 13px;
3466
+ color: var(--strand-gray-700);
3467
+ text-decoration: none;
3468
+ transition: background var(--strand-duration-fast) var(--strand-ease-out-quart),
3469
+ color var(--strand-duration-fast) var(--strand-ease-out-quart);
3470
+ }
3471
+
3472
+ .strand-ref-shell__group-link:hover {
3473
+ background: var(--strand-surface-recessed);
3474
+ color: var(--strand-blue-midnight);
3475
+ }
3476
+
3477
+ .strand-ref-shell__group-dot {
3478
+ width: 4px;
3479
+ height: 4px;
3480
+ border-radius: 50%;
3481
+ background: var(--strand-gray-300);
3482
+ flex: none;
3483
+ }
3484
+
3485
+ .strand-ref-shell__group-link:hover .strand-ref-shell__group-dot {
3486
+ background: var(--strand-blue-primary);
3487
+ }
3488
+
3489
+ /* Main: scrolling column, padding 56px 64px 96px, clamped width. */
3490
+ .strand-ref-shell__main {
3491
+ padding: 56px var(--strand-space-16) 96px;
3492
+ max-width: 1120px;
3493
+ }
3494
+
3495
+ /* Header: h1 + lead + metrics row, bottom hairline. */
3496
+ .strand-ref-header {
3497
+ padding-bottom: var(--strand-space-10);
3498
+ border-bottom: 1px solid var(--strand-gray-200);
3499
+ margin-bottom: var(--strand-space-8);
3500
+ }
3501
+
3502
+ .strand-ref-header__title {
3503
+ font-family: var(--strand-font-sans);
3504
+ font-weight: var(--strand-weight-light);
3505
+ letter-spacing: var(--strand-tracking-tight);
3506
+ color: var(--strand-blue-midnight);
3507
+ font-size: 40px;
3508
+ margin: var(--strand-space-3) 0 0;
3509
+ }
3510
+
3511
+ .strand-ref-header__lead {
3512
+ max-width: 620px;
3513
+ margin: var(--strand-space-4) 0 0;
3514
+ font-family: var(--strand-font-sans);
3515
+ font-size: 20px;
3516
+ color: var(--strand-gray-500);
3517
+ line-height: 1.5;
3518
+ }
3519
+
3520
+ .strand-ref-header__meta {
3521
+ display: grid;
3522
+ grid-template-columns: repeat(4, minmax(0, auto));
3523
+ gap: 48px;
3524
+ margin: var(--strand-space-8) 0 0;
3525
+ justify-content: start;
3526
+ }
3527
+
3528
+ .strand-ref-header__meta-item {
3529
+ display: flex;
3530
+ flex-direction: column;
3531
+ gap: var(--strand-space-2);
3532
+ margin: 0;
3533
+ }
3534
+
3535
+ .strand-ref-header__meta-label {
3536
+ font-family: var(--strand-font-mono);
3537
+ font-size: 10px;
3538
+ letter-spacing: 0.14em;
3539
+ text-transform: uppercase;
3540
+ color: var(--strand-gray-500);
3541
+ margin: 0;
3542
+ }
3543
+
3544
+ .strand-ref-header__meta-value {
3545
+ font-family: var(--strand-font-sans);
3546
+ font-size: 22px;
3547
+ font-weight: var(--strand-weight-light);
3548
+ letter-spacing: -0.01em;
3549
+ color: var(--strand-blue-midnight);
3550
+ margin: 0;
3551
+ line-height: 1.2;
3552
+ }
3553
+
3554
+ /* Taxonomy explainer block: overline + definition list of terms. */
3555
+ .strand-ref-taxonomy {
3556
+ margin-top: var(--strand-space-6);
3557
+ padding: var(--strand-space-5) 22px;
3558
+ background: var(--strand-surface-recessed);
3559
+ border: 1px solid var(--strand-gray-200);
3560
+ border-radius: var(--strand-radius-lg);
3561
+ max-width: 720px;
3562
+ }
3563
+
3564
+ .strand-ref-taxonomy__title {
3565
+ font-family: var(--strand-font-mono);
3566
+ font-size: 10px;
3567
+ letter-spacing: 0.18em;
3568
+ text-transform: uppercase;
3569
+ color: var(--strand-blue-midnight);
3570
+ font-weight: var(--strand-weight-semibold);
3571
+ margin-bottom: 10px;
3572
+ }
3573
+
3574
+ .strand-ref-taxonomy__list {
3575
+ margin: 0;
3576
+ display: grid;
3577
+ grid-template-columns: 1fr;
3578
+ gap: var(--strand-space-2);
3579
+ }
3580
+
3581
+ .strand-ref-taxonomy__list > div {
3582
+ display: grid;
3583
+ grid-template-columns: 160px 1fr;
3584
+ gap: 14px;
3585
+ align-items: baseline;
3586
+ }
3587
+
3588
+ .strand-ref-taxonomy__list dt {
3589
+ font-family: var(--strand-font-mono);
3590
+ font-size: 11px;
3591
+ letter-spacing: 0.08em;
3592
+ text-transform: uppercase;
3593
+ color: var(--strand-blue-primary);
3594
+ font-weight: var(--strand-weight-semibold);
3595
+ margin: 0;
3596
+ }
3597
+
3598
+ .strand-ref-taxonomy__list dd {
3599
+ margin: 0;
3600
+ font-size: 13px;
3601
+ color: var(--strand-gray-700);
3602
+ line-height: 1.5;
3603
+ }
3604
+
3605
+ .strand-ref-taxonomy__list em {
3606
+ font-style: italic;
3607
+ color: var(--strand-blue-midnight);
3608
+ }
3609
+
3610
+ /* Section: vertical block with hairline bottom. */
3611
+ .strand-ref-section {
3612
+ padding: var(--strand-space-12) 0;
3613
+ border-bottom: 1px solid var(--strand-gray-200);
3614
+ scroll-margin-top: var(--strand-space-4);
3615
+ }
3616
+
3617
+ .strand-ref-section:last-child {
3618
+ border-bottom: 0;
3619
+ }
3620
+
3621
+ .strand-ref-section__head {
3622
+ margin-bottom: var(--strand-space-8);
3623
+ display: flex;
3624
+ align-items: baseline;
3625
+ justify-content: space-between;
3626
+ gap: var(--strand-space-6);
3627
+ flex-wrap: wrap;
3628
+ }
3629
+
3630
+ .strand-ref-section__head h2 {
3631
+ margin: var(--strand-space-2) 0 0;
3632
+ font-weight: var(--strand-weight-light);
3633
+ letter-spacing: var(--strand-tracking-tight);
3634
+ color: var(--strand-blue-midnight);
3635
+ font-size: 28px;
3636
+ }
3637
+
3638
+ .strand-ref-section__head-note {
3639
+ font-family: var(--strand-font-mono);
3640
+ font-size: 10px;
3641
+ letter-spacing: var(--strand-tracking-ultra);
3642
+ text-transform: uppercase;
3643
+ color: var(--strand-gray-500);
3644
+ }
3645
+
3646
+ .strand-ref-section__body {
3647
+ display: flex;
3648
+ flex-direction: column;
3649
+ gap: var(--strand-space-8);
3650
+ }
3651
+
3652
+ /* Example: a single component specimen with meta column + demo panel. */
3653
+ .strand-ref-example {
3654
+ display: grid;
3655
+ grid-template-columns: 200px 1fr;
3656
+ gap: 28px;
3657
+ align-items: start;
3658
+ }
3659
+
3660
+ .strand-ref-example__meta {
3661
+ padding-top: 6px;
3662
+ }
3663
+
3664
+ .strand-ref-example__label {
3665
+ font-family: var(--strand-font-sans);
3666
+ font-size: 13px;
3667
+ font-weight: var(--strand-weight-medium);
3668
+ color: var(--strand-blue-midnight);
3669
+ margin-bottom: 6px;
3670
+ }
3671
+
3672
+ .strand-ref-example__code {
3673
+ font-family: var(--strand-font-mono);
3674
+ font-size: 10px;
3675
+ letter-spacing: 0.04em;
3676
+ color: var(--strand-gray-500);
3677
+ display: block;
3678
+ line-height: 1.5;
3679
+ }
3680
+
3681
+ .strand-ref-example__demo {
3682
+ background: var(--strand-surface-elevated);
3683
+ border: 1px solid var(--strand-gray-200);
3684
+ border-radius: var(--strand-radius-lg);
3685
+ /* 24px 28px: token 24px (space-6) + literal 28px chrome value (no token match) */
3686
+ padding: var(--strand-space-6) 28px;
3687
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.03);
3688
+ }
3689
+
3690
+ .strand-ref-example__demo--pad-none {
3691
+ padding: 0;
3692
+ overflow: hidden;
3693
+ }
3694
+
3695
+ .strand-ref-example__demo--recessed {
3696
+ background: var(--strand-surface-recessed);
3697
+ }
3698
+
3699
+ .strand-ref-example__caption {
3700
+ margin-top: var(--strand-space-2);
3701
+ font-size: 12px;
3702
+ line-height: 1.55;
3703
+ color: var(--strand-gray-500);
3704
+ max-width: 560px;
3705
+ }
3706
+
3707
+ /* Responsive: collapse to single column at 1040, further adjust at 560. */
3708
+ @media (max-width: 1040px) {
3709
+ .strand-ref-shell {
3710
+ grid-template-columns: 1fr;
3711
+ }
3712
+
3713
+ .strand-ref-shell__sidebar {
3714
+ position: static;
3715
+ height: auto;
3716
+ border-right: 0;
3717
+ border-bottom: 1px solid var(--strand-gray-200);
3718
+ }
3719
+
3720
+ .strand-ref-shell__main {
3721
+ padding: var(--strand-space-8) var(--strand-space-6) var(--strand-space-16);
3722
+ }
3723
+
3724
+ .strand-ref-example {
3725
+ grid-template-columns: 1fr;
3726
+ }
3727
+
3728
+ .strand-ref-header__meta {
3729
+ grid-template-columns: 1fr 1fr;
3730
+ gap: var(--strand-space-6) var(--strand-space-8);
3731
+ }
3732
+ }
3733
+
3734
+ @media (max-width: 560px) {
3735
+ .strand-ref-header__meta {
3736
+ grid-template-columns: 1fr;
3737
+ gap: 18px;
3738
+ }
3739
+ }
3740
+
3741
+
3742
+ /* LabTip */
3743
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3744
+
3745
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3746
+
3747
+ /* ══════════════════════════════════════════════════
3748
+ LAB TIP (pure-CSS tooltip specimen)
3749
+ ══════════════════════════════════════════════════
3750
+ A hover/focus-driven tooltip for QA specimens on docs
3751
+ pages. This is NOT the production Strand Tooltip (which is
3752
+ JS-driven with collision detection); it is a static
3753
+ specimen showing four fixed positions simultaneously.
3754
+
3755
+ Use the --pinned modifier to show the bubble without
3756
+ hover/focus (useful for before/after screenshots). */
3757
+
3758
+ .strand-ref-tip {
3759
+ position: relative;
3760
+ display: inline-flex;
3761
+ }
3762
+
3763
+ .strand-ref-tip__bubble {
3764
+ position: absolute;
3765
+ z-index: 2;
3766
+ padding: 6px 10px;
3767
+ border-radius: var(--strand-radius-sm);
3768
+ background: var(--strand-blue-midnight);
3769
+ color: var(--strand-on-blue-primary);
3770
+ font-family: var(--strand-font-mono);
3771
+ font-size: 11px;
3772
+ letter-spacing: 0.04em;
3773
+ white-space: nowrap;
3774
+ opacity: 0;
3775
+ pointer-events: none;
3776
+ transition: opacity var(--strand-duration-fast) var(--strand-ease-out-quart),
3777
+ transform var(--strand-duration-fast) var(--strand-ease-out-quart);
3778
+ }
3779
+
3780
+ .strand-ref-tip:hover .strand-ref-tip__bubble,
3781
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble,
3782
+ .strand-ref-tip--pinned .strand-ref-tip__bubble {
3783
+ opacity: 1;
3784
+ }
2821
3785
 
2822
- .strand-detail-panel__close-icon {
2823
- display: none;
2824
- }
3786
+ .strand-ref-tip__bubble--top {
3787
+ left: 50%;
3788
+ bottom: calc(100% + 8px);
3789
+ transform: translateX(-50%) translateY(4px);
3790
+ }
2825
3791
 
2826
- .strand-detail-panel__close-text {
2827
- display: inline;
2828
- }
3792
+ .strand-ref-tip__bubble--bottom {
3793
+ left: 50%;
3794
+ top: calc(100% + 8px);
3795
+ transform: translateX(-50%) translateY(-4px);
3796
+ }
2829
3797
 
2830
- .strand-detail-panel > .strand-overline {
2831
- margin-bottom: var(--strand-space-2);
2832
- }
3798
+ .strand-ref-tip__bubble--left {
3799
+ right: calc(100% + 8px);
3800
+ top: 50%;
3801
+ transform: translateX(4px) translateY(-50%);
3802
+ }
2833
3803
 
2834
- .strand-map-legend,
2835
- .strand-coord-readout {
2836
- display: none;
2837
- }
3804
+ .strand-ref-tip__bubble--right {
3805
+ left: calc(100% + 8px);
3806
+ top: 50%;
3807
+ transform: translateX(-4px) translateY(-50%);
3808
+ }
2838
3809
 
2839
- .strand-search-bar__input {
2840
- font-size: 16px;
2841
- }
3810
+ .strand-ref-tip:hover .strand-ref-tip__bubble--top,
3811
+ .strand-ref-tip--pinned .strand-ref-tip__bubble--top,
3812
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble--top {
3813
+ transform: translateX(-50%) translateY(0);
2842
3814
  }
2843
3815
 
2844
- /* ──────────────────────────────────────────────
2845
- REDUCED MOTION
2846
- ──────────────────────────────────────────────
2847
- Strip every animation and transition from the FUI primitives
2848
- when the user has prefers-reduced-motion. The instrument is
2849
- still readable, just static. */
3816
+ .strand-ref-tip:hover .strand-ref-tip__bubble--bottom,
3817
+ .strand-ref-tip--pinned .strand-ref-tip__bubble--bottom,
3818
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble--bottom {
3819
+ transform: translateX(-50%) translateY(0);
3820
+ }
2850
3821
 
2851
- @media (prefers-reduced-motion: reduce) {
2852
- .strand-scanline,
2853
- .strand-scanline--ambient {
2854
- display: none;
2855
- }
3822
+ .strand-ref-tip:hover .strand-ref-tip__bubble--left,
3823
+ .strand-ref-tip--pinned .strand-ref-tip__bubble--left,
3824
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble--left {
3825
+ transform: translateX(0) translateY(-50%);
3826
+ }
2856
3827
 
2857
- .strand-instrument-viewport--full-bleed::after {
2858
- animation: none;
2859
- }
3828
+ .strand-ref-tip:hover .strand-ref-tip__bubble--right,
3829
+ .strand-ref-tip--pinned .strand-ref-tip__bubble--right,
3830
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble--right {
3831
+ transform: translateX(0) translateY(-50%);
3832
+ }
2860
3833
 
2861
- .strand-map-pin {
2862
- animation: none;
3834
+ @media (prefers-reduced-motion: reduce) {
3835
+ .strand-ref-tip__bubble {
3836
+ transition: none;
2863
3837
  }
3838
+ }
2864
3839
 
2865
- .strand-map-pin::before,
2866
- .strand-map-pin::after {
2867
- animation: none;
2868
- }
2869
3840
 
2870
- .strand-map-pin:hover {
2871
- animation: none;
2872
- }
3841
+ /* LabUtilCell */
3842
+ /*! Strand UI | MIT License | dillingerstaffing.com */
2873
3843
 
2874
- .strand-map-pin:hover::before,
2875
- .strand-map-pin:hover::after {
2876
- animation: none;
2877
- }
3844
+ /*! Strand UI | MIT License | dillingerstaffing.com */
2878
3845
 
2879
- .strand-detail-panel {
2880
- transition: none;
2881
- }
3846
+ /* ══════════════════════════════════════════════════
3847
+ LAB UTIL CELL (utility-class demo tile)
3848
+ ══════════════════════════════════════════════════
3849
+ Demo tile that shows a single utility class in action
3850
+ (e.g. .strand-mt-4, .strand-mx-auto). The row container
3851
+ arranges cells horizontally; each cell has a code label
3852
+ + demo area + optional caption. */
2882
3853
 
2883
- .strand-detail-panel.is-open > .strand-overline,
2884
- .strand-detail-panel--open > .strand-overline,
2885
- .strand-detail-panel.open > .strand-overline,
2886
- .strand-detail-panel.is-open .strand-detail-panel__title,
2887
- .strand-detail-panel--open .strand-detail-panel__title,
2888
- .strand-detail-panel.open .strand-detail-panel__title,
2889
- .strand-detail-panel.is-open .strand-detail-panel__meta,
2890
- .strand-detail-panel--open .strand-detail-panel__meta,
2891
- .strand-detail-panel.open .strand-detail-panel__meta,
2892
- .strand-detail-panel.is-open .strand-detail-panel__salary,
2893
- .strand-detail-panel--open .strand-detail-panel__salary,
2894
- .strand-detail-panel.open .strand-detail-panel__salary,
2895
- .strand-detail-panel.is-open .strand-detail-panel__cta,
2896
- .strand-detail-panel--open .strand-detail-panel__cta,
2897
- .strand-detail-panel.open .strand-detail-panel__cta,
2898
- .strand-detail-panel.is-open .strand-detail-panel__source,
2899
- .strand-detail-panel--open .strand-detail-panel__source,
2900
- .strand-detail-panel.open .strand-detail-panel__source {
2901
- animation: none;
2902
- }
3854
+ .strand-ref-util-row {
3855
+ display: flex;
3856
+ align-items: stretch;
3857
+ gap: 18px;
3858
+ flex-wrap: wrap;
3859
+ }
2903
3860
 
2904
- .strand-map-legend__title::before {
2905
- animation: none;
2906
- }
3861
+ .strand-ref-util-cell {
3862
+ display: flex;
3863
+ flex-direction: column;
3864
+ gap: 10px;
3865
+ /* 14px 16px: specimen chrome literal, no token match for 14px */
3866
+ padding: 14px var(--strand-space-4);
3867
+ background: var(--strand-surface-recessed);
3868
+ border: 1px solid var(--strand-gray-200);
3869
+ border-radius: var(--strand-radius-md);
3870
+ min-width: 180px;
3871
+ flex: 1;
3872
+ }
2907
3873
 
2908
- .strand-coord-readout::before {
2909
- animation: none;
2910
- }
3874
+ .strand-ref-util-cell__code {
3875
+ font-family: var(--strand-font-mono);
3876
+ font-size: 10px;
3877
+ letter-spacing: 0.06em;
3878
+ color: var(--strand-blue-primary);
3879
+ font-weight: var(--strand-weight-medium);
3880
+ }
2911
3881
 
2912
- .strand-map-loading__spinner {
2913
- animation: none;
2914
- border-color: rgba(59, 142, 246, 0.4);
2915
- }
3882
+ .strand-ref-util-cell__caption {
3883
+ font-family: var(--strand-font-mono);
3884
+ font-size: 10px;
3885
+ letter-spacing: 0.04em;
3886
+ color: var(--strand-gray-500);
3887
+ }
2916
3888
 
2917
- .strand-search-bar__action--locating {
2918
- animation: none;
2919
- }
3889
+ .strand-ref-util-cell__demo {
3890
+ background: var(--strand-surface-elevated);
3891
+ border: 1px dashed var(--strand-gray-300);
3892
+ border-radius: var(--strand-radius-sm);
3893
+ padding: 0;
3894
+ display: flex;
3895
+ flex-direction: column;
3896
+ }
3897
+
3898
+ .strand-ref-util-cell__block {
3899
+ background: var(--strand-blue-midnight);
3900
+ color: var(--strand-on-blue-primary);
3901
+ padding: 6px 10px;
3902
+ font-family: var(--strand-font-mono);
3903
+ font-size: 11px;
3904
+ letter-spacing: 0.04em;
3905
+ display: inline-block;
3906
+ align-self: flex-start;
2920
3907
  }
2921
3908
 
2922
3909
 
@@ -4187,6 +5174,53 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
4187
5174
  }
4188
5175
 
4189
5176
 
5177
+ /* Swatch */
5178
+ /*! Strand UI | MIT License | dillingerstaffing.com */
5179
+
5180
+ /*! Strand UI | MIT License | dillingerstaffing.com */
5181
+
5182
+ /* ══════════════════════════════════════════════════
5183
+ SWATCH (color specimen for docs surfaces)
5184
+ ══════════════════════════════════════════════════
5185
+ A single color tile rendered in a grid of swatches on a
5186
+ design-token documentation page. Background and text colors
5187
+ are applied inline via the consumer (because tone varies per
5188
+ swatch). Base chrome (border, min-height, internal layout)
5189
+ is CSS-driven. Grid container is a sibling primitive. */
5190
+
5191
+ .strand-swatch-grid {
5192
+ display: grid;
5193
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
5194
+ gap: 10px;
5195
+ }
5196
+
5197
+ .strand-swatch {
5198
+ display: flex;
5199
+ flex-direction: column;
5200
+ gap: var(--strand-space-1);
5201
+ /* 14px 14px 12px: specimen chrome literal, no token scale match */
5202
+ padding: 14px 14px 12px;
5203
+ border-radius: var(--strand-radius-md);
5204
+ border: 1px solid var(--strand-gray-200);
5205
+ min-height: 92px;
5206
+ }
5207
+
5208
+ .strand-swatch__name {
5209
+ font-family: var(--strand-font-mono);
5210
+ font-size: 10px;
5211
+ letter-spacing: var(--strand-tracking-widest);
5212
+ text-transform: uppercase;
5213
+ font-weight: var(--strand-weight-medium);
5214
+ }
5215
+
5216
+ .strand-swatch__hex {
5217
+ font-family: var(--strand-font-mono);
5218
+ font-size: 11px;
5219
+ opacity: 0.75;
5220
+ margin-top: auto;
5221
+ }
5222
+
5223
+
4190
5224
  /* Switch */
4191
5225
  /*! Strand UI | MIT License | dillingerstaffing.com */
4192
5226
 
@@ -4851,6 +5885,67 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
4851
5885
  }
4852
5886
 
4853
5887
 
5888
+ /* TokenSpecimen */
5889
+ /*! Strand UI | MIT License | dillingerstaffing.com */
5890
+
5891
+ /*! Strand UI | MIT License | dillingerstaffing.com */
5892
+
5893
+ /* ══════════════════════════════════════════════════
5894
+ TOKEN SPECIMEN (spacing / radius / shadow tiles)
5895
+ ══════════════════════════════════════════════════
5896
+ Each specimen pairs a visual (spacer bar, radius box, or
5897
+ shadow tile) with a mono label and value. Visuals set their
5898
+ pixel dimensions and shadow/radius inline (per-token variance
5899
+ is the whole point of the spec). */
5900
+
5901
+ .strand-token-specimen-grid {
5902
+ display: grid;
5903
+ grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
5904
+ gap: var(--strand-space-5);
5905
+ }
5906
+
5907
+ .strand-token-specimen {
5908
+ display: flex;
5909
+ flex-direction: column;
5910
+ gap: 10px;
5911
+ align-items: flex-start;
5912
+ font-family: var(--strand-font-mono);
5913
+ font-size: 10px;
5914
+ letter-spacing: 0.04em;
5915
+ color: var(--strand-gray-500);
5916
+ line-height: 1.5;
5917
+ }
5918
+
5919
+ .strand-token-specimen b {
5920
+ display: block;
5921
+ font-weight: var(--strand-weight-medium);
5922
+ color: var(--strand-blue-midnight);
5923
+ letter-spacing: 0.06em;
5924
+ text-transform: uppercase;
5925
+ font-size: 10px;
5926
+ }
5927
+
5928
+ .strand-token-specimen > span {
5929
+ display: block;
5930
+ line-height: 1.5;
5931
+ }
5932
+
5933
+ .strand-token-specimen__spacer {
5934
+ display: block;
5935
+ height: 16px;
5936
+ background: var(--strand-blue-primary);
5937
+ border-radius: var(--strand-radius-sm);
5938
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15);
5939
+ }
5940
+
5941
+ .strand-token-specimen__box {
5942
+ width: 64px;
5943
+ height: 64px;
5944
+ background: var(--strand-surface-elevated);
5945
+ border: 1px solid var(--strand-gray-200);
5946
+ }
5947
+
5948
+
4854
5949
  /* Tooltip */
4855
5950
  /*! Strand UI | MIT License | dillingerstaffing.com */
4856
5951
 
@@ -4929,6 +6024,46 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
4929
6024
  }
4930
6025
 
4931
6026
 
6027
+ /* TypeSpecimen */
6028
+ /*! Strand UI | MIT License | dillingerstaffing.com */
6029
+
6030
+ /*! Strand UI | MIT License | dillingerstaffing.com */
6031
+
6032
+ /* ══════════════════════════════════════════════════
6033
+ TYPE SPECIMEN (docs-site typography tile)
6034
+ ══════════════════════════════════════════════════
6035
+ A stacked specimen: large display text on top, mono meta
6036
+ line below. Use inside a section body on a typography
6037
+ documentation page. Dashed divider between siblings. */
6038
+
6039
+ .strand-type-specimen {
6040
+ display: grid;
6041
+ grid-template-columns: 1fr;
6042
+ gap: var(--strand-space-3);
6043
+ padding: var(--strand-space-5) 0;
6044
+ border-top: 1px dashed var(--strand-gray-200);
6045
+ }
6046
+
6047
+ .strand-type-specimen:first-child {
6048
+ border-top: 0;
6049
+ padding-top: 0;
6050
+ }
6051
+
6052
+ .strand-type-specimen__meta {
6053
+ display: block;
6054
+ font-family: var(--strand-font-mono);
6055
+ font-size: 10px;
6056
+ letter-spacing: 0.06em;
6057
+ color: var(--strand-gray-500);
6058
+ line-height: 1.5;
6059
+ }
6060
+
6061
+ .strand-type-specimen__meta b {
6062
+ color: var(--strand-blue-primary);
6063
+ font-weight: var(--strand-weight-medium);
6064
+ }
6065
+
6066
+
4932
6067
  /* Static & Utilities */
4933
6068
  /*! Strand UI | MIT License | dillingerstaffing.com */
4934
6069
 
@@ -5237,6 +6372,37 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
5237
6372
  color: var(--strand-teal-vital);
5238
6373
  }
5239
6374
 
6375
+ /* ── Key-Value Row: editorial modifier ──
6376
+ Additive modifier on .strand-kv for card-metadata contexts
6377
+ (composed cards, editorial specimens) where values should
6378
+ read as soft sans-serif Blue-midnight rather than the default
6379
+ mono-gray instrument readout. Dashed divider between rows.
6380
+ Use inside .strand-card__section content blocks. The base
6381
+ .strand-kv default stays mono-tabular for instrument surfaces. */
6382
+ .strand-kv--editorial {
6383
+ padding: 6px 0;
6384
+ font-size: var(--strand-text-sm);
6385
+ line-height: 1.4;
6386
+ }
6387
+
6388
+ .strand-kv--editorial + .strand-kv--editorial {
6389
+ border-top: 1px dashed var(--strand-gray-200);
6390
+ }
6391
+
6392
+ .strand-kv--editorial .strand-kv__label {
6393
+ letter-spacing: var(--strand-tracking-ultra);
6394
+ flex: none;
6395
+ white-space: nowrap;
6396
+ }
6397
+
6398
+ .strand-kv--editorial .strand-kv__value {
6399
+ font-family: var(--strand-font-sans);
6400
+ font-size: var(--strand-text-sm);
6401
+ color: var(--strand-blue-midnight);
6402
+ font-weight: var(--strand-weight-medium);
6403
+ font-variant-numeric: normal;
6404
+ }
6405
+
5240
6406
  /* ── Diagnostic Log Entry ──
5241
6407
  Derivation: inline-sequence + ranked-sequence (DL 11.10).
5242
6408
  time(OVERLINE) + status(OVERLINE+COLOR_SEMANTIC) + text(SECONDARY) + RANK_BORDER */