@dillingerstaffing/strand-vue 0.16.0 → 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 +1268 -87
  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,13 +735,56 @@ 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
- Layout helpers for a content-sized card grid with an inline
740
- next-event preview row. Useful for membership grids, channel
741
- listings, and similar layouts where cards must size to their
742
- content rather than fill a fixed cell. */
767
+ Equal-height card row with a natural top-to-bottom stack inside each
768
+ card and the final horizontal row (the CTA) anchored to the card's
769
+ bottom edge. Cards in the same row align to the tallest card's
770
+ height; an uneven content mix never produces the ragged-bottom look
771
+ where some cards end tall and others stop short. Useful for channel
772
+ listings, membership grids, and any layout where cards carry a
773
+ primary CTA that must read as the shared affordance across the row. */
743
774
  .strand-channel-grid {
744
- align-items: start;
775
+ align-items: stretch;
776
+ }
777
+ .strand-channel-grid > .strand-card {
778
+ display: flex;
779
+ flex-direction: column;
780
+ }
781
+ .strand-channel-grid > .strand-card > .strand-stack--vertical {
782
+ flex: 1;
783
+ display: flex;
784
+ flex-direction: column;
785
+ }
786
+ .strand-channel-grid > .strand-card > .strand-stack--vertical > .strand-stack--horizontal:last-child {
787
+ margin-top: auto;
745
788
  }
746
789
 
747
790
  .strand-channel-title {
@@ -1124,6 +1167,91 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
1124
1167
  }
1125
1168
 
1126
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
+
1127
1255
  /* DataReadout */
1128
1256
  /*! Strand UI | MIT License | dillingerstaffing.com */
1129
1257
 
@@ -1547,6 +1675,26 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
1547
1675
  .strand-instrument-viewport .strand-kv__label { color: var(--strand-gray-400); }
1548
1676
  .strand-instrument-viewport .strand-kv__value { color: var(--strand-gray-200); }
1549
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
+
1550
1698
  .strand-instrument-viewport__label {
1551
1699
  color: var(--strand-gray-400);
1552
1700
  font-family: var(--strand-font-mono);
@@ -2800,108 +2948,962 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
2800
2948
  margin-bottom: var(--strand-space-4);
2801
2949
  }
2802
2950
 
2803
- .strand-detail-panel__close:hover {
2804
- background: var(--strand-blue-glow);
2805
- }
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
+ }
2806
3785
 
2807
- .strand-detail-panel__close-icon {
2808
- display: none;
2809
- }
3786
+ .strand-ref-tip__bubble--top {
3787
+ left: 50%;
3788
+ bottom: calc(100% + 8px);
3789
+ transform: translateX(-50%) translateY(4px);
3790
+ }
2810
3791
 
2811
- .strand-detail-panel__close-text {
2812
- display: inline;
2813
- }
3792
+ .strand-ref-tip__bubble--bottom {
3793
+ left: 50%;
3794
+ top: calc(100% + 8px);
3795
+ transform: translateX(-50%) translateY(-4px);
3796
+ }
2814
3797
 
2815
- .strand-detail-panel > .strand-overline {
2816
- margin-bottom: var(--strand-space-2);
2817
- }
3798
+ .strand-ref-tip__bubble--left {
3799
+ right: calc(100% + 8px);
3800
+ top: 50%;
3801
+ transform: translateX(4px) translateY(-50%);
3802
+ }
2818
3803
 
2819
- .strand-map-legend,
2820
- .strand-coord-readout {
2821
- display: none;
2822
- }
3804
+ .strand-ref-tip__bubble--right {
3805
+ left: calc(100% + 8px);
3806
+ top: 50%;
3807
+ transform: translateX(-4px) translateY(-50%);
3808
+ }
2823
3809
 
2824
- .strand-search-bar__input {
2825
- font-size: 16px;
2826
- }
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);
2827
3814
  }
2828
3815
 
2829
- /* ──────────────────────────────────────────────
2830
- REDUCED MOTION
2831
- ──────────────────────────────────────────────
2832
- Strip every animation and transition from the FUI primitives
2833
- when the user has prefers-reduced-motion. The instrument is
2834
- 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
+ }
2835
3821
 
2836
- @media (prefers-reduced-motion: reduce) {
2837
- .strand-scanline,
2838
- .strand-scanline--ambient {
2839
- display: none;
2840
- }
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
+ }
2841
3827
 
2842
- .strand-instrument-viewport--full-bleed::after {
2843
- animation: none;
2844
- }
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
+ }
2845
3833
 
2846
- .strand-map-pin {
2847
- animation: none;
3834
+ @media (prefers-reduced-motion: reduce) {
3835
+ .strand-ref-tip__bubble {
3836
+ transition: none;
2848
3837
  }
3838
+ }
2849
3839
 
2850
- .strand-map-pin::before,
2851
- .strand-map-pin::after {
2852
- animation: none;
2853
- }
2854
3840
 
2855
- .strand-map-pin:hover {
2856
- animation: none;
2857
- }
3841
+ /* LabUtilCell */
3842
+ /*! Strand UI | MIT License | dillingerstaffing.com */
2858
3843
 
2859
- .strand-map-pin:hover::before,
2860
- .strand-map-pin:hover::after {
2861
- animation: none;
2862
- }
3844
+ /*! Strand UI | MIT License | dillingerstaffing.com */
2863
3845
 
2864
- .strand-detail-panel {
2865
- transition: none;
2866
- }
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. */
2867
3853
 
2868
- .strand-detail-panel.is-open > .strand-overline,
2869
- .strand-detail-panel--open > .strand-overline,
2870
- .strand-detail-panel.open > .strand-overline,
2871
- .strand-detail-panel.is-open .strand-detail-panel__title,
2872
- .strand-detail-panel--open .strand-detail-panel__title,
2873
- .strand-detail-panel.open .strand-detail-panel__title,
2874
- .strand-detail-panel.is-open .strand-detail-panel__meta,
2875
- .strand-detail-panel--open .strand-detail-panel__meta,
2876
- .strand-detail-panel.open .strand-detail-panel__meta,
2877
- .strand-detail-panel.is-open .strand-detail-panel__salary,
2878
- .strand-detail-panel--open .strand-detail-panel__salary,
2879
- .strand-detail-panel.open .strand-detail-panel__salary,
2880
- .strand-detail-panel.is-open .strand-detail-panel__cta,
2881
- .strand-detail-panel--open .strand-detail-panel__cta,
2882
- .strand-detail-panel.open .strand-detail-panel__cta,
2883
- .strand-detail-panel.is-open .strand-detail-panel__source,
2884
- .strand-detail-panel--open .strand-detail-panel__source,
2885
- .strand-detail-panel.open .strand-detail-panel__source {
2886
- animation: none;
2887
- }
3854
+ .strand-ref-util-row {
3855
+ display: flex;
3856
+ align-items: stretch;
3857
+ gap: 18px;
3858
+ flex-wrap: wrap;
3859
+ }
2888
3860
 
2889
- .strand-map-legend__title::before {
2890
- animation: none;
2891
- }
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
+ }
2892
3873
 
2893
- .strand-coord-readout::before {
2894
- animation: none;
2895
- }
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
+ }
2896
3881
 
2897
- .strand-map-loading__spinner {
2898
- animation: none;
2899
- border-color: rgba(59, 142, 246, 0.4);
2900
- }
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
+ }
2901
3888
 
2902
- .strand-search-bar__action--locating {
2903
- animation: none;
2904
- }
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;
2905
3907
  }
2906
3908
 
2907
3909
 
@@ -4172,6 +5174,53 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
4172
5174
  }
4173
5175
 
4174
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
+
4175
5224
  /* Switch */
4176
5225
  /*! Strand UI | MIT License | dillingerstaffing.com */
4177
5226
 
@@ -4836,6 +5885,67 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
4836
5885
  }
4837
5886
 
4838
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
+
4839
5949
  /* Tooltip */
4840
5950
  /*! Strand UI | MIT License | dillingerstaffing.com */
4841
5951
 
@@ -4914,6 +6024,46 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
4914
6024
  }
4915
6025
 
4916
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
+
4917
6067
  /* Static & Utilities */
4918
6068
  /*! Strand UI | MIT License | dillingerstaffing.com */
4919
6069
 
@@ -5222,6 +6372,37 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
5222
6372
  color: var(--strand-teal-vital);
5223
6373
  }
5224
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
+
5225
6406
  /* ── Diagnostic Log Entry ──
5226
6407
  Derivation: inline-sequence + ranked-sequence (DL 11.10).
5227
6408
  time(OVERLINE) + status(OVERLINE+COLOR_SEMANTIC) + text(SECONDARY) + RANK_BORDER */