@dillingerstaffing/strand-vue 0.16.1 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +1312 -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,1026 @@ 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. Height fills viewport from sticky-top to
3360
+ bottom so its bottom never falls below the viewport edge. dvh tracks
3361
+ mobile browser-chrome changes; vh fallback for older browsers. */
3362
+ .strand-ref-shell__sidebar {
3363
+ position: sticky;
3364
+ top: var(--strand-ref-sticky-top, 0);
3365
+ height: calc(100vh - var(--strand-ref-sticky-top, 0px));
3366
+ height: calc(100dvh - var(--strand-ref-sticky-top, 0px));
3367
+ max-height: calc(100vh - var(--strand-ref-sticky-top, 0px));
3368
+ max-height: calc(100dvh - var(--strand-ref-sticky-top, 0px));
3369
+ background: var(--strand-surface-elevated);
3370
+ border-right: 1px solid var(--strand-gray-200);
3371
+ display: flex;
3372
+ flex-direction: column;
3373
+ overflow: hidden;
3374
+ }
3375
+
3376
+ /* Sidebar head: fixed top block with brand and hairline bottom. */
3377
+ .strand-ref-shell__sidebar-head {
3378
+ padding: var(--strand-space-6) var(--strand-space-5) 18px;
3379
+ border-bottom: 1px solid var(--strand-gray-100);
3380
+ flex: none;
3381
+ background: var(--strand-surface-elevated);
3382
+ }
3383
+
3384
+ /* Sidebar scroll region: groups of nav links, overflow-y auto. */
3385
+ .strand-ref-shell__sidebar-scroll {
3386
+ flex: 1;
3387
+ min-height: 0;
3388
+ overflow-y: auto;
3389
+ overflow-anchor: none;
3390
+ overscroll-behavior: contain;
3391
+ padding: var(--strand-space-4) var(--strand-space-5) var(--strand-space-6);
3392
+ display: flex;
3393
+ flex-direction: column;
3394
+ gap: 18px;
3395
+ }
3396
+
3397
+ /* Brand row: mark + title + sub stacked horizontally. */
3398
+ .strand-ref-shell__brand {
3399
+ display: flex;
3400
+ align-items: center;
3401
+ gap: var(--strand-space-3);
3402
+ }
3403
+
3404
+ .strand-ref-shell__brand-mark {
3405
+ width: 36px;
3406
+ height: 36px;
3407
+ border-radius: var(--strand-radius-md);
3408
+ background: var(--strand-blue-midnight);
3409
+ color: var(--strand-on-blue-primary);
3410
+ display: grid;
3411
+ place-items: center;
3412
+ font-family: var(--strand-font-mono);
3413
+ font-weight: var(--strand-weight-semibold);
3414
+ font-size: 13px;
3415
+ letter-spacing: 0.04em;
3416
+ }
3417
+
3418
+ .strand-ref-shell__brand-title {
3419
+ font-family: var(--strand-font-mono);
3420
+ font-weight: var(--strand-weight-medium);
3421
+ color: var(--strand-blue-midnight);
3422
+ font-size: 15px;
3423
+ }
3424
+
3425
+ .strand-ref-shell__brand-sub {
3426
+ font-family: var(--strand-font-mono);
3427
+ font-size: 10px;
3428
+ text-transform: uppercase;
3429
+ letter-spacing: var(--strand-tracking-ultra);
3430
+ color: var(--strand-gray-500);
3431
+ }
3432
+
3433
+ /* Sidebar nav group: divider between groups, label + list. */
3434
+ .strand-ref-shell__group {
3435
+ display: flex;
3436
+ flex-direction: column;
3437
+ gap: var(--strand-space-1);
3438
+ padding-top: 10px;
3439
+ border-top: 1px solid var(--strand-gray-100);
3440
+ }
3441
+
3442
+ .strand-ref-shell__group:first-of-type {
3443
+ border-top: 0;
3444
+ padding-top: 0;
3445
+ }
3446
+
3447
+ .strand-ref-shell__group-label {
3448
+ font-family: var(--strand-font-mono);
3449
+ font-size: 10px;
3450
+ letter-spacing: 0.18em;
3451
+ text-transform: uppercase;
3452
+ color: var(--strand-blue-midnight);
3453
+ font-weight: var(--strand-weight-semibold);
3454
+ padding: 6px 10px 8px;
3455
+ }
3456
+
3457
+ .strand-ref-shell__group-list {
3458
+ display: flex;
3459
+ flex-direction: column;
3460
+ gap: 1px;
3461
+ }
3462
+
3463
+ .strand-ref-shell__group-link {
3464
+ display: flex;
3465
+ align-items: center;
3466
+ gap: 10px;
3467
+ padding: 7px 10px;
3468
+ border-radius: var(--strand-radius-md);
3469
+ font-family: var(--strand-font-sans);
3470
+ font-size: 13px;
3471
+ color: var(--strand-gray-700);
3472
+ text-decoration: none;
3473
+ transition: background var(--strand-duration-fast) var(--strand-ease-out-quart),
3474
+ color var(--strand-duration-fast) var(--strand-ease-out-quart);
3475
+ }
3476
+
3477
+ .strand-ref-shell__group-link:hover {
3478
+ background: var(--strand-surface-recessed);
3479
+ color: var(--strand-blue-midnight);
3480
+ }
3481
+
3482
+ .strand-ref-shell__group-dot {
3483
+ width: 4px;
3484
+ height: 4px;
3485
+ border-radius: 50%;
3486
+ background: var(--strand-gray-300);
3487
+ flex: none;
3488
+ }
3489
+
3490
+ .strand-ref-shell__group-link:hover .strand-ref-shell__group-dot {
3491
+ background: var(--strand-blue-primary);
3492
+ }
3493
+
3494
+ /* Main: scrolling column, padding 56px 64px 96px, clamped width. */
3495
+ .strand-ref-shell__main {
3496
+ padding: 56px var(--strand-space-16) 96px;
3497
+ max-width: 1120px;
3498
+ }
3499
+
3500
+ /* Header: h1 + lead + metrics row, bottom hairline. */
3501
+ .strand-ref-header {
3502
+ padding-bottom: var(--strand-space-10);
3503
+ border-bottom: 1px solid var(--strand-gray-200);
3504
+ margin-bottom: var(--strand-space-8);
3505
+ }
3506
+
3507
+ .strand-ref-header__title {
3508
+ font-family: var(--strand-font-sans);
3509
+ font-weight: var(--strand-weight-light);
3510
+ letter-spacing: var(--strand-tracking-tight);
3511
+ color: var(--strand-blue-midnight);
3512
+ font-size: 40px;
3513
+ margin: var(--strand-space-3) 0 0;
3514
+ }
3515
+
3516
+ .strand-ref-header__lead {
3517
+ max-width: 620px;
3518
+ margin: var(--strand-space-4) 0 0;
3519
+ font-family: var(--strand-font-sans);
3520
+ font-size: 20px;
3521
+ color: var(--strand-gray-500);
3522
+ line-height: 1.5;
3523
+ }
3524
+
3525
+ .strand-ref-header__meta {
3526
+ display: grid;
3527
+ grid-template-columns: repeat(4, minmax(0, auto));
3528
+ gap: 48px;
3529
+ margin: var(--strand-space-8) 0 0;
3530
+ justify-content: start;
3531
+ }
3532
+
3533
+ .strand-ref-header__meta-item {
3534
+ display: flex;
3535
+ flex-direction: column;
3536
+ gap: var(--strand-space-2);
3537
+ margin: 0;
3538
+ }
3539
+
3540
+ .strand-ref-header__meta-label {
3541
+ font-family: var(--strand-font-mono);
3542
+ font-size: 10px;
3543
+ letter-spacing: 0.14em;
3544
+ text-transform: uppercase;
3545
+ color: var(--strand-gray-500);
3546
+ margin: 0;
3547
+ }
3548
+
3549
+ .strand-ref-header__meta-value {
3550
+ font-family: var(--strand-font-sans);
3551
+ font-size: 22px;
3552
+ font-weight: var(--strand-weight-light);
3553
+ letter-spacing: -0.01em;
3554
+ color: var(--strand-blue-midnight);
3555
+ margin: 0;
3556
+ line-height: 1.2;
3557
+ }
3558
+
3559
+ /* Taxonomy explainer block: overline + definition list of terms. */
3560
+ .strand-ref-taxonomy {
3561
+ margin-top: var(--strand-space-6);
3562
+ padding: var(--strand-space-5) 22px;
3563
+ background: var(--strand-surface-recessed);
3564
+ border: 1px solid var(--strand-gray-200);
3565
+ border-radius: var(--strand-radius-lg);
3566
+ max-width: 720px;
3567
+ }
3568
+
3569
+ .strand-ref-taxonomy__title {
3570
+ font-family: var(--strand-font-mono);
3571
+ font-size: 10px;
3572
+ letter-spacing: 0.18em;
3573
+ text-transform: uppercase;
3574
+ color: var(--strand-blue-midnight);
3575
+ font-weight: var(--strand-weight-semibold);
3576
+ margin-bottom: 10px;
3577
+ }
3578
+
3579
+ .strand-ref-taxonomy__list {
3580
+ margin: 0;
3581
+ display: grid;
3582
+ grid-template-columns: 1fr;
3583
+ gap: var(--strand-space-2);
3584
+ }
3585
+
3586
+ .strand-ref-taxonomy__list > div {
3587
+ display: grid;
3588
+ grid-template-columns: 160px 1fr;
3589
+ gap: 14px;
3590
+ align-items: baseline;
3591
+ }
3592
+
3593
+ .strand-ref-taxonomy__list dt {
3594
+ font-family: var(--strand-font-mono);
3595
+ font-size: 11px;
3596
+ letter-spacing: 0.08em;
3597
+ text-transform: uppercase;
3598
+ color: var(--strand-blue-primary);
3599
+ font-weight: var(--strand-weight-semibold);
3600
+ margin: 0;
3601
+ }
3602
+
3603
+ .strand-ref-taxonomy__list dd {
3604
+ margin: 0;
3605
+ font-size: 13px;
3606
+ color: var(--strand-gray-700);
3607
+ line-height: 1.5;
3608
+ }
3609
+
3610
+ .strand-ref-taxonomy__list em {
3611
+ font-style: italic;
3612
+ color: var(--strand-blue-midnight);
3613
+ }
3614
+
3615
+ /* Section: vertical block with hairline bottom. */
3616
+ .strand-ref-section {
3617
+ padding: var(--strand-space-12) 0;
3618
+ border-bottom: 1px solid var(--strand-gray-200);
3619
+ scroll-margin-top: var(--strand-space-4);
3620
+ }
3621
+
3622
+ .strand-ref-section:last-child {
3623
+ border-bottom: 0;
3624
+ }
3625
+
3626
+ .strand-ref-section__head {
3627
+ margin-bottom: var(--strand-space-8);
3628
+ display: flex;
3629
+ align-items: baseline;
3630
+ justify-content: space-between;
3631
+ gap: var(--strand-space-6);
3632
+ flex-wrap: wrap;
3633
+ }
3634
+
3635
+ .strand-ref-section__head h2 {
3636
+ margin: var(--strand-space-2) 0 0;
3637
+ font-weight: var(--strand-weight-light);
3638
+ letter-spacing: var(--strand-tracking-tight);
3639
+ color: var(--strand-blue-midnight);
3640
+ font-size: 28px;
3641
+ }
3642
+
3643
+ .strand-ref-section__head-note {
3644
+ font-family: var(--strand-font-mono);
3645
+ font-size: 10px;
3646
+ letter-spacing: var(--strand-tracking-ultra);
3647
+ text-transform: uppercase;
3648
+ color: var(--strand-gray-500);
3649
+ }
3650
+
3651
+ .strand-ref-section__body {
3652
+ display: flex;
3653
+ flex-direction: column;
3654
+ gap: var(--strand-space-8);
3655
+ }
3656
+
3657
+ /* Example: a single component specimen with meta column + demo panel. */
3658
+ .strand-ref-example {
3659
+ display: grid;
3660
+ grid-template-columns: 200px 1fr;
3661
+ gap: 28px;
3662
+ align-items: start;
3663
+ }
3664
+
3665
+ .strand-ref-example__meta {
3666
+ padding-top: 6px;
3667
+ }
3668
+
3669
+ .strand-ref-example__label {
3670
+ font-family: var(--strand-font-sans);
3671
+ font-size: 13px;
3672
+ font-weight: var(--strand-weight-medium);
3673
+ color: var(--strand-blue-midnight);
3674
+ margin-bottom: 6px;
3675
+ }
3676
+
3677
+ .strand-ref-example__code {
3678
+ font-family: var(--strand-font-mono);
3679
+ font-size: 10px;
3680
+ letter-spacing: 0.04em;
3681
+ color: var(--strand-gray-500);
3682
+ display: block;
3683
+ line-height: 1.5;
3684
+ }
3685
+
3686
+ .strand-ref-example__demo {
3687
+ background: var(--strand-surface-elevated);
3688
+ border: 1px solid var(--strand-gray-200);
3689
+ border-radius: var(--strand-radius-lg);
3690
+ /* 24px 28px: token 24px (space-6) + literal 28px chrome value (no token match) */
3691
+ padding: var(--strand-space-6) 28px;
3692
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.03);
3693
+ }
3694
+
3695
+ .strand-ref-example__demo--pad-none {
3696
+ padding: 0;
3697
+ overflow: hidden;
3698
+ }
3699
+
3700
+ .strand-ref-example__demo--recessed {
3701
+ background: var(--strand-surface-recessed);
3702
+ }
3703
+
3704
+ .strand-ref-example__caption {
3705
+ margin-top: var(--strand-space-2);
3706
+ font-size: 12px;
3707
+ line-height: 1.55;
3708
+ color: var(--strand-gray-500);
3709
+ max-width: 560px;
3710
+ }
3711
+
3712
+ /* Mobile-trigger FAB: hidden by default; shown only inside the responsive
3713
+ breakpoint. Floats bottom-right and toggles the mobile drawer. The
3714
+ consumer pairs this with toggling `.is-nav-open` on the shell mount
3715
+ point. The button itself uses standard strand-btn primitives plus
3716
+ this class for FAB positioning. */
3717
+ .strand-ref-mobile-trigger {
3718
+ display: none;
3719
+ }
3720
+
3721
+ .strand-ref-shell__nav-scrim {
3722
+ display: none;
3723
+ }
3724
+
3725
+ /* Responsive: at <=1040px the sidebar becomes a slide-over drawer.
3726
+ Consumer toggles `.is-nav-open` on the shell mount point to open the
3727
+ drawer. The trigger button (.strand-ref-mobile-trigger) sits as a FAB
3728
+ bottom-right, and the scrim (.strand-ref-shell__nav-scrim) closes it
3729
+ on tap. */
3730
+ @media (max-width: 1040px) {
3731
+ .strand-ref-shell {
3732
+ grid-template-columns: 1fr;
3733
+ }
3734
+
3735
+ .strand-ref-shell__sidebar {
3736
+ position: fixed;
3737
+ top: var(--strand-ref-sticky-top, 0);
3738
+ left: 0;
3739
+ right: 0;
3740
+ bottom: 0;
3741
+ height: auto;
3742
+ max-height: none;
3743
+ width: 100%;
3744
+ z-index: 80;
3745
+ background: var(--strand-surface-elevated);
3746
+ box-shadow: var(--strand-elevation-3, 0 8px 28px rgba(15, 23, 42, 0.18));
3747
+ transform: translateX(-100%);
3748
+ transition: transform var(--strand-duration-normal, 200ms)
3749
+ var(--strand-ease-out-quart, ease-out);
3750
+ visibility: hidden;
3751
+ border-right: 0;
3752
+ border-bottom: 0;
3753
+ }
3754
+
3755
+ .strand-ref-shell.is-nav-open .strand-ref-shell__sidebar {
3756
+ transform: translateX(0);
3757
+ visibility: visible;
3758
+ }
3759
+
3760
+ .strand-ref-shell__nav-scrim {
3761
+ position: fixed;
3762
+ top: var(--strand-ref-sticky-top, 0);
3763
+ left: 0;
3764
+ right: 0;
3765
+ bottom: 0;
3766
+ z-index: 75;
3767
+ background: rgba(15, 23, 42, 0.4);
3768
+ }
3769
+
3770
+ .strand-ref-shell.is-nav-open .strand-ref-shell__nav-scrim {
3771
+ display: block;
3772
+ }
3773
+
3774
+ .strand-ref-mobile-trigger {
3775
+ display: inline-flex;
3776
+ position: fixed;
3777
+ bottom: calc(env(safe-area-inset-bottom, 0px) + 16px);
3778
+ right: 16px;
3779
+ z-index: 85;
3780
+ box-shadow: var(--strand-elevation-3, 0 8px 24px rgba(15, 23, 42, 0.2));
3781
+ border-radius: var(--strand-radius-full, 9999px);
3782
+ }
3783
+
3784
+ .strand-ref-shell__main {
3785
+ padding: var(--strand-space-8) var(--strand-space-6) var(--strand-space-16);
3786
+ }
3787
+
3788
+ .strand-ref-example {
3789
+ grid-template-columns: 1fr;
3790
+ }
3791
+
3792
+ .strand-ref-header__meta {
3793
+ grid-template-columns: 1fr 1fr;
3794
+ gap: var(--strand-space-6) var(--strand-space-8);
3795
+ }
3796
+ }
3797
+
3798
+ @media (max-width: 560px) {
3799
+ .strand-ref-header__meta {
3800
+ grid-template-columns: 1fr;
3801
+ gap: 18px;
3802
+ }
3803
+ }
3804
+
3805
+
3806
+ /* LabTip */
3807
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3808
+
3809
+ /*! Strand UI | MIT License | dillingerstaffing.com */
3810
+
3811
+ /* ══════════════════════════════════════════════════
3812
+ LAB TIP (pure-CSS tooltip specimen)
3813
+ ══════════════════════════════════════════════════
3814
+ A hover/focus-driven tooltip for QA specimens on docs
3815
+ pages. This is NOT the production Strand Tooltip (which is
3816
+ JS-driven with collision detection); it is a static
3817
+ specimen showing four fixed positions simultaneously.
3818
+
3819
+ Use the --pinned modifier to show the bubble without
3820
+ hover/focus (useful for before/after screenshots). */
3821
+
3822
+ .strand-ref-tip {
3823
+ position: relative;
3824
+ display: inline-flex;
3825
+ }
3826
+
3827
+ .strand-ref-tip__bubble {
3828
+ position: absolute;
3829
+ z-index: 2;
3830
+ padding: 6px 10px;
3831
+ border-radius: var(--strand-radius-sm);
3832
+ background: var(--strand-blue-midnight);
3833
+ color: var(--strand-on-blue-primary);
3834
+ font-family: var(--strand-font-mono);
3835
+ font-size: 11px;
3836
+ letter-spacing: 0.04em;
3837
+ white-space: nowrap;
3838
+ opacity: 0;
3839
+ pointer-events: none;
3840
+ transition: opacity var(--strand-duration-fast) var(--strand-ease-out-quart),
3841
+ transform var(--strand-duration-fast) var(--strand-ease-out-quart);
3842
+ }
3843
+
3844
+ .strand-ref-tip:hover .strand-ref-tip__bubble,
3845
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble,
3846
+ .strand-ref-tip--pinned .strand-ref-tip__bubble {
3847
+ opacity: 1;
3848
+ }
2821
3849
 
2822
- .strand-detail-panel__close-icon {
2823
- display: none;
2824
- }
3850
+ .strand-ref-tip__bubble--top {
3851
+ left: 50%;
3852
+ bottom: calc(100% + 8px);
3853
+ transform: translateX(-50%) translateY(4px);
3854
+ }
2825
3855
 
2826
- .strand-detail-panel__close-text {
2827
- display: inline;
2828
- }
3856
+ .strand-ref-tip__bubble--bottom {
3857
+ left: 50%;
3858
+ top: calc(100% + 8px);
3859
+ transform: translateX(-50%) translateY(-4px);
3860
+ }
2829
3861
 
2830
- .strand-detail-panel > .strand-overline {
2831
- margin-bottom: var(--strand-space-2);
2832
- }
3862
+ .strand-ref-tip__bubble--left {
3863
+ right: calc(100% + 8px);
3864
+ top: 50%;
3865
+ transform: translateX(4px) translateY(-50%);
3866
+ }
2833
3867
 
2834
- .strand-map-legend,
2835
- .strand-coord-readout {
2836
- display: none;
2837
- }
3868
+ .strand-ref-tip__bubble--right {
3869
+ left: calc(100% + 8px);
3870
+ top: 50%;
3871
+ transform: translateX(-4px) translateY(-50%);
3872
+ }
2838
3873
 
2839
- .strand-search-bar__input {
2840
- font-size: 16px;
2841
- }
3874
+ .strand-ref-tip:hover .strand-ref-tip__bubble--top,
3875
+ .strand-ref-tip--pinned .strand-ref-tip__bubble--top,
3876
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble--top {
3877
+ transform: translateX(-50%) translateY(0);
2842
3878
  }
2843
3879
 
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. */
3880
+ .strand-ref-tip:hover .strand-ref-tip__bubble--bottom,
3881
+ .strand-ref-tip--pinned .strand-ref-tip__bubble--bottom,
3882
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble--bottom {
3883
+ transform: translateX(-50%) translateY(0);
3884
+ }
2850
3885
 
2851
- @media (prefers-reduced-motion: reduce) {
2852
- .strand-scanline,
2853
- .strand-scanline--ambient {
2854
- display: none;
2855
- }
3886
+ .strand-ref-tip:hover .strand-ref-tip__bubble--left,
3887
+ .strand-ref-tip--pinned .strand-ref-tip__bubble--left,
3888
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble--left {
3889
+ transform: translateX(0) translateY(-50%);
3890
+ }
2856
3891
 
2857
- .strand-instrument-viewport--full-bleed::after {
2858
- animation: none;
2859
- }
3892
+ .strand-ref-tip:hover .strand-ref-tip__bubble--right,
3893
+ .strand-ref-tip--pinned .strand-ref-tip__bubble--right,
3894
+ .strand-ref-tip:focus-within .strand-ref-tip__bubble--right {
3895
+ transform: translateX(0) translateY(-50%);
3896
+ }
2860
3897
 
2861
- .strand-map-pin {
2862
- animation: none;
3898
+ @media (prefers-reduced-motion: reduce) {
3899
+ .strand-ref-tip__bubble {
3900
+ transition: none;
2863
3901
  }
3902
+ }
2864
3903
 
2865
- .strand-map-pin::before,
2866
- .strand-map-pin::after {
2867
- animation: none;
2868
- }
2869
3904
 
2870
- .strand-map-pin:hover {
2871
- animation: none;
2872
- }
3905
+ /* LabUtilCell */
3906
+ /*! Strand UI | MIT License | dillingerstaffing.com */
2873
3907
 
2874
- .strand-map-pin:hover::before,
2875
- .strand-map-pin:hover::after {
2876
- animation: none;
2877
- }
3908
+ /*! Strand UI | MIT License | dillingerstaffing.com */
2878
3909
 
2879
- .strand-detail-panel {
2880
- transition: none;
2881
- }
3910
+ /* ══════════════════════════════════════════════════
3911
+ LAB UTIL CELL (utility-class demo tile)
3912
+ ══════════════════════════════════════════════════
3913
+ Demo tile that shows a single utility class in action
3914
+ (e.g. .strand-mt-4, .strand-mx-auto). The row container
3915
+ arranges cells horizontally; each cell has a code label
3916
+ + demo area + optional caption. */
2882
3917
 
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
- }
3918
+ .strand-ref-util-row {
3919
+ display: flex;
3920
+ align-items: stretch;
3921
+ gap: 18px;
3922
+ flex-wrap: wrap;
3923
+ }
2903
3924
 
2904
- .strand-map-legend__title::before {
2905
- animation: none;
2906
- }
3925
+ .strand-ref-util-cell {
3926
+ display: flex;
3927
+ flex-direction: column;
3928
+ gap: 10px;
3929
+ /* 14px 16px: specimen chrome literal, no token match for 14px */
3930
+ padding: 14px var(--strand-space-4);
3931
+ background: var(--strand-surface-recessed);
3932
+ border: 1px solid var(--strand-gray-200);
3933
+ border-radius: var(--strand-radius-md);
3934
+ min-width: 180px;
3935
+ flex: 1;
3936
+ }
2907
3937
 
2908
- .strand-coord-readout::before {
2909
- animation: none;
2910
- }
3938
+ .strand-ref-util-cell__code {
3939
+ font-family: var(--strand-font-mono);
3940
+ font-size: 10px;
3941
+ letter-spacing: 0.06em;
3942
+ color: var(--strand-blue-primary);
3943
+ font-weight: var(--strand-weight-medium);
3944
+ }
2911
3945
 
2912
- .strand-map-loading__spinner {
2913
- animation: none;
2914
- border-color: rgba(59, 142, 246, 0.4);
2915
- }
3946
+ .strand-ref-util-cell__caption {
3947
+ font-family: var(--strand-font-mono);
3948
+ font-size: 10px;
3949
+ letter-spacing: 0.04em;
3950
+ color: var(--strand-gray-500);
3951
+ }
2916
3952
 
2917
- .strand-search-bar__action--locating {
2918
- animation: none;
2919
- }
3953
+ .strand-ref-util-cell__demo {
3954
+ background: var(--strand-surface-elevated);
3955
+ border: 1px dashed var(--strand-gray-300);
3956
+ border-radius: var(--strand-radius-sm);
3957
+ padding: 0;
3958
+ display: flex;
3959
+ flex-direction: column;
3960
+ }
3961
+
3962
+ .strand-ref-util-cell__block {
3963
+ background: var(--strand-blue-midnight);
3964
+ color: var(--strand-on-blue-primary);
3965
+ padding: 6px 10px;
3966
+ font-family: var(--strand-font-mono);
3967
+ font-size: 11px;
3968
+ letter-spacing: 0.04em;
3969
+ display: inline-block;
3970
+ align-self: flex-start;
2920
3971
  }
2921
3972
 
2922
3973
 
@@ -4187,6 +5238,53 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
4187
5238
  }
4188
5239
 
4189
5240
 
5241
+ /* Swatch */
5242
+ /*! Strand UI | MIT License | dillingerstaffing.com */
5243
+
5244
+ /*! Strand UI | MIT License | dillingerstaffing.com */
5245
+
5246
+ /* ══════════════════════════════════════════════════
5247
+ SWATCH (color specimen for docs surfaces)
5248
+ ══════════════════════════════════════════════════
5249
+ A single color tile rendered in a grid of swatches on a
5250
+ design-token documentation page. Background and text colors
5251
+ are applied inline via the consumer (because tone varies per
5252
+ swatch). Base chrome (border, min-height, internal layout)
5253
+ is CSS-driven. Grid container is a sibling primitive. */
5254
+
5255
+ .strand-swatch-grid {
5256
+ display: grid;
5257
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
5258
+ gap: 10px;
5259
+ }
5260
+
5261
+ .strand-swatch {
5262
+ display: flex;
5263
+ flex-direction: column;
5264
+ gap: var(--strand-space-1);
5265
+ /* 14px 14px 12px: specimen chrome literal, no token scale match */
5266
+ padding: 14px 14px 12px;
5267
+ border-radius: var(--strand-radius-md);
5268
+ border: 1px solid var(--strand-gray-200);
5269
+ min-height: 92px;
5270
+ }
5271
+
5272
+ .strand-swatch__name {
5273
+ font-family: var(--strand-font-mono);
5274
+ font-size: 10px;
5275
+ letter-spacing: var(--strand-tracking-widest);
5276
+ text-transform: uppercase;
5277
+ font-weight: var(--strand-weight-medium);
5278
+ }
5279
+
5280
+ .strand-swatch__hex {
5281
+ font-family: var(--strand-font-mono);
5282
+ font-size: 11px;
5283
+ opacity: 0.75;
5284
+ margin-top: auto;
5285
+ }
5286
+
5287
+
4190
5288
  /* Switch */
4191
5289
  /*! Strand UI | MIT License | dillingerstaffing.com */
4192
5290
 
@@ -4851,6 +5949,67 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
4851
5949
  }
4852
5950
 
4853
5951
 
5952
+ /* TokenSpecimen */
5953
+ /*! Strand UI | MIT License | dillingerstaffing.com */
5954
+
5955
+ /*! Strand UI | MIT License | dillingerstaffing.com */
5956
+
5957
+ /* ══════════════════════════════════════════════════
5958
+ TOKEN SPECIMEN (spacing / radius / shadow tiles)
5959
+ ══════════════════════════════════════════════════
5960
+ Each specimen pairs a visual (spacer bar, radius box, or
5961
+ shadow tile) with a mono label and value. Visuals set their
5962
+ pixel dimensions and shadow/radius inline (per-token variance
5963
+ is the whole point of the spec). */
5964
+
5965
+ .strand-token-specimen-grid {
5966
+ display: grid;
5967
+ grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
5968
+ gap: var(--strand-space-5);
5969
+ }
5970
+
5971
+ .strand-token-specimen {
5972
+ display: flex;
5973
+ flex-direction: column;
5974
+ gap: 10px;
5975
+ align-items: flex-start;
5976
+ font-family: var(--strand-font-mono);
5977
+ font-size: 10px;
5978
+ letter-spacing: 0.04em;
5979
+ color: var(--strand-gray-500);
5980
+ line-height: 1.5;
5981
+ }
5982
+
5983
+ .strand-token-specimen b {
5984
+ display: block;
5985
+ font-weight: var(--strand-weight-medium);
5986
+ color: var(--strand-blue-midnight);
5987
+ letter-spacing: 0.06em;
5988
+ text-transform: uppercase;
5989
+ font-size: 10px;
5990
+ }
5991
+
5992
+ .strand-token-specimen > span {
5993
+ display: block;
5994
+ line-height: 1.5;
5995
+ }
5996
+
5997
+ .strand-token-specimen__spacer {
5998
+ display: block;
5999
+ height: 16px;
6000
+ background: var(--strand-blue-primary);
6001
+ border-radius: var(--strand-radius-sm);
6002
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15);
6003
+ }
6004
+
6005
+ .strand-token-specimen__box {
6006
+ width: 64px;
6007
+ height: 64px;
6008
+ background: var(--strand-surface-elevated);
6009
+ border: 1px solid var(--strand-gray-200);
6010
+ }
6011
+
6012
+
4854
6013
  /* Tooltip */
4855
6014
  /*! Strand UI | MIT License | dillingerstaffing.com */
4856
6015
 
@@ -4929,6 +6088,46 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
4929
6088
  }
4930
6089
 
4931
6090
 
6091
+ /* TypeSpecimen */
6092
+ /*! Strand UI | MIT License | dillingerstaffing.com */
6093
+
6094
+ /*! Strand UI | MIT License | dillingerstaffing.com */
6095
+
6096
+ /* ══════════════════════════════════════════════════
6097
+ TYPE SPECIMEN (docs-site typography tile)
6098
+ ══════════════════════════════════════════════════
6099
+ A stacked specimen: large display text on top, mono meta
6100
+ line below. Use inside a section body on a typography
6101
+ documentation page. Dashed divider between siblings. */
6102
+
6103
+ .strand-type-specimen {
6104
+ display: grid;
6105
+ grid-template-columns: 1fr;
6106
+ gap: var(--strand-space-3);
6107
+ padding: var(--strand-space-5) 0;
6108
+ border-top: 1px dashed var(--strand-gray-200);
6109
+ }
6110
+
6111
+ .strand-type-specimen:first-child {
6112
+ border-top: 0;
6113
+ padding-top: 0;
6114
+ }
6115
+
6116
+ .strand-type-specimen__meta {
6117
+ display: block;
6118
+ font-family: var(--strand-font-mono);
6119
+ font-size: 10px;
6120
+ letter-spacing: 0.06em;
6121
+ color: var(--strand-gray-500);
6122
+ line-height: 1.5;
6123
+ }
6124
+
6125
+ .strand-type-specimen__meta b {
6126
+ color: var(--strand-blue-primary);
6127
+ font-weight: var(--strand-weight-medium);
6128
+ }
6129
+
6130
+
4932
6131
  /* Static & Utilities */
4933
6132
  /*! Strand UI | MIT License | dillingerstaffing.com */
4934
6133
 
@@ -5237,6 +6436,37 @@ body.strand-banner-active .strand-instrument-viewport--full-bleed {
5237
6436
  color: var(--strand-teal-vital);
5238
6437
  }
5239
6438
 
6439
+ /* ── Key-Value Row: editorial modifier ──
6440
+ Additive modifier on .strand-kv for card-metadata contexts
6441
+ (composed cards, editorial specimens) where values should
6442
+ read as soft sans-serif Blue-midnight rather than the default
6443
+ mono-gray instrument readout. Dashed divider between rows.
6444
+ Use inside .strand-card__section content blocks. The base
6445
+ .strand-kv default stays mono-tabular for instrument surfaces. */
6446
+ .strand-kv--editorial {
6447
+ padding: 6px 0;
6448
+ font-size: var(--strand-text-sm);
6449
+ line-height: 1.4;
6450
+ }
6451
+
6452
+ .strand-kv--editorial + .strand-kv--editorial {
6453
+ border-top: 1px dashed var(--strand-gray-200);
6454
+ }
6455
+
6456
+ .strand-kv--editorial .strand-kv__label {
6457
+ letter-spacing: var(--strand-tracking-ultra);
6458
+ flex: none;
6459
+ white-space: nowrap;
6460
+ }
6461
+
6462
+ .strand-kv--editorial .strand-kv__value {
6463
+ font-family: var(--strand-font-sans);
6464
+ font-size: var(--strand-text-sm);
6465
+ color: var(--strand-blue-midnight);
6466
+ font-weight: var(--strand-weight-medium);
6467
+ font-variant-numeric: normal;
6468
+ }
6469
+
5240
6470
  /* ── Diagnostic Log Entry ──
5241
6471
  Derivation: inline-sequence + ranked-sequence (DL 11.10).
5242
6472
  time(OVERLINE) + status(OVERLINE+COLOR_SEMANTIC) + text(SECONDARY) + RANK_BORDER */