@countermeasure-platform/web-components 1.2.1 → 1.2.2-dev.15.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 (320) hide show
  1. package/dist/{arc-jVbrWVYZ.js → arc-DOJ9myHo.js} +21 -21
  2. package/dist/{arc-jVbrWVYZ.js.map → arc-DOJ9myHo.js.map} +1 -1
  3. package/dist/architecture-7EHR7CIX-RjIwnEbG.js +3 -0
  4. package/dist/{architectureDiagram-2XIMDMQ5-D5q0ma9h.js → architectureDiagram-3BPJPVTR-cYFnhp15.js} +165 -152
  5. package/dist/{architectureDiagram-2XIMDMQ5-D5q0ma9h.js.map → architectureDiagram-3BPJPVTR-cYFnhp15.js.map} +1 -1
  6. package/dist/{array-DXadUs1s.js → array-BLp0zq5K.js} +1 -1
  7. package/dist/{array-DXadUs1s.js.map → array-BLp0zq5K.js.map} +1 -1
  8. package/dist/{blockDiagram-WCTKOSBZ-BH3jwWeU.js → blockDiagram-GPEHLZMM-DNLPMFXL.js} +994 -864
  9. package/dist/blockDiagram-GPEHLZMM-DNLPMFXL.js.map +1 -0
  10. package/dist/{c4Diagram-IC4MRINW-OFLrunYI.js → c4Diagram-AAUBKEIU-G8g3OBBg.js} +232 -235
  11. package/dist/c4Diagram-AAUBKEIU-G8g3OBBg.js.map +1 -0
  12. package/dist/channel-MTYqUJFm.js +7 -0
  13. package/dist/{channel-LRbq43st.js.map → channel-MTYqUJFm.js.map} +1 -1
  14. package/dist/{chunk-KX2RTZJC-d9jFqUAY.js → chunk-2J33WTMH-BKsVIUnb.js} +4 -4
  15. package/dist/{chunk-KX2RTZJC-d9jFqUAY.js.map → chunk-2J33WTMH-BKsVIUnb.js.map} +1 -1
  16. package/dist/chunk-3OPIFGDE-CcNRL44h.js +3669 -0
  17. package/dist/chunk-3OPIFGDE-CcNRL44h.js.map +1 -0
  18. package/dist/{chunk-4BX2VUAB-BS9gpN-y.js → chunk-4BX2VUAB-BeLKo9Pn.js} +2 -2
  19. package/dist/{chunk-4BX2VUAB-BS9gpN-y.js.map → chunk-4BX2VUAB-BeLKo9Pn.js.map} +1 -1
  20. package/dist/{chunk-R5LLSJPH-c1IfaK5D.js → chunk-4EGX6M5U-Bh9as06l.js} +13 -13
  21. package/dist/chunk-4EGX6M5U-Bh9as06l.js.map +1 -0
  22. package/dist/{chunk-55IACEB6-DZ-UBhHX.js → chunk-55IACEB6-CuKbiO89.js} +3 -3
  23. package/dist/{chunk-55IACEB6-DZ-UBhHX.js.map → chunk-55IACEB6-CuKbiO89.js.map} +1 -1
  24. package/dist/chunk-5DO6E6H7-CAB8pWf5.js +25 -0
  25. package/dist/chunk-5DO6E6H7-CAB8pWf5.js.map +1 -0
  26. package/dist/{chunk-GEFDOKGD-DGJJEGSm.js → chunk-5ZQYHXKU-CjOcwRY6.js} +570 -326
  27. package/dist/chunk-5ZQYHXKU-CjOcwRY6.js.map +1 -0
  28. package/dist/{chunk-WL4C6EOR-BV-op7zg.js → chunk-727SXJPM-kowsFLrz.js} +724 -569
  29. package/dist/chunk-727SXJPM-kowsFLrz.js.map +1 -0
  30. package/dist/{chunk-NQ4KR5QH-C0nWShNk.js → chunk-AQP2D5EJ-Bc1gUIeA.js} +384 -362
  31. package/dist/chunk-AQP2D5EJ-Bc1gUIeA.js.map +1 -0
  32. package/dist/{chunk-OZEHJAEY-BsQ56PV-.js → chunk-BR22UD5L-BCFxmd5-.js} +16 -16
  33. package/dist/chunk-BR22UD5L-BCFxmd5-.js.map +1 -0
  34. package/dist/{chunk-MX3YWQON-D43mcq1f.js → chunk-BSJP7CBP-Bl94i3-1.js} +7 -5
  35. package/dist/chunk-BSJP7CBP-Bl94i3-1.js.map +1 -0
  36. package/dist/chunk-CSCIHK7Q-DyRIc27i.js +2868 -0
  37. package/dist/chunk-CSCIHK7Q-DyRIc27i.js.map +1 -0
  38. package/dist/chunk-FHYWG6QK-kLWdRarG.js +25 -0
  39. package/dist/chunk-FHYWG6QK-kLWdRarG.js.map +1 -0
  40. package/dist/{chunk-FMBD7UC4-1IxrpdPX.js → chunk-FMBD7UC4-IdpWVRCU.js} +2 -2
  41. package/dist/{chunk-FMBD7UC4-1IxrpdPX.js.map → chunk-FMBD7UC4-IdpWVRCU.js.map} +1 -1
  42. package/dist/chunk-KSCS5N6A-CVcDS9QV.js +563 -0
  43. package/dist/chunk-KSCS5N6A-CVcDS9QV.js.map +1 -0
  44. package/dist/{chunk-YBOYWFTD-DkjEOcgZ.js → chunk-L5ZTLDWV-Day0EgsR.js} +9 -9
  45. package/dist/{chunk-YBOYWFTD-DkjEOcgZ.js.map → chunk-L5ZTLDWV-Day0EgsR.js.map} +1 -1
  46. package/dist/chunk-LZXEDZCA-BO_GpQSR.js +51 -0
  47. package/dist/chunk-LZXEDZCA-BO_GpQSR.js.map +1 -0
  48. package/dist/chunk-MPE355IW-BkN6MrMO.js +25 -0
  49. package/dist/chunk-MPE355IW-BkN6MrMO.js.map +1 -0
  50. package/dist/chunk-MZUSXYTE-94iWO-dh.js +32 -0
  51. package/dist/chunk-MZUSXYTE-94iWO-dh.js.map +1 -0
  52. package/dist/chunk-N66VUXT2-QbIUkiJZ.js +56 -0
  53. package/dist/chunk-N66VUXT2-QbIUkiJZ.js.map +1 -0
  54. package/dist/{chunk-JSJVCQXG-Do17yYig.js → chunk-ND2GUHAM-Boh7GenS.js} +6 -6
  55. package/dist/{chunk-JSJVCQXG-Do17yYig.js.map → chunk-ND2GUHAM-Boh7GenS.js.map} +1 -1
  56. package/dist/chunk-NNHCCRGN-CNU0zvRn.js +20603 -0
  57. package/dist/chunk-NNHCCRGN-CNU0zvRn.js.map +1 -0
  58. package/dist/{chunk-PQ6SQG4A-Cpfc5F4u.js → chunk-NZK2D7GU-D4Ird7wv.js} +4 -4
  59. package/dist/{chunk-PQ6SQG4A-Cpfc5F4u.js.map → chunk-NZK2D7GU-D4Ird7wv.js.map} +1 -1
  60. package/dist/{chunk-PU5JKC2W-DNpn_Yik.js → chunk-O5CBEL6O-DThtyjPO.js} +85 -74
  61. package/dist/{chunk-PU5JKC2W-DNpn_Yik.js.map → chunk-O5CBEL6O-DThtyjPO.js.map} +1 -1
  62. package/dist/chunk-PUPMXCY4-DsO2K8st.js +25 -0
  63. package/dist/chunk-PUPMXCY4-DsO2K8st.js.map +1 -0
  64. package/dist/{chunk-QZHKN3VN-kDNdTVLo.js → chunk-QZHKN3VN-DC5aJQQT.js} +2 -2
  65. package/dist/{chunk-QZHKN3VN-kDNdTVLo.js.map → chunk-QZHKN3VN-DC5aJQQT.js.map} +1 -1
  66. package/dist/chunk-UIBZB4QT-Cu3IcTk1.js +25 -0
  67. package/dist/chunk-UIBZB4QT-Cu3IcTk1.js.map +1 -0
  68. package/dist/chunk-WCWK7LTN-DpMt57Ty.js +33 -0
  69. package/dist/chunk-WCWK7LTN-DpMt57Ty.js.map +1 -0
  70. package/dist/chunk-WU5MYG2G-mzocEmS2.js +12 -0
  71. package/dist/{chunk-HHEYEP7N-DJ1b-gA8.js.map → chunk-WU5MYG2G-mzocEmS2.js.map} +1 -1
  72. package/dist/{chunk-XPW4576I-BqiPnb3d.js → chunk-XPW4576I-BwxN5U1_.js} +2 -2
  73. package/dist/{chunk-XPW4576I-BqiPnb3d.js.map → chunk-XPW4576I-BwxN5U1_.js.map} +1 -1
  74. package/dist/classDiagram-4FO5ZUOK-CZv04EX-.js +31 -0
  75. package/dist/{classDiagram-VBA2DB6C-DZfC0xPM.js.map → classDiagram-4FO5ZUOK-CZv04EX-.js.map} +1 -1
  76. package/dist/classDiagram-v2-Q7XG4LA2-aOPSPoxt.js +31 -0
  77. package/dist/{classDiagram-v2-RAHNMMFH-CtWRD1ax.js.map → classDiagram-v2-Q7XG4LA2-aOPSPoxt.js.map} +1 -1
  78. package/dist/component-COshXojx.js +163 -0
  79. package/dist/component-COshXojx.js.map +1 -0
  80. package/dist/components/brand/index.d.ts +8 -2
  81. package/dist/components/brand/index.d.ts.map +1 -1
  82. package/dist/components/brand/index.js +58 -31
  83. package/dist/components/brand/index.js.map +1 -1
  84. package/dist/components/brand/types.d.ts +8 -0
  85. package/dist/components/brand/types.d.ts.map +1 -1
  86. package/dist/components/index.js +1 -1
  87. package/dist/components/tree-view/index.d.ts.map +1 -1
  88. package/dist/components/tree-view/index.js +1 -1
  89. package/dist/{cose-bilkent-S5V4N54A-DxM02fly.js → cose-bilkent-S5V4N54A-D_hwzCJc.js} +7 -8
  90. package/dist/{cose-bilkent-S5V4N54A-DxM02fly.js.map → cose-bilkent-S5V4N54A-D_hwzCJc.js.map} +1 -1
  91. package/dist/{cytoscape.esm-2vKMh7AJ.js → cytoscape.esm-C85eXBIz.js} +1 -1
  92. package/dist/{cytoscape.esm-2vKMh7AJ.js.map → cytoscape.esm-C85eXBIz.js.map} +1 -1
  93. package/dist/dagre-BM42HDAG-DBqY2dVf.js +299 -0
  94. package/dist/dagre-BM42HDAG-DBqY2dVf.js.map +1 -0
  95. package/dist/dagre-IxFkiJHF.js +1938 -0
  96. package/dist/dagre-IxFkiJHF.js.map +1 -0
  97. package/dist/{defaultLocale-PLHpRrsr.js → defaultLocale-DSDxELFN.js} +1 -1
  98. package/dist/{defaultLocale-PLHpRrsr.js.map → defaultLocale-DSDxELFN.js.map} +1 -1
  99. package/dist/{diagram-IFDJBPK2-D-Enf1mK.js → diagram-2AECGRRQ-BwC5Qbme.js} +39 -39
  100. package/dist/{diagram-IFDJBPK2-D-Enf1mK.js.map → diagram-2AECGRRQ-BwC5Qbme.js.map} +1 -1
  101. package/dist/diagram-5GNKFQAL-BpJ9oZ4s.js +103 -0
  102. package/dist/diagram-5GNKFQAL-BpJ9oZ4s.js.map +1 -0
  103. package/dist/diagram-KO2AKTUF-kSLn21uw.js +434 -0
  104. package/dist/diagram-KO2AKTUF-kSLn21uw.js.map +1 -0
  105. package/dist/{diagram-P4PSJMXO-O8g_RIkM.js → diagram-LMA3HP47-BRqyGMLP.js} +43 -43
  106. package/dist/{diagram-P4PSJMXO-O8g_RIkM.js.map → diagram-LMA3HP47-BRqyGMLP.js.map} +1 -1
  107. package/dist/{diagram-E7M64L7V-Co7O3gub.js → diagram-OG6HWLK6-BsskLXHm.js} +171 -174
  108. package/dist/diagram-OG6HWLK6-BsskLXHm.js.map +1 -0
  109. package/dist/{dist-BrNloUiz.js → dist-BScrlPBC.js} +32 -23
  110. package/dist/dist-BScrlPBC.js.map +1 -0
  111. package/dist/{erDiagram-INFDFZHY-C42JeR9I.js → erDiagram-TEJ5UH35-DzB7hnCi.js} +198 -164
  112. package/dist/erDiagram-TEJ5UH35-DzB7hnCi.js.map +1 -0
  113. package/dist/eventmodeling-FCH6USID-HcA67HMu.js +3 -0
  114. package/dist/{flowDiagram-PKNHOUZH-DInJjOz3.js → flowDiagram-I6XJVG4X-RYkPtPRG.js} +453 -469
  115. package/dist/flowDiagram-I6XJVG4X-RYkPtPRG.js.map +1 -0
  116. package/dist/{ganttDiagram-A5KZAMGK-Dgp-4Yss.js → ganttDiagram-6RSMTGT7-BfjlFVNd.js} +340 -333
  117. package/dist/ganttDiagram-6RSMTGT7-BfjlFVNd.js.map +1 -0
  118. package/dist/gitGraph-WXDBUCRP-D60yP8mT.js +3 -0
  119. package/dist/gitGraphDiagram-PVQCEYII-DbUp_ElG.js +731 -0
  120. package/dist/gitGraphDiagram-PVQCEYII-DbUp_ElG.js.map +1 -0
  121. package/dist/graphlib-k-wJtbbK.js +1268 -0
  122. package/dist/graphlib-k-wJtbbK.js.map +1 -0
  123. package/dist/icons/lucide.d.ts +1 -2
  124. package/dist/icons/lucide.d.ts.map +1 -1
  125. package/dist/icons/lucide.js.map +1 -1
  126. package/dist/index.js +1 -1
  127. package/dist/info-J43DQDTF-DDmtkMBG.js +3 -0
  128. package/dist/{infoDiagram-LFFYTUFH-DajJJRvc.js → infoDiagram-5YYISTIA-C0TqWTrr.js} +7 -7
  129. package/dist/{infoDiagram-LFFYTUFH-DajJJRvc.js.map → infoDiagram-5YYISTIA-C0TqWTrr.js.map} +1 -1
  130. package/dist/{init-DcLTaNW1.js → init-CGzIZb6J.js} +1 -1
  131. package/dist/{init-DcLTaNW1.js.map → init-CGzIZb6J.js.map} +1 -1
  132. package/dist/{ishikawaDiagram-PHBUUO56-qHBJm2LT.js → ishikawaDiagram-YF4QCWOH-Cyk_Antz.js} +98 -97
  133. package/dist/ishikawaDiagram-YF4QCWOH-Cyk_Antz.js.map +1 -0
  134. package/dist/{journeyDiagram-4ABVD52K-PgfYdoDM.js → journeyDiagram-JHISSGLW-CTl8eDDe.js} +78 -78
  135. package/dist/journeyDiagram-JHISSGLW-CTl8eDDe.js.map +1 -0
  136. package/dist/{kanban-definition-K7BYSVSG-DFRT8j7A.js → kanban-definition-UN3LZRKU-homeDoHF.js} +46 -44
  137. package/dist/{kanban-definition-K7BYSVSG-DFRT8j7A.js.map → kanban-definition-UN3LZRKU-homeDoHF.js.map} +1 -1
  138. package/dist/{katex-BZdHnXin.js → katex-CgkxVokH.js} +1 -1
  139. package/dist/{katex-BZdHnXin.js.map → katex-CgkxVokH.js.map} +1 -1
  140. package/dist/line-k_aZSToM.js +36 -0
  141. package/dist/{line-Cq1AZT4f.js.map → line-k_aZSToM.js.map} +1 -1
  142. package/dist/{linear-BnJD01Xn.js → linear-Dpcbf4VP.js} +5 -5
  143. package/dist/{linear-BnJD01Xn.js.map → linear-Dpcbf4VP.js.map} +1 -1
  144. package/dist/{mermaid-parser.core-Dz5qv4CI.js → mermaid-parser.core-B_q76LYz.js} +32 -17
  145. package/dist/mermaid-parser.core-B_q76LYz.js.map +1 -0
  146. package/dist/mermaid.core-DAh-gNcn.js +997 -0
  147. package/dist/mermaid.core-DAh-gNcn.js.map +1 -0
  148. package/dist/{mindmap-definition-YRQLILUH-D95OPRMh.js → mindmap-definition-RKZ34NQL-Cjglmmr7.js} +153 -108
  149. package/dist/mindmap-definition-RKZ34NQL-Cjglmmr7.js.map +1 -0
  150. package/dist/{ordinal-CC9tfh_g.js → ordinal-DHGdAr1Y.js} +2 -2
  151. package/dist/{ordinal-CC9tfh_g.js.map → ordinal-DHGdAr1Y.js.map} +1 -1
  152. package/dist/packet-YPE3B663-Bo9N32Mb.js +3 -0
  153. package/dist/{path-y0uQCOMW.js → path-D-DDb3Wo.js} +1 -1
  154. package/dist/{path-y0uQCOMW.js.map → path-D-DDb3Wo.js.map} +1 -1
  155. package/dist/pie-LRSECV5Y-DndCyILX.js +3 -0
  156. package/dist/pieDiagram-4H26LBE5-Swbny_uk.js +167 -0
  157. package/dist/pieDiagram-4H26LBE5-Swbny_uk.js.map +1 -0
  158. package/dist/{quadrantDiagram-337W2JSQ-CcKc-h2o.js → quadrantDiagram-W4KKPZXB-kyt1iJkC.js} +359 -332
  159. package/dist/quadrantDiagram-W4KKPZXB-kyt1iJkC.js.map +1 -0
  160. package/dist/radar-GUYGQ44K-DpLG1fRN.js +3 -0
  161. package/dist/react/brand/index.d.ts +13 -1
  162. package/dist/react/brand/index.d.ts.map +1 -1
  163. package/dist/react/brand.js +28 -3
  164. package/dist/react/brand.js.map +1 -1
  165. package/dist/react/sidebar.d.ts +22 -1
  166. package/dist/react/sidebar.d.ts.map +1 -1
  167. package/dist/react/sidebar.js +26 -2
  168. package/dist/react/sidebar.js.map +1 -1
  169. package/dist/react/topology.js +1 -1
  170. package/dist/react.js +100 -100
  171. package/dist/{requirementDiagram-Z7DCOOCP-aPcaPduF.js → requirementDiagram-4Y6WPE33-DWRks7dz.js} +153 -133
  172. package/dist/requirementDiagram-4Y6WPE33-DWRks7dz.js.map +1 -0
  173. package/dist/{rough.esm-C9rQ9YkE.js → rough.esm-C7tiDdBn.js} +1 -1
  174. package/dist/{rough.esm-C9rQ9YkE.js.map → rough.esm-C7tiDdBn.js.map} +1 -1
  175. package/dist/{sankeyDiagram-WA2Y5GQK-CO_lUqQX.js → sankeyDiagram-5OEKKPKP-J_SVMd-0.js} +125 -76
  176. package/dist/{sankeyDiagram-WA2Y5GQK-CO_lUqQX.js.map → sankeyDiagram-5OEKKPKP-J_SVMd-0.js.map} +1 -1
  177. package/dist/sequenceDiagram-3UESZ5HK-BMhjbe8U.js +4167 -0
  178. package/dist/sequenceDiagram-3UESZ5HK-BMhjbe8U.js.map +1 -0
  179. package/dist/sidebar/component.d.ts +5 -0
  180. package/dist/sidebar/component.d.ts.map +1 -1
  181. package/dist/sidebar/index.d.ts +1 -1
  182. package/dist/sidebar/index.d.ts.map +1 -1
  183. package/dist/sidebar/index.js +1 -1
  184. package/dist/sidebar/index.js.map +1 -1
  185. package/dist/sidebar/types.d.ts +59 -0
  186. package/dist/sidebar/types.d.ts.map +1 -1
  187. package/dist/{src-D1EMXotX.js → src-CWnvxuyh.js} +603 -591
  188. package/dist/{src-D1EMXotX.js.map → src-CWnvxuyh.js.map} +1 -1
  189. package/dist/{src-BhNgmpel.js → src-DngnQkx_.js} +4 -5
  190. package/dist/{src-BhNgmpel.js.map → src-DngnQkx_.js.map} +1 -1
  191. package/dist/stateDiagram-AJRCARHV-x4JHehDk.js +220 -0
  192. package/dist/stateDiagram-AJRCARHV-x4JHehDk.js.map +1 -0
  193. package/dist/stateDiagram-v2-BHNVJYJU-CO93vpHl.js +29 -0
  194. package/dist/{stateDiagram-v2-FVOUBMTO-CAWy0Pkh.js.map → stateDiagram-v2-BHNVJYJU-CO93vpHl.js.map} +1 -1
  195. package/dist/styles/components/brand.css +30 -0
  196. package/dist/styles/sidebar.css +586 -6
  197. package/dist/styles/tenant-ui.css +3 -4
  198. package/dist/styles/threat-library.css +0 -1
  199. package/dist/styles/tokens.css +0 -1
  200. package/dist/{timeline-definition-YZTLITO2-CjxxCuOg.js → timeline-definition-PNZ67QCA-rsiMN1-p.js} +517 -279
  201. package/dist/timeline-definition-PNZ67QCA-rsiMN1-p.js.map +1 -0
  202. package/dist/{topology-C8cyIHlB.js → topology-B9Lv-y1-.js} +181 -182
  203. package/dist/{topology-C8cyIHlB.js.map → topology-B9Lv-y1-.js.map} +1 -1
  204. package/dist/{tree-view-SpbHG9Yi.js → tree-view-gML5wGlz.js} +3 -3
  205. package/dist/{tree-view-SpbHG9Yi.js.map → tree-view-gML5wGlz.js.map} +1 -1
  206. package/dist/treeView-BLDUP644-mJdM3Q6x.js +3 -0
  207. package/dist/treemap-LRROVOQU-BbNMhR6z.js +3 -0
  208. package/dist/{value-gSPnIECy.js → value-CnwEagIg.js} +2 -2
  209. package/dist/{value-gSPnIECy.js.map → value-CnwEagIg.js.map} +1 -1
  210. package/dist/{vennDiagram-LZ73GAT5-FqpGoq2s.js → vennDiagram-CIIHVFJN-JUCgWboO.js} +98 -98
  211. package/dist/{vennDiagram-LZ73GAT5-FqpGoq2s.js.map → vennDiagram-CIIHVFJN-JUCgWboO.js.map} +1 -1
  212. package/dist/visualization/mermaid-diagram/index.js +1 -1
  213. package/dist/wardley-L42UT6IY-DB53GwcN.js +3 -0
  214. package/dist/wardleyDiagram-YWT4CUSO-D9ZPcSHL.js +646 -0
  215. package/dist/wardleyDiagram-YWT4CUSO-D9ZPcSHL.js.map +1 -0
  216. package/dist/{xychartDiagram-JWTSCODW-BNEAK79X.js → xychartDiagram-2RQKCTM6-D3ufsY0S.js} +146 -143
  217. package/dist/{xychartDiagram-JWTSCODW-BNEAK79X.js.map → xychartDiagram-2RQKCTM6-D3ufsY0S.js.map} +1 -1
  218. package/package.json +1 -1
  219. package/src/components/brand/index.ts +63 -0
  220. package/src/components/brand/types.ts +9 -0
  221. package/src/components/theme/theme-studio-review.test.ts +34 -0
  222. package/src/components/tree-view/index.ts +0 -2
  223. package/src/icons/lucide.ts +1 -2
  224. package/src/react/brand/index.test.tsx +28 -0
  225. package/src/react/brand/index.tsx +38 -0
  226. package/src/react/sidebar.test.tsx +30 -0
  227. package/src/react/sidebar.tsx +52 -1
  228. package/src/sidebar/component.test.ts +109 -0
  229. package/src/sidebar/component.ts +233 -44
  230. package/src/sidebar/index.ts +1 -0
  231. package/src/sidebar/types.ts +60 -0
  232. package/src/styles/components/brand.css +30 -0
  233. package/src/styles/sidebar.css +586 -6
  234. package/src/styles/tenant-ui.css +3 -4
  235. package/src/styles/threat-library.css +0 -1
  236. package/src/styles/tokens.css +0 -1
  237. package/dist/_basePickBy-BQMPE4-n.js +0 -168
  238. package/dist/_basePickBy-BQMPE4-n.js.map +0 -1
  239. package/dist/_baseUniq-Bdp_vFUv.js +0 -684
  240. package/dist/_baseUniq-Bdp_vFUv.js.map +0 -1
  241. package/dist/architecture-PBZL5I3N-Zk3GmKE8.js +0 -3
  242. package/dist/blockDiagram-WCTKOSBZ-BH3jwWeU.js.map +0 -1
  243. package/dist/c4Diagram-IC4MRINW-OFLrunYI.js.map +0 -1
  244. package/dist/channel-LRbq43st.js +0 -7
  245. package/dist/chunk-7E7YKBS2-BsywoVTt.js +0 -25
  246. package/dist/chunk-7E7YKBS2-BsywoVTt.js.map +0 -1
  247. package/dist/chunk-7R4GIKGN-DJmroLCH.js +0 -2054
  248. package/dist/chunk-7R4GIKGN-DJmroLCH.js.map +0 -1
  249. package/dist/chunk-C72U2L5F-BwPwVDcP.js +0 -25
  250. package/dist/chunk-C72U2L5F-BwPwVDcP.js.map +0 -1
  251. package/dist/chunk-EGIJ26TM-DKd5cEgn.js +0 -25
  252. package/dist/chunk-EGIJ26TM-DKd5cEgn.js.map +0 -1
  253. package/dist/chunk-GEFDOKGD-DGJJEGSm.js.map +0 -1
  254. package/dist/chunk-GLR3WWYH-BDwmgwCA.js +0 -43
  255. package/dist/chunk-GLR3WWYH-BDwmgwCA.js.map +0 -1
  256. package/dist/chunk-HHEYEP7N-DJ1b-gA8.js +0 -12
  257. package/dist/chunk-KYZI473N-BXYCe83A.js +0 -3437
  258. package/dist/chunk-KYZI473N-BXYCe83A.js.map +0 -1
  259. package/dist/chunk-L3YUKLVL-Y5k8UNMf.js +0 -25
  260. package/dist/chunk-L3YUKLVL-Y5k8UNMf.js.map +0 -1
  261. package/dist/chunk-MX3YWQON-D43mcq1f.js.map +0 -1
  262. package/dist/chunk-NBPlniwU.js +0 -23
  263. package/dist/chunk-NQ4KR5QH-C0nWShNk.js.map +0 -1
  264. package/dist/chunk-O4XLMI2P-DtGEm9QX.js +0 -514
  265. package/dist/chunk-O4XLMI2P-DtGEm9QX.js.map +0 -1
  266. package/dist/chunk-OZEHJAEY-BsQ56PV-.js.map +0 -1
  267. package/dist/chunk-R5LLSJPH-c1IfaK5D.js.map +0 -1
  268. package/dist/chunk-WL4C6EOR-BV-op7zg.js.map +0 -1
  269. package/dist/chunk-XIRO2GV7-Bv1hlNLi.js +0 -32
  270. package/dist/chunk-XIRO2GV7-Bv1hlNLi.js.map +0 -1
  271. package/dist/chunk-XZSTWKYB-C7maKWEr.js +0 -15799
  272. package/dist/chunk-XZSTWKYB-C7maKWEr.js.map +0 -1
  273. package/dist/classDiagram-VBA2DB6C-DZfC0xPM.js +0 -31
  274. package/dist/classDiagram-v2-RAHNMMFH-CtWRD1ax.js +0 -31
  275. package/dist/clone-CliVdNc8.js +0 -10
  276. package/dist/clone-CliVdNc8.js.map +0 -1
  277. package/dist/component-C1Jiz1Ki.js +0 -103
  278. package/dist/component-C1Jiz1Ki.js.map +0 -1
  279. package/dist/dagre-BqC9mhMk.js +0 -1485
  280. package/dist/dagre-BqC9mhMk.js.map +0 -1
  281. package/dist/dagre-KLK3FWXG-DTKcsol6.js +0 -296
  282. package/dist/dagre-KLK3FWXG-DTKcsol6.js.map +0 -1
  283. package/dist/diagram-E7M64L7V-Co7O3gub.js.map +0 -1
  284. package/dist/dist-BrNloUiz.js.map +0 -1
  285. package/dist/erDiagram-INFDFZHY-C42JeR9I.js.map +0 -1
  286. package/dist/flowDiagram-PKNHOUZH-DInJjOz3.js.map +0 -1
  287. package/dist/ganttDiagram-A5KZAMGK-Dgp-4Yss.js.map +0 -1
  288. package/dist/gitGraph-HDMCJU4V-D_QsK6Rt.js +0 -3
  289. package/dist/gitGraphDiagram-K3NZZRJ6-Dr_X0dND.js +0 -628
  290. package/dist/gitGraphDiagram-K3NZZRJ6-Dr_X0dND.js.map +0 -1
  291. package/dist/graphlib-ecencZTG.js +0 -227
  292. package/dist/graphlib-ecencZTG.js.map +0 -1
  293. package/dist/info-3K5VOQVL-BbLiZXwn.js +0 -3
  294. package/dist/isArrayLikeObject-Bjsxaqj7.js +0 -580
  295. package/dist/isArrayLikeObject-Bjsxaqj7.js.map +0 -1
  296. package/dist/isEmpty-CeZZUVts.js +0 -37
  297. package/dist/isEmpty-CeZZUVts.js.map +0 -1
  298. package/dist/ishikawaDiagram-PHBUUO56-qHBJm2LT.js.map +0 -1
  299. package/dist/journeyDiagram-4ABVD52K-PgfYdoDM.js.map +0 -1
  300. package/dist/line-Cq1AZT4f.js +0 -36
  301. package/dist/math-D4gdAuwG.js +0 -12
  302. package/dist/math-D4gdAuwG.js.map +0 -1
  303. package/dist/mermaid-parser.core-Dz5qv4CI.js.map +0 -1
  304. package/dist/mermaid.core-DTiIXVKa.js +0 -923
  305. package/dist/mermaid.core-DTiIXVKa.js.map +0 -1
  306. package/dist/mindmap-definition-YRQLILUH-D95OPRMh.js.map +0 -1
  307. package/dist/packet-RMMSAZCW-D72DRs1N.js +0 -3
  308. package/dist/pie-UPGHQEXC-C8RDLrEi.js +0 -3
  309. package/dist/pieDiagram-SKSYHLDU-BREEn_Sk.js +0 -167
  310. package/dist/pieDiagram-SKSYHLDU-BREEn_Sk.js.map +0 -1
  311. package/dist/quadrantDiagram-337W2JSQ-CcKc-h2o.js.map +0 -1
  312. package/dist/radar-KQ55EAFF-DhmvjiyN.js +0 -3
  313. package/dist/requirementDiagram-Z7DCOOCP-aPcaPduF.js.map +0 -1
  314. package/dist/sequenceDiagram-2WXFIKYE-D7Vh1Zld.js +0 -4112
  315. package/dist/sequenceDiagram-2WXFIKYE-D7Vh1Zld.js.map +0 -1
  316. package/dist/stateDiagram-RAJIS63D-DdiY5cf3.js +0 -220
  317. package/dist/stateDiagram-RAJIS63D-DdiY5cf3.js.map +0 -1
  318. package/dist/stateDiagram-v2-FVOUBMTO-CAWy0Pkh.js +0 -29
  319. package/dist/timeline-definition-YZTLITO2-CjxxCuOg.js.map +0 -1
  320. package/dist/treemap-KZPCXAKY-BvLvHb2t.js +0 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@countermeasure-platform/web-components",
3
- "version": "1.2.1",
3
+ "version": "1.2.2-dev.15.1",
4
4
  "description": "Shared web components for CounterMeasure applications - consolidates common frontend functionality across projects.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import {
7
+ type BrandLockupConfig,
7
8
  type BrandSize,
8
9
  type ConnectorLogoConfig,
9
10
  type ConnectorLogoSize,
@@ -14,6 +15,7 @@ import { resolveContainer, uniqueId } from '../../primitives/utils'
14
15
 
15
16
  export type {
16
17
  BrandSize,
18
+ BrandLockupConfig,
17
19
  ConnectorLogoConfig,
18
20
  ConnectorLogoSize,
19
21
  DiamondConfig,
@@ -132,6 +134,23 @@ export class Wordmark {
132
134
  }
133
135
  }
134
136
 
137
+ export class BrandLockup {
138
+ public readonly el: HTMLSpanElement
139
+
140
+ constructor(config: BrandLockupConfig = {}) {
141
+ this.el = createBrandLockupElement(config)
142
+
143
+ if (config.container !== undefined) {
144
+ const parent = resolveContainer(config.container)
145
+ parent.appendChild(this.el)
146
+ }
147
+ }
148
+
149
+ destroy(): void {
150
+ this.el.remove()
151
+ }
152
+ }
153
+
135
154
  export class ConnectorLogo {
136
155
  public readonly el: HTMLSpanElement
137
156
 
@@ -230,6 +249,40 @@ export function createWordmarkSvg(config: WordmarkConfig = {}): SVGSVGElement {
230
249
  return svg
231
250
  }
232
251
 
252
+ export function createBrandLockupElement(config: BrandLockupConfig = {}): HTMLSpanElement {
253
+ const el = document.createElement('span')
254
+ el.id = uniqueId('cmm-brand-lockup')
255
+ el.className = buildBrandLockupClassName(config)
256
+
257
+ if (config.decorative === true) {
258
+ el.setAttribute('aria-hidden', 'true')
259
+ } else {
260
+ el.setAttribute('role', 'img')
261
+ el.setAttribute('aria-label', config.label ?? 'CounterMeasure')
262
+ }
263
+
264
+ el.appendChild(createDiamondSvg({ size: config.markSize ?? 22, decorative: true }))
265
+
266
+ if (config.showWordmark !== false) {
267
+ const wordmark = document.createElement('span')
268
+ wordmark.className = 'cmm-brand-lockup__wordmark'
269
+ wordmark.setAttribute('aria-hidden', 'true')
270
+
271
+ const counter = document.createElement('span')
272
+ counter.className = 'cmm-brand-lockup__counter'
273
+ counter.textContent = 'COUNTER'
274
+
275
+ const measure = document.createElement('span')
276
+ measure.className = 'cmm-brand-lockup__measure'
277
+ measure.textContent = 'MEASURE'
278
+
279
+ wordmark.append(counter, measure)
280
+ el.appendChild(wordmark)
281
+ }
282
+
283
+ return el
284
+ }
285
+
233
286
  export function getConnectorLogoColor(name: string): string {
234
287
  const paletteKey = getConnectorPaletteKey(name)
235
288
  return CONNECTOR_LOGO_PALETTE[paletteKey]
@@ -268,6 +321,16 @@ function buildWordmarkClassName(config: WordmarkConfig): string {
268
321
  return classes.join(' ')
269
322
  }
270
323
 
324
+ function buildBrandLockupClassName(config: BrandLockupConfig): string {
325
+ const classes = ['cmm-brand-lockup']
326
+
327
+ if (config.className) {
328
+ classes.push(config.className)
329
+ }
330
+
331
+ return classes.join(' ')
332
+ }
333
+
271
334
  function buildConnectorLogoClassName(config: ConnectorLogoConfig): string {
272
335
  const classes = [
273
336
  'cmm-connector-logo',
@@ -25,6 +25,15 @@ export interface WordmarkConfig {
25
25
  className?: string
26
26
  }
27
27
 
28
+ export interface BrandLockupConfig {
29
+ container?: HTMLElement | string
30
+ markSize?: BrandSize | number
31
+ label?: string
32
+ decorative?: boolean
33
+ showWordmark?: boolean
34
+ className?: string
35
+ }
36
+
28
37
  export interface ConnectorLogoConfig {
29
38
  container?: HTMLElement | string
30
39
  name: string
@@ -154,6 +154,40 @@ describe('IconGalleryBrowser accessibility', () => {
154
154
 
155
155
  picker.destroy()
156
156
  })
157
+
158
+ it.each([
159
+ { iconSet: 'lucide', strokeWidth: '2', linecap: 'round', linejoin: 'round', heading: /All Icons — Lucide style/ },
160
+ { iconSet: 'heroicons', strokeWidth: '2.4', linecap: 'round', linejoin: 'round', heading: /All Icons — Heroicons style/ },
161
+ { iconSet: 'phosphor', strokeWidth: '1.5', linecap: 'round', linejoin: 'round', heading: /All Icons — Phosphor style/ },
162
+ { iconSet: 'material', strokeWidth: '2', linecap: 'square', linejoin: 'miter', heading: /All Icons — Material style/ },
163
+ {
164
+ iconSet: 'countermeasure',
165
+ strokeWidth: '1.75',
166
+ linecap: 'round',
167
+ linejoin: 'round',
168
+ heading: /CounterMeasure Brand Icons/,
169
+ },
170
+ ] as const)(
171
+ 'applies the $iconSet stroke and linecap to gallery cells',
172
+ ({ iconSet, strokeWidth, linecap, linejoin, heading }) => {
173
+ const picker = new IconGalleryBrowser()
174
+ document.body.appendChild(picker.el)
175
+
176
+ setThemePartial({ iconSet })
177
+ requireButton(picker.el, '.theme-studio-icon-gallery__toggle').click()
178
+
179
+ const heading_el = requireElement(picker.el, '.theme-studio-icon-gallery__heading')
180
+ expect(heading_el.textContent ?? '').toMatch(heading)
181
+
182
+ const svg = picker.el.querySelector('.theme-studio-icon-gallery__cell svg')
183
+ expect(svg).toBeTruthy()
184
+ expect(svg?.getAttribute('stroke-width')).toBe(strokeWidth)
185
+ expect(svg?.getAttribute('stroke-linecap')).toBe(linecap)
186
+ expect(svg?.getAttribute('stroke-linejoin')).toBe(linejoin)
187
+
188
+ picker.destroy()
189
+ }
190
+ )
157
191
  })
158
192
 
159
193
  describe('IconSetPicker event listener cleanup', () => {
@@ -583,13 +583,11 @@ export class TreeView {
583
583
  toggle.setAttribute('aria-hidden', 'true')
584
584
 
585
585
  if (isExpandable) {
586
- toggle.textContent = node.expanded === true ? '\u25BE' : '\u25B8'
587
586
  toggle.addEventListener('click', (e: Event) => {
588
587
  e.stopPropagation()
589
588
  void this.handleToggle(node)
590
589
  })
591
590
  } else {
592
- toggle.textContent = ' '
593
591
  toggle.style.visibility = 'hidden'
594
592
  }
595
593
 
@@ -1,6 +1,5 @@
1
1
  /**
2
- * Canonical Lucide path data from
3
- * `CounterMeasure Design System/assets/lucide-icons.json`.
2
+ * Canonical Lucide path data bundled with the package.
4
3
  */
5
4
 
6
5
  export const LUCIDE_ICON_PATHS = {
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { render } from '@testing-library/react'
3
+
4
+ import { BrandLockup, CounterMeasureBrandLockup } from './index'
5
+
6
+ describe('React brand lockup', () => {
7
+ it('renders the shared CounterMeasure lockup with split brand text', () => {
8
+ const { container } = render(<BrandLockup />)
9
+ const lockup = container.querySelector('.cmm-brand-lockup')
10
+
11
+ expect(lockup).toBeTruthy()
12
+ expect(lockup?.getAttribute('role')).toBe('img')
13
+ expect(lockup?.getAttribute('aria-label')).toBe('CounterMeasure')
14
+ expect(lockup?.querySelector('.cmm-diamond')).toBeTruthy()
15
+ expect(lockup?.textContent).toBe('COUNTERMEASURE')
16
+ expect(lockup?.querySelector('.cmm-brand-lockup__counter')?.textContent).toBe('COUNTER')
17
+ expect(lockup?.querySelector('.cmm-brand-lockup__measure')?.textContent).toBe('MEASURE')
18
+ })
19
+
20
+ it('can render mark-only for collapsed sidebars', () => {
21
+ const { container } = render(<CounterMeasureBrandLockup showWordmark={false} decorative />)
22
+ const lockup = container.querySelector('.cmm-brand-lockup')
23
+
24
+ expect(lockup?.getAttribute('aria-hidden')).toBe('true')
25
+ expect(lockup?.querySelector('.cmm-diamond')).toBeTruthy()
26
+ expect(lockup?.querySelector('.cmm-brand-lockup__wordmark')).toBeNull()
27
+ })
28
+ })
@@ -13,6 +13,7 @@ import {
13
13
  getConnectorLogoSizeClass,
14
14
  getConnectorLogoTone,
15
15
  type BrandSize,
16
+ type BrandLockupConfig,
16
17
  type ConnectorLogoSize,
17
18
  type WordmarkVariant,
18
19
  } from '../../components/brand'
@@ -159,6 +160,38 @@ export function Wordmark({
159
160
  )
160
161
  }
161
162
 
163
+ export interface BrandLockupProps extends React.HTMLAttributes<HTMLSpanElement> {
164
+ markSize?: BrandSize | number
165
+ label?: string
166
+ decorative?: boolean
167
+ showWordmark?: boolean
168
+ }
169
+
170
+ export function BrandLockup({
171
+ className,
172
+ markSize = 22,
173
+ label = 'CounterMeasure',
174
+ decorative = false,
175
+ showWordmark = true,
176
+ ...props
177
+ }: BrandLockupProps) {
178
+ const accessibilityProps = decorative
179
+ ? { 'aria-hidden': true }
180
+ : { role: 'img', 'aria-label': label }
181
+
182
+ return (
183
+ <span className={cn('cmm-brand-lockup', className)} {...accessibilityProps} {...props}>
184
+ <Diamond size={markSize} decorative />
185
+ {showWordmark ? (
186
+ <span className="cmm-brand-lockup__wordmark" aria-hidden="true">
187
+ <span className="cmm-brand-lockup__counter">COUNTER</span>
188
+ <span className="cmm-brand-lockup__measure">MEASURE</span>
189
+ </span>
190
+ ) : null}
191
+ </span>
192
+ )
193
+ }
194
+
162
195
  export interface ConnectorLogoProps extends React.HTMLAttributes<HTMLSpanElement> {
163
196
  name: string
164
197
  src?: string
@@ -211,8 +244,13 @@ export type CountermeasureLogoProps = DiamondProps
211
244
  export type CounterMeasureLogoProps = DiamondProps
212
245
  export type CountermeasureWordmarkProps = WordmarkProps
213
246
  export type CounterMeasureWordmarkProps = WordmarkProps
247
+ export type CountermeasureBrandLockupProps = BrandLockupProps
248
+ export type CounterMeasureBrandLockupProps = BrandLockupProps
249
+ export type { BrandLockupConfig }
214
250
 
215
251
  export const CountermeasureLogo = Diamond
216
252
  export const CounterMeasureLogo = Diamond
217
253
  export const CountermeasureWordmark = Wordmark
218
254
  export const CounterMeasureWordmark = Wordmark
255
+ export const CountermeasureBrandLockup = BrandLockup
256
+ export const CounterMeasureBrandLockup = BrandLockup
@@ -0,0 +1,30 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { render } from '@testing-library/react'
3
+
4
+ import { SidebarCollapseButton } from './sidebar'
5
+
6
+ describe('SidebarCollapseButton', () => {
7
+ it('renders the shared edge-docked collapse control', () => {
8
+ const { container } = render(<SidebarCollapseButton edge />)
9
+ const button = container.querySelector('button')
10
+
11
+ expect(button).toBeTruthy()
12
+ expect(button?.getAttribute('aria-label')).toBe('Collapse sidebar')
13
+ expect(button?.getAttribute('aria-expanded')).toBe('true')
14
+ expect(button?.getAttribute('title')).toBe('Collapse sidebar')
15
+ expect(button?.classList.contains('sidebar__collapse-btn')).toBe(true)
16
+ expect(button?.classList.contains('sidebar__collapse-btn--edge')).toBe(true)
17
+ expect(button?.querySelector('path')?.getAttribute('d')).toBe('m15 18-6-6 6-6')
18
+ })
19
+
20
+ it('switches affordance metadata for collapsed sidebars', () => {
21
+ const { container } = render(<SidebarCollapseButton collapsed edge visible />)
22
+ const button = container.querySelector('button')
23
+
24
+ expect(button?.getAttribute('aria-label')).toBe('Expand sidebar')
25
+ expect(button?.getAttribute('aria-expanded')).toBe('false')
26
+ expect(button?.getAttribute('data-collapsed')).toBe('true')
27
+ expect(button?.getAttribute('data-visible')).toBe('true')
28
+ expect(button?.querySelector('path')?.getAttribute('d')).toBe('m9 18 6-6-6-6')
29
+ })
30
+ })
@@ -35,6 +35,14 @@ export interface SidebarProps extends Omit<
35
35
 
36
36
  export type { SidebarNavItem, SidebarSection, SidebarUser, SidebarFooterAction }
37
37
 
38
+ export interface SidebarCollapseButtonProps
39
+ extends React.ButtonHTMLAttributes<HTMLButtonElement> {
40
+ collapsed?: boolean
41
+ edge?: boolean
42
+ visible?: boolean
43
+ label?: string
44
+ }
45
+
38
46
  function Sidebar({ activeItemId, onNavigate, onCollapse, className, ...config }: SidebarProps) {
39
47
  const containerRef = React.useRef<HTMLDivElement>(null)
40
48
  const sidebarRef = React.useRef<SidebarComponent | null>(null)
@@ -73,4 +81,47 @@ function Sidebar({ activeItemId, onNavigate, onCollapse, className, ...config }:
73
81
 
74
82
  Sidebar.displayName = 'Sidebar'
75
83
 
76
- export { Sidebar }
84
+ function SidebarCollapseButton({
85
+ collapsed = false,
86
+ edge = false,
87
+ visible = false,
88
+ label,
89
+ className,
90
+ type = 'button',
91
+ children,
92
+ ...props
93
+ }: SidebarCollapseButtonProps) {
94
+ const resolvedLabel = label ?? (collapsed ? 'Expand sidebar' : 'Collapse sidebar')
95
+ const path = collapsed ? 'm9 18 6-6-6-6' : 'm15 18-6-6 6-6'
96
+
97
+ return (
98
+ <button
99
+ type={type}
100
+ className={cn('sidebar__collapse-btn', edge && 'sidebar__collapse-btn--edge', className)}
101
+ aria-label={resolvedLabel}
102
+ aria-expanded={!collapsed}
103
+ title={resolvedLabel}
104
+ data-collapsed={collapsed ? 'true' : 'false'}
105
+ data-visible={visible ? 'true' : undefined}
106
+ {...props}
107
+ >
108
+ {children ?? (
109
+ <svg
110
+ aria-hidden="true"
111
+ viewBox="0 0 24 24"
112
+ fill="none"
113
+ stroke="currentColor"
114
+ strokeWidth="2"
115
+ strokeLinecap="round"
116
+ strokeLinejoin="round"
117
+ >
118
+ <path d={path} />
119
+ </svg>
120
+ )}
121
+ </button>
122
+ )
123
+ }
124
+
125
+ SidebarCollapseButton.displayName = 'SidebarCollapseButton'
126
+
127
+ export { Sidebar, SidebarCollapseButton }
@@ -0,0 +1,109 @@
1
+ import { describe, expect, it, vi } from 'vitest'
2
+
3
+ import { SidebarComponent } from './component'
4
+
5
+ function createContainer(): HTMLElement {
6
+ const container = document.createElement('div')
7
+ container.style.height = '320px'
8
+ document.body.appendChild(container)
9
+ return container
10
+ }
11
+
12
+ describe('SidebarComponent', () => {
13
+ it('renders brand header, scroll body, and edge collapse control when configured', () => {
14
+ const container = createContainer()
15
+ const sidebar = new SidebarComponent({
16
+ container,
17
+ variant: 'product',
18
+ brand: { label: 'CounterMeasure' },
19
+ collapsible: true,
20
+ collapseButtonVisible: true,
21
+ sections: [
22
+ {
23
+ id: 'main',
24
+ label: 'Main',
25
+ items: [
26
+ { id: 'dashboard', label: 'Dashboard', icon: 'dashboard', badge: 3, badgeTone: 'amber' },
27
+ ],
28
+ },
29
+ ],
30
+ })
31
+
32
+ expect(container.querySelector('.sidebar')?.classList.contains('sidebar--product')).toBe(true)
33
+ expect(container.querySelector('.sidebar')?.getAttribute('data-sidebar')).toBe('product')
34
+ expect(container.querySelector('.sidebar__header .cmm-brand-lockup')).toBeTruthy()
35
+ expect(container.querySelector('.sidebar__body .sidebar__section')).toBeTruthy()
36
+ expect(container.querySelector('.sidebar__badge--amber')?.textContent).toBe('3')
37
+ expect(container.querySelector('.sidebar__item')?.getAttribute('data-badge-visible')).toBe('true')
38
+ expect(container.querySelector('.sidebar__item')?.getAttribute('data-badge-tone')).toBe('amber')
39
+
40
+ const collapseButton = container.querySelector<HTMLButtonElement>('.sidebar__collapse-btn--edge')
41
+ expect(collapseButton).toBeTruthy()
42
+ expect(collapseButton?.getAttribute('aria-label')).toBe('Collapse sidebar')
43
+ expect(collapseButton?.getAttribute('aria-expanded')).toBe('true')
44
+ expect(collapseButton?.getAttribute('data-visible')).toBe('true')
45
+
46
+ sidebar.destroy()
47
+ container.remove()
48
+ })
49
+
50
+ it('updates collapse control state and emits collapse callbacks', () => {
51
+ const container = createContainer()
52
+ const onCollapse = vi.fn()
53
+ const sidebar = new SidebarComponent({
54
+ container,
55
+ collapsible: true,
56
+ sections: [
57
+ {
58
+ id: 'main',
59
+ items: [{ id: 'dashboard', label: 'Dashboard' }],
60
+ },
61
+ ],
62
+ onCollapse,
63
+ })
64
+
65
+ const collapseButton = container.querySelector<HTMLButtonElement>('.sidebar__collapse-btn--edge')
66
+ collapseButton?.click()
67
+
68
+ expect(container.querySelector('.sidebar')?.classList.contains('sidebar--collapsed')).toBe(true)
69
+ expect(collapseButton?.getAttribute('aria-label')).toBe('Expand sidebar')
70
+ expect(collapseButton?.getAttribute('aria-expanded')).toBe('false')
71
+ expect(onCollapse).toHaveBeenCalledWith(true)
72
+
73
+ sidebar.expand()
74
+ expect(collapseButton?.getAttribute('aria-label')).toBe('Collapse sidebar')
75
+ expect(collapseButton?.getAttribute('aria-expanded')).toBe('true')
76
+ expect(onCollapse).toHaveBeenLastCalledWith(false)
77
+
78
+ sidebar.destroy()
79
+ container.remove()
80
+ })
81
+
82
+ it('updates compact badge-dot visibility state when badge counts change', () => {
83
+ const container = createContainer()
84
+ const sidebar = new SidebarComponent({
85
+ container,
86
+ sections: [
87
+ {
88
+ id: 'main',
89
+ items: [{ id: 'alerts', label: 'Alerts', badge: 5, badgeTone: 'rose' }],
90
+ },
91
+ ],
92
+ })
93
+
94
+ const item = container.querySelector<HTMLElement>('[data-item-id="alerts"]')
95
+ expect(item?.getAttribute('data-badge-visible')).toBe('true')
96
+ expect(item?.getAttribute('data-badge-tone')).toBe('rose')
97
+
98
+ sidebar.updateBadge('alerts', 0)
99
+ expect(item?.getAttribute('data-badge-visible')).toBe('false')
100
+ expect(container.querySelector('[data-badge="alerts"]')?.textContent).toBe('')
101
+
102
+ sidebar.updateBadge('alerts', 9)
103
+ expect(item?.getAttribute('data-badge-visible')).toBe('true')
104
+ expect(container.querySelector('[data-badge="alerts"]')?.textContent).toBe('9')
105
+
106
+ sidebar.destroy()
107
+ container.remove()
108
+ })
109
+ })