@jimka/typescript-ui 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/dist/lib/AbstractInput-Dt9ooHjo.js +2 -0
  2. package/dist/lib/AbstractInput-Dt9ooHjo.js.map +1 -0
  3. package/dist/lib/AccordionConstraints-DahZEfEp.js +2 -0
  4. package/dist/lib/AccordionConstraints-DahZEfEp.js.map +1 -0
  5. package/dist/lib/{Anchor-iZhsvMlT.js → Anchor-DdYgyn2V.js} +2 -2
  6. package/dist/lib/{Anchor-iZhsvMlT.js.map → Anchor-DdYgyn2V.js.map} +1 -1
  7. package/dist/lib/{AnimatedDropdown-D0RhVgv3.js → AnimatedDropdown-_KhHzX5D.js} +2 -2
  8. package/dist/lib/AnimatedDropdown-_KhHzX5D.js.map +1 -0
  9. package/dist/lib/Border-BELbqMDJ.js +2 -0
  10. package/dist/lib/Border-BELbqMDJ.js.map +1 -0
  11. package/dist/lib/Button-CKzjQyqA.js +2 -0
  12. package/dist/lib/Button-CKzjQyqA.js.map +1 -0
  13. package/dist/lib/{Card-C20k2YHU.js → Card-CAp7LcB5.js} +2 -2
  14. package/dist/lib/{Card-C20k2YHU.js.map → Card-CAp7LcB5.js.map} +1 -1
  15. package/dist/lib/Checkbox-CvAZJ4_T.js +2 -0
  16. package/dist/lib/Checkbox-CvAZJ4_T.js.map +1 -0
  17. package/dist/lib/CodeEditor-DoGGdL1Y.js +2 -0
  18. package/dist/lib/CodeEditor-DoGGdL1Y.js.map +1 -0
  19. package/dist/lib/ComboBox-DgjMnpdh.js +2 -0
  20. package/dist/lib/ComboBox-DgjMnpdh.js.map +1 -0
  21. package/dist/lib/Component-YrLXKJZS.js +2 -0
  22. package/dist/lib/Component-YrLXKJZS.js.map +1 -0
  23. package/dist/lib/Container-C5cxnioS.js +2 -0
  24. package/dist/lib/{Container-FWRjgF6T.js.map → Container-C5cxnioS.js.map} +1 -1
  25. package/dist/lib/DOM-DDhDN8lQ.js +2 -0
  26. package/dist/lib/DOM-DDhDN8lQ.js.map +1 -0
  27. package/dist/lib/Diagnostics-MI6Yw-3E.js +2 -0
  28. package/dist/lib/Diagnostics-MI6Yw-3E.js.map +1 -0
  29. package/dist/lib/Dialog-CXQXRQQK.js +2 -0
  30. package/dist/lib/Dialog-CXQXRQQK.js.map +1 -0
  31. package/dist/lib/DragManager-D5pBaPPg.js +2 -0
  32. package/dist/lib/DragManager-D5pBaPPg.js.map +1 -0
  33. package/dist/lib/{FieldDecorator-DyPX8CFh.js → FieldDecorator-37IgKHHm.js} +2 -2
  34. package/dist/lib/{FieldDecorator-DyPX8CFh.js.map → FieldDecorator-37IgKHHm.js.map} +1 -1
  35. package/dist/lib/{Fit-CaPMj7Up.js → Fit-amTWlJM2.js} +2 -2
  36. package/dist/lib/{Fit-CaPMj7Up.js.map → Fit-amTWlJM2.js.map} +1 -1
  37. package/dist/lib/{FloatingPanel-Dsy_vJxi.js → FloatingPanel-CwsFPYbc.js} +2 -2
  38. package/dist/lib/{FloatingPanel-Dsy_vJxi.js.map → FloatingPanel-CwsFPYbc.js.map} +1 -1
  39. package/dist/lib/Glyph-Cof7BxfJ.js +2 -0
  40. package/dist/lib/Glyph-Cof7BxfJ.js.map +1 -0
  41. package/dist/lib/{Grid-ft_UUpj8.js → Grid-BQZ4UIUH.js} +2 -2
  42. package/dist/lib/{Grid-ft_UUpj8.js.map → Grid-BQZ4UIUH.js.map} +1 -1
  43. package/dist/lib/GridConstraints-BkXa62z0.js +2 -0
  44. package/dist/lib/GridConstraints-BkXa62z0.js.map +1 -0
  45. package/dist/lib/{Header-Osm3IjDw.js → Header-Cj33ABP1.js} +2 -2
  46. package/dist/lib/{Header-Osm3IjDw.js.map → Header-Cj33ABP1.js.map} +1 -1
  47. package/dist/lib/{IconText-BBaYJ2Fx.js → IconText-Dp64iq_q.js} +2 -2
  48. package/dist/lib/{IconText-BBaYJ2Fx.js.map → IconText-Dp64iq_q.js.map} +1 -1
  49. package/dist/lib/LabeledGrid-Dpelrc1k.js +2 -0
  50. package/dist/lib/LabeledGrid-Dpelrc1k.js.map +1 -0
  51. package/dist/lib/LayoutSerialization-DgLJSuew.js +2 -0
  52. package/dist/lib/LayoutSerialization-DgLJSuew.js.map +1 -0
  53. package/dist/lib/Link-DE8tE3u3.js +2 -0
  54. package/dist/lib/Link-DE8tE3u3.js.map +1 -0
  55. package/dist/lib/List-TfgHScl3.js +2 -0
  56. package/dist/lib/List-TfgHScl3.js.map +1 -0
  57. package/dist/lib/ListenerBag-DYRl4TSb.js +2 -0
  58. package/dist/lib/ListenerBag-DYRl4TSb.js.map +1 -0
  59. package/dist/lib/{MemoryStore-DhPoU-7X.js → MemoryStore-ByGDEKYI.js} +2 -2
  60. package/dist/lib/{MemoryStore-DhPoU-7X.js.map → MemoryStore-ByGDEKYI.js.map} +1 -1
  61. package/dist/lib/Menu-BCQISKiQ.js +2 -0
  62. package/dist/lib/Menu-BCQISKiQ.js.map +1 -0
  63. package/dist/lib/{MenuButton-BqCT-1yv.js → MenuButton-BO4y3jf2.js} +2 -2
  64. package/dist/lib/{MenuButton-BqCT-1yv.js.map → MenuButton-BO4y3jf2.js.map} +1 -1
  65. package/dist/lib/{OverlayFade-CuEXgimf.js → OverlayFade-C1yQKffL.js} +2 -2
  66. package/dist/lib/{OverlayFade-CuEXgimf.js.map → OverlayFade-C1yQKffL.js.map} +1 -1
  67. package/dist/lib/{Panel-CtViePqY.js → Panel-DlsVVuvn.js} +2 -2
  68. package/dist/lib/{Panel-CtViePqY.js.map → Panel-DlsVVuvn.js.map} +1 -1
  69. package/dist/lib/{Position-BIEU1Eze.js → Position-DWR1nIpA.js} +2 -2
  70. package/dist/lib/{Position-BIEU1Eze.js.map → Position-DWR1nIpA.js.map} +1 -1
  71. package/dist/lib/ProgressSpinner-BI9tFIVm.js +2 -0
  72. package/dist/lib/ProgressSpinner-BI9tFIVm.js.map +1 -0
  73. package/dist/lib/RadioButton-BxcuFChp.js +2 -0
  74. package/dist/lib/RadioButton-BxcuFChp.js.map +1 -0
  75. package/dist/lib/RadioMenuRow-B2bthoxj.js +2 -0
  76. package/dist/lib/RadioMenuRow-B2bthoxj.js.map +1 -0
  77. package/dist/lib/{RovingTabIndex--w28AnXc.js → RovingTabIndex-BttlsARv.js} +2 -2
  78. package/dist/lib/{RovingTabIndex--w28AnXc.js.map → RovingTabIndex-BttlsARv.js.map} +1 -1
  79. package/dist/lib/Scrollbar-orAWHWap.js +2 -0
  80. package/dist/lib/Scrollbar-orAWHWap.js.map +1 -0
  81. package/dist/lib/SelectableText-BbS_lRzY.js +2 -0
  82. package/dist/lib/SelectableText-BbS_lRzY.js.map +1 -0
  83. package/dist/lib/Slider-BvXc-cx5.js +2 -0
  84. package/dist/lib/Slider-BvXc-cx5.js.map +1 -0
  85. package/dist/lib/Spacer-C6faKe1V.js +2 -0
  86. package/dist/lib/Spacer-C6faKe1V.js.map +1 -0
  87. package/dist/lib/StyleTraits-CAtzeyRR.js +2 -0
  88. package/dist/lib/StyleTraits-CAtzeyRR.js.map +1 -0
  89. package/dist/lib/TabButton-BQDaBszs.js +2 -0
  90. package/dist/lib/TabButton-BQDaBszs.js.map +1 -0
  91. package/dist/lib/TabCloseButton-B-iLVPGZ.js +2 -0
  92. package/dist/lib/TabCloseButton-B-iLVPGZ.js.map +1 -0
  93. package/dist/lib/Table-3McEw5gr.js +7 -0
  94. package/dist/lib/Table-3McEw5gr.js.map +1 -0
  95. package/dist/lib/Text-CGFXPhHD.js +2 -0
  96. package/dist/lib/Text-CGFXPhHD.js.map +1 -0
  97. package/dist/lib/Tooltip-DgRHQZhL.js +3 -0
  98. package/dist/lib/Tooltip-DgRHQZhL.js.map +1 -0
  99. package/dist/lib/Tree-Bq2pjjAz.js +2 -0
  100. package/dist/lib/Tree-Bq2pjjAz.js.map +1 -0
  101. package/dist/lib/{VBox-DVe4UXwX.js → VBox-hFIZAEpT.js} +2 -2
  102. package/dist/lib/{VBox-DVe4UXwX.js.map → VBox-hFIZAEpT.js.map} +1 -1
  103. package/dist/lib/{VirtualScroller-ggPTCQb0.js → VirtualScroller-Csa3GBSM.js} +2 -2
  104. package/dist/lib/{VirtualScroller-ggPTCQb0.js.map → VirtualScroller-Csa3GBSM.js.map} +1 -1
  105. package/dist/lib/Window-CQ14_65z.js +2 -0
  106. package/dist/lib/Window-CQ14_65z.js.map +1 -0
  107. package/dist/lib/component/button.es.js +1 -1
  108. package/dist/lib/component/button.es.js.map +1 -1
  109. package/dist/lib/component/chart.es.js +1 -1
  110. package/dist/lib/component/chart.es.js.map +1 -1
  111. package/dist/lib/component/container.es.js +1 -1
  112. package/dist/lib/component/container.es.js.map +1 -1
  113. package/dist/lib/component/diagram.es.js +1 -1
  114. package/dist/lib/component/diagram.es.js.map +1 -1
  115. package/dist/lib/component/display.es.js +1 -1
  116. package/dist/lib/component/display.es.js.map +1 -1
  117. package/dist/lib/component/editor.es.js +2 -2
  118. package/dist/lib/component/editor.es.js.map +1 -1
  119. package/dist/lib/component/input.es.js +1 -1
  120. package/dist/lib/component/input.es.js.map +1 -1
  121. package/dist/lib/component/list.es.js +1 -1
  122. package/dist/lib/component/list.es.js.map +1 -1
  123. package/dist/lib/component/menubar.es.js +1 -1
  124. package/dist/lib/component/menubar.es.js.map +1 -1
  125. package/dist/lib/component/table.es.js +1 -6
  126. package/dist/lib/component/table.es.js.map +1 -1
  127. package/dist/lib/component/tree.es.js +1 -1
  128. package/dist/lib/component/tree.es.js.map +1 -1
  129. package/dist/lib/core-DpzpKLWE.js +2 -0
  130. package/dist/lib/core-DpzpKLWE.js.map +1 -0
  131. package/dist/lib/core.es.js +1 -2
  132. package/dist/lib/data.es.js +1 -1
  133. package/dist/lib/diagnostics.es.js +24 -0
  134. package/dist/lib/diagnostics.es.js.map +1 -0
  135. package/dist/lib/glyphs/solid/index.es.js +1 -1
  136. package/dist/lib/layout.es.js +1 -1
  137. package/dist/lib/layout.es.js.map +1 -1
  138. package/dist/lib/overlay.es.js +1 -1
  139. package/dist/lib/overlay.es.js.map +1 -1
  140. package/dist/lib/primitive-8YvORgGS.js +2 -0
  141. package/dist/lib/primitive-8YvORgGS.js.map +1 -0
  142. package/dist/lib/primitive.es.js +1 -2
  143. package/dist/lib/router.es.js +1 -1
  144. package/dist/lib/selectionsEqual-DWdW5pxP.js +2 -0
  145. package/dist/lib/{selectionsEqual-C7MrKMQr.js.map → selectionsEqual-DWdW5pxP.js.map} +1 -1
  146. package/dist/lib/types/component/button/Button.d.ts +6 -14
  147. package/dist/lib/types/component/button/TabButton.d.ts +3 -5
  148. package/dist/lib/types/component/button/TabCloseButton.d.ts +3 -0
  149. package/dist/lib/types/component/button/ToggleButton.d.ts +2 -5
  150. package/dist/lib/types/component/chart/AbstractChart.d.ts +2 -2
  151. package/dist/lib/types/component/container/AccordionHeader.d.ts +6 -1
  152. package/dist/lib/types/component/container/AccordionIndicator.d.ts +2 -0
  153. package/dist/lib/types/component/container/FieldSet.d.ts +2 -0
  154. package/dist/lib/types/component/container/LabeledFieldSet.d.ts +1 -1
  155. package/dist/lib/types/component/container/LabeledGrid.d.ts +4 -1
  156. package/dist/lib/types/component/container/Legend.d.ts +2 -2
  157. package/dist/lib/types/component/container/MenuItem.d.ts +1 -0
  158. package/dist/lib/types/component/container/WindowBorder.d.ts +2 -2
  159. package/dist/lib/types/component/container/WindowHeader.d.ts +6 -0
  160. package/dist/lib/types/component/diagram/DiagramEdgeLayer.d.ts +10 -0
  161. package/dist/lib/types/component/diagram/DiagramGroupNode.d.ts +2 -0
  162. package/dist/lib/types/component/diagram/DiagramNode.d.ts +6 -2
  163. package/dist/lib/types/component/diagram/DiagramNodeLayer.d.ts +25 -0
  164. package/dist/lib/types/component/diagram/DiagramResidency.d.ts +11 -0
  165. package/dist/lib/types/component/diagram/DiagramView.d.ts +22 -0
  166. package/dist/lib/types/component/input/AbstractCalendarDropdown.d.ts +4 -4
  167. package/dist/lib/types/component/input/AbstractInput.d.ts +1 -0
  168. package/dist/lib/types/component/input/AbstractPickerField.d.ts +4 -2
  169. package/dist/lib/types/component/input/AutoCompleteDropdown.d.ts +2 -2
  170. package/dist/lib/types/component/input/AutoCompleteField.d.ts +1 -0
  171. package/dist/lib/types/component/input/ComboBox.d.ts +5 -2
  172. package/dist/lib/types/component/input/Link.d.ts +2 -2
  173. package/dist/lib/types/component/input/PasswordField.d.ts +2 -2
  174. package/dist/lib/types/component/input/PickerButton.d.ts +5 -2
  175. package/dist/lib/types/component/input/PickerInput.d.ts +2 -2
  176. package/dist/lib/types/component/input/SelectableText.d.ts +2 -2
  177. package/dist/lib/types/component/input/SpinButton.d.ts +3 -2
  178. package/dist/lib/types/component/input/Text.d.ts +3 -7
  179. package/dist/lib/types/component/input/TextArea.d.ts +2 -2
  180. package/dist/lib/types/component/input/TextField.d.ts +2 -2
  181. package/dist/lib/types/component/input/TextInput.d.ts +4 -2
  182. package/dist/lib/types/component/input/TimePickerDropdown.d.ts +2 -2
  183. package/dist/lib/types/component/input/UsernameField.d.ts +2 -2
  184. package/dist/lib/types/component/list/AbstractMarkerList.d.ts +2 -0
  185. package/dist/lib/types/component/list/AbstractSelectableList.d.ts +4 -2
  186. package/dist/lib/types/component/list/ListItem.d.ts +2 -1
  187. package/dist/lib/types/component/menubar/MenuBarButton.d.ts +3 -0
  188. package/dist/lib/types/component/menubar/ToolBar.d.ts +2 -0
  189. package/dist/lib/types/component/table/Body.d.ts +14 -6
  190. package/dist/lib/types/component/table/Column.d.ts +2 -0
  191. package/dist/lib/types/component/table/ColumnConfig.d.ts +1 -0
  192. package/dist/lib/types/component/table/Footer.d.ts +2 -0
  193. package/dist/lib/types/component/table/Header.d.ts +7 -0
  194. package/dist/lib/types/component/table/Row.d.ts +2 -0
  195. package/dist/lib/types/component/table/Table.d.ts +4 -1
  196. package/dist/lib/types/component/table/TablePanel.d.ts +5 -0
  197. package/dist/lib/types/component/table/TreeTablePanel.d.ts +5 -0
  198. package/dist/lib/types/component/table/cell/Cell.d.ts +3 -2
  199. package/dist/lib/types/component/table/cell/Header.d.ts +4 -3
  200. package/dist/lib/types/component/table/cell/ParentHeader.d.ts +4 -0
  201. package/dist/lib/types/component/tree/TreeRow.d.ts +2 -0
  202. package/dist/lib/types/core/AnimatedDropdown.d.ts +2 -2
  203. package/dist/lib/types/core/Binding.d.ts +1 -0
  204. package/dist/lib/types/core/ClassStyleRules.d.ts +44 -22
  205. package/dist/lib/types/core/Component.d.ts +55 -28
  206. package/dist/lib/types/core/DOM.d.ts +6 -0
  207. package/dist/lib/types/core/Diagnostics.d.ts +22 -0
  208. package/dist/lib/types/core/Event.d.ts +7 -0
  209. package/dist/lib/types/core/LayerManager.d.ts +2 -0
  210. package/dist/lib/types/core/ListenerBag.d.ts +1 -0
  211. package/dist/lib/types/core/StyleTarget.d.ts +12 -0
  212. package/dist/lib/types/core/StyleTraits.d.ts +4 -0
  213. package/dist/lib/types/core/Theme.d.ts +5 -2
  214. package/dist/lib/types/core/index.d.ts +5 -2
  215. package/dist/lib/types/diagnostics/DiagnosticsOverlay.d.ts +29 -0
  216. package/dist/lib/types/diagnostics/DiagnosticsSampler.d.ts +61 -0
  217. package/dist/lib/types/diagnostics/StyleAudit.d.ts +19 -0
  218. package/dist/lib/types/diagnostics/StyleAuditOverlay.d.ts +12 -0
  219. package/dist/lib/types/diagnostics/StyleAuditView.d.ts +13 -0
  220. package/dist/lib/types/diagnostics/index.d.ts +7 -0
  221. package/dist/lib/types/layout/LayoutManager.d.ts +3 -0
  222. package/dist/lib/types/layout/Table.d.ts +1 -0
  223. package/dist/lib/types/overlay/AbstractWindow.d.ts +35 -2
  224. package/dist/lib/types/overlay/ButtonGroup.d.ts +1 -0
  225. package/dist/lib/types/overlay/Dialog.d.ts +1 -0
  226. package/dist/lib/types/overlay/Menu.d.ts +2 -0
  227. package/dist/lib/types/overlay/Notification.d.ts +0 -1
  228. package/dist/lib/types/overlay/PopupPanel.d.ts +2 -2
  229. package/dist/lib/types/overlay/RailHandle.d.ts +4 -5
  230. package/dist/lib/types/overlay/TabWindow.d.ts +3 -0
  231. package/dist/lib/types/overlay/Tooltip.d.ts +1 -0
  232. package/dist/lib/types/overlay/Window.d.ts +4 -1
  233. package/dist/lib/validation.es.js +1 -1
  234. package/llms.txt +2 -0
  235. package/package.json +5 -1
  236. package/dist/lib/AbstractInput-W2PLJV5_.js +0 -2
  237. package/dist/lib/AbstractInput-W2PLJV5_.js.map +0 -1
  238. package/dist/lib/AnimatedDropdown-D0RhVgv3.js.map +0 -1
  239. package/dist/lib/Border-6GsTNV-2.js +0 -2
  240. package/dist/lib/Border-6GsTNV-2.js.map +0 -1
  241. package/dist/lib/Button-CnFAiQuV.js +0 -2
  242. package/dist/lib/Button-CnFAiQuV.js.map +0 -1
  243. package/dist/lib/Checkbox-CM1z8keM.js +0 -2
  244. package/dist/lib/Checkbox-CM1z8keM.js.map +0 -1
  245. package/dist/lib/CheckboxMenuRow-C1h4LPHR.js +0 -2
  246. package/dist/lib/CheckboxMenuRow-C1h4LPHR.js.map +0 -1
  247. package/dist/lib/CodeEditor-CTL2WjF8.js +0 -2
  248. package/dist/lib/CodeEditor-CTL2WjF8.js.map +0 -1
  249. package/dist/lib/ComboBox-PZ5YPL0X.js +0 -2
  250. package/dist/lib/ComboBox-PZ5YPL0X.js.map +0 -1
  251. package/dist/lib/Component-D99-15Zt.js +0 -2
  252. package/dist/lib/Component-D99-15Zt.js.map +0 -1
  253. package/dist/lib/Container-FWRjgF6T.js +0 -2
  254. package/dist/lib/DOM-Cjh7_7TF.js +0 -2
  255. package/dist/lib/DOM-Cjh7_7TF.js.map +0 -1
  256. package/dist/lib/Dialog-DN78RaVH.js +0 -2
  257. package/dist/lib/Dialog-DN78RaVH.js.map +0 -1
  258. package/dist/lib/Glyph-DiEpD3gy.js +0 -2
  259. package/dist/lib/Glyph-DiEpD3gy.js.map +0 -1
  260. package/dist/lib/GridConstraints-CvZ0Nzaw.js +0 -2
  261. package/dist/lib/GridConstraints-CvZ0Nzaw.js.map +0 -1
  262. package/dist/lib/LayoutSerialization-BC64__O7.js +0 -2
  263. package/dist/lib/LayoutSerialization-BC64__O7.js.map +0 -1
  264. package/dist/lib/List-CQbZK_pT.js +0 -2
  265. package/dist/lib/List-CQbZK_pT.js.map +0 -1
  266. package/dist/lib/ListenerBag-WPdKuuds.js +0 -2
  267. package/dist/lib/ListenerBag-WPdKuuds.js.map +0 -1
  268. package/dist/lib/Menu-CwHluLGT.js +0 -2
  269. package/dist/lib/Menu-CwHluLGT.js.map +0 -1
  270. package/dist/lib/ProgressSpinner-BuBvC1FY.js +0 -2
  271. package/dist/lib/ProgressSpinner-BuBvC1FY.js.map +0 -1
  272. package/dist/lib/RadioButton-Df5J-H6m.js +0 -2
  273. package/dist/lib/RadioButton-Df5J-H6m.js.map +0 -1
  274. package/dist/lib/RadioMenuRow-Cfv0x6Qj.js +0 -2
  275. package/dist/lib/RadioMenuRow-Cfv0x6Qj.js.map +0 -1
  276. package/dist/lib/Scrollbar-DcnueNJd.js +0 -2
  277. package/dist/lib/Scrollbar-DcnueNJd.js.map +0 -1
  278. package/dist/lib/SelectableText-DZNxjKXR.js +0 -2
  279. package/dist/lib/SelectableText-DZNxjKXR.js.map +0 -1
  280. package/dist/lib/Slider-DNfd8Lxz.js +0 -2
  281. package/dist/lib/Slider-DNfd8Lxz.js.map +0 -1
  282. package/dist/lib/Spacer-BznfGbwG.js +0 -2
  283. package/dist/lib/Spacer-BznfGbwG.js.map +0 -1
  284. package/dist/lib/TabButton-CAACsMov.js +0 -2
  285. package/dist/lib/TabButton-CAACsMov.js.map +0 -1
  286. package/dist/lib/TabCloseButton-CCiqsX3y.js +0 -2
  287. package/dist/lib/TabCloseButton-CCiqsX3y.js.map +0 -1
  288. package/dist/lib/Text-O-FWa5Cy.js +0 -2
  289. package/dist/lib/Text-O-FWa5Cy.js.map +0 -1
  290. package/dist/lib/Tooltip-CyICVu15.js +0 -3
  291. package/dist/lib/Tooltip-CyICVu15.js.map +0 -1
  292. package/dist/lib/Tree-CSEguhlk.js +0 -2
  293. package/dist/lib/Tree-CSEguhlk.js.map +0 -1
  294. package/dist/lib/core.es.js.map +0 -1
  295. package/dist/lib/primitive.es.js.map +0 -1
  296. package/dist/lib/selectionsEqual-C7MrKMQr.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.es.js","names":[],"sources":["../../src/typescript/lib/diagnostics/DiagnosticsSampler.ts","../../src/typescript/lib/diagnostics/StyleAudit.ts","../../src/typescript/lib/diagnostics/StyleAuditView.ts","../../src/typescript/lib/diagnostics/StyleAuditOverlay.ts","../../src/typescript/lib/diagnostics/DiagnosticsOverlay.ts"],"sourcesContent":["// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n\nimport { Diagnostics } from \"~/core/Diagnostics.js\";\nimport { Event } from \"~/core/Event.js\";\nimport { styleRuleCounts, type StyleRuleCounts } from \"~/core/StyleTarget.js\";\nimport { DOM } from \"~/core/DOM.js\";\n\n/** Default sample-window length, matching the overlay's twice-a-second readout. */\nconst SAMPLE_INTERVAL_MS_DEFAULT = 500;\n\n/** Bytes per megabyte, for converting `performance.memory`'s byte counts. */\nconst BYTES_PER_MB = 1024 * 1024;\n\n/**\n * Every framework-internal diagnostics reading, assembled from the pushed\n * `Diagnostics` counters and the derived `Event` / `StyleTarget` registries.\n * Pure and offline-safe: no timing, no DOM reads.\n *\n * @category Core\n */\nexport interface FrameworkCounts {\n /** Live component count — `componentsConstructed - componentsDestroyed`. */\n components: number;\n componentsConstructed: number;\n componentsDestroyed: number;\n layoutPasses: number;\n layoutFlushes: number;\n layoutFlushTotalMs: number;\n layoutFlushMaxMs: number;\n domListeners: Event.ListenerCounts;\n /** Live semantic listener count — `bagListenersAdded - bagListenersRemoved`. */\n semanticListeners: number;\n styleRules: StyleRuleCounts;\n}\n\n/**\n * Reads every framework counter once. No timing, no DOM reads — offline-safe.\n *\n * @returns The current {@link FrameworkCounts}.\n */\nexport function readFrameworkCounts(): FrameworkCounts {\n const counters = Diagnostics.counters();\n\n return {\n components: counters.componentsConstructed - counters.componentsDestroyed,\n componentsConstructed: counters.componentsConstructed,\n componentsDestroyed: counters.componentsDestroyed,\n layoutPasses: counters.layoutPasses,\n layoutFlushes: counters.layoutFlushes,\n layoutFlushTotalMs: counters.layoutFlushTotalMs,\n layoutFlushMaxMs: counters.layoutFlushMaxMs,\n domListeners: Event.listenerCounts(),\n semanticListeners: counters.bagListenersAdded - counters.bagListenersRemoved,\n styleRules: styleRuleCounts(),\n };\n}\n\n/**\n * One window's worth of browser-level and framework-level diagnostics\n * readings, handed to {@link DiagnosticsSamplerOptions.onSample}.\n *\n * @category Core\n */\nexport interface DiagnosticsSample {\n fps: number;\n frameTimeMs: number;\n frameTimeMaxMs: number;\n heapUsedMB: number | null;\n heapLimitMB: number | null;\n domNodes: number;\n /** Cumulative long-task count since {@link DiagnosticsSampler.start}. */\n longTasks: number;\n /** Long-task count observed within this sample window only. */\n longTasksRecent: number;\n components: number;\n componentsConstructed: number;\n componentsDestroyed: number;\n layoutPassesPerSec: number;\n /** Running average flush cost since timing was last enabled. */\n layoutFlushAvgMs: number;\n layoutFlushMaxMs: number;\n /** The `total` of {@link Event.ListenerCounts}, flattened. */\n domListeners: number;\n semanticListeners: number;\n styleRules: StyleRuleCounts;\n}\n\n/**\n * Construction options for {@link DiagnosticsSampler}.\n *\n * @category Core\n */\nexport interface DiagnosticsSamplerOptions {\n /** Sample window length in ms. Default `500`. */\n intervalMs?: number;\n /** Invoked once per sample window while the sampler is running. */\n onSample: (sample: DiagnosticsSample) => void;\n}\n\n/**\n * Drives the diagnostics overlay's live readout: one `requestAnimationFrame`\n * chain measures FPS and per-frame time, aggregates long tasks via a\n * `PerformanceObserver` when supported, and every {@link DiagnosticsSamplerOptions.intervalMs}\n * assembles a {@link DiagnosticsSample} from the framework counters, the DOM\n * node count, and `performance.memory` (when available).\n *\n * Not a `Component`, so it is not `callable()`-wrapped.\n *\n * @category Core\n */\nexport class DiagnosticsSampler {\n\n private readonly _onSample: (sample: DiagnosticsSample) => void;\n private readonly _intervalMs: number;\n\n private _running: boolean = false;\n private _rafHandle: number | null = null;\n private _observer: PerformanceObserver | null = null;\n\n // Sample-window accumulators, reset at the top of every window.\n private _windowStart: number | null = null;\n private _lastFrameTs: number | null = null;\n private _frameCount: number = 0;\n private _frameTimeMaxMs: number = 0;\n private _longTasksThisWindow: number = 0;\n\n // Session accumulators, reset only by start().\n private _longTasksTotal: number = 0;\n private _prevLayoutPasses: number = 0;\n\n private readonly _boundOnFrame: FrameRequestCallback = (ts) => this.onFrame(ts);\n private readonly _boundOnLongTasks: PerformanceObserverCallback = (list) => this.onLongTasks(list);\n\n /**\n * @param options - Sample interval and the per-window callback.\n */\n constructor(options: DiagnosticsSamplerOptions) {\n this._onSample = options.onSample;\n this._intervalMs = options.intervalMs ?? SAMPLE_INTERVAL_MS_DEFAULT;\n }\n\n /**\n * Starts the frame loop. Idempotent — a no-op while already running.\n *\n * @remarks Enables {@link Diagnostics.setTimingEnabled}, so a freshly\n * started sampler reads a fresh layout-flush average rather than one\n * diluted by time spent stopped. Installs the long-task observer when the\n * engine supports it.\n */\n start(): void {\n if (this._running) {\n return;\n }\n\n this._running = true;\n\n Diagnostics.setTimingEnabled(true);\n\n this._windowStart = null;\n this._lastFrameTs = null;\n this._frameCount = 0;\n this._frameTimeMaxMs = 0;\n this._longTasksThisWindow = 0;\n this._longTasksTotal = 0;\n this._prevLayoutPasses = Diagnostics.counters().layoutPasses;\n\n if (typeof PerformanceObserver !== \"undefined\"\n && PerformanceObserver.supportedEntryTypes?.includes(\"longtask\")) {\n this._observer = new PerformanceObserver(this._boundOnLongTasks);\n this._observer.observe({ entryTypes: [\"longtask\"] });\n }\n\n this._rafHandle = DOM.sink.requestAnimationFrame(this._boundOnFrame);\n }\n\n /**\n * Stops the frame loop and disconnects the long-task observer, if one was\n * installed. Idempotent — a no-op while already stopped.\n */\n stop(): void {\n if (!this._running) {\n return;\n }\n\n this._running = false;\n\n if (this._rafHandle !== null) {\n DOM.sink.cancelAnimationFrame(this._rafHandle);\n this._rafHandle = null;\n }\n\n this._observer?.disconnect();\n this._observer = null;\n\n Diagnostics.setTimingEnabled(false);\n }\n\n /**\n * Whether the frame loop is currently running.\n *\n * @returns `true` between a `start()` and its matching `stop()`.\n */\n isRunning(): boolean {\n return this._running;\n }\n\n /**\n * The `requestAnimationFrame` callback: accumulates this frame into the\n * current window's stats and, once the window has elapsed, assembles and\n * emits a sample before starting the next window.\n *\n * @param ts - The frame's own high-resolution timestamp, supplied by the\n * browser. Reused as both the frame-delta clock and the window clock so\n * no extra `performance.now()` read happens per frame.\n */\n private onFrame(ts: number): void {\n if (this._lastFrameTs !== null) {\n const delta = ts - this._lastFrameTs;\n\n this._frameCount++;\n\n if (delta > this._frameTimeMaxMs) {\n this._frameTimeMaxMs = delta;\n }\n }\n this._lastFrameTs = ts;\n\n if (this._windowStart === null) {\n this._windowStart = ts;\n }\n\n const elapsedMs = ts - this._windowStart;\n\n if (elapsedMs >= this._intervalMs) {\n this.emitSample(elapsedMs);\n\n this._windowStart = ts;\n this._frameCount = 0;\n this._frameTimeMaxMs = 0;\n this._longTasksThisWindow = 0;\n }\n\n this._rafHandle = DOM.sink.requestAnimationFrame(this._boundOnFrame);\n }\n\n /**\n * The `PerformanceObserver` callback for `\"longtask\"` entries: folds the\n * batch into both the cumulative and current-window long-task counts.\n *\n * @param list - The observed batch of long-task entries.\n */\n private onLongTasks(list: PerformanceObserverEntryList): void {\n const n = list.getEntries().length;\n\n this._longTasksTotal += n;\n this._longTasksThisWindow += n;\n }\n\n /**\n * Assembles one {@link DiagnosticsSample} from the current window's\n * accumulators plus the framework counters, the DOM node count, and\n * `performance.memory`, and hands it to the configured callback.\n *\n * @param elapsedMs - The elapsed time covered by this window, in ms.\n */\n private emitSample(elapsedMs: number): void {\n const framework = readFrameworkCounts();\n const deltaPasses = framework.layoutPasses - this._prevLayoutPasses;\n this._prevLayoutPasses = framework.layoutPasses;\n\n const memory = (performance as unknown as {\n memory?: { usedJSHeapSize: number; jsHeapSizeLimit: number };\n }).memory;\n\n const sample: DiagnosticsSample = {\n fps: this._frameCount > 0 && elapsedMs > 0 ? (this._frameCount / elapsedMs) * 1000 : 0,\n frameTimeMs: this._frameCount > 0 ? elapsedMs / this._frameCount : 0,\n frameTimeMaxMs: this._frameTimeMaxMs,\n heapUsedMB: memory ? memory.usedJSHeapSize / BYTES_PER_MB : null,\n heapLimitMB: memory ? memory.jsHeapSizeLimit / BYTES_PER_MB : null,\n domNodes: DOM.source.countElements(),\n longTasks: this._longTasksTotal,\n longTasksRecent: this._longTasksThisWindow,\n components: framework.components,\n componentsConstructed: framework.componentsConstructed,\n componentsDestroyed: framework.componentsDestroyed,\n layoutPassesPerSec: elapsedMs > 0 ? (deltaPasses / elapsedMs) * 1000 : 0,\n layoutFlushAvgMs: framework.layoutFlushes > 0 ? framework.layoutFlushTotalMs / framework.layoutFlushes : 0,\n layoutFlushMaxMs: framework.layoutFlushMaxMs,\n domListeners: framework.domListeners.total,\n semanticListeners: framework.semanticListeners,\n styleRules: framework.styleRules,\n };\n\n this._onSample(sample);\n }\n}\n","// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n\nimport { COMPONENT_CLASS } from \"~/core/ClassStyleRules.js\";\nimport { DOM } from \"~/core/DOM.js\";\nimport { styleRuleEntries } from \"~/core/StyleTarget.js\";\n\n/** How many duplicate-body rows to show, ranked by bytes wasted. */\nconst MAX_ROWS = 25;\n\n/** Formats a byte count as kilobytes with two decimals, e.g. `18.32 KB`. */\nfunction formatKB(bytes: number): string {\n return (bytes / 1024).toFixed(2) + \" KB\";\n}\n\n/**\n * Classifies a `#id`-scoped rule's selector into the shape of duplication it\n * represents, for the summary's \"scope\" column: a bare `#id` (the plain base\n * rule), a state suffix (`.pressed`, `:hover`, …), or a pseudo-element\n * (`::-webkit-scrollbar`).\n */\nfunction classifySelector(selector: string): string {\n if (selector.includes(\"::\")) return \"pseudo-element\";\n if (selector.slice(1).includes(\":\") || selector.slice(1).includes(\".\")) return \"state suffix\";\n return \"plain\";\n}\n\n/**\n * Maps every live component's escaped `#<id>` selector prefix to its concrete\n * class name. A stylesheet rule's selector may carry a state/pseudo suffix\n * after the id (`.pressed`, `:hover:not(.pressed)`, `::-webkit-scrollbar`),\n * and the id itself is CSS-escaped when it starts with a digit (component ids\n * are UUIDs, so this is the common case, not an edge case) — matching by\n * re-escaping each live element's id and testing it as a selector prefix\n * avoids having to hand-parse where the id ends and the suffix begins.\n */\nfunction buildComponentIndex(): Map<string, string> {\n const index = new Map<string, string>();\n\n for (const handle of DOM.source.querySelectorAll(DOM.source.getBody(), `.${COMPONENT_CLASS}`)) {\n const id = DOM.source.getId(handle);\n if (!id) continue;\n\n const classAttr = DOM.source.getAttribute(handle, \"class\") ?? \"\";\n const name = classAttr.split(/\\s+/).find((cls) => cls !== \"\" && cls !== COMPONENT_CLASS);\n\n if (name) {\n index.set(\"#\" + DOM.source.escapeSelector(id), name);\n }\n }\n\n return index;\n}\n\n/** Resolves the component class name owning a rule's selector via the id-prefix index from {@link buildComponentIndex}. */\nfunction componentNameForSelector(selector: string, index: Map<string, string>): string | null {\n for (const [idSelector, name] of index) {\n if (selector === idSelector || selector.startsWith(idSelector + \".\") || selector.startsWith(idSelector + \":\")) {\n return name;\n }\n }\n\n return null;\n}\n\n/**\n * Per-metric summary counts for {@link StyleAuditResult}.\n *\n * @category Core\n */\nexport interface StyleAuditSummary {\n totalRules: number;\n totalSizeKB: string;\n componentRuleCount: number;\n uniqueBodyCount: number;\n wastedKB: string;\n}\n\n/**\n * One duplicate-body group, ranked by bytes wasted.\n *\n * @category Core\n */\nexport interface DuplicateRuleRow {\n count: number;\n wastedKB: string;\n component: string;\n scope: string;\n body: string;\n}\n\n/**\n * The full result of {@link auditStyleRules}.\n *\n * @category Core\n */\nexport interface StyleAuditResult {\n summary: StyleAuditSummary;\n duplicates: DuplicateRuleRow[];\n}\n\n/**\n * Audits the framework's shared stylesheet for per-instance (`#id`-scoped)\n * rules whose declaration body duplicates another instance's. Ranks the\n * worst offenders by bytes wasted, capped to the top 25.\n *\n * @returns The {@link StyleAuditResult}.\n */\nexport function auditStyleRules(): StyleAuditResult {\n const componentIndex = buildComponentIndex();\n const entries = styleRuleEntries();\n\n let totalBytes = 0;\n let componentRuleCount = 0;\n\n const bodies = new Map<string, { count: number; scope: string; componentNames: Set<string> }>();\n\n for (const entry of entries) {\n totalBytes += entry.cssText.length;\n\n if (!entry.selector.startsWith(\"#\")) {\n continue;\n }\n\n componentRuleCount++;\n\n const body = entry.cssText.slice(entry.cssText.indexOf(\"{\"));\n const scope = classifySelector(entry.selector);\n const componentName = componentNameForSelector(entry.selector, componentIndex);\n const existing = bodies.get(body);\n\n if (existing) {\n existing.count++;\n if (componentName) existing.componentNames.add(componentName);\n } else {\n const componentNames = new Set<string>();\n if (componentName) componentNames.add(componentName);\n bodies.set(body, { count: 1, scope, componentNames });\n }\n }\n\n const dupeStats: { body: string; count: number; scope: string; componentNames: Set<string>; wastedBytes: number }[] = [];\n let totalWastedBytes = 0;\n\n for (const [body, { count, scope, componentNames }] of bodies) {\n if (count <= 1) {\n continue;\n }\n\n const wastedBytes = body.length * (count - 1);\n totalWastedBytes += wastedBytes;\n\n dupeStats.push({ body, count, scope, componentNames, wastedBytes });\n }\n\n dupeStats.sort((a, b) => b.wastedBytes - a.wastedBytes);\n\n const duplicates: DuplicateRuleRow[] = dupeStats.slice(0, MAX_ROWS).map((stat) => ({\n count: stat.count,\n wastedKB: formatKB(stat.wastedBytes),\n component: stat.componentNames.size > 0 ? Array.from(stat.componentNames).sort().join(\", \") : \"—\",\n scope: stat.scope,\n body: stat.body,\n }));\n\n return {\n summary: {\n totalRules: entries.length,\n totalSizeKB: formatKB(totalBytes),\n componentRuleCount,\n uniqueBodyCount: bodies.size,\n wastedKB: formatKB(totalWastedBytes),\n },\n duplicates,\n };\n}\n","// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n\nimport { callable } from \"~/core/Callable.js\";\nimport { VBox } from \"~/layout/VBox.js\";\nimport { MemoryStore } from \"~/data/MemoryStore.js\";\nimport { Model } from \"~/data/Model.js\";\nimport { Table } from \"~/component/table/Table.js\";\nimport type { ColumnSpec } from \"~/component/table/ColumnConfig.js\";\nimport { Text } from \"~/component/input/Text.js\";\nimport { Button } from \"~/component/button/Button.js\";\nimport { Tooltip } from \"~/overlay/Tooltip.js\";\nimport { auditStyleRules } from \"~/diagnostics/StyleAudit.js\";\nimport { Container } from \"../core\";\nimport { UNBOUNDED } from \"../primitive\";\n\n/**\n * The embeddable stylesheet-dedup audit: an explanation, a Refresh button, a\n * summary line, and a table of the worst duplicate-body offenders by bytes\n * wasted. Runs one audit immediately at construction and again only on an\n * explicit Refresh click — no periodic auto-refresh, mirroring the source\n * demo panel this view was extracted from.\n *\n * Embedded by both the demo app's own \"Style Audit\" tab and\n * {@link StyleAuditOverlay}'s window body; whichever container embeds it owns\n * scrolling, so this view does not set `autoScroll` on itself.\n *\n * @category Core\n */\nclass StyleAuditView extends Container {\n\n private readonly _summary: Text = new Text(\"\", { whiteSpace: \"normal\" });\n private readonly _refreshButton: Button = new Button(\"Refresh\");\n private readonly _store: MemoryStore;\n\n private readonly _boundRefresh: () => void = () => this.refresh();\n\n constructor() {\n super({ layoutManager: new VBox({ spacing: 8 }) });\n\n const explanation = new Text(\n \"Scans the framework's shared #Base stylesheet for per-instance (#id) rules whose \"\n + \"declaration body duplicates another instance's — bytes a shared class-level rule \"\n + \"could collapse to one copy. Switch tabs to populate more components, then refresh.\",\n { whiteSpace: \"normal\" },\n );\n this.addComponent(explanation);\n\n this._refreshButton.on(\"action\", this._boundRefresh);\n this.addComponent(this._refreshButton);\n\n this.addComponent(this._summary);\n\n const model = new Model([\n { name: \"count\", type: \"number\", order: 0 },\n { name: \"wastedKB\", type: \"string\", order: 1 },\n { name: \"component\", type: \"string\", order: 2 },\n { name: \"scope\", type: \"string\", order: 3 },\n { name: \"body\", type: \"string\", order: 4 },\n ]);\n this._store = new MemoryStore(model, []);\n\n const spec: ColumnSpec = {\n autoSizeColumns: true,\n columns: [\n { field: \"count\", minWidth: 70 , readOnly: true },\n { field: \"wastedKB\", minWidth: 100 , readOnly: true },\n { field: \"component\", minWidth: 140 , readOnly: true },\n { field: \"scope\", minWidth: 110 , readOnly: true },\n { field: \"body\", minWidth: 420, maxWidth: UNBOUNDED, preserveWidth: true, readOnly: true },\n ],\n };\n\n this.addComponent(new Table(this._store, spec), { weight: 1 });\n\n this.refresh();\n }\n\n /** Re-runs {@link auditStyleRules} and writes the result into the summary text and table. */\n private refresh(): void {\n const { summary, duplicates } = auditStyleRules();\n\n this._summary.setText(\n `Total rules: ${summary.totalRules} · Total size: ${summary.totalSizeKB} · `\n + `Per-instance (#id) rules: ${summary.componentRuleCount} · Unique bodies: ${summary.uniqueBodyCount} · `\n + `Estimated dedupeable size: ${summary.wastedKB}`,\n );\n\n this._store.loadData(duplicates);\n }\n\n /**\n * Detaches the Refresh button's own hover tooltip — `Button` attaches one\n * for any non-empty title but never detaches it itself, the same reason\n * `DiagnosticsOverlay.teardown` detaches its own titled button's tooltip.\n */\n protected override destructor(): void {\n Tooltip.detach(this._refreshButton);\n super.destructor();\n }\n}\n\nconst StyleAuditViewCallable = callable(StyleAuditView);\ntype StyleAuditViewCallable = StyleAuditView;\nexport {\n StyleAuditView as _StyleAuditView,\n StyleAuditViewCallable as StyleAuditView\n};\n","// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n\nimport { Window } from \"~/overlay/Window.js\";\nimport { VBox } from \"~/layout/VBox.js\";\nimport { Placement } from \"~/primitive/Placement.js\";\nimport { StyleAuditView } from \"~/diagnostics/StyleAuditView.js\";\nimport { Container } from \"../core\";\n\n/** Overlay window size and starting position — see `## Internal Structure`. */\nconst WINDOW_X = 360;\nconst WINDOW_Y = 24;\nconst WINDOW_WIDTH = 800;\nconst WINDOW_HEIGHT = 520;\n\n/**\n * A floating window showing the stylesheet-dedup audit — the same view\n * embedded in the demo app's own \"Style Audit\" tab, opened alongside\n * {@link DiagnosticsOverlay}. Its `WINDOW_X` sits to the right of\n * `DiagnosticsOverlay`'s own window, so the two do not fully overlap when\n * both are open.\n *\n * Opened and closed only through the static surface — there is no public\n * constructor.\n *\n * @example\n * ```typescript\n * StyleAuditOverlay.open();\n * ```\n *\n * @category Core\n */\n// Intentional exception to the `callable()`-wrap rule, mirroring\n// DiagnosticsOverlay: `StyleAuditOverlay` has a private constructor and is\n// used only through its static methods (`open` / `close` / `toggle` /\n// `isOpen`), so there is no public `new StyleAuditOverlay()` /\n// `StyleAuditOverlay(...)` surface to wrap.\nexport class StyleAuditOverlay extends Window {\n\n private static instance: StyleAuditOverlay | null = null;\n\n /** Private — use the static methods; only one instance is ever created. */\n private constructor() {\n super(\"Style Audit\");\n\n this.setX(WINDOW_X);\n this.setY(WINDOW_Y);\n this.setWidth(WINDOW_WIDTH);\n this.setHeight(WINDOW_HEIGHT);\n\n const body = new Container({\n autoScroll: \"y\",\n layoutManager: new VBox({ stretching: true }),\n });\n body.addComponent(new StyleAuditView(), { weight: 1 });\n\n this.addComponent(body, { placement: Placement.CENTER });\n }\n\n /**\n * Opens the overlay, creating it on first call. Idempotent — a second\n * call raises the existing window instead of building another.\n */\n static open(): void {\n if (StyleAuditOverlay.instance === null) {\n const instance = new StyleAuditOverlay();\n\n StyleAuditOverlay.instance = instance;\n\n instance.show();\n }\n\n StyleAuditOverlay.instance.bringToFront();\n }\n\n /**\n * Closes the overlay. A no-op while already closed.\n */\n static close(): void {\n if (StyleAuditOverlay.instance !== null) {\n const instance = StyleAuditOverlay.instance;\n\n instance.onExitAction();\n }\n }\n\n /**\n * Opens the overlay when closed, closes it when open.\n */\n static toggle(): void {\n if (StyleAuditOverlay.isOpen()) {\n StyleAuditOverlay.close();\n } else {\n StyleAuditOverlay.open();\n }\n }\n\n /**\n * Whether the overlay is currently open.\n *\n * @returns `true` between an `open()` and its matching `close()` —\n * `false` immediately on `close()`, not only once the close animation\n * finishes.\n */\n static isOpen(): boolean {\n return StyleAuditOverlay.instance !== null;\n }\n\n /**\n * Clears the static instance slot. Idempotent, and safe to call from both\n * the animated close path ({@link onExitAction}) and a direct\n * {@link destructor} (a `dispose()` that bypassed it). Unlike\n * `DiagnosticsOverlay`, there is no sampler to stop.\n */\n private teardown(): void {\n if (StyleAuditOverlay.instance === this) {\n StyleAuditOverlay.instance = null;\n }\n }\n\n /**\n * Runs teardown before the inherited close animation starts, so\n * {@link isOpen} already reads `false` while it plays out.\n */\n override onExitAction(): void {\n this.teardown();\n super.onExitAction();\n }\n\n /**\n * The safety net for a direct `dispose()` that bypassed {@link onExitAction}.\n */\n protected override destructor(): void {\n this.teardown();\n super.destructor();\n }\n}\n","// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n\nimport { Window } from \"~/overlay/Window.js\";\nimport { VBox } from \"~/layout/VBox.js\";\nimport { LabeledGrid, type LabeledRowDescriptor } from \"~/component/container/LabeledGrid.js\";\nimport { Header } from \"~/component/display/Header.js\";\nimport { Text } from \"~/component/input/Text.js\";\nimport { Button } from \"~/component/button/Button.js\";\nimport { Tooltip } from \"~/overlay/Tooltip.js\";\nimport { Placement } from \"~/primitive/Placement.js\";\nimport { DiagnosticsSampler, type DiagnosticsSample } from \"~/diagnostics/DiagnosticsSampler.js\";\nimport { StyleAuditOverlay } from \"~/diagnostics/StyleAuditOverlay.js\";\nimport { Container } from \"../core\";\n\n/** Overlay window size and starting position — see `## Internal Structure`. */\nconst OVERLAY_X = 24;\nconst OVERLAY_Y = 24;\nconst OVERLAY_WIDTH = 320;\nconst OVERLAY_HEIGHT = 460;\n\n/**\n * The in-app copy for each metric row, shown as a hover tooltip on both the\n * row's label and its value. A change here should be mirrored in\n * `docs/components/DiagnosticsOverlay.md`'s row-by-row table.\n */\nconst ROW_DESCRIPTIONS = {\n fps: \"Frames per second\\n\\nFrames completed in the last half-second, expressed per second. The overlay asks the browser for a frame every frame, so an idle app reads at the display's refresh rate — a drop is the signal, the absolute number is not.\",\n frameTime: \"Average frame time\\n\\nAverage gap between frames over the last half-second, with the longest single gap in brackets. The average is just 1000 / FPS; the maximum is where a one-off stutter shows up.\",\n heap: \"Heap memory usage\\n\\nUsed JavaScript heap against the engine's limit, from performance.memory. Chromium-only and quantised — read the trend across an interaction, not the digits. Shows 'unavailable' on engines that do not expose it.\",\n domNodes: \"Elements in the document\\n\\nCounted with document.querySelectorAll('*'). Elements only — text and comment nodes are not counted. A count that does not return to its starting point after a repeated open/close means elements are outliving their components.\",\n longTasks: \"Main-thread tasks longer than 50 ms\\n\\nReported by PerformanceObserver: the total since the overlay opened, with the count from the last half-second in brackets. Stays at 0 on engines with no long-task reporting.\",\n components: \"Live Component count\\n\\nConstructed minus disposed. A component dropped without dispose() is still counted, on purpose: that is the leak this number exists to expose. It is not garbage-collection aware.\",\n constructedDisposed: \"The two running totals the Components figure is derived from. Both only ever rise. Rising together with a steady gap is ordinary churn; a gap that widens is a leak.\",\n layoutPasses: \"doLayout() calls per second\\n\\nA raw call count, not a measure of layout cost. A deep tree of cheap layouts scores higher than a shallow tree of expensive ones, so read Layout flush for cost. A rate that stays high while nothing is happening means something calls scheduleLayout() on every pass.\",\n layoutFlush: \"Layout flush times\\n\\nAverage and longest time one coalesced layout flush took, in milliseconds. Timed once per flush, never per component. Both figures reset each time the overlay opens: the average dilutes over a long session, the maximum only ever rises.\",\n domListeners: \"DOM-event listeners\\n\\nLive DOM-event registrations across the framework's exact-target, subtree and viewport maps. Destroying a component purges its registrations, so a count that does not come back down after a repeated open/close means components are not being destroyed.\",\n semanticListeners: \"Live ListenerBag registrations\\n\\nThe framework's own on() / off() subscriptions such as theme changes and model events, not DOM events. Added minus removed.\",\n styleRules: \"Style rules\\n\\nRules currently materialised on the framework's shared stylesheet, with the per-component (#id) and shared-class counts in brackets. The two bracketed figures do not add up to the total — verbatim selector rules make up the rest. Per-component rules should fall as their components are disposed.\",\n} as const;\n\n/**\n * A floating window showing live runtime diagnostics: browser-level numbers\n * (FPS, JS heap, DOM node count, long tasks) beside framework-internal ones\n * (live `Component` count, layout passes and flush time, DOM/semantic\n * listener registrations, per-instance stylesheet rules). Each framework\n * number corresponds to a leak class this codebase has shipped and fixed —\n * open it against a running app to watch for one recurring.\n *\n * Opened and closed only through the static surface — there is no public\n * constructor.\n *\n * @example\n * ```typescript\n * DiagnosticsOverlay.open();\n * ```\n *\n * @category Core\n */\n// Intentional exception to the `callable()`-wrap rule, mirroring Tooltip:\n// `DiagnosticsOverlay` has a private constructor and is used only through its\n// static methods (`open` / `close` / `toggle` / `isOpen`), so there is no\n// public `new DiagnosticsOverlay()` / `DiagnosticsOverlay(...)` surface to wrap.\nexport class DiagnosticsOverlay extends Window {\n\n private static instance: DiagnosticsOverlay | null = null;\n\n private readonly _sampler: DiagnosticsSampler;\n\n private readonly _fps: Text = new Text();\n private readonly _frameTime: Text = new Text();\n private readonly _heap: Text = new Text();\n private readonly _domNodes: Text = new Text();\n private readonly _longTasks: Text = new Text();\n private readonly _componentsText: Text = new Text();\n private readonly _constructedDisposed: Text = new Text();\n private readonly _layoutPasses: Text = new Text();\n private readonly _layoutFlush: Text = new Text();\n private readonly _domListeners: Text = new Text();\n private readonly _semanticListeners: Text = new Text();\n private readonly _styleRules: Text = new Text();\n\n private readonly _boundOnSample: (sample: DiagnosticsSample) => void = (sample) => this.onSample(sample);\n\n private readonly _styleAuditButton: Button = new Button(\"Show style audit\");\n private readonly _boundOnOpenStyleAudit: () => void = () => StyleAuditOverlay.open();\n\n /** Private — use the static methods; only one instance is ever created. */\n private constructor() {\n super(\"Diagnostics\", { resizable: false });\n\n this.setX(OVERLAY_X);\n this.setY(OVERLAY_Y);\n this.setWidth(OVERLAY_WIDTH);\n this.setHeight(OVERLAY_HEIGHT);\n\n const rows: LabeledRowDescriptor[] = [\n { component: new Header(\"Browser\"), fullWidth: true },\n [{ title: \"FPS\", component: this._fps, description: ROW_DESCRIPTIONS.fps }],\n [{ title: \"Frame time\", component: this._frameTime, description: ROW_DESCRIPTIONS.frameTime }],\n [{ title: \"JS heap\", component: this._heap, description: ROW_DESCRIPTIONS.heap }],\n [{ title: \"DOM nodes\", component: this._domNodes, description: ROW_DESCRIPTIONS.domNodes }],\n [{ title: \"Long tasks\", component: this._longTasks, description: ROW_DESCRIPTIONS.longTasks }],\n { component: new Header(\"Framework\"), fullWidth: true },\n [{ title: \"Components\", component: this._componentsText, description: ROW_DESCRIPTIONS.components }],\n [{ title: \"Constructed / disposed\", component: this._constructedDisposed, description: ROW_DESCRIPTIONS.constructedDisposed }],\n [{ title: \"Layout passes\", component: this._layoutPasses, description: ROW_DESCRIPTIONS.layoutPasses }],\n [{ title: \"Layout flush\", component: this._layoutFlush, description: ROW_DESCRIPTIONS.layoutFlush }],\n [{ title: \"DOM listeners\", component: this._domListeners, description: ROW_DESCRIPTIONS.domListeners }],\n [{ title: \"Semantic listeners\", component: this._semanticListeners, description: ROW_DESCRIPTIONS.semanticListeners }],\n [{ title: \"Stylesheet rules\", component: this._styleRules, description: ROW_DESCRIPTIONS.styleRules }],\n ];\n\n this._styleAuditButton.on(\"action\", this._boundOnOpenStyleAudit);\n this._sampler = new DiagnosticsSampler({ onSample: this._boundOnSample });\n\n this.addComponent(Container({\n layoutManager: VBox({ stretching: true }),\n components: [\n { component: LabeledGrid({ columns: 1, rows }) },\n { component: Container(), constraints: { weight: 1.0 } },\n { component: this._styleAuditButton }\n ]\n }), { placement: Placement.CENTER });\n }\n\n /**\n * Opens the overlay, creating it on first call. Idempotent — a second\n * call raises the existing window instead of building another.\n */\n static open(): void {\n if (DiagnosticsOverlay.instance === null) {\n const instance = new DiagnosticsOverlay();\n\n DiagnosticsOverlay.instance = instance;\n\n instance.show();\n instance._sampler.start();\n }\n\n DiagnosticsOverlay.instance.bringToFront();\n }\n\n /**\n * Closes the overlay. A no-op while already closed.\n */\n static close(): void {\n if (DiagnosticsOverlay.instance !== null) {\n const instance = DiagnosticsOverlay.instance;\n\n instance.onExitAction();\n }\n }\n\n /**\n * Opens the overlay when closed, closes it when open.\n */\n static toggle(): void {\n if (DiagnosticsOverlay.isOpen()) {\n DiagnosticsOverlay.close();\n } else {\n DiagnosticsOverlay.open();\n }\n }\n\n /**\n * Whether the overlay is currently open.\n *\n * @returns `true` between an `open()` and its matching `close()` —\n * `false` immediately on `close()`, not only once the close animation\n * finishes.\n */\n static isOpen(): boolean {\n return DiagnosticsOverlay.instance !== null;\n }\n\n /**\n * Stops the sampler, detaches the style-audit button's own hover tooltip\n * (`Button` attaches one for any non-empty title but never detaches it\n * itself — the same reason `LabeledGrid.destructor` detaches the row\n * tooltips it owns), and clears the static instance slot. Idempotent, and\n * safe to call from both the animated close path ({@link onExitAction})\n * and a direct {@link destructor} (a `dispose()` that bypassed it).\n */\n private teardown(): void {\n this._sampler.stop();\n Tooltip.detach(this._styleAuditButton);\n\n if (DiagnosticsOverlay.instance === this) {\n DiagnosticsOverlay.instance = null;\n }\n }\n\n /**\n * Runs teardown before the inherited close animation starts, so\n * {@link isOpen} already reads `false` while it plays out.\n */\n override onExitAction(): void {\n this.teardown();\n super.onExitAction();\n }\n\n /**\n * The safety net for a direct `dispose()` that bypassed {@link onExitAction}.\n */\n protected override destructor(): void {\n this.teardown();\n super.destructor();\n }\n\n /**\n * Writes one sample's readings into the metric rows.\n *\n * @param sample - The latest {@link DiagnosticsSample}.\n */\n private onSample(sample: DiagnosticsSample): void {\n this._fps.setText(String(Math.round(sample.fps)));\n this._frameTime.setText(`${sample.frameTimeMs.toFixed(1)} ms (max ${sample.frameTimeMaxMs.toFixed(1)})`);\n this._heap.setText(\n sample.heapUsedMB !== null && sample.heapLimitMB !== null\n ? `${sample.heapUsedMB.toFixed(1)} / ${sample.heapLimitMB.toFixed(1)} MB`\n : \"unavailable\",\n );\n this._domNodes.setText(String(sample.domNodes));\n this._longTasks.setText(`${sample.longTasks} (+${sample.longTasksRecent})`);\n this._componentsText.setText(String(sample.components));\n this._constructedDisposed.setText(`${sample.componentsConstructed} / ${sample.componentsDestroyed}`);\n this._layoutPasses.setText(`${Math.round(sample.layoutPassesPerSec)} /s`);\n this._layoutFlush.setText(`${sample.layoutFlushAvgMs.toFixed(2)} ms (max ${sample.layoutFlushMaxMs.toFixed(2)})`);\n this._domListeners.setText(String(sample.domListeners));\n this._semanticListeners.setText(String(sample.semanticListeners));\n this._styleRules.setText(\n `${sample.styleRules.total} (${sample.styleRules.instance} inst / ${sample.styleRules.class} cls)`,\n );\n }\n}\n"],"mappings":"6pBAQA,IAAM,EAA6B,IAG7B,EAAe,QA6BrB,SAAgB,qBAAuC,CACnD,IAAM,EAAW,EAAY,SAAS,EAEtC,MAAO,CACH,WAAuB,EAAS,sBAAwB,EAAS,oBACjE,sBAAuB,EAAS,sBAChC,oBAAuB,EAAS,oBAChC,aAAuB,EAAS,aAChC,cAAuB,EAAS,cAChC,mBAAuB,EAAS,mBAChC,iBAAuB,EAAS,iBAChC,aAAuB,EAAM,eAAe,EAC5C,kBAAuB,EAAS,kBAAoB,EAAS,oBAC7D,WAAuB,EAAgB,CAC3C,CACJ,CAuDA,IAAa,mBAAb,KAAgC,CAE5B,UACA,YAEA,SAAsC,GACtC,WAAsC,KACtC,UAAgD,KAGhD,aAA8C,KAC9C,aAA8C,KAC9C,YAA+C,EAC/C,gBAA+C,EAC/C,qBAA+C,EAG/C,gBAAoC,EACpC,kBAAoC,EAEpC,cAAkE,GAAO,KAAK,QAAQ,CAAE,EACxF,kBAAmE,GAAS,KAAK,YAAY,CAAI,EAKjG,YAAY,EAAoC,CAC5C,KAAK,UAAc,EAAQ,SAC3B,KAAK,YAAc,EAAQ,YAAc,CAC7C,CAUA,OAAc,CACN,KAAK,WAIT,KAAK,SAAW,GAEhB,EAAY,iBAAiB,EAAI,EAEjC,KAAK,aAAuB,KAC5B,KAAK,aAAuB,KAC5B,KAAK,YAAuB,EAC5B,KAAK,gBAAuB,EAC5B,KAAK,qBAAuB,EAC5B,KAAK,gBAAuB,EAC5B,KAAK,kBAAuB,EAAY,SAAS,CAAC,CAAC,aAE/C,OAAO,oBAAwB,KAC5B,oBAAoB,qBAAqB,SAAS,UAAU,IAC/D,KAAK,UAAY,IAAI,oBAAoB,KAAK,iBAAiB,EAC/D,KAAK,UAAU,QAAQ,CAAE,WAAY,CAAC,UAAU,CAAE,CAAC,GAGvD,KAAK,WAAa,EAAI,KAAK,sBAAsB,KAAK,aAAa,EACvE,CAMA,MAAa,CACJ,KAAK,WAIV,KAAK,SAAW,GAEZ,KAAK,aAAe,OACpB,EAAI,KAAK,qBAAqB,KAAK,UAAU,EAC7C,KAAK,WAAa,MAGtB,KAAK,WAAW,WAAW,EAC3B,KAAK,UAAY,KAEjB,EAAY,iBAAiB,EAAK,EACtC,CAOA,WAAqB,CACjB,OAAO,KAAK,QAChB,CAWA,QAAgB,EAAkB,CAC9B,GAAI,KAAK,eAAiB,KAAM,CAC5B,IAAM,EAAQ,EAAK,KAAK,aAExB,KAAK,cAED,EAAQ,KAAK,kBACb,KAAK,gBAAkB,EAE/B,CACA,KAAK,aAAe,EAEhB,KAAK,eAAiB,OACtB,KAAK,aAAe,GAGxB,IAAM,EAAY,EAAK,KAAK,aAExB,GAAa,KAAK,cAClB,KAAK,WAAW,CAAS,EAEzB,KAAK,aAAuB,EAC5B,KAAK,YAAuB,EAC5B,KAAK,gBAAuB,EAC5B,KAAK,qBAAuB,GAGhC,KAAK,WAAa,EAAI,KAAK,sBAAsB,KAAK,aAAa,CACvE,CAQA,YAAoB,EAA0C,CAC1D,IAAM,EAAI,EAAK,WAAW,CAAC,CAAC,OAE5B,KAAK,iBAAwB,EAC7B,KAAK,sBAAwB,CACjC,CASA,WAAmB,EAAyB,CACxC,IAAM,EAAe,oBAAoB,EACnC,EAAe,EAAU,aAAe,KAAK,kBACnD,KAAK,kBAAoB,EAAU,aAEnC,IAAM,EAAU,YAEb,OAEG,EAA4B,CAC9B,IAAuB,KAAK,YAAc,GAAK,EAAY,EAAK,KAAK,YAAc,EAAa,IAAO,EACvG,YAAwB,KAAK,YAAc,EAAI,EAAY,KAAK,YAAc,EAC9E,eAAwB,KAAK,gBAC7B,WAAwB,EAAS,EAAO,eAAkB,EAAe,KACzE,YAAwB,EAAS,EAAO,gBAAkB,EAAe,KACzE,SAAwB,EAAI,OAAO,cAAc,EACjD,UAAwB,KAAK,gBAC7B,gBAAwB,KAAK,qBAC7B,WAAwB,EAAU,WAClC,sBAAwB,EAAU,sBAClC,oBAAwB,EAAU,oBAClC,mBAAwB,EAAY,EAAK,EAAc,EAAa,IAAO,EAC3E,iBAAwB,EAAU,cAAgB,EAAI,EAAU,mBAAqB,EAAU,cAAgB,EAC/G,iBAAwB,EAAU,iBAClC,aAAwB,EAAU,aAAa,MAC/C,kBAAwB,EAAU,kBAClC,WAAwB,EAAU,UACtC,EAEA,KAAK,UAAU,CAAM,CACzB,CACJ,ECjSM,EAAW,GAGjB,SAAS,SAAS,EAAuB,CACrC,OAAQ,EAAQ,KAAA,CAAM,QAAQ,CAAC,EAAI,KACvC,CAQA,SAAS,iBAAiB,EAA0B,CAGhD,OAFI,EAAS,SAAS,IAAI,EAAU,iBAChC,EAAS,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,GAAK,EAAS,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,EAAU,eACxE,OACX,CAWA,SAAS,qBAA2C,CAChD,IAAM,EAAQ,IAAI,IAElB,IAAK,IAAM,KAAU,EAAI,OAAO,iBAAiB,EAAI,OAAO,QAAQ,EAAG,IAAI,GAAiB,EAAG,CAC3F,IAAM,EAAK,EAAI,OAAO,MAAM,CAAM,EAClC,GAAI,CAAC,EAAI,SAGT,IAAM,GADY,EAAI,OAAO,aAAa,EAAQ,OAAO,GAAK,GAAA,CACvC,MAAM,KAAK,CAAC,CAAC,KAAM,GAAQ,IAAQ,IAAM,IAAA,iBAAuB,EAEnF,GACA,EAAM,IAAI,IAAM,EAAI,OAAO,eAAe,CAAE,EAAG,CAAI,CAE3D,CAEA,OAAO,CACX,CAGA,SAAS,yBAAyB,EAAkB,EAA2C,CAC3F,IAAK,GAAM,CAAC,EAAY,KAAS,EAC7B,GAAI,IAAa,GAAc,EAAS,WAAW,EAAa,GAAG,GAAK,EAAS,WAAW,EAAa,GAAG,EACxG,OAAO,EAIf,OAAO,IACX,CA6CA,SAAgB,iBAAoC,CAChD,IAAM,EAAiB,oBAAoB,EACrC,EAAiB,EAAiB,EAEpC,EAAqB,EACrB,EAAqB,EAEnB,EAAS,IAAI,IAEnB,IAAK,IAAM,KAAS,EAAS,CAGzB,GAFA,GAAc,EAAM,QAAQ,OAExB,CAAC,EAAM,SAAS,WAAW,GAAG,EAC9B,SAGJ,IAEA,IAAM,EAAe,EAAM,QAAQ,MAAM,EAAM,QAAQ,QAAQ,GAAG,CAAC,EAC7D,EAAe,iBAAiB,EAAM,QAAQ,EAC9C,EAAgB,yBAAyB,EAAM,SAAU,CAAc,EACvE,EAAgB,EAAO,IAAI,CAAI,EAErC,GAAI,EACA,EAAS,QACL,GAAe,EAAS,eAAe,IAAI,CAAa,MACzD,CACH,IAAM,EAAiB,IAAI,IACvB,GAAe,EAAe,IAAI,CAAa,EACnD,EAAO,IAAI,EAAM,CAAE,MAAO,EAAG,QAAO,gBAAe,CAAC,CACxD,CACJ,CAEA,IAAM,EAAgH,CAAC,EACnH,EAAmB,EAEvB,IAAK,GAAM,CAAC,EAAM,CAAE,QAAO,QAAO,qBAAqB,EAAQ,CAC3D,GAAI,GAAS,EACT,SAGJ,IAAM,EAAc,EAAK,QAAU,EAAQ,GAC3C,GAAoB,EAEpB,EAAU,KAAK,CAAE,OAAM,QAAO,QAAO,iBAAgB,aAAY,CAAC,CACtE,CAEA,EAAU,MAAM,EAAG,IAAM,EAAE,YAAc,EAAE,WAAW,EAEtD,IAAM,EAAiC,EAAU,MAAM,EAAG,CAAQ,CAAC,CAAC,IAAK,IAAU,CAC/E,MAAW,EAAK,MAChB,SAAW,SAAS,EAAK,WAAW,EACpC,UAAW,EAAK,eAAe,KAAO,EAAI,MAAM,KAAK,EAAK,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAI,IAC9F,MAAW,EAAK,MAChB,KAAW,EAAK,IACpB,EAAE,EAEF,MAAO,CACH,QAAS,CACL,WAAY,EAAQ,OACpB,YAAa,SAAS,CAAU,EAChC,qBACA,gBAAiB,EAAO,KACxB,SAAU,SAAS,CAAgB,CACvC,EACA,YACJ,CACJ,CClJA,IAAM,eAAN,cAA6B,CAAU,CAEnC,SAAyC,IAAI,EAAK,GAAI,CAAE,WAAY,QAAS,CAAC,EAC9E,eAA0C,IAAI,EAAO,SAAS,EAC9D,OAEA,kBAAmD,KAAK,QAAQ,EAEhE,aAAc,CACV,MAAM,CAAE,cAAe,IAAI,EAAK,CAAE,QAAS,CAAE,CAAC,CAAE,CAAC,EAEjD,IAAM,EAAc,IAAI,EACpB,uPAGA,CAAE,WAAY,QAAS,CAC3B,EACA,KAAK,aAAa,CAAW,EAE7B,KAAK,eAAe,GAAG,SAAU,KAAK,aAAa,EACnD,KAAK,aAAa,KAAK,cAAc,EAErC,KAAK,aAAa,KAAK,QAAQ,EAE/B,IAAM,EAAQ,IAAI,EAAM,CACpB,CAAE,KAAM,QAAa,KAAM,SAAU,MAAO,CAAE,EAC9C,CAAE,KAAM,WAAa,KAAM,SAAU,MAAO,CAAE,EAC9C,CAAE,KAAM,YAAa,KAAM,SAAU,MAAO,CAAE,EAC9C,CAAE,KAAM,QAAa,KAAM,SAAU,MAAO,CAAE,EAC9C,CAAE,KAAM,OAAa,KAAM,SAAU,MAAO,CAAE,CAClD,CAAC,EACD,KAAK,OAAS,IAAI,EAAY,EAAO,CAAC,CAAC,EAEvC,IAAM,EAAmB,CACrB,gBAAiB,GACjB,QAAS,CACL,CAAE,MAAO,QAAa,SAAU,GAA2B,SAAU,EAAK,EAC1E,CAAE,MAAO,WAAa,SAAU,IAA0B,SAAU,EAAK,EACzE,CAAE,MAAO,YAAa,SAAU,IAA0B,SAAU,EAAK,EACzE,CAAE,MAAO,QAAa,SAAU,IAA0B,SAAU,EAAK,EACzE,CAAE,MAAO,OAAa,SAAU,IAAK,SAAU,EAAW,cAAe,GAAM,SAAU,EAAK,CAClG,CACJ,EAEA,KAAK,aAAa,IAAI,EAAM,KAAK,OAAQ,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EAE7D,KAAK,QAAQ,CACjB,CAGA,SAAwB,CACpB,GAAM,CAAE,UAAS,cAAe,gBAAgB,EAEhD,KAAK,SAAS,QACV,gBAAgB,EAAQ,WAAW,iBAAiB,EAAQ,YAAY,+BACzC,EAAQ,mBAAmB,oBAAoB,EAAQ,gBAAgB,gCACtE,EAAQ,UAC5C,EAEA,KAAK,OAAO,SAAS,CAAU,CACnC,CAOA,YAAsC,CAClC,EAAQ,OAAO,KAAK,cAAc,EAClC,MAAM,WAAW,CACrB,CACJ,EAEM,EAAyB,EAAS,cAAc,EC5FhD,EAAgB,IAChB,EAAgB,GAChB,EAAgB,IAChB,EAAgB,IAwBT,EAAb,MAAa,0BAA0B,CAAO,CAE1C,OAAe,SAAqC,KAGpD,aAAsB,CAClB,MAAM,aAAa,EAEnB,KAAK,KAAK,CAAQ,EAClB,KAAK,KAAK,CAAQ,EAClB,KAAK,SAAS,CAAY,EAC1B,KAAK,UAAU,CAAa,EAE5B,IAAM,EAAO,IAAI,EAAU,CACvB,WAAe,IACf,cAAe,IAAI,EAAK,CAAE,WAAY,EAAK,CAAC,CAChD,CAAC,EACD,EAAK,aAAa,IAAI,EAAkB,CAAE,OAAQ,CAAE,CAAC,EAErD,KAAK,aAAa,EAAM,CAAE,UAAW,EAAU,MAAO,CAAC,CAC3D,CAMA,OAAO,MAAa,CAChB,GAAI,kBAAkB,WAAa,KAAM,CACrC,IAAM,EAAW,IAAI,kBAErB,kBAAkB,SAAW,EAE7B,EAAS,KAAK,CAClB,CAEA,kBAAkB,SAAS,aAAa,CAC5C,CAKA,OAAO,OAAc,CACb,kBAAkB,WAAa,MAG/B,kBAFmC,SAE1B,aAAa,CAE9B,CAKA,OAAO,QAAe,CACd,kBAAkB,OAAO,EACzB,kBAAkB,MAAM,EAExB,kBAAkB,KAAK,CAE/B,CASA,OAAO,QAAkB,CACrB,OAAO,kBAAkB,WAAa,IAC1C,CAQA,UAAyB,CACjB,kBAAkB,WAAa,OAC/B,kBAAkB,SAAW,KAErC,CAMA,cAA8B,CAC1B,KAAK,SAAS,EACd,MAAM,aAAa,CACvB,CAKA,YAAsC,CAClC,KAAK,SAAS,EACd,MAAM,WAAW,CACrB,CACJ,ECxHM,EAAiB,GACjB,EAAiB,GACjB,EAAiB,IACjB,EAAiB,IAOjB,EAAmB,CACrB,IAAK;;8NACL,UAAW;;iLACX,KAAM;;qNACN,SAAU;;oOACV,UAAW;;+KACX,WAAY;;oLACZ,oBAAqB,uKACrB,aAAc;;0QACd,YAAa;;6OACb,aAAc;;6PACd,kBAAmB;;6HACnB,WAAY;;wSAChB,EAwBa,EAAb,MAAa,2BAA2B,CAAO,CAE3C,OAAe,SAAsC,KAErD,SAEA,KAA8C,IAAI,EAClD,WAA8C,IAAI,EAClD,MAA8C,IAAI,EAClD,UAA8C,IAAI,EAClD,WAA8C,IAAI,EAClD,gBAA8C,IAAI,EAClD,qBAA8C,IAAI,EAClD,cAA8C,IAAI,EAClD,aAA8C,IAAI,EAClD,cAA8C,IAAI,EAClD,mBAA8C,IAAI,EAClD,YAA8C,IAAI,EAElD,eAAwE,GAAW,KAAK,SAAS,CAAM,EAEvG,kBAA6C,IAAI,EAAO,kBAAkB,EAC1E,2BAA4D,EAAkB,KAAK,EAGnF,aAAsB,CAClB,MAAM,cAAe,CAAE,UAAW,EAAM,CAAC,EAEzC,KAAK,KAAK,CAAS,EACnB,KAAK,KAAK,CAAS,EACnB,KAAK,SAAS,CAAa,EAC3B,KAAK,UAAU,CAAc,EAE7B,IAAM,EAA+B,CACjC,CAAE,UAAW,IAAI,EAAO,SAAS,EAAG,UAAW,EAAK,EACpD,CAAC,CAAE,MAAO,MAA0B,UAAW,KAAK,KAAsB,YAAa,EAAiB,GAAI,CAAC,EAC7G,CAAC,CAAE,MAAO,aAA0B,UAAW,KAAK,WAAsB,YAAa,EAAiB,SAAU,CAAC,EACnH,CAAC,CAAE,MAAO,UAA0B,UAAW,KAAK,MAAsB,YAAa,EAAiB,IAAK,CAAC,EAC9G,CAAC,CAAE,MAAO,YAA0B,UAAW,KAAK,UAAsB,YAAa,EAAiB,QAAS,CAAC,EAClH,CAAC,CAAE,MAAO,aAA0B,UAAW,KAAK,WAAsB,YAAa,EAAiB,SAAU,CAAC,EACnH,CAAE,UAAW,IAAI,EAAO,WAAW,EAAG,UAAW,EAAK,EACtD,CAAC,CAAE,MAAO,aAA0B,UAAW,KAAK,gBAAsB,YAAa,EAAiB,UAAW,CAAC,EACpH,CAAC,CAAE,MAAO,yBAA0B,UAAW,KAAK,qBAAsB,YAAa,EAAiB,mBAAoB,CAAC,EAC7H,CAAC,CAAE,MAAO,gBAA0B,UAAW,KAAK,cAAsB,YAAa,EAAiB,YAAa,CAAC,EACtH,CAAC,CAAE,MAAO,eAA0B,UAAW,KAAK,aAAsB,YAAa,EAAiB,WAAY,CAAC,EACrH,CAAC,CAAE,MAAO,gBAA0B,UAAW,KAAK,cAAsB,YAAa,EAAiB,YAAa,CAAC,EACtH,CAAC,CAAE,MAAO,qBAA0B,UAAW,KAAK,mBAAsB,YAAa,EAAiB,iBAAkB,CAAC,EAC3H,CAAC,CAAE,MAAO,mBAA0B,UAAW,KAAK,YAAsB,YAAa,EAAiB,UAAW,CAAC,CACxH,EAEA,KAAK,kBAAkB,GAAG,SAAU,KAAK,sBAAsB,EAC/D,KAAK,SAAW,IAAI,mBAAmB,CAAE,SAAU,KAAK,cAAe,CAAC,EAExE,KAAK,aAAa,EAAU,CACxB,cAAe,EAAK,CAAE,WAAY,EAAK,CAAC,EACxC,WAAY,CACR,CAAE,UAAW,EAAY,CAAE,QAAS,EAAG,MAAK,CAAC,CAAE,EAC/C,CAAE,UAAW,EAAU,EAAG,YAAa,CAAE,OAAQ,CAAI,CAAE,EACvD,CAAE,UAAW,KAAK,iBAAkB,CACxC,CACJ,CAAC,EAAG,CAAE,UAAW,EAAU,MAAO,CAAC,CACvC,CAMA,OAAO,MAAa,CAChB,GAAI,mBAAmB,WAAa,KAAM,CACtC,IAAM,EAAW,IAAI,mBAErB,mBAAmB,SAAW,EAE9B,EAAS,KAAK,EACd,EAAS,SAAS,MAAM,CAC5B,CAEA,mBAAmB,SAAS,aAAa,CAC7C,CAKA,OAAO,OAAc,CACb,mBAAmB,WAAa,MAGhC,mBAFoC,SAE3B,aAAa,CAE9B,CAKA,OAAO,QAAe,CACd,mBAAmB,OAAO,EAC1B,mBAAmB,MAAM,EAEzB,mBAAmB,KAAK,CAEhC,CASA,OAAO,QAAkB,CACrB,OAAO,mBAAmB,WAAa,IAC3C,CAUA,UAAyB,CACrB,KAAK,SAAS,KAAK,EACnB,EAAQ,OAAO,KAAK,iBAAiB,EAEjC,mBAAmB,WAAa,OAChC,mBAAmB,SAAW,KAEtC,CAMA,cAA8B,CAC1B,KAAK,SAAS,EACd,MAAM,aAAa,CACvB,CAKA,YAAsC,CAClC,KAAK,SAAS,EACd,MAAM,WAAW,CACrB,CAOA,SAAiB,EAAiC,CAC9C,KAAK,KAAK,QAAQ,OAAO,KAAK,MAAM,EAAO,GAAG,CAAC,CAAC,EAChD,KAAK,WAAW,QAAQ,GAAG,EAAO,YAAY,QAAQ,CAAC,EAAE,WAAW,EAAO,eAAe,QAAQ,CAAC,EAAE,EAAE,EACvG,KAAK,MAAM,QACP,EAAO,aAAe,MAAQ,EAAO,cAAgB,KAC/C,GAAG,EAAO,WAAW,QAAQ,CAAC,EAAE,KAAK,EAAO,YAAY,QAAQ,CAAC,EAAE,KACnE,aACV,EACA,KAAK,UAAU,QAAQ,OAAO,EAAO,QAAQ,CAAC,EAC9C,KAAK,WAAW,QAAQ,GAAG,EAAO,UAAU,KAAK,EAAO,gBAAgB,EAAE,EAC1E,KAAK,gBAAgB,QAAQ,OAAO,EAAO,UAAU,CAAC,EACtD,KAAK,qBAAqB,QAAQ,GAAG,EAAO,sBAAsB,KAAK,EAAO,qBAAqB,EACnG,KAAK,cAAc,QAAQ,GAAG,KAAK,MAAM,EAAO,kBAAkB,EAAE,IAAI,EACxE,KAAK,aAAa,QAAQ,GAAG,EAAO,iBAAiB,QAAQ,CAAC,EAAE,WAAW,EAAO,iBAAiB,QAAQ,CAAC,EAAE,EAAE,EAChH,KAAK,cAAc,QAAQ,OAAO,EAAO,YAAY,CAAC,EACtD,KAAK,mBAAmB,QAAQ,OAAO,EAAO,iBAAiB,CAAC,EAChE,KAAK,YAAY,QACb,GAAG,EAAO,WAAW,MAAM,IAAI,EAAO,WAAW,SAAS,UAAU,EAAO,WAAW,MAAM,MAChG,CACJ,CACJ"}