@mono-lit/helper 0.0.0-stage → 0.0.2

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 (539) hide show
  1. package/LICENSE.md +55 -0
  2. package/README.md +35 -3
  3. package/dist/breakpoints-CAbhDUht.js +84 -0
  4. package/dist/checkbox-Cqpie9Ap.js +4 -0
  5. package/dist/chip-DBUUa2eB.js +4 -0
  6. package/dist/chip-limits-BMoO31JM.js +213 -0
  7. package/dist/chip-strip-Cw3gyz0q.js +213 -0
  8. package/dist/color-DHYrfXsX.js +253 -0
  9. package/dist/css-class-BRKRzHx-.js +60 -0
  10. package/dist/css-size-DhHSVZJK.js +37 -0
  11. package/dist/data/theme/presets.json.d.ts +140 -0
  12. package/dist/data-source-controller-B_rgHCjw.js +241 -0
  13. package/dist/data-source-controller-Dbb4fd8I.js +241 -0
  14. package/dist/data-source-options-CP-X62Pa.js +535 -0
  15. package/dist/data-source-options-Jqj7LU3Z.js +537 -0
  16. package/dist/data-source-read-B4DGp6UQ.js +216 -0
  17. package/dist/data-source-read-DL88aH8t.js +217 -0
  18. package/dist/decorate-DEXtNagw.js +141 -0
  19. package/dist/element-props-CLB6yvbm.js +114 -0
  20. package/dist/esm-Ptok4SQZ.js +2026 -0
  21. package/dist/excel-CY6zGkcx.js +608 -0
  22. package/dist/excel-DopRbEMK.js +608 -0
  23. package/dist/export-BiGVyxt6.js +2302 -0
  24. package/dist/export.d.ts +1 -0
  25. package/dist/export.js +2302 -0
  26. package/dist/field-icons-DELrSdqJ.js +86 -0
  27. package/dist/field-path-C92eGLg3.js +251 -0
  28. package/dist/filter-builder-Bke3qOgJ.js +205 -0
  29. package/dist/filter-builder-CE4zE0V5.js +205 -0
  30. package/dist/filter-eval-DIfU2EAn.js +173 -0
  31. package/dist/filter-odata-C1vSGZaY.js +591 -0
  32. package/dist/form-control-core-B8d7k6vk.js +223 -0
  33. package/dist/form-control-core-eeRr0zLU.js +223 -0
  34. package/dist/hydration-flush-RB5Tz5nl.js +1001 -0
  35. package/dist/icon-CJkTlmTb.js +55 -0
  36. package/dist/icon-dVhYJUIH.js +17 -0
  37. package/dist/import-BgJdkwBI.js +606 -0
  38. package/dist/import.d.ts +1 -0
  39. package/dist/import.js +606 -0
  40. package/dist/index.d.ts +1 -0
  41. package/dist/index.js +16 -0
  42. package/dist/index.node-BIqEGehH.js +396 -0
  43. package/dist/index.node.d.ts +1 -0
  44. package/dist/index.node.js +16 -0
  45. package/dist/input-zGOULADt.js +4 -0
  46. package/dist/layout-var-CZnzMC0s.js +73 -0
  47. package/dist/light-slots-BVJwyg_2.js +244 -0
  48. package/dist/light-slots-DW1WgfgT.js +254 -0
  49. package/dist/markdown-DfqrfOJN.js +20146 -0
  50. package/dist/mono-button-simcTQdW.js +873 -0
  51. package/dist/mono-button.shadow-B_rKOY9N.js +784 -0
  52. package/dist/mono-data-chart-CEv29_NS.js +779 -0
  53. package/dist/mono-data-dropdown-Wnoke6zO.js +357 -0
  54. package/dist/mono-data-grid-CjkEqxgE.js +3913 -0
  55. package/dist/mono-data-grid-YjR3n9Ar.js +3915 -0
  56. package/dist/mono-element-B0kP_96P.js +232 -0
  57. package/dist/mono-event-Bi1qP9uN.js +129 -0
  58. package/dist/mono-form-controller-5PfsU4qa.js +409 -0
  59. package/dist/mono-modal-controller-BMO3n3rP.js +223 -0
  60. package/dist/mono-ui-CPV7rrdo.js +358 -0
  61. package/dist/normalize-error-Gcgmgh5i.js +871 -0
  62. package/dist/notifier-CE4yxMUQ.js +88 -0
  63. package/dist/nuxt.d.ts +1 -0
  64. package/dist/nuxt.js +130 -0
  65. package/dist/popup-portal-BziRX1yG.js +465 -0
  66. package/dist/popup-stack-CEEMib__.js +189 -0
  67. package/dist/rate-limit-BBa2PO79.js +521 -0
  68. package/dist/reactive-D3EERqgO.js +47 -0
  69. package/dist/reactive-Di3mTMnV.js +1087 -0
  70. package/dist/search.d.ts +1 -0
  71. package/dist/search.js +97 -0
  72. package/dist/src/components/accordion/accordion-core.d.ts +62 -0
  73. package/dist/src/components/accordion/accordion-types.d.ts +62 -0
  74. package/dist/src/components/accordion/index.d.ts +3 -0
  75. package/dist/src/components/accordion/index.shadow.d.ts +5 -0
  76. package/dist/src/components/accordion/mono-accordion.d.ts +55 -0
  77. package/dist/src/components/accordion/mono-accordion.shadow.d.ts +56 -0
  78. package/dist/src/components/alert/alert-core.d.ts +46 -0
  79. package/dist/src/components/alert/alert-types.d.ts +44 -0
  80. package/dist/src/components/alert/index.d.ts +3 -0
  81. package/dist/src/components/alert/index.shadow.d.ts +5 -0
  82. package/dist/src/components/alert/mono-alert.d.ts +44 -0
  83. package/dist/src/components/alert/mono-alert.shadow.d.ts +34 -0
  84. package/dist/src/components/breadcrumb/breadcrumb-core.d.ts +61 -0
  85. package/dist/src/components/breadcrumb/breadcrumb-list-core.d.ts +49 -0
  86. package/dist/src/components/breadcrumb/breadcrumb-render.d.ts +31 -0
  87. package/dist/src/components/breadcrumb/breadcrumb-types.d.ts +117 -0
  88. package/dist/src/components/breadcrumb/breadcrumb-utils.d.ts +43 -0
  89. package/dist/src/components/breadcrumb/index.d.ts +6 -0
  90. package/dist/src/components/breadcrumb/index.shadow.d.ts +8 -0
  91. package/dist/src/components/breadcrumb/mono-breadcrumb-list.d.ts +29 -0
  92. package/dist/src/components/breadcrumb/mono-breadcrumb-list.shadow.d.ts +48 -0
  93. package/dist/src/components/breadcrumb/mono-breadcrumb.d.ts +38 -0
  94. package/dist/src/components/breadcrumb/mono-breadcrumb.shadow.d.ts +73 -0
  95. package/dist/src/components/button/button-core.d.ts +90 -0
  96. package/dist/src/components/button/button-dropdown-core.d.ts +57 -0
  97. package/dist/src/components/button/button-dropdown-types.d.ts +129 -0
  98. package/dist/src/components/button/button-types.d.ts +219 -0
  99. package/dist/src/components/button/button-utils.d.ts +18 -0
  100. package/dist/src/components/button/index.button-dropdown.d.ts +4 -0
  101. package/dist/src/components/button/index.button-dropdown.shadow.d.ts +4 -0
  102. package/dist/src/components/button/index.d.ts +8 -0
  103. package/dist/src/components/button/index.shadow.d.ts +5 -0
  104. package/dist/src/components/button/mono-button-dropdown.d.ts +35 -0
  105. package/dist/src/components/button/mono-button-dropdown.shadow.d.ts +45 -0
  106. package/dist/src/components/button/mono-button.d.ts +123 -0
  107. package/dist/src/components/button/mono-button.shadow.d.ts +56 -0
  108. package/dist/src/components/card/card-core.d.ts +75 -0
  109. package/dist/src/components/card/card-types.d.ts +137 -0
  110. package/dist/src/components/card/card-utils.d.ts +23 -0
  111. package/dist/src/components/card/index.d.ts +4 -0
  112. package/dist/src/components/card/index.shadow.d.ts +6 -0
  113. package/dist/src/components/card/mono-card.d.ts +56 -0
  114. package/dist/src/components/card/mono-card.shadow.d.ts +52 -0
  115. package/dist/src/components/chart/chart-core.d.ts +43 -0
  116. package/dist/src/components/chart/chart-odata.d.ts +52 -0
  117. package/dist/src/components/chart/chart-types.d.ts +356 -0
  118. package/dist/src/components/chart/index.d.ts +8 -0
  119. package/dist/src/components/chart/index.shadow.d.ts +7 -0
  120. package/dist/src/components/chart/mono-chart-presets.d.ts +43 -0
  121. package/dist/src/components/chart/mono-chart-presets.shadow.d.ts +43 -0
  122. package/dist/src/components/chart/mono-chart.d.ts +30 -0
  123. package/dist/src/components/chart/mono-chart.shadow.d.ts +22 -0
  124. package/dist/src/components/chart/mono-data-chart.d.ts +27 -0
  125. package/dist/src/components/checkbox/checkbox-core.d.ts +53 -0
  126. package/dist/src/components/checkbox/checkbox-types.d.ts +69 -0
  127. package/dist/src/components/checkbox/checkbox-utils.d.ts +35 -0
  128. package/dist/src/components/checkbox/index.d.ts +4 -0
  129. package/dist/src/components/checkbox/index.shadow.d.ts +5 -0
  130. package/dist/src/components/checkbox/mono-checkbox.d.ts +34 -0
  131. package/dist/src/components/checkbox/mono-checkbox.shadow.d.ts +45 -0
  132. package/dist/src/components/chip/chip-core.d.ts +58 -0
  133. package/dist/src/components/chip/chip-types.d.ts +142 -0
  134. package/dist/src/components/chip/chip-utils.d.ts +24 -0
  135. package/dist/src/components/chip/index.d.ts +8 -0
  136. package/dist/src/components/chip/index.shadow.d.ts +6 -0
  137. package/dist/src/components/chip/mono-chip.d.ts +48 -0
  138. package/dist/src/components/chip/mono-chip.shadow.d.ts +33 -0
  139. package/dist/src/components/chip/mono-status-dot.d.ts +34 -0
  140. package/dist/src/components/date/date-core.d.ts +80 -0
  141. package/dist/src/components/date/date-types.d.ts +163 -0
  142. package/dist/src/components/date/index.d.ts +3 -0
  143. package/dist/src/components/date/index.shadow.d.ts +4 -0
  144. package/dist/src/components/date/mono-date.d.ts +22 -0
  145. package/dist/src/components/date/mono-date.shadow.d.ts +31 -0
  146. package/dist/src/components/drawer/drawer-core.d.ts +99 -0
  147. package/dist/src/components/drawer/drawer-types.d.ts +153 -0
  148. package/dist/src/components/drawer/index.d.ts +3 -0
  149. package/dist/src/components/drawer/index.shadow.d.ts +4 -0
  150. package/dist/src/components/drawer/mono-drawer.d.ts +45 -0
  151. package/dist/src/components/drawer/mono-drawer.shadow.d.ts +46 -0
  152. package/dist/src/components/dropdown/dropdown-core.d.ts +33 -0
  153. package/dist/src/components/dropdown/dropdown-types.d.ts +88 -0
  154. package/dist/src/components/dropdown/index.d.ts +3 -0
  155. package/dist/src/components/dropdown/index.shadow.d.ts +4 -0
  156. package/dist/src/components/dropdown/mono-dropdown.d.ts +34 -0
  157. package/dist/src/components/dropdown/mono-dropdown.shadow.d.ts +28 -0
  158. package/dist/src/components/dropdown-table/dropdown-table-core.d.ts +65 -0
  159. package/dist/src/components/dropdown-table/dropdown-table-types.d.ts +278 -0
  160. package/dist/src/components/dropdown-table/index.d.ts +5 -0
  161. package/dist/src/components/dropdown-table/index.shadow.d.ts +6 -0
  162. package/dist/src/components/dropdown-table/mono-data-dropdown.d.ts +152 -0
  163. package/dist/src/components/dropdown-table/mono-dropdown-table.d.ts +46 -0
  164. package/dist/src/components/dropdown-table/mono-dropdown-table.shadow.d.ts +22 -0
  165. package/dist/src/components/file-upload/file-upload-core.d.ts +60 -0
  166. package/dist/src/components/file-upload/file-upload-types.d.ts +145 -0
  167. package/dist/src/components/file-upload/file-upload-utils.d.ts +16 -0
  168. package/dist/src/components/file-upload/index.d.ts +4 -0
  169. package/dist/src/components/file-upload/index.shadow.d.ts +5 -0
  170. package/dist/src/components/file-upload/mono-file-upload.d.ts +33 -0
  171. package/dist/src/components/file-upload/mono-file-upload.shadow.d.ts +50 -0
  172. package/dist/src/components/filter/filter-builder-core.d.ts +36 -0
  173. package/dist/src/components/filter/filter-builder.d.ts +23 -0
  174. package/dist/src/components/filter/filter-odata.d.ts +27 -0
  175. package/dist/src/components/filter/filter-operators.d.ts +13 -0
  176. package/dist/src/components/filter/filter-types.d.ts +253 -0
  177. package/dist/src/components/filter/index.d.ts +6 -0
  178. package/dist/src/components/filter/index.shadow.d.ts +7 -0
  179. package/dist/src/components/filter/mono-filter-builder.d.ts +21 -0
  180. package/dist/src/components/filter/mono-filter-builder.shadow.d.ts +17 -0
  181. package/dist/src/components/form/form-control-core.d.ts +37 -0
  182. package/dist/src/components/form/form-rules.d.ts +25 -0
  183. package/dist/src/components/form/form-types.d.ts +307 -0
  184. package/dist/src/components/form/index.d.ts +6 -0
  185. package/dist/src/components/form/mono-form-controller.d.ts +16 -0
  186. package/dist/src/components/input/index.d.ts +6 -0
  187. package/dist/src/components/input/index.shadow.d.ts +8 -0
  188. package/dist/src/components/input/input-core.d.ts +91 -0
  189. package/dist/src/components/input/input-format.d.ts +118 -0
  190. package/dist/src/components/input/input-types.d.ts +179 -0
  191. package/dist/src/components/input/input-utils.d.ts +10 -0
  192. package/dist/src/components/input/mono-input.d.ts +46 -0
  193. package/dist/src/components/input/mono-input.shadow.d.ts +34 -0
  194. package/dist/src/components/menu/index.d.ts +6 -0
  195. package/dist/src/components/menu/index.shadow.d.ts +7 -0
  196. package/dist/src/components/menu/menu-core.d.ts +65 -0
  197. package/dist/src/components/menu/menu-render.d.ts +55 -0
  198. package/dist/src/components/menu/menu-types.d.ts +195 -0
  199. package/dist/src/components/menu/menu-utils.d.ts +53 -0
  200. package/dist/src/components/menu/mono-menu-list.d.ts +118 -0
  201. package/dist/src/components/menu/mono-menu.d.ts +39 -0
  202. package/dist/src/components/menu/mono-menu.shadow.d.ts +40 -0
  203. package/dist/src/components/modal/index.d.ts +4 -0
  204. package/dist/src/components/modal/index.shadow.d.ts +5 -0
  205. package/dist/src/components/modal/modal-core.d.ts +110 -0
  206. package/dist/src/components/modal/modal-types.d.ts +304 -0
  207. package/dist/src/components/modal/mono-modal-controller.d.ts +4 -0
  208. package/dist/src/components/modal/mono-modal.d.ts +45 -0
  209. package/dist/src/components/modal/mono-modal.shadow.d.ts +50 -0
  210. package/dist/src/components/nav/index.d.ts +4 -0
  211. package/dist/src/components/nav/index.shadow.d.ts +6 -0
  212. package/dist/src/components/nav/mono-nav.d.ts +41 -0
  213. package/dist/src/components/nav/mono-nav.shadow.d.ts +21 -0
  214. package/dist/src/components/nav/nav-core.d.ts +34 -0
  215. package/dist/src/components/nav/nav-types.d.ts +48 -0
  216. package/dist/src/components/nav/nav-utils.d.ts +12 -0
  217. package/dist/src/components/radio/index.d.ts +4 -0
  218. package/dist/src/components/radio/index.shadow.d.ts +5 -0
  219. package/dist/src/components/radio/mono-radio.d.ts +31 -0
  220. package/dist/src/components/radio/mono-radio.shadow.d.ts +35 -0
  221. package/dist/src/components/radio/radio-core.d.ts +45 -0
  222. package/dist/src/components/radio/radio-types.d.ts +58 -0
  223. package/dist/src/components/radio/radio-utils.d.ts +12 -0
  224. package/dist/src/components/rich-text-editor/index.d.ts +5 -0
  225. package/dist/src/components/rich-text-editor/index.shadow.d.ts +6 -0
  226. package/dist/src/components/rich-text-editor/mono-rich-text-editor.d.ts +31 -0
  227. package/dist/src/components/rich-text-editor/mono-rich-text-editor.shadow.d.ts +34 -0
  228. package/dist/src/components/rich-text-editor/rich-text-editor-core.d.ts +100 -0
  229. package/dist/src/components/rich-text-editor/rich-text-editor-loader.d.ts +17 -0
  230. package/dist/src/components/rich-text-editor/rich-text-editor-toolbar.d.ts +65 -0
  231. package/dist/src/components/rich-text-editor/rich-text-editor-types.d.ts +231 -0
  232. package/dist/src/components/select/index.d.ts +4 -0
  233. package/dist/src/components/select/index.shadow.d.ts +5 -0
  234. package/dist/src/components/select/mono-select.d.ts +69 -0
  235. package/dist/src/components/select/mono-select.shadow.d.ts +48 -0
  236. package/dist/src/components/select/select-core.d.ts +98 -0
  237. package/dist/src/components/select/select-types.d.ts +284 -0
  238. package/dist/src/components/select/select-utils.d.ts +7 -0
  239. package/dist/src/components/sidebar/index.d.ts +4 -0
  240. package/dist/src/components/sidebar/index.shadow.d.ts +6 -0
  241. package/dist/src/components/sidebar/mono-sidebar.d.ts +34 -0
  242. package/dist/src/components/sidebar/mono-sidebar.shadow.d.ts +27 -0
  243. package/dist/src/components/sidebar/sidebar-core.d.ts +51 -0
  244. package/dist/src/components/sidebar/sidebar-types.d.ts +119 -0
  245. package/dist/src/components/sidebar/sidebar-utils.d.ts +55 -0
  246. package/dist/src/components/switch/index.d.ts +4 -0
  247. package/dist/src/components/switch/index.shadow.d.ts +5 -0
  248. package/dist/src/components/switch/mono-switch.d.ts +31 -0
  249. package/dist/src/components/switch/mono-switch.shadow.d.ts +36 -0
  250. package/dist/src/components/switch/switch-core.d.ts +49 -0
  251. package/dist/src/components/switch/switch-types.d.ts +64 -0
  252. package/dist/src/components/switch/switch-utils.d.ts +12 -0
  253. package/dist/src/components/table/array-source.d.ts +44 -0
  254. package/dist/src/components/table/date-filter-tree.d.ts +93 -0
  255. package/dist/src/components/table/grouping.d.ts +55 -0
  256. package/dist/src/components/table/index.d.ts +33 -0
  257. package/dist/src/components/table/index.shadow.d.ts +47 -0
  258. package/dist/src/components/table/mono-data-grid.d.ts +1756 -0
  259. package/dist/src/components/table/mono-table-checkbox-core.d.ts +76 -0
  260. package/dist/src/components/table/mono-table-checkbox.d.ts +34 -0
  261. package/dist/src/components/table/mono-table-checkbox.shadow.d.ts +26 -0
  262. package/dist/src/components/table/mono-table-detail-core.d.ts +87 -0
  263. package/dist/src/components/table/mono-table-detail.d.ts +32 -0
  264. package/dist/src/components/table/mono-table-detail.shadow.d.ts +31 -0
  265. package/dist/src/components/table/mono-table-empty-core.d.ts +60 -0
  266. package/dist/src/components/table/mono-table-empty.d.ts +35 -0
  267. package/dist/src/components/table/mono-table-empty.shadow.d.ts +40 -0
  268. package/dist/src/components/table/mono-table-error-core.d.ts +84 -0
  269. package/dist/src/components/table/mono-table-error.d.ts +28 -0
  270. package/dist/src/components/table/mono-table-error.shadow.d.ts +21 -0
  271. package/dist/src/components/table/mono-table-info-core.d.ts +13 -0
  272. package/dist/src/components/table/mono-table-info.d.ts +19 -0
  273. package/dist/src/components/table/mono-table-info.shadow.d.ts +14 -0
  274. package/dist/src/components/table/mono-table-loading-core.d.ts +41 -0
  275. package/dist/src/components/table/mono-table-loading.d.ts +50 -0
  276. package/dist/src/components/table/mono-table-loading.shadow.d.ts +14 -0
  277. package/dist/src/components/table/mono-table-page-size-core.d.ts +14 -0
  278. package/dist/src/components/table/mono-table-page-size.d.ts +16 -0
  279. package/dist/src/components/table/mono-table-page-size.shadow.d.ts +11 -0
  280. package/dist/src/components/table/mono-table-paging-core.d.ts +22 -0
  281. package/dist/src/components/table/mono-table-paging-group-core.d.ts +18 -0
  282. package/dist/src/components/table/mono-table-paging-group.d.ts +20 -0
  283. package/dist/src/components/table/mono-table-paging-group.shadow.d.ts +13 -0
  284. package/dist/src/components/table/mono-table-paging.d.ts +16 -0
  285. package/dist/src/components/table/mono-table-paging.shadow.d.ts +11 -0
  286. package/dist/src/components/table/mono-table-search-core.d.ts +74 -0
  287. package/dist/src/components/table/mono-table-search.d.ts +34 -0
  288. package/dist/src/components/table/mono-table-search.shadow.d.ts +21 -0
  289. package/dist/src/components/table/mono-table-sort-core.d.ts +35 -0
  290. package/dist/src/components/table/mono-table-sort.d.ts +38 -0
  291. package/dist/src/components/table/mono-table-sort.shadow.d.ts +20 -0
  292. package/dist/src/components/table/mono-table-summary-core.d.ts +26 -0
  293. package/dist/src/components/table/mono-table-summary.d.ts +24 -0
  294. package/dist/src/components/table/mono-table-summary.shadow.d.ts +14 -0
  295. package/dist/src/components/table/mono-table-th-core.d.ts +56 -0
  296. package/dist/src/components/table/mono-table-th.d.ts +41 -0
  297. package/dist/src/components/table/mono-table-th.shadow.d.ts +19 -0
  298. package/dist/src/components/table/store-group-source.d.ts +24 -0
  299. package/dist/src/components/table/table-controller-core.d.ts +40 -0
  300. package/dist/src/components/table/table-filter-icons.d.ts +3 -0
  301. package/dist/src/components/table/table-menu-core.d.ts +65 -0
  302. package/dist/src/components/table/table-overlay.d.ts +165 -0
  303. package/dist/src/components/table/table-sort-icons.d.ts +4 -0
  304. package/dist/src/components/table/table-sort-utils.d.ts +20 -0
  305. package/dist/src/components/table/table-types.d.ts +475 -0
  306. package/dist/src/components/tabs/index.d.ts +3 -0
  307. package/dist/src/components/tabs/index.shadow.d.ts +4 -0
  308. package/dist/src/components/tabs/mono-tabs.d.ts +33 -0
  309. package/dist/src/components/tabs/mono-tabs.shadow.d.ts +37 -0
  310. package/dist/src/components/tabs/tabs-core.d.ts +57 -0
  311. package/dist/src/components/tabs/tabs-types.d.ts +65 -0
  312. package/dist/src/components/tag-input/index.d.ts +4 -0
  313. package/dist/src/components/tag-input/index.shadow.d.ts +5 -0
  314. package/dist/src/components/tag-input/mono-tag-input.d.ts +66 -0
  315. package/dist/src/components/tag-input/mono-tag-input.shadow.d.ts +40 -0
  316. package/dist/src/components/tag-input/tag-input-core.d.ts +108 -0
  317. package/dist/src/components/tag-input/tag-input-types.d.ts +420 -0
  318. package/dist/src/components/tag-input/tag-input-utils.d.ts +8 -0
  319. package/dist/src/components/textarea/index.d.ts +4 -0
  320. package/dist/src/components/textarea/index.shadow.d.ts +5 -0
  321. package/dist/src/components/textarea/mono-textarea.d.ts +29 -0
  322. package/dist/src/components/textarea/mono-textarea.shadow.d.ts +31 -0
  323. package/dist/src/components/textarea/textarea-core.d.ts +60 -0
  324. package/dist/src/components/textarea/textarea-types.d.ts +131 -0
  325. package/dist/src/components/textarea/textarea-utils.d.ts +7 -0
  326. package/dist/src/components/tooltip/control-tooltip.d.ts +36 -0
  327. package/dist/src/components/tooltip/index.d.ts +6 -0
  328. package/dist/src/components/tooltip/tooltip-config.d.ts +27 -0
  329. package/dist/src/components/tooltip/tooltip-declarative.d.ts +41 -0
  330. package/dist/src/components/tooltip/tooltip-loader.d.ts +1 -0
  331. package/dist/src/components/tooltip/tooltip-types.d.ts +110 -0
  332. package/dist/src/composables/breakpoints.d.ts +59 -0
  333. package/dist/src/composables/chip-limits.d.ts +48 -0
  334. package/dist/src/composables/chip-strip.d.ts +93 -0
  335. package/dist/src/composables/color.d.ts +103 -0
  336. package/dist/src/composables/css-class.d.ts +27 -0
  337. package/dist/src/composables/css-size.d.ts +40 -0
  338. package/dist/src/composables/data-source-controller.d.ts +113 -0
  339. package/dist/src/composables/element-props.d.ts +46 -0
  340. package/dist/src/composables/field-icons.d.ts +15 -0
  341. package/dist/src/composables/hybird-prop.d.ts +79 -0
  342. package/dist/src/composables/hydration-flush.d.ts +34 -0
  343. package/dist/src/composables/icon.d.ts +17 -0
  344. package/dist/src/composables/layout-var.d.ts +34 -0
  345. package/dist/src/composables/light-slots.d.ts +133 -0
  346. package/dist/src/composables/mdi-glyphs.d.ts +4 -0
  347. package/dist/src/composables/mono-element.d.ts +9 -0
  348. package/dist/src/composables/mono-event.d.ts +55 -0
  349. package/dist/src/composables/mono-pending.d.ts +8 -0
  350. package/dist/src/composables/mono-skeleton.d.ts +193 -0
  351. package/dist/src/composables/mono-ui.d.ts +58 -0
  352. package/dist/src/composables/notifier.d.ts +46 -0
  353. package/dist/src/composables/popup-portal.d.ts +226 -0
  354. package/dist/src/composables/popup-stack.d.ts +70 -0
  355. package/dist/src/composables/rate-limit.d.ts +108 -0
  356. package/dist/src/composables/reactive.d.ts +53 -0
  357. package/dist/src/composables/shadow-css.d.ts +42 -0
  358. package/dist/src/composables/visibility.d.ts +36 -0
  359. package/dist/src/data/theme/index.d.ts +30 -0
  360. package/dist/src/data/theme/presets.d.ts +94 -0
  361. package/dist/src/entries/index.d.ts +2 -0
  362. package/dist/src/entries/index.node.d.ts +42 -0
  363. package/dist/src/entries/search.d.ts +3 -0
  364. package/dist/src/export/detail.d.ts +29 -0
  365. package/dist/src/export/download.d.ts +9 -0
  366. package/dist/src/export/excel/index.d.ts +27 -0
  367. package/dist/src/export/excel/nodes.d.ts +123 -0
  368. package/dist/src/export/expression.d.ts +36 -0
  369. package/dist/src/export/helpers.d.ts +6 -0
  370. package/dist/src/export/index.d.ts +13 -0
  371. package/dist/src/export/markdown.d.ts +52 -0
  372. package/dist/src/export/resolve-data.d.ts +31 -0
  373. package/dist/src/export/sentinel.d.ts +97 -0
  374. package/dist/src/export/sheet-name.d.ts +45 -0
  375. package/dist/src/export/styles.d.ts +33 -0
  376. package/dist/src/export/template.d.ts +10 -0
  377. package/dist/src/export/types.d.ts +259 -0
  378. package/dist/src/import/coerce.d.ts +38 -0
  379. package/dist/src/import/index.d.ts +16 -0
  380. package/dist/src/import/match.d.ts +54 -0
  381. package/dist/src/import/parse.d.ts +15 -0
  382. package/dist/src/import/types.d.ts +153 -0
  383. package/dist/src/nuxt/index.d.ts +94 -0
  384. package/dist/src/search/data-search.d.ts +207 -0
  385. package/dist/src/search/field-path.d.ts +107 -0
  386. package/dist/src/search/filter-eval.d.ts +30 -0
  387. package/dist/src/search/index.d.ts +22 -0
  388. package/dist/src/search/odata-search.d.ts +18 -0
  389. package/dist/src/search/search-expr.d.ts +160 -0
  390. package/dist/src/utils/data-source-apply.d.ts +97 -0
  391. package/dist/src/utils/data-source-options.d.ts +116 -0
  392. package/dist/src/utils/data-source-read.d.ts +85 -0
  393. package/dist/src/utils/data-source-summary.d.ts +55 -0
  394. package/dist/src/utils/normalize-error.d.ts +90 -0
  395. package/dist/src/vite/index.d.ts +48 -0
  396. package/dist/src/vite/mono-client-only.d.ts +35 -0
  397. package/dist/src/vite/mono-ssr-stub.d.ts +20 -0
  398. package/dist/src/vite/shadow-manifest.d.ts +8 -0
  399. package/dist/styles-BIJ31TM4.js +20146 -0
  400. package/dist/tooltip-DQqNpqk2.js +795 -0
  401. package/dist/tooltip.d.ts +1 -0
  402. package/dist/tooltip.js +2 -0
  403. package/dist/ui/accordion.d.ts +1 -0
  404. package/dist/ui/accordion.js +466 -0
  405. package/dist/ui/alert.d.ts +1 -0
  406. package/dist/ui/alert.js +221 -0
  407. package/dist/ui/breadcrumb.d.ts +1 -0
  408. package/dist/ui/breadcrumb.js +902 -0
  409. package/dist/ui/button-dropdown.d.ts +1 -0
  410. package/dist/ui/button-dropdown.js +679 -0
  411. package/dist/ui/button.d.ts +1 -0
  412. package/dist/ui/button.js +63 -0
  413. package/dist/ui/card.d.ts +1 -0
  414. package/dist/ui/card.js +524 -0
  415. package/dist/ui/chart.d.ts +1 -0
  416. package/dist/ui/chart.js +885 -0
  417. package/dist/ui/checkbox.d.ts +1 -0
  418. package/dist/ui/checkbox.js +413 -0
  419. package/dist/ui/chip.d.ts +1 -0
  420. package/dist/ui/chip.js +558 -0
  421. package/dist/ui/date.d.ts +1 -0
  422. package/dist/ui/date.js +686 -0
  423. package/dist/ui/drawer.d.ts +1 -0
  424. package/dist/ui/drawer.js +901 -0
  425. package/dist/ui/dropdown-table.d.ts +1 -0
  426. package/dist/ui/dropdown-table.js +1291 -0
  427. package/dist/ui/dropdown.d.ts +1 -0
  428. package/dist/ui/dropdown.js +586 -0
  429. package/dist/ui/file-upload.d.ts +1 -0
  430. package/dist/ui/file-upload.js +688 -0
  431. package/dist/ui/filter.d.ts +1 -0
  432. package/dist/ui/filter.js +400 -0
  433. package/dist/ui/font/files/geist-47c091c9.woff2 +0 -0
  434. package/dist/ui/font/files/geist-8dd77544.woff2 +0 -0
  435. package/dist/ui/font/files/geist-b9248b1e.woff2 +0 -0
  436. package/dist/ui/font/files/geist-d40d74b4.woff2 +0 -0
  437. package/dist/ui/font/files/geist-f493429a.woff2 +0 -0
  438. package/dist/ui/font/files/geistmono-03737868.woff2 +0 -0
  439. package/dist/ui/font/files/geistmono-421a7e38.woff2 +0 -0
  440. package/dist/ui/font/files/geistmono-48ef518d.woff2 +0 -0
  441. package/dist/ui/font/files/geistmono-5df35d39.woff2 +0 -0
  442. package/dist/ui/font/files/geistmono-7de289a4.woff2 +0 -0
  443. package/dist/ui/font/files/geistmono-e976128f.woff2 +0 -0
  444. package/dist/ui/font/files/inter-05cf802c.woff2 +0 -0
  445. package/dist/ui/font/files/inter-2b2f25a4.woff2 +0 -0
  446. package/dist/ui/font/files/inter-467acc7a.woff2 +0 -0
  447. package/dist/ui/font/files/inter-6e85163c.woff2 +0 -0
  448. package/dist/ui/font/files/inter-7048add3.woff2 +0 -0
  449. package/dist/ui/font/files/inter-9be0371e.woff2 +0 -0
  450. package/dist/ui/font/files/inter-a28b7e31.woff2 +0 -0
  451. package/dist/ui/font/files/poppins-054df55a.woff2 +0 -0
  452. package/dist/ui/font/files/poppins-0ee5dc9a.woff2 +0 -0
  453. package/dist/ui/font/files/poppins-0f44cb18.woff2 +0 -0
  454. package/dist/ui/font/files/poppins-0ff0d30c.woff2 +0 -0
  455. package/dist/ui/font/files/poppins-13045147.woff2 +0 -0
  456. package/dist/ui/font/files/poppins-1db57cd9.woff2 +0 -0
  457. package/dist/ui/font/files/poppins-2cf2a902.woff2 +0 -0
  458. package/dist/ui/font/files/poppins-39e7f079.woff2 +0 -0
  459. package/dist/ui/font/files/poppins-9607042d.woff2 +0 -0
  460. package/dist/ui/font/files/poppins-9a88fc1f.woff2 +0 -0
  461. package/dist/ui/font/files/poppins-b8f4f752.woff2 +0 -0
  462. package/dist/ui/font/files/poppins-f5e57db4.woff2 +0 -0
  463. package/dist/ui/font/geist-mono.css +104 -0
  464. package/dist/ui/font/geist.css +168 -0
  465. package/dist/ui/font/inter.css +232 -0
  466. package/dist/ui/font/poppins.css +104 -0
  467. package/dist/ui/form.d.ts +1 -0
  468. package/dist/ui/form.js +3 -0
  469. package/dist/ui/index.css +21989 -0
  470. package/dist/ui/input.d.ts +1 -0
  471. package/dist/ui/input.js +1176 -0
  472. package/dist/ui/menu.d.ts +1 -0
  473. package/dist/ui/menu.js +1289 -0
  474. package/dist/ui/modal.d.ts +1 -0
  475. package/dist/ui/modal.js +996 -0
  476. package/dist/ui/nav.d.ts +1 -0
  477. package/dist/ui/nav.js +295 -0
  478. package/dist/ui/radio.d.ts +1 -0
  479. package/dist/ui/radio.js +379 -0
  480. package/dist/ui/rich-text-editor.d.ts +1 -0
  481. package/dist/ui/rich-text-editor.js +1338 -0
  482. package/dist/ui/select.d.ts +1 -0
  483. package/dist/ui/select.js +2200 -0
  484. package/dist/ui/shadow/accordion.js +442 -0
  485. package/dist/ui/shadow/alert.js +218 -0
  486. package/dist/ui/shadow/breadcrumb.js +919 -0
  487. package/dist/ui/shadow/button-dropdown.js +696 -0
  488. package/dist/ui/shadow/button.js +63 -0
  489. package/dist/ui/shadow/card.js +538 -0
  490. package/dist/ui/shadow/chart.js +1685 -0
  491. package/dist/ui/shadow/checkbox.js +457 -0
  492. package/dist/ui/shadow/chip.js +559 -0
  493. package/dist/ui/shadow/date.js +712 -0
  494. package/dist/ui/shadow/drawer.js +869 -0
  495. package/dist/ui/shadow/dropdown-table.js +1620 -0
  496. package/dist/ui/shadow/dropdown.js +547 -0
  497. package/dist/ui/shadow/file-upload.js +731 -0
  498. package/dist/ui/shadow/filter.js +402 -0
  499. package/dist/ui/shadow/input.js +1150 -0
  500. package/dist/ui/shadow/menu.js +899 -0
  501. package/dist/ui/shadow/modal.js +1194 -0
  502. package/dist/ui/shadow/nav.js +240 -0
  503. package/dist/ui/shadow/radio.js +408 -0
  504. package/dist/ui/shadow/rich-text-editor.js +1344 -0
  505. package/dist/ui/shadow/select.js +2167 -0
  506. package/dist/ui/shadow/sidebar.js +606 -0
  507. package/dist/ui/shadow/switch.js +428 -0
  508. package/dist/ui/shadow/table.js +4755 -0
  509. package/dist/ui/shadow/tabs.js +372 -0
  510. package/dist/ui/shadow/tag-input.js +2974 -0
  511. package/dist/ui/shadow/textarea.js +816 -0
  512. package/dist/ui/sidebar.d.ts +1 -0
  513. package/dist/ui/sidebar.js +659 -0
  514. package/dist/ui/switch.d.ts +1 -0
  515. package/dist/ui/switch.js +398 -0
  516. package/dist/ui/table.d.ts +1 -0
  517. package/dist/ui/table.js +4654 -0
  518. package/dist/ui/tabs.d.ts +1 -0
  519. package/dist/ui/tabs.js +379 -0
  520. package/dist/ui/tag-input.d.ts +1 -0
  521. package/dist/ui/tag-input.js +2947 -0
  522. package/dist/ui/textarea.d.ts +1 -0
  523. package/dist/ui/textarea.js +819 -0
  524. package/dist/ui/theme/legacy.css +293 -0
  525. package/dist/ui/theme/luma.css +743 -0
  526. package/dist/ui/theme/lyra.css +754 -0
  527. package/dist/ui/theme/maia.css +673 -0
  528. package/dist/ui/theme/mira.css +802 -0
  529. package/dist/ui/theme/nova.css +662 -0
  530. package/dist/ui/theme/one.css +699 -0
  531. package/dist/ui/theme/rhea.css +742 -0
  532. package/dist/ui/theme/sera.css +845 -0
  533. package/dist/ui/theme/tokens.css +261 -0
  534. package/dist/ui/theme/vega.css +467 -0
  535. package/dist/vite-C5iUK7so.js +329 -0
  536. package/dist/vite.d.ts +1 -0
  537. package/dist/vite.js +2 -0
  538. package/dist/vue.d.ts +282 -0
  539. package/package.json +411 -3
@@ -0,0 +1,1289 @@
1
+ import { l as monoHostChildNodes } from "../mono-ui-CPV7rrdo.js";
2
+ import { t as customElement } from "../mono-element-B0kP_96P.js";
3
+ import { a as defineHybridPropAliases, n as arrayHasChanged, r as booleanStringConverter, t as __decorate } from "../decorate-DEXtNagw.js";
4
+ import { t as dispatchMonoEvent } from "../mono-event-Bi1qP9uN.js";
5
+ import { a as parkDetachedNodes, s as placeSlotNode } from "../light-slots-DW1WgfgT.js";
6
+ import { t as isIconifyClass } from "../icon-dVhYJUIH.js";
7
+ import { a as validateColorProp, i as isThemeColorToken, n as colorClassToken, r as customColorStyle, t as CUSTOM_COLOR_CLASS } from "../color-DHYrfXsX.js";
8
+ import { LitElement, html, isServer, nothing, unsafeCSS } from "lit";
9
+ import { property, state } from "lit/decorators.js";
10
+ //#region src/components/menu/menu-utils.ts
11
+ function isItem(node) {
12
+ return !node.type || node.type === "item";
13
+ }
14
+ function isGroup(node) {
15
+ return node.type === "group";
16
+ }
17
+ function isDivider(node) {
18
+ return node.type === "divider";
19
+ }
20
+ function isSubheader(node) {
21
+ return node.type === "subheader";
22
+ }
23
+ /**
24
+ * Walk the tree and collect the chain (root → leaf) leading to the item with
25
+ * the given id. Returns an empty array if not found.
26
+ */
27
+ function findActivePath(items, id) {
28
+ for (const node of items) {
29
+ if (node.id === id) return [node];
30
+ if (node.items?.length) {
31
+ const sub = findActivePath(node.items, id);
32
+ if (sub.length) return [node, ...sub];
33
+ }
34
+ }
35
+ return [];
36
+ }
37
+ function findItem(items, id) {
38
+ for (const node of items) {
39
+ if (node.id === id) return node;
40
+ if (node.items?.length) {
41
+ const sub = findItem(node.items, id);
42
+ if (sub) return sub;
43
+ }
44
+ }
45
+ return null;
46
+ }
47
+ /**
48
+ * Generate a 1–2 character alias from a menu item's title for the icon
49
+ * fallback (used by `renderMenuIcon` when no `item.icon` and no slot icon are
50
+ * provided). Each space-delimited word contributes its first character; output
51
+ * is uppercased and capped at `max` characters.
52
+ *
53
+ * Examples:
54
+ * getMenuAlias('Dashboard') → 'D'
55
+ * getMenuAlias('Post Budget') → 'PB'
56
+ * getMenuAlias('Sales Order Report') → 'SO'
57
+ * getMenuAlias('logbook') → 'L'
58
+ * getMenuAlias('') → ''
59
+ */
60
+ function getMenuAlias(input, max = 2) {
61
+ if (!input || typeof input !== "string") return "";
62
+ const words = input.trim().split(/\s+/).filter(Boolean);
63
+ if (!words.length) return "";
64
+ return words.slice(0, max).map((w) => w.charAt(0)).join("").toUpperCase();
65
+ }
66
+ function collectDefaultOpenGroups(items) {
67
+ const out = [];
68
+ const visit = (list) => {
69
+ for (const node of list) {
70
+ if (isGroup(node) && node.defaultOpen) out.push(node.id);
71
+ if (node.items?.length) visit(node.items);
72
+ }
73
+ };
74
+ visit(items);
75
+ return out;
76
+ }
77
+ function generateMenuRootClasses(props) {
78
+ return [
79
+ "mono-menu",
80
+ props.density,
81
+ colorClassToken(props.color),
82
+ props.nav ? "nav" : "plain",
83
+ props.selectable ? "" : "not-selectable",
84
+ props.disabled ? "disabled" : "",
85
+ props.cssClassName ?? "",
86
+ props.rootExtra ?? ""
87
+ ].filter(Boolean).join(" ");
88
+ }
89
+ function validateMenuProps(props) {
90
+ const errors = [];
91
+ if (props.density && ![
92
+ "compact",
93
+ "comfortable",
94
+ "default"
95
+ ].includes(props.density)) errors.push(`Invalid density: ${String(props.density)}`);
96
+ const colorError = validateColorProp(props.color);
97
+ if (colorError) errors.push(colorError);
98
+ return errors;
99
+ }
100
+ /**
101
+ * The Basecoat styling attributes for the menu ROOT, mirroring the props one
102
+ * for one. A prop at its DEFAULT emits nothing — `:not([mono-density])` is
103
+ * comfortable and `:not([mono-color])` is primary — so the rendered DOM is
104
+ * also the shortest hand-written markup that paints the same (see menu.css).
105
+ * `nav` defaults to TRUE, so `mono-plain` is the attribute that says
106
+ * something. Shared so `<mono-menu>` and a standalone `<mono-menu-list>`
107
+ * cannot drift apart.
108
+ */
109
+ function menuRootAttrs(props) {
110
+ return {
111
+ density: props.density === "comfortable" ? null : props.density,
112
+ color: isThemeColorToken(props.color) || props.color === "surface" ? props.color === "primary" ? null : props.color : CUSTOM_COLOR_CLASS
113
+ };
114
+ }
115
+ //#endregion
116
+ //#region src/components/menu/menu-render.ts
117
+ function clsFor(base, key, cssClass) {
118
+ const extra = cssClass?.[key];
119
+ return extra ? `${base} ${extra}` : base;
120
+ }
121
+ function renderMenuIcon(item, ctx) {
122
+ const slotNodes = ctx.getSlotIconNodes(item.id);
123
+ if (!!(slotNodes && slotNodes.length)) return html`
124
+ <span
125
+ class=${clsFor("mono-menu-icon", "icon", ctx.cssClass)}
126
+ mono-icon
127
+ aria-hidden="true"
128
+ >
129
+ <span data-mono-slot=${`icon-${item.id}`}></span>
130
+ </span>
131
+ `;
132
+ if (ctx.iconSlot && item.icon && isIconifyClass(item.icon)) return html`
133
+ <span
134
+ class=${clsFor("mono-menu-icon", "icon", ctx.cssClass)}
135
+ mono-icon
136
+ aria-hidden="true"
137
+ >
138
+ <slot name=${`icon-${item.id}`}></slot>
139
+ </span>
140
+ `;
141
+ if (item.icon && isIconifyClass(item.icon)) return html`
142
+ <span
143
+ class=${clsFor("mono-menu-icon", "icon", ctx.cssClass)}
144
+ mono-icon
145
+ aria-hidden="true"
146
+ >
147
+ <span class=${`mono-menu-iconify ${item.icon}`} mono-glyph></span>
148
+ </span>
149
+ `;
150
+ if (item.icon) return html`
151
+ <span
152
+ class=${clsFor("mono-menu-icon", "icon", ctx.cssClass)}
153
+ mono-icon
154
+ aria-hidden="true"
155
+ >
156
+ ${item.icon}
157
+ </span>
158
+ `;
159
+ const alias = getMenuAlias(item.title || item.id);
160
+ if (alias) return html`
161
+ <span
162
+ class=${`${clsFor("mono-menu-icon", "icon", ctx.cssClass)} alias`}
163
+ mono-icon
164
+ mono-alias
165
+ aria-hidden="true"
166
+ data-mono-alias=${alias}
167
+ >
168
+ ${alias}
169
+ </span>
170
+ `;
171
+ return nothing;
172
+ }
173
+ function renderMenuBadge(item, ctx) {
174
+ if (item.badge === void 0 || item.badge === null || item.badge === "") return nothing;
175
+ const colorClass = item.badgeColor && item.badgeColor !== "default" ? item.badgeColor : "";
176
+ return html`
177
+ <span
178
+ class=${`${clsFor("mono-menu-badge", "badge", ctx.cssClass)} ${colorClass}`.trim()}
179
+ mono-badge=${colorClass}
180
+ >
181
+ ${item.badge}
182
+ </span>
183
+ `;
184
+ }
185
+ function renderMenuAppend(item, ctx) {
186
+ if (item.badge !== void 0 && item.badge !== null && item.badge !== "") return renderMenuBadge(item, ctx);
187
+ if (!item.appendIcon) return nothing;
188
+ return html`
189
+ <span
190
+ class=${clsFor("mono-menu-append", "appendIcon", ctx.cssClass)}
191
+ mono-append
192
+ aria-hidden="true"
193
+ >
194
+ ${item.appendIcon}
195
+ </span>
196
+ `;
197
+ }
198
+ function renderMenuItemRow(item, ctx) {
199
+ const active = ctx.isSelected(item.id);
200
+ const itemClasses = [
201
+ clsFor("mono-menu-item", "item", ctx.cssClass),
202
+ active ? "active" : "",
203
+ active && ctx.cssClass?.itemActive ? ctx.cssClass.itemActive : "",
204
+ item.disabled ? "disabled" : "",
205
+ item.disabled && ctx.cssClass?.itemDisabled ? ctx.cssClass.itemDisabled : ""
206
+ ].filter(Boolean).join(" ");
207
+ const tag = item.href ? "a" : "button";
208
+ const actionInner = html`
209
+ ${renderMenuIcon(item, ctx)}
210
+ <span class=${clsFor("mono-menu-content", "content", ctx.cssClass)} mono-content>
211
+ <span class=${clsFor("mono-menu-title", "title", ctx.cssClass)} mono-title>
212
+ ${item.title ?? item.id}
213
+ </span>
214
+ ${item.subtitle ? html`<span
215
+ class=${clsFor("mono-menu-subtitle", "subtitle", ctx.cssClass)}
216
+ mono-subtitle
217
+ >${item.subtitle}</span
218
+ >` : nothing}
219
+ </span>
220
+ ${renderMenuAppend(item, ctx)}
221
+ `;
222
+ return html`
223
+ <li class=${itemClasses} mono-item ?mono-active=${active} ?mono-disabled=${!!item.disabled}>
224
+ ${tag === "a" ? html`
225
+ <a
226
+ class=${clsFor("mono-menu-action", "action", ctx.cssClass)}
227
+ mono-action
228
+ href=${item.href}
229
+ role=${ctx.selectable ? "option" : "link"}
230
+ aria-current=${active ? "page" : "false"}
231
+ aria-disabled=${item.disabled ? "true" : "false"}
232
+ @click=${(e) => ctx.onItemClick(item, e)}
233
+ >
234
+ ${actionInner}
235
+ </a>
236
+ ` : html`
237
+ <button
238
+ type="button"
239
+ class=${clsFor("mono-menu-action", "action", ctx.cssClass)}
240
+ mono-action
241
+ role=${ctx.selectable ? "option" : "menuitem"}
242
+ aria-selected=${ctx.selectable ? active ? "true" : "false" : nothing}
243
+ aria-disabled=${item.disabled ? "true" : "false"}
244
+ ?disabled=${item.disabled || ctx.disabled}
245
+ @click=${(e) => ctx.onItemClick(item, e)}
246
+ >
247
+ ${actionInner}
248
+ </button>
249
+ `}
250
+ ${ctx.bodySlot && !isGroup(item) ? html`<ul
251
+ class=${clsFor("mono-menu-list", "list", ctx.cssClass)}
252
+ mono-list
253
+ data-mono-slot="body"
254
+ ></ul>` : item.items?.length && !isGroup(item) ? html`<ul class=${clsFor("mono-menu-list", "list", ctx.cssClass)} mono-list>
255
+ ${renderMenuList(item.items, ctx)}
256
+ </ul>` : nothing}
257
+ </li>
258
+ `;
259
+ }
260
+ function renderMenuGroup(group, ctx) {
261
+ const open = ctx.isGroupOpen(group.id);
262
+ const ancestorActive = ctx.isGroupActive?.(group) ?? false;
263
+ return html`
264
+ <li
265
+ class=${[clsFor("mono-menu-group", "group", ctx.cssClass), ancestorActive ? "active" : ""].filter(Boolean).join(" ")}
266
+ mono-item
267
+ mono-group
268
+ ?mono-open=${open}
269
+ ?mono-active=${ancestorActive}
270
+ ?mono-disabled=${!!group.disabled}
271
+ data-open=${open ? "true" : "false"}
272
+ >
273
+ <button
274
+ type="button"
275
+ class=${clsFor("mono-menu-group-header", "groupHeader", ctx.cssClass)}
276
+ mono-group-header
277
+ aria-expanded=${open ? "true" : "false"}
278
+ ?disabled=${group.disabled || ctx.disabled}
279
+ @click=${(e) => ctx.onGroupToggle(group, e)}
280
+ >
281
+ ${renderMenuIcon(group, ctx)}
282
+ <span class=${clsFor("mono-menu-content", "content", ctx.cssClass)} mono-content>
283
+ <span class=${clsFor("mono-menu-title", "title", ctx.cssClass)} mono-title>
284
+ ${group.title ?? group.id}
285
+ </span>
286
+ ${group.subtitle ? html`<span
287
+ class=${clsFor("mono-menu-subtitle", "subtitle", ctx.cssClass)}
288
+ mono-subtitle
289
+ >${group.subtitle}</span
290
+ >` : nothing}
291
+ </span>
292
+ <span
293
+ class=${clsFor("mono-menu-chevron", "groupChevron", ctx.cssClass)}
294
+ mono-chevron
295
+ aria-hidden="true"
296
+ >
297
+ ${ctx.chevronSvg ?? html`<span class="mono-icon i-mdi-chevron-right" aria-hidden="true"></span>`}
298
+ </span>
299
+ </button>
300
+ ${ctx.bodySlot ? html`<ul
301
+ class=${clsFor("mono-menu-list", "groupBody", ctx.cssClass)}
302
+ mono-list
303
+ mono-group-body
304
+ data-mono-slot="body"
305
+ ></ul>` : group.items?.length ? html`<ul
306
+ class=${clsFor("mono-menu-list", "groupBody", ctx.cssClass)}
307
+ mono-list
308
+ mono-group-body
309
+ >
310
+ ${renderMenuList(group.items, ctx)}
311
+ </ul>` : nothing}
312
+ </li>
313
+ `;
314
+ }
315
+ function renderMenuDivider(item, ctx) {
316
+ return html`<li
317
+ class=${clsFor("mono-menu-divider", "divider", ctx.cssClass)}
318
+ mono-divider
319
+ role="separator"
320
+ data-id=${item.id}
321
+ ></li>`;
322
+ }
323
+ function renderMenuSubheader(item, ctx) {
324
+ return html`<li
325
+ class=${clsFor("mono-menu-subheader", "subheader", ctx.cssClass)}
326
+ mono-subheader
327
+ data-id=${item.id}
328
+ >
329
+ ${item.title ?? ""}
330
+ </li>`;
331
+ }
332
+ function renderMenuList(list, ctx) {
333
+ return list.map((item) => {
334
+ if (isDivider(item)) return renderMenuDivider(item, ctx);
335
+ if (isSubheader(item)) return renderMenuSubheader(item, ctx);
336
+ if (isGroup(item)) return renderMenuGroup(item, ctx);
337
+ return renderMenuItemRow(item, ctx);
338
+ });
339
+ }
340
+ /**
341
+ * Render only the group rows from `list` — non-group items are skipped.
342
+ * Used by `<mono-menu-list type="group">`.
343
+ */
344
+ function renderMenuGroupsOnly(list, ctx) {
345
+ const out = [];
346
+ for (const item of list) if (isGroup(item)) out.push(renderMenuGroup(item, ctx));
347
+ return out;
348
+ }
349
+ //#endregion
350
+ //#region src/components/menu/menu-core.ts
351
+ /** Coerce any `items` input (array, JSON string, or other) to a MenuItem array. */
352
+ function coerceItems(value) {
353
+ if (Array.isArray(value)) return value;
354
+ if (typeof value === "string") {
355
+ if (!value) return [];
356
+ try {
357
+ const parsed = JSON.parse(value);
358
+ return Array.isArray(parsed) ? parsed : [];
359
+ } catch {
360
+ return [];
361
+ }
362
+ }
363
+ return [];
364
+ }
365
+ /**
366
+ * `MonoMenuCore` — all render-mode-agnostic logic for `mono-menu`: reactive
367
+ * props, hybrid aliases, css-class interop, selection + open-group state,
368
+ * default-open seeding, the click/toggle/change events, the full public API, and
369
+ * the chrome `render()` (which delegates the body to a `_renderBody()` hook).
370
+ *
371
+ * Leaves to each build: `createRenderRoot()`, the body strategy (light: slot
372
+ * capture / declarative `slot="body"`; shadow: items-driven only), and
373
+ * `_chevronSvg()` (light: undefined → UnoCSS icon span; shadow: inline SVG).
374
+ */
375
+ var MonoMenuCore = (superClass) => {
376
+ class MonoMenuCoreClass extends superClass {
377
+ constructor(...args) {
378
+ super(...args);
379
+ this.items = [];
380
+ this.modelValue = "";
381
+ this.multiple = false;
382
+ this.density = "comfortable";
383
+ this.color = "primary";
384
+ this.nav = true;
385
+ this.selectable = true;
386
+ this.disabled = false;
387
+ this.controlled = false;
388
+ this.cssClass = {};
389
+ this.cssClassName = "";
390
+ this._openGroups = /* @__PURE__ */ new Set();
391
+ this._seededGroups = /* @__PURE__ */ new Set();
392
+ this._slotIcons = /* @__PURE__ */ new Map();
393
+ this._listChildren = /* @__PURE__ */ new Set();
394
+ this._railSidebar = null;
395
+ this._railObserver = null;
396
+ this._railRetryRaf = null;
397
+ this._railRetryTimer = null;
398
+ defineHybridPropAliases(this, ["modelValue", "cssClass"]);
399
+ Object.defineProperty(this, "css-class", {
400
+ get: () => this.cssClass,
401
+ set: (value) => this._setCssClass(value),
402
+ configurable: true,
403
+ enumerable: false
404
+ });
405
+ Object.defineProperty(this, "cssclass", {
406
+ get: () => this.cssClass,
407
+ set: (value) => this._setCssClass(value),
408
+ configurable: true,
409
+ enumerable: false
410
+ });
411
+ }
412
+ static get observedAttributes() {
413
+ return [
414
+ ...super.observedAttributes ?? [],
415
+ "modelvalue",
416
+ "css-class",
417
+ "cssclass"
418
+ ];
419
+ }
420
+ attributeChangedCallback(name, oldValue, newValue) {
421
+ super.attributeChangedCallback(name, oldValue, newValue);
422
+ if (oldValue === newValue) return;
423
+ if (name === "modelvalue") {
424
+ this.modelValue = newValue ?? "";
425
+ return;
426
+ }
427
+ if (name === "css-class" || name === "cssclass") this._setCssClass(newValue);
428
+ }
429
+ connectedCallback() {
430
+ super.connectedCallback();
431
+ if (isServer) return;
432
+ this._setupRailSync();
433
+ }
434
+ disconnectedCallback() {
435
+ if (!isServer) this._teardownRailSync();
436
+ super.disconnectedCallback();
437
+ }
438
+ willUpdate(changed) {
439
+ if (typeof this.items === "string") this.items = coerceItems(this.items);
440
+ super.willUpdate?.(changed);
441
+ if (changed.has("items")) this._seedDefaultOpenGroups();
442
+ }
443
+ _seedDefaultOpenGroups() {
444
+ const existing = new Set(this._openGroups);
445
+ let changed = false;
446
+ for (const id of collectDefaultOpenGroups(this.items)) {
447
+ if (this._seededGroups.has(id)) continue;
448
+ this._seededGroups.add(id);
449
+ if (!existing.has(id)) {
450
+ existing.add(id);
451
+ changed = true;
452
+ }
453
+ }
454
+ if (!changed) return;
455
+ this._openGroups = existing;
456
+ }
457
+ _setCssClass(value) {
458
+ if (value == null) {
459
+ this.cssClass = {};
460
+ this.cssClassName = "";
461
+ return;
462
+ }
463
+ if (typeof value === "object") {
464
+ this.cssClass = value;
465
+ return;
466
+ }
467
+ if (typeof value === "string") {
468
+ const trimmed = value.trim();
469
+ if (!trimmed) {
470
+ this.cssClass = {};
471
+ this.cssClassName = "";
472
+ return;
473
+ }
474
+ if (trimmed.startsWith("{") && trimmed.endsWith("}")) try {
475
+ this.cssClass = JSON.parse(trimmed);
476
+ return;
477
+ } catch {}
478
+ this.cssClassName = trimmed;
479
+ }
480
+ }
481
+ _cls(base, key) {
482
+ const extra = this.cssClass?.[key];
483
+ return extra ? `${base} ${extra}` : base;
484
+ }
485
+ get _rootClasses() {
486
+ return generateMenuRootClasses({
487
+ density: this.density,
488
+ color: this.color,
489
+ nav: this.nav,
490
+ selectable: this.selectable,
491
+ disabled: this.disabled,
492
+ cssClassName: this.cssClassName,
493
+ rootExtra: this.cssClass?.root
494
+ });
495
+ }
496
+ _isSelected(id) {
497
+ if (this.multiple) return Array.isArray(this.modelValue) && this.modelValue.includes(id);
498
+ return !this.multiple && this.modelValue === id;
499
+ }
500
+ _isGroupOpen(id) {
501
+ return this._openGroups.has(id);
502
+ }
503
+ /** A group is "active" when the currently-selected item is a descendant. */
504
+ _isGroupActive(group) {
505
+ const selected = this.multiple ? Array.isArray(this.modelValue) ? this.modelValue : [] : [this.modelValue];
506
+ const ids = new Set(selected.filter(Boolean));
507
+ if (!ids.size) return false;
508
+ const contains = (node) => !!node.items?.some((child) => ids.has(child.id) || contains(child));
509
+ return contains(group);
510
+ }
511
+ _findRegisteredItem(id) {
512
+ for (const child of this._listChildren) {
513
+ const found = findItem(child.getMenuItems?.() ?? [], id);
514
+ if (found) return found;
515
+ }
516
+ return null;
517
+ }
518
+ _findAnyItem(id) {
519
+ return findItem(this.items, id) ?? this._findRegisteredItem(id);
520
+ }
521
+ _getRegisteredActivePath(id) {
522
+ for (const child of this._listChildren) {
523
+ const path = findActivePath(child.getMenuItems?.() ?? [], id);
524
+ if (path.length) return path;
525
+ }
526
+ return [];
527
+ }
528
+ select(id) {
529
+ const item = this._findAnyItem(id);
530
+ if (!item || !isItem(item)) return;
531
+ this._handleItemActivation(item);
532
+ }
533
+ deselect(id) {
534
+ if (!this.multiple) {
535
+ if (this.modelValue === id) {
536
+ const oldValue = this.modelValue;
537
+ this.modelValue = "";
538
+ this._emitChange(id, this._findAnyItem(id) ?? { id }, false, oldValue);
539
+ }
540
+ return;
541
+ }
542
+ if (Array.isArray(this.modelValue) && this.modelValue.includes(id)) {
543
+ const oldValue = [...this.modelValue];
544
+ this.modelValue = this.modelValue.filter((v) => v !== id);
545
+ this._emitChange(id, this._findAnyItem(id) ?? { id }, false, oldValue);
546
+ }
547
+ }
548
+ toggleGroup(id) {
549
+ const item = this._findAnyItem(id);
550
+ if (!item || !isGroup(item)) return;
551
+ this._handleGroupToggle(item);
552
+ }
553
+ expandGroup(id) {
554
+ if (this._openGroups.has(id)) return;
555
+ const next = new Set(this._openGroups);
556
+ next.add(id);
557
+ this._openGroups = next;
558
+ }
559
+ collapseGroup(id) {
560
+ if (!this._openGroups.has(id)) return;
561
+ const next = new Set(this._openGroups);
562
+ next.delete(id);
563
+ this._openGroups = next;
564
+ }
565
+ focus() {
566
+ this.querySelector(".mono-menu-action, .mono-menu-group-header")?.focus();
567
+ }
568
+ getActivePath() {
569
+ const id = !this.multiple ? this.modelValue : Array.isArray(this.modelValue) && this.modelValue.length ? this.modelValue[this.modelValue.length - 1] : "";
570
+ if (!id) return [];
571
+ const ownPath = findActivePath(this.items, id);
572
+ if (ownPath.length) return ownPath;
573
+ return this._getRegisteredActivePath(id);
574
+ }
575
+ requestItemActivation(item, event) {
576
+ this._handleItemActivation(item, event);
577
+ }
578
+ requestGroupToggle(group, event) {
579
+ this._handleGroupToggle(group, event);
580
+ }
581
+ isItemSelected(id) {
582
+ return this._isSelected(id);
583
+ }
584
+ isGroupOpenPublic(id) {
585
+ return this._isGroupOpen(id);
586
+ }
587
+ getSlotIconNodes(id) {
588
+ return this._slotIcons.get(id);
589
+ }
590
+ /** @internal called by `<mono-menu-list>` from its connectedCallback. */
591
+ _registerListChild(child) {
592
+ this._listChildren.add(child);
593
+ }
594
+ /** @internal called by `<mono-menu-list>` from its disconnectedCallback. */
595
+ _unregisterListChild(child) {
596
+ this._listChildren.delete(child);
597
+ }
598
+ /** Walk up across slot + shadow boundaries to the host `<mono-sidebar>`, if any. */
599
+ _findAncestorSidebar() {
600
+ let node = this.assignedSlot ?? this.parentNode;
601
+ while (node) {
602
+ if (node instanceof Element && (node.localName === "mono-sidebar" || node.localName === "mono-shadow-sidebar")) return node;
603
+ node = node.assignedSlot ?? (node instanceof ShadowRoot ? node.host : node.parentNode);
604
+ }
605
+ return null;
606
+ }
607
+ _setupRailSync(retries = 30) {
608
+ if (this._railObserver) this._teardownRailSync();
609
+ const sidebar = this._findAncestorSidebar();
610
+ if (!sidebar) {
611
+ if (retries <= 0 || isServer) return;
612
+ let fired = false;
613
+ const retry = () => {
614
+ if (fired) return;
615
+ fired = true;
616
+ this._railRetryRaf = null;
617
+ this._railRetryTimer = null;
618
+ if (this.isConnected) this._setupRailSync(retries - 1);
619
+ };
620
+ this._cancelRailRetry();
621
+ if (typeof requestAnimationFrame !== "undefined") this._railRetryRaf = requestAnimationFrame(retry);
622
+ this._railRetryTimer = setTimeout(retry, 32);
623
+ return;
624
+ }
625
+ this._railSidebar = sidebar;
626
+ this._applyRailCollapsed(sidebar.hasAttribute("data-rail-collapsed"));
627
+ this._railObserver = new MutationObserver(() => {
628
+ this._applyRailCollapsed(sidebar.hasAttribute("data-rail-collapsed"));
629
+ });
630
+ this._railObserver.observe(sidebar, {
631
+ attributes: true,
632
+ attributeFilter: ["data-rail-collapsed"]
633
+ });
634
+ }
635
+ _cancelRailRetry() {
636
+ if (this._railRetryRaf !== null && typeof cancelAnimationFrame !== "undefined") cancelAnimationFrame(this._railRetryRaf);
637
+ if (this._railRetryTimer !== null) clearTimeout(this._railRetryTimer);
638
+ this._railRetryRaf = null;
639
+ this._railRetryTimer = null;
640
+ }
641
+ _teardownRailSync() {
642
+ this._cancelRailRetry();
643
+ this._railObserver?.disconnect();
644
+ this._railObserver = null;
645
+ this._railSidebar = null;
646
+ }
647
+ static {
648
+ this._RAIL_COLLAPSE_VARS = [
649
+ ["--mono-menu-label-display", "none"],
650
+ ["--mono-menu-row-display", "flex"],
651
+ ["--mono-menu-row-justify", "center"],
652
+ ["--mono-menu-action-width", "auto"],
653
+ ["--mono-menu-action-justify", "center"],
654
+ ["--mono-menu-action-gap", "0"],
655
+ ["--mono-menu-group-children-display", "none"]
656
+ ];
657
+ }
658
+ _applyRailCollapsed(collapsed) {
659
+ this.toggleAttribute("rail-collapsed", collapsed);
660
+ const vars = MonoMenuCoreClass._RAIL_COLLAPSE_VARS;
661
+ if (collapsed) for (const [name, value] of vars) this.style.setProperty(name, value);
662
+ else for (const [name] of vars) this.style.removeProperty(name);
663
+ }
664
+ _handleItemActivation(item, event) {
665
+ if (item.disabled || this.disabled) return;
666
+ dispatchMonoEvent(this, "click", {
667
+ value: item.id,
668
+ item,
669
+ sourceEvent: event
670
+ });
671
+ if (this.controlled) return;
672
+ if (!this.selectable) return;
673
+ if (this.multiple) {
674
+ const oldArr = Array.isArray(this.modelValue) ? [...this.modelValue] : [];
675
+ let nextArr;
676
+ let selected;
677
+ if (oldArr.includes(item.id)) {
678
+ nextArr = oldArr.filter((v) => v !== item.id);
679
+ selected = false;
680
+ } else {
681
+ nextArr = [...oldArr, item.id];
682
+ selected = true;
683
+ }
684
+ this.modelValue = nextArr;
685
+ this._emitChange(item.id, item, selected, oldArr, event);
686
+ return;
687
+ }
688
+ const oldValue = this.modelValue;
689
+ if (oldValue === item.id) return;
690
+ this.modelValue = item.id;
691
+ this._emitChange(item.id, item, true, oldValue, event);
692
+ }
693
+ _emitChange(value, item, selected, oldValue, event) {
694
+ const detail = {
695
+ modelValue: this.modelValue,
696
+ oldValue,
697
+ value,
698
+ item,
699
+ selected,
700
+ sourceEvent: event
701
+ };
702
+ dispatchMonoEvent(this, "change", detail);
703
+ }
704
+ _handleGroupToggle(group, event) {
705
+ if (group.disabled || this.disabled) return;
706
+ const oldOpen = this._openGroups.has(group.id);
707
+ const next = new Set(this._openGroups);
708
+ if (oldOpen) next.delete(group.id);
709
+ else next.add(group.id);
710
+ this._openGroups = next;
711
+ const detail = {
712
+ groupId: group.id,
713
+ open: !oldOpen,
714
+ oldOpen,
715
+ group,
716
+ sourceEvent: event
717
+ };
718
+ dispatchMonoEvent(this, "toggle-group", detail);
719
+ }
720
+ /** Inline chevron — light: undefined (UnoCSS span); shadow: inline SVG. */
721
+ _chevronSvg() {}
722
+ /** Whether to project icons via native `<slot>` — light: false; shadow: true. */
723
+ _useIconSlots() {
724
+ return false;
725
+ }
726
+ _renderContext() {
727
+ return {
728
+ multiple: this.multiple,
729
+ selectable: this.selectable,
730
+ disabled: this.disabled,
731
+ cssClass: this.cssClass,
732
+ chevronSvg: this._chevronSvg(),
733
+ iconSlot: this._useIconSlots(),
734
+ isSelected: (id) => this._isSelected(id),
735
+ isGroupOpen: (id) => this._isGroupOpen(id),
736
+ isGroupActive: (group) => this._isGroupActive(group),
737
+ getSlotIconNodes: (id) => this._slotIcons.get(id),
738
+ onItemClick: (item, e) => this._handleItemActivation(item, e),
739
+ onGroupToggle: (group, e) => this._handleGroupToggle(group, e)
740
+ };
741
+ }
742
+ /** Default body — items-driven. Light overrides to add the slot="body" path. */
743
+ _renderBody() {
744
+ return html`
745
+ <ul
746
+ class=${this._cls("mono-menu-list", "list")}
747
+ mono-list
748
+ role=${this.selectable ? "listbox" : "menu"}
749
+ >
750
+ ${renderMenuList(this.items, this._renderContext())}
751
+ </ul>
752
+ `;
753
+ }
754
+ /**
755
+
756
+ * Carries a literal `color` (`#7c3aed`, `rgb(…)`) that no stylesheet can know about.
757
+ * Empty for a palette slot, which resolves entirely through the `.mono-menu.<token>`
758
+ * rules instead.
759
+ *
760
+ * Must land on the ROOT element, not the host: a class-based `-preset` declared on
761
+ * the root beats an inherited one, so a host-level write would silently lose. If a
762
+ * `_syncRootFromState`-style attribute re-assert is ever added here (sidebar has one),
763
+ * it has to serialize from THIS getter or it will wipe the colour.
764
+ */
765
+ get _inlineRootStyle() {
766
+ return customColorStyle(isThemeColorToken(this.color) || this.color === "surface" ? "" : this.color, "menu");
767
+ }
768
+ render() {
769
+ const attrs = menuRootAttrs(this);
770
+ return html`
771
+ <nav
772
+ class=${this._rootClasses}
773
+ style=${this._inlineRootStyle}
774
+ role="navigation"
775
+ mono-menu
776
+ mono-density=${attrs.density ?? nothing}
777
+ mono-color=${attrs.color ?? nothing}
778
+ ?mono-plain=${!this.nav}
779
+ ?mono-disabled=${this.disabled}
780
+ >
781
+ ${this._renderBody()}
782
+ </nav>
783
+ `;
784
+ }
785
+ }
786
+ __decorate([property({
787
+ attribute: "items",
788
+ converter: {
789
+ fromAttribute: (value) => coerceItems(value),
790
+ toAttribute: () => null
791
+ },
792
+ hasChanged: arrayHasChanged
793
+ })], MonoMenuCoreClass.prototype, "items", void 0);
794
+ __decorate([property({
795
+ attribute: "model-value",
796
+ reflect: true
797
+ })], MonoMenuCoreClass.prototype, "modelValue", void 0);
798
+ __decorate([property({
799
+ reflect: true,
800
+ converter: booleanStringConverter
801
+ })], MonoMenuCoreClass.prototype, "multiple", void 0);
802
+ __decorate([property({ type: String })], MonoMenuCoreClass.prototype, "density", void 0);
803
+ __decorate([property({ type: String })], MonoMenuCoreClass.prototype, "color", void 0);
804
+ __decorate([property({
805
+ reflect: true,
806
+ converter: booleanStringConverter
807
+ })], MonoMenuCoreClass.prototype, "nav", void 0);
808
+ __decorate([property({
809
+ reflect: true,
810
+ converter: booleanStringConverter
811
+ })], MonoMenuCoreClass.prototype, "selectable", void 0);
812
+ __decorate([property({
813
+ reflect: true,
814
+ converter: booleanStringConverter
815
+ })], MonoMenuCoreClass.prototype, "disabled", void 0);
816
+ __decorate([property({
817
+ reflect: true,
818
+ converter: booleanStringConverter
819
+ })], MonoMenuCoreClass.prototype, "controlled", void 0);
820
+ __decorate([property({ attribute: false })], MonoMenuCoreClass.prototype, "cssClass", void 0);
821
+ __decorate([property({ attribute: false })], MonoMenuCoreClass.prototype, "cssClassName", void 0);
822
+ __decorate([state()], MonoMenuCoreClass.prototype, "_openGroups", void 0);
823
+ return MonoMenuCoreClass;
824
+ };
825
+ //#endregion
826
+ //#region src/components/menu/menu.css?raw
827
+ var menu_default = "/* @unocss-include */\r\n\r\n/* =========================================================================\r\n mono-menu — a port of Basecoat's sidebar NAVIGATION (basecoat-css@1.0.2,\r\n vega style).\r\n\r\n Basecoat has no standalone menu, but it has the thing a menu is: the list\r\n inside `.sidebar nav` — a group, its rows, its headings and its separators.\r\n That block is also the richest per-flavor surface in the whole vendor sheet,\r\n so this port is where a flavor finally gets to say what a nav row looks like.\r\n\r\n Styled by ATTRIBUTE, and the attributes mirror the element's props one for\r\n one, so hand-written markup reads like the Lit / Vue tag:\r\n\r\n <mono-menu density=\"compact\" color=\"success\" :nav=\"false\">\r\n <nav mono-menu mono-density=\"compact\" mono-color=\"success\" mono-plain\r\n role=\"navigation\">\r\n <ul mono-list>\r\n <li mono-item mono-active>\r\n <a mono-action href=\"/\" aria-current=\"page\">\r\n <span mono-icon>…</span>\r\n <span mono-content>\r\n <span mono-title>Dashboard</span>\r\n <span mono-subtitle>Overview</span>\r\n </span>\r\n <span mono-badge=\"info\">3</span>\r\n </a>\r\n </li>\r\n <li mono-divider role=\"separator\"></li>\r\n <li mono-subheader>Section</li>\r\n </ul>\r\n </nav>\r\n\r\n An absent attribute is the prop's default (`:not([mono-density])` =\r\n comfortable, `:not([mono-color])` = primary, and `nav` defaults to TRUE so\r\n `mono-plain` is what the other mode says). The old classes\r\n (`.mono-menu.comfortable.primary.nav`) are still emitted as inert hooks\r\n until 2.0 but no rule here reads them.\r\n\r\n Selector map (ours ≡ upstream):\r\n [mono-menu] ≡ .sidebar nav > section > [role=group]\r\n (relative flex w-full min-w-0 flex-col, p-2 text-sm)\r\n :where([mono-menu]) [mono-list] ≡ .sidebar nav ul (flex w-full min-w-0 flex-col, gap-1)\r\n :where([mono-menu]) [mono-item] ≡ .sidebar nav li (relative)\r\n :where([mono-menu]) [mono-action] ≡ .sidebar nav li > :is(a, button) — the row\r\n [mono-active] ≡ [aria-current=page], [data-active=true]\r\n (bg-sidebar-accent text-sidebar-accent-foreground font-medium)\r\n :where([mono-menu]) [mono-subheader] ≡ .sidebar nav h3\r\n :where([mono-menu]) [mono-divider] ≡ .sidebar nav [role=separator] (border-sidebar-border mx-2 w-auto)\r\n :where([mono-menu]) [mono-group-header]≡ details > summary — the same row, plus the chevron\r\n [mono-density=…] ≡ [data-size='sm' | default | 'lg'] (h-7 / h-8 / h-12)\r\n :where([mono-menu]) [mono-badge] ≡ .badge — EXTENSION (upstream's rows carry none)\r\n :where([mono-menu]) [mono-subtitle] ≡ EXTENSION ([&>span:last-child]:truncate is upstream's\r\n only nod to a second line)\r\n [mono-color=…] ≡ EXTENSION (upstream has one accent)\r\n\r\n THE ACTIVE ROW IS A NEUTRAL WASH, not a brand gradient. Upstream paints it\r\n `bg-sidebar-accent text-sidebar-accent-foreground font-medium` — a flat\r\n surface tint. The pre-port sheet filled it with a two-stop brand gradient and\r\n a coloured shadow; both are gone. `color` still tints hover and the active\r\n row through `--mono-menu-accent`, and `color=\"surface\"` leaves it upstream's\r\n plain `--sidebar-accent`.\r\n\r\n DARK MODE comes free — every colour resolves through a Basecoat token that\r\n already flips. A selector crosses neither the custom-element host nor the\r\n shadow boundary, so no `.dark` rule can live in component CSS.\r\n\r\n FLAVORS set `--mono-menu-{radius,pad-x,pad-y,height,font,gap,icon-size,\r\n subheader-*,badge-*}` (+ the per-density forms); every fallback here is\r\n vega's value (`node scripts/basecoat-styles.mjs --grep \"sidebar nav\"`).\r\n ========================================================================= */\r\n\r\nmono-menu,\r\nmono-menu-list {\r\n display: block;\r\n}\r\n\r\n/* =========================================\r\n Root — the group\r\n ========================================= */\r\n\r\n/* basecoat@1.0.2 components/sidebar.css .sidebar >> nav >> > section >> > [role=group] — relative flex w-full min-w-0 flex-col */\r\n/* basecoat@1.0.2 styles/vega.css .sidebar nav > section > [role=group] — p-2 text-sm */\r\n[mono-menu] {\r\n /* ── the roles, each a public knob over a Basecoat token ────────────────── */\r\n --_mono-menu-primary: var(--mono-menu-primary, var(--primary));\r\n --_mono-menu-secondary: var(--mono-menu-secondary, var(--secondary-foreground));\r\n --_mono-menu-success: var(--mono-menu-success, var(--success));\r\n --_mono-menu-danger: var(--mono-menu-danger, var(--destructive));\r\n --_mono-menu-warning: var(--mono-menu-warning, var(--warning));\r\n --_mono-menu-info: var(--mono-menu-info, var(--info));\r\n --_mono-menu-teal: var(--mono-menu-teal, var(--teal));\r\n --_mono-menu-purple: var(--mono-menu-purple, var(--purple));\r\n --_mono-menu-neutral: var(--mono-menu-neutral, var(--neutral));\r\n --_mono-menu-dark: var(--mono-menu-dark, var(--dark));\r\n\r\n --_mono-menu-accent: var(--mono-menu-accent, var(--_mono-menu-accent-preset, var(--_mono-menu-primary)));\r\n --_mono-menu-on-accent: var(--mono-menu-on-accent, var(--_mono-menu-on-accent-preset, var(--primary-foreground)));\r\n\r\n /* ── ink and surface — upstream's own chrome tokens ──────────────────────\r\n basecoat@1.0.2 styles/vega.css .sidebar nav — bg-sidebar text-sidebar-foreground */\r\n --_mono-menu-surface: var(--mono-menu-surface, transparent);\r\n --_mono-menu-text: var(--mono-menu-text, var(--sidebar-foreground));\r\n /* basecoat@1.0.2 styles/vega.css .sidebar nav h3 — text-sidebar-foreground/70 …:\r\n upstream's muted chrome ink is the row ink at 70%. */\r\n --_mono-menu-text-soft: var(--mono-menu-text-soft, color-mix(in oklab, var(--_mono-menu-text) 70%, transparent));\r\n --_mono-menu-text-faint: var(--mono-menu-text-faint, color-mix(in oklab, var(--_mono-menu-text) 50%, transparent));\r\n /* basecoat@1.0.2 styles/vega.css .sidebar nav [role=separator] — border-sidebar-border mx-2 */\r\n --_mono-menu-border: var(--mono-menu-border, var(--sidebar-border));\r\n --_mono-menu-border-lite: var(--mono-menu-border-lite, var(--_mono-menu-border));\r\n\r\n /* ── the row's resting / hover / active paint ────────────────────────────\r\n basecoat@1.0.2 styles/vega.css .sidebar nav li > :is(a, button), .sidebar nav li > details > summary — ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground gap-2 rounded-md p-2 text-sm focus-visible:ring-2 text-left focus-visible:outline-hidden data-[open]:hover:bg-sidebar-accent data-[open]:hover:text-sidebar-accent-foreground [&>svg]:shrink-0 [&>svg]:size-4\r\n Hover is a SURFACE wash upstream, not the brand — so the role only tints\r\n it, at `--mono-mode-tint`, and `color=\"surface\"` leaves it exactly\r\n `--sidebar-accent`. */\r\n --_mono-menu-hover-tint: var(--mono-menu-hover-tint, var(--_mono-menu-hover-tint-preset, var(--mono-mode-tint)));\r\n --_mono-menu-hover-bg: var(--mono-menu-hover-bg, color-mix(in oklab, var(--_mono-menu-accent) var(--_mono-menu-hover-tint), var(--sidebar-accent)));\r\n --_mono-menu-hover-color: var(--mono-menu-hover-color, var(--sidebar-accent-foreground));\r\n --_mono-menu-hover-border-color: var(--mono-menu-hover-border-color, transparent);\r\n\r\n /* basecoat@1.0.2 styles/vega.css .sidebar nav li > :is(a, button):is([aria-current=page], [data-active=true]), .sidebar nav li > details > summary:is([aria-current=page], [data-active=true]) — bg-sidebar-accent text-sidebar-accent-foreground font-medium */\r\n --_mono-menu-active-tint: var(--mono-menu-active-tint, var(--_mono-menu-active-tint-preset, var(--mono-mode-tint-hover)));\r\n --_mono-menu-active-bg: var(--mono-menu-active-bg, color-mix(in oklab, var(--_mono-menu-accent) var(--_mono-menu-active-tint), var(--sidebar-accent)));\r\n --_mono-menu-active-color: var(--mono-menu-active-color, var(--_mono-menu-active-color-preset, var(--_mono-menu-accent)));\r\n --_mono-menu-active-weight: var(--mono-menu-active-weight, var(--mono-font-weight-medium));\r\n /* the pre-port glow; upstream has none, so it starts at nothing */\r\n --_mono-menu-active-shadow: var(--mono-menu-active-shadow, none);\r\n\r\n /* ── comfortable metrics live on the unqualified root ON PURPOSE ─────────\r\n basecoat@1.0.2 styles/vega.css .sidebar nav li > :is(a, button):not([data-size]), .sidebar nav li > details > summary:not([data-size]), .sidebar nav li > :is(a, button)[data-size=default], .sidebar nav li > details > summary[data-size=default] — h-8 text-sm */\r\n --_mono-menu-height: var(--mono-menu-height, var(--_mono-menu-height-preset, var(--mono-menu-height-comfortable, calc(var(--mono-spacing) * 8))));\r\n --_mono-menu-pad-x: var(--mono-menu-pad-x, var(--_mono-menu-pad-x-preset, var(--mono-menu-pad-x-comfortable, calc(var(--mono-spacing) * 2))));\r\n --_mono-menu-pad-y: var(--mono-menu-pad-y, var(--_mono-menu-pad-y-preset, var(--mono-menu-pad-y-comfortable, calc(var(--mono-spacing) * 2))));\r\n --_mono-menu-font: var(--mono-menu-font, var(--_mono-menu-font-preset, var(--mono-menu-font-comfortable, var(--mono-text-sm))));\r\n --_mono-menu-line-height: var(--mono-menu-line-height, var(--_mono-menu-line-height-preset, var(--mono-text-sm--lh)));\r\n /* basecoat@1.0.2 styles/vega.css .sidebar nav > section > [role=group] > ul — gap-1 */\r\n --_mono-menu-gap: var(--mono-menu-gap, var(--_mono-menu-gap-preset, var(--mono-menu-gap-comfortable, var(--mono-spacing))));\r\n /* the row's own gap — `gap-2` between icon, label and append */\r\n --_mono-menu-row-gap: var(--mono-menu-row-gap, calc(var(--mono-spacing) * 2));\r\n --_mono-menu-radius: var(--mono-menu-radius, var(--_mono-menu-radius-preset, var(--mono-menu-radius-comfortable, var(--mono-radius-md))));\r\n /* `[&>svg]:size-4` */\r\n --_mono-menu-icon-size: var(--mono-menu-icon-size, var(--_mono-menu-icon-size-preset, var(--mono-menu-icon-size-comfortable, calc(var(--mono-spacing) * 4))));\r\n /* the group's own padding — `p-2` */\r\n --_mono-menu-group-pad: var(--mono-menu-group-pad, var(--_mono-menu-group-pad-preset, var(--mono-menu-group-pad-comfortable, calc(var(--mono-spacing) * 2))));\r\n /* ── the nested tree — EXTENSION ─────────────────────────────────────────\r\n Upstream nests a list and leaves it flush — `.sidebar nav … ul > ul` is only\r\n `flex min-w-0 flex-col` — so a child list reads as one straight column with\r\n its parent. mono keeps its pre-port tree affordance instead: a child list\r\n steps in by one gutter and hangs off a guide rule drawn under the centre of\r\n the parent row's icon, so depth is legible without reading the labels. */\r\n --_mono-menu-indent: var(--mono-menu-indent, var(--_mono-menu-indent-preset, var(--mono-menu-indent-comfortable, calc(var(--mono-spacing) * 4))));\r\n --_mono-menu-guide-width: var(--mono-menu-guide-width, var(--mono-border-width));\r\n --_mono-menu-guide-color: var(--mono-menu-guide-color, var(--_mono-menu-border-lite));\r\n /* the guide lines up with the middle of the parent row's icon */\r\n --_mono-menu-guide-offset: var(--mono-menu-guide-offset, calc(var(--_mono-menu-pad-x) + (var(--_mono-menu-icon-size) / 2)));\r\n\r\n /* ── the subheader — `.sidebar nav h3` ───────────────────────────────────\r\n basecoat@1.0.2 styles/vega.css .sidebar nav h3 — text-sidebar-foreground/70 ring-sidebar-ring h-8 rounded-md px-2 text-xs font-medium focus-visible:ring-2 [&>svg]:size-4 transition-[margin,opacity] duration-200 ease-linear */\r\n --_mono-menu-subheader-height: var(--mono-menu-subheader-height, calc(var(--mono-spacing) * 8));\r\n --_mono-menu-subheader-pad-x: var(--mono-menu-subheader-pad-x, var(--_mono-menu-subheader-pad-x-preset, calc(var(--mono-spacing) * 2)));\r\n --_mono-menu-subheader-font: var(--mono-menu-subheader-font, var(--mono-text-xs));\r\n --_mono-menu-subheader-weight: var(--mono-menu-subheader-weight, var(--mono-font-weight-medium));\r\n --_mono-menu-subheader-transform: var(--mono-menu-subheader-transform, none);\r\n --_mono-menu-subheader-tracking: var(--mono-menu-subheader-tracking, normal);\r\n --_mono-menu-subheader-radius: var(--mono-menu-subheader-radius, var(--_mono-menu-subheader-radius-preset, var(--mono-radius-md)));\r\n\r\n /* ── the badge — EXTENSION, borrowing `.badge`'s shape ───────────────────\r\n basecoat@1.0.2 styles/vega.css .badge — h-5 gap-1 rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium transition-all [&>svg]:size-3! */\r\n --_mono-menu-badge-height: var(--mono-menu-badge-height, calc(var(--mono-spacing) * 5));\r\n --_mono-menu-badge-pad-x: var(--mono-menu-badge-pad-x, calc(var(--mono-spacing) * 2));\r\n --_mono-menu-badge-radius: var(--mono-menu-badge-radius, var(--mono-radius-4xl));\r\n --_mono-menu-badge-font: var(--mono-menu-badge-font, var(--mono-text-xs));\r\n --_mono-menu-badge-weight: var(--mono-menu-badge-weight, var(--mono-font-weight-medium));\r\n --_mono-menu-badge-bg: var(--mono-menu-badge-bg, var(--secondary));\r\n --_mono-menu-badge-color: var(--mono-menu-badge-color, var(--secondary-foreground));\r\n\r\n /* the two knobs a rail collapses with — the sidebar writes them */\r\n /* ── the rail-collapse contract ──────────────────────────────────────────\r\n A sidebar in collapsed rail mode hands these down as inherited custom\r\n properties, because a descendant selector cannot reach a slotted SHADOW\r\n menu's rows. Every one of them has to be consumed here or the collapse\r\n only happens in the build the sidebar's own legacy class rules could\r\n reach — which is exactly how the light build ended up centring its rows\r\n while the shadow build and the hand-written twins did not. */\r\n --_mono-menu-label-display: var(--mono-menu-label-display, inline-flex);\r\n /* the same switch, for the parts whose natural display is block-level */\r\n --_mono-menu-block-display: var(--mono-menu-label-display, list-item);\r\n --_mono-menu-row-display: var(--mono-menu-row-display, list-item);\r\n --_mono-menu-row-justify: var(--mono-menu-row-justify, normal);\r\n --_mono-menu-action-width: var(--mono-menu-action-width, 100%);\r\n --_mono-menu-action-justify: var(--mono-menu-action-justify, flex-start);\r\n --_mono-menu-action-gap: var(--mono-menu-action-gap, var(--_mono-menu-row-gap));\r\n\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n min-width: 0;\r\n padding: var(--_mono-menu-group-pad);\r\n font-family: inherit;\r\n font-size: var(--_mono-menu-font);\r\n color: var(--_mono-menu-text);\r\n background: var(--_mono-menu-surface);\r\n}\r\n\r\n[mono-menu],\r\n:where([mono-menu]) *,\r\n:where([mono-menu]) *::before,\r\n:where([mono-menu]) *::after {\r\n box-sizing: border-box;\r\n}\r\n\r\n/* =========================================\r\n Density — upstream's `data-size` ladder\r\n ========================================= */\r\n\r\n/* basecoat@1.0.2 styles/vega.css .sidebar nav li > :is(a, button)[data-size=sm], .sidebar nav li > details > summary[data-size=sm] — h-7 text-xs */\r\n[mono-menu][mono-density=\"compact\"] {\r\n --_mono-menu-height-preset: var(--mono-menu-height-compact, calc(var(--mono-spacing) * 7));\r\n --_mono-menu-pad-x-preset: var(--mono-menu-pad-x-compact, calc(var(--mono-spacing) * 2));\r\n --_mono-menu-pad-y-preset: var(--mono-menu-pad-y-compact, calc(var(--mono-spacing) * 1));\r\n --_mono-menu-font-preset: var(--mono-menu-font-compact, var(--mono-text-xs));\r\n --_mono-menu-line-height-preset: var(--mono-text-xs--lh);\r\n --_mono-menu-gap-preset: var(--mono-menu-gap-compact, calc(var(--mono-spacing) * 0.5));\r\n --_mono-menu-icon-size-preset: var(--mono-menu-icon-size-compact, calc(var(--mono-spacing) * 3.5));\r\n --_mono-menu-group-pad-preset: var(--mono-menu-group-pad-compact, calc(var(--mono-spacing) * 1.5));\r\n --_mono-menu-indent-preset: var(--mono-menu-indent-compact, calc(var(--mono-spacing) * 3.5));\r\n}\r\n\r\n/* basecoat@1.0.2 styles/vega.css .sidebar nav li > :is(a, button)[data-size=lg], .sidebar nav li > details > summary[data-size=lg] — h-12 text-sm */\r\n[mono-menu][mono-density=\"default\"] {\r\n --_mono-menu-height-preset: var(--mono-menu-height-default, calc(var(--mono-spacing) * 12));\r\n --_mono-menu-pad-x-preset: var(--mono-menu-pad-x-default, calc(var(--mono-spacing) * 2));\r\n --_mono-menu-pad-y-preset: var(--mono-menu-pad-y-default, calc(var(--mono-spacing) * 2));\r\n --_mono-menu-font-preset: var(--mono-menu-font-default, var(--mono-text-sm));\r\n --_mono-menu-gap-preset: var(--mono-menu-gap-default, calc(var(--mono-spacing) * 1.5));\r\n --_mono-menu-icon-size-preset: var(--mono-menu-icon-size-default, calc(var(--mono-spacing) * 5));\r\n --_mono-menu-group-pad-preset: var(--mono-menu-group-pad-default, calc(var(--mono-spacing) * 3));\r\n --_mono-menu-indent-preset: var(--mono-menu-indent-default, calc(var(--mono-spacing) * 4.5));\r\n}\r\n\r\n/* =========================================\r\n Colours — EXTENSION: the role TINTS upstream's neutral wash\r\n ========================================= */\r\n\r\n[mono-menu][mono-color=\"primary\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-primary);\r\n --_mono-menu-on-accent-preset: var(--primary-foreground);\r\n}\r\n[mono-menu][mono-color=\"secondary\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-secondary);\r\n --_mono-menu-on-accent-preset: var(--secondary);\r\n}\r\n[mono-menu][mono-color=\"success\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-success);\r\n --_mono-menu-on-accent-preset: var(--success-foreground);\r\n}\r\n[mono-menu][mono-color=\"danger\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-danger);\r\n --_mono-menu-on-accent-preset: var(--destructive-foreground);\r\n}\r\n[mono-menu][mono-color=\"warning\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-warning);\r\n --_mono-menu-on-accent-preset: var(--warning-foreground);\r\n}\r\n[mono-menu][mono-color=\"info\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-info);\r\n --_mono-menu-on-accent-preset: var(--info-foreground);\r\n}\r\n[mono-menu][mono-color=\"teal\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-teal);\r\n --_mono-menu-on-accent-preset: var(--teal-foreground);\r\n}\r\n[mono-menu][mono-color=\"purple\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-purple);\r\n --_mono-menu-on-accent-preset: var(--purple-foreground);\r\n}\r\n[mono-menu][mono-color=\"neutral\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-neutral);\r\n --_mono-menu-on-accent-preset: var(--neutral-foreground);\r\n}\r\n[mono-menu][mono-color=\"dark\"] {\r\n --_mono-menu-accent-preset: var(--_mono-menu-dark);\r\n --_mono-menu-on-accent-preset: var(--dark-foreground);\r\n}\r\n\r\n/* `surface` is upstream exactly: the wash is `--sidebar-accent`, untinted, and\r\n the active row is inked `--sidebar-accent-foreground` rather than a role. */\r\n[mono-menu][mono-color=\"surface\"] {\r\n --_mono-menu-hover-tint-preset: 0%;\r\n --_mono-menu-active-tint-preset: 0%;\r\n --_mono-menu-active-color-preset: var(--sidebar-accent-foreground);\r\n}\r\n\r\n/* =========================================\r\n The list\r\n ========================================= */\r\n\r\n/* basecoat@1.0.2 components/sidebar.css .sidebar >> nav >> > section >> ul — flex w-full min-w-0 flex-col */\r\n/* basecoat@1.0.2 styles/vega.css .sidebar nav > section > [role=group] > ul — gap-1\r\n The root is in the selector so `.vp-doc ul, .vp-doc ol` (0,1,1) cannot inject\r\n the left padding that would break a flush menu. */\r\n:where([mono-menu]) [mono-list] {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n min-width: 0;\r\n gap: var(--_mono-menu-gap);\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n}\r\n\r\n/* basecoat@1.0.2 components/sidebar.css .sidebar >> nav >> > section >> ul >> ul — flex min-w-0 flex-col\r\n Upstream stops at the flex column. The rest is mono's own tree affordance:\r\n the child list is pushed in under the parent row's icon, hangs off a guide\r\n rule, and clears the row above it by one list gap — a nested `ul` is a block\r\n child of its `li`, so the parent list's `gap` never reaches it.\r\n\r\n `:has(> *)` because a declarative row always renders its children list, even\r\n with no children in it: an empty one would otherwise hang a guide off every\r\n leaf row and push the next row down by a gap. */\r\n:where([mono-menu]) [mono-list] [mono-list]:has(> *) {\r\n width: auto;\r\n margin-top: var(--_mono-menu-gap);\r\n margin-inline-start: var(--_mono-menu-guide-offset);\r\n padding-inline-start: var(--_mono-menu-indent);\r\n border-inline-start: var(--_mono-menu-guide-width) solid var(--_mono-menu-guide-color);\r\n}\r\n\r\n/* The DECLARATIVE body (`slot=\"body\"` + `<mono-menu-list>`). Each top-level\r\n row renders its own `<ul mono-list>`, so they are siblings of one another\r\n rather than `li`s of one list — nothing was left to carry the row gap, and a\r\n declarative menu's top-level rows sat flush while an items-driven one (and\r\n every hand-written twin) spaced them. Lay the body out as the list would, and\r\n dissolve the element the author hung `slot=\"body\"` on so the rows become its\r\n own children. */\r\n:where([mono-menu]) [mono-body] {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n min-width: 0;\r\n gap: var(--_mono-menu-gap);\r\n}\r\n\r\n:where([mono-menu]) [mono-body] > [mono-slotted] {\r\n display: contents;\r\n}\r\n\r\n/* basecoat@1.0.2 components/sidebar.css .sidebar >> nav >> > section >> ul >> li — relative */\r\n:where([mono-menu]) [mono-item] {\r\n position: relative;\r\n display: var(--_mono-menu-row-display);\r\n justify-content: var(--_mono-menu-row-justify);\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n}\r\n\r\n/* =========================================\r\n The row\r\n ========================================= */\r\n\r\n/* basecoat@1.0.2 components/sidebar.css .sidebar >> nav >> > section >> ul >> li >> > a, > button, > details > summary — flex w-full items-center overflow-hidden text-left outline-hidden transition-[width,height,padding] disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0 */\r\n/* basecoat@1.0.2 styles/vega.css .sidebar nav li > :is(a, button), .sidebar nav li > details > summary — ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground gap-2 rounded-md p-2 text-sm focus-visible:ring-2 text-left focus-visible:outline-hidden data-[open]:hover:bg-sidebar-accent data-[open]:hover:text-sidebar-accent-foreground [&>svg]:shrink-0 [&>svg]:size-4 */\r\n:where([mono-menu]) :is([mono-action], [mono-group-header]) {\r\n display: flex;\r\n align-items: center;\r\n justify-content: var(--_mono-menu-action-justify);\r\n gap: var(--_mono-menu-action-gap);\r\n width: var(--_mono-menu-action-width);\r\n min-height: var(--_mono-menu-height);\r\n padding: var(--_mono-menu-pad-y) var(--_mono-menu-pad-x);\r\n border: var(--mono-border-width) solid transparent;\r\n border-radius: var(--_mono-menu-radius);\r\n background: transparent;\r\n color: inherit;\r\n font: inherit;\r\n font-size: var(--_mono-menu-font);\r\n line-height: var(--_mono-menu-line-height);\r\n text-align: left;\r\n text-decoration: none;\r\n overflow: hidden;\r\n cursor: pointer;\r\n outline: none;\r\n transition:\r\n background-color var(--mono-duration) var(--mono-ease),\r\n color var(--mono-duration) var(--mono-ease),\r\n border-color var(--mono-duration) var(--mono-ease);\r\n}\r\n\r\n/* VitePress's `.vp-doc a` (0,1,1) underlines and re-inks every link. */\r\n[mono-menu] a[mono-action] {\r\n text-decoration: none;\r\n color: inherit;\r\n}\r\n\r\n[mono-menu] a[mono-action]::after {\r\n display: none !important;\r\n}\r\n\r\n@media (hover: hover) {\r\n [mono-menu] :is([mono-action], [mono-group-header]):hover {\r\n background: var(--_mono-menu-hover-bg);\r\n color: var(--_mono-menu-hover-color);\r\n border-color: var(--_mono-menu-hover-border-color);\r\n }\r\n}\r\n\r\n/* `focus-visible:ring-2` on `ring-sidebar-ring` */\r\n[mono-menu] :is([mono-action], [mono-group-header]):focus-visible {\r\n outline: none;\r\n box-shadow: 0 0 0 var(--mono-ring-width)\r\n color-mix(in oklab, var(--sidebar-ring, var(--ring)) var(--mono-ring-alpha), transparent);\r\n}\r\n\r\n/* basecoat@1.0.2 styles/vega.css .sidebar nav li > :is(a, button):is([aria-current=page], [data-active=true]), .sidebar nav li > details > summary:is([aria-current=page], [data-active=true]) — bg-sidebar-accent text-sidebar-accent-foreground font-medium\r\n A flat wash and a weight step — NOT the pre-port brand gradient and glow. */\r\n[mono-menu] [mono-item][mono-active] > :is([mono-action], [mono-group-header]) {\r\n background: var(--_mono-menu-active-bg);\r\n color: var(--_mono-menu-active-color);\r\n font-weight: var(--_mono-menu-active-weight);\r\n box-shadow: var(--_mono-menu-active-shadow);\r\n}\r\n\r\n/* `disabled:pointer-events-none disabled:opacity-50 aria-disabled:…` */\r\n[mono-menu] [mono-item][mono-disabled] > :is([mono-action], [mono-group-header]),\r\n[mono-menu] :is([mono-action], [mono-group-header]):disabled,\r\n[mono-menu][mono-disabled] :is([mono-action], [mono-group-header]) {\r\n opacity: var(--mono-disabled-opacity, 0.5);\r\n pointer-events: none;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* `plain` — the non-`nav` mode: rows read as list entries, not links. */\r\n[mono-menu][mono-plain] :is([mono-action], [mono-group-header]) {\r\n border-radius: 0;\r\n}\r\n\r\n/* =========================================\r\n Row content\r\n ========================================= */\r\n\r\n/* `[&>svg]:shrink-0 [&>svg]:size-4` */\r\n:where([mono-menu]) [mono-icon] {\r\n flex-shrink: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--_mono-menu-icon-size);\r\n height: var(--_mono-menu-icon-size);\r\n font-size: var(--_mono-menu-icon-size);\r\n line-height: 1;\r\n}\r\n\r\n/* Three shapes end up inside the box and all must fill it:\r\n shadow build, user-slotted → <slot> → ::slotted(svg)\r\n light build, user-slotted → <span data-mono-slot=\"icon-<id>\"> → svg\r\n inline `item.icon` markup → a direct child svg\r\n The light placeholder parks the captured child, so the SVG is a GRANDchild\r\n and a `> svg` rule misses it entirely. */\r\n[mono-menu] [mono-icon] > svg,\r\n[mono-menu] [mono-icon] > [data-mono-slot] > svg,\r\n[mono-menu] [mono-icon] slot::slotted(svg) {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n[mono-menu] [mono-icon] > [data-mono-slot] {\r\n display: contents;\r\n}\r\n\r\n/* Class + attribute = specificity (0,2,0), deliberately. UnoCSS's `i-…`\r\n utilities set `width`/`height: 1.2em` (presetIcons `scale: 1.2`) at (0,1,0)\r\n and their sheet loads AFTER this one, so a single selector loses and the\r\n glyph overflows its box. Two selectors win regardless of sheet order — and it\r\n is the only thing that works for the SHADOW build, where this span is a\r\n LIGHT-DOM child of the host that no shadow-scoped selector can reach.\r\n Scoped to the menu: its OWN class (every build sets it on the span — the shadow\r\n build's span is a light-DOM child of the host, outside [mono-menu]) OR anything\r\n inside a [mono-menu] root (raw CSS markup writes a bare\r\n `<span mono-glyph class=\"i-…\">`). Still (0,2,0): `:is()` weighs its heaviest\r\n argument. A bare `[mono-glyph][mono-glyph]` is global and stretched every other\r\n component's `[mono-glyph]` to 100% — the accordion's icon chip filled its header. */\r\n:is(.mono-menu-iconify, [mono-menu] *)[mono-glyph] {\r\n display: inline-block;\r\n width: 100%;\r\n height: 100%;\r\n flex-shrink: 0;\r\n color: inherit;\r\n}\r\n\r\n/* An `alias` icon is the placeholder a row shows when it has no glyph of its\r\n own — a dimmed dot rather than a hole in the column. */\r\n[mono-menu] [mono-icon][mono-alias] {\r\n opacity: 0.55;\r\n}\r\n\r\n/* `[&>span:last-child]:truncate` */\r\n:where([mono-menu]) [mono-content] {\r\n display: var(--_mono-menu-label-display);\r\n flex-direction: column;\r\n justify-content: center;\r\n min-width: 0;\r\n flex: 1;\r\n overflow: hidden;\r\n}\r\n\r\n:where([mono-menu]) [mono-title] {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n font-size: inherit;\r\n color: inherit;\r\n}\r\n\r\n:where([mono-menu]) [mono-subtitle] {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n font-size: var(--mono-text-xs);\r\n line-height: var(--mono-text-xs--lh);\r\n color: var(--_mono-menu-text-soft);\r\n}\r\n\r\n:where([mono-menu]) [mono-append] {\r\n flex-shrink: 0;\r\n display: var(--_mono-menu-label-display);\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--_mono-menu-icon-size);\r\n height: var(--_mono-menu-icon-size);\r\n color: var(--_mono-menu-text-faint);\r\n}\r\n\r\n/* =========================================\r\n Group — upstream's `<details><summary>`\r\n ========================================= */\r\n\r\n/* basecoat@1.0.2 components/sidebar.css .sidebar >> nav >> > section >> ul >> li >> > details >> > summary >> &::after — ms-auto block size-3.5 bg-current content-[''] transition-transform ease-linear */\r\n:where([mono-menu]) [mono-chevron] {\r\n flex-shrink: 0;\r\n display: var(--_mono-menu-label-display);\r\n align-items: center;\r\n justify-content: center;\r\n margin-inline-start: auto;\r\n width: calc(var(--mono-spacing) * 3.5);\r\n height: calc(var(--mono-spacing) * 3.5);\r\n color: var(--_mono-menu-text-faint);\r\n transition: rotate var(--mono-duration) linear;\r\n}\r\n\r\n/* basecoat@1.0.2 components/sidebar.css .sidebar >> nav >> > section >> ul >> li >> > details >> &:not([open]) >> > summary >> &::after — -rotate-90 rtl:rotate-90\r\n Upstream's marker is a chevron-DOWN, so it rotates the CLOSED state a quarter\r\n turn back to point along the reading direction. mono's marker is a\r\n chevron-RIGHT, which already points that way at rest — so the rotation\r\n belongs on the OPEN state instead. Taking upstream's rule literally left an\r\n open group pointing right and a closed one pointing up. */\r\n[mono-menu] [mono-group][mono-open] > [mono-group-header] > [mono-chevron] {\r\n rotate: 90deg;\r\n}\r\n\r\n[dir=\"rtl\"] [mono-menu] [mono-group]:not([mono-open]) > [mono-group-header] > [mono-chevron] {\r\n rotate: 180deg;\r\n}\r\n\r\n[mono-menu] [mono-group]:not([mono-open]) > [mono-group-body] {\r\n display: none;\r\n}\r\n\r\n[mono-menu] [mono-group] > [mono-group-body] {\r\n display: var(--mono-menu-group-children-display, flex);\r\n}\r\n\r\n/* =========================================\r\n Subheader and divider\r\n ========================================= */\r\n\r\n/* basecoat@1.0.2 components/sidebar.css .sidebar >> nav >> > section >> h3 — flex shrink-0 items-center outline-hidden transition-[margin,opacity] duration-200 ease-linear [&>svg]:shrink-0 */\r\n/* basecoat@1.0.2 styles/vega.css .sidebar nav h3 — text-sidebar-foreground/70 ring-sidebar-ring h-8 rounded-md px-2 text-xs font-medium focus-visible:ring-2 [&>svg]:size-4 transition-[margin,opacity] duration-200 ease-linear */\r\n:where([mono-menu]) [mono-subheader] {\r\n flex-shrink: 0;\r\n display: var(--_mono-menu-label-display);\r\n align-items: center;\r\n height: var(--_mono-menu-subheader-height);\r\n padding: 0 var(--_mono-menu-subheader-pad-x);\r\n margin: 0;\r\n border-radius: var(--_mono-menu-subheader-radius);\r\n list-style: none;\r\n font-size: var(--_mono-menu-subheader-font);\r\n font-weight: var(--_mono-menu-subheader-weight);\r\n text-transform: var(--_mono-menu-subheader-transform);\r\n letter-spacing: var(--_mono-menu-subheader-tracking);\r\n color: var(--_mono-menu-text-soft);\r\n}\r\n\r\n/* basecoat@1.0.2 components/sidebar.css .sidebar >> nav >> [role=separator] — w-auto */\r\n/* basecoat@1.0.2 styles/vega.css .sidebar nav [role=separator] — border-sidebar-border mx-2 */\r\n:where([mono-menu]) [mono-divider] {\r\n display: var(--_mono-menu-block-display);\r\n width: auto;\r\n height: 0;\r\n /* `mx-2` and nothing else: upstream gives the separator no block margin at\r\n all, because it is a flex item of the list and the list's own `gap` already\r\n spaces it from the rows either side. Adding a block margin on top double-\r\n spaced it — and put the one property on this row that `.vp-doc li + li`\r\n (0,1,2) could out-specify. */\r\n margin-inline: calc(var(--mono-spacing) * 2);\r\n padding: 0;\r\n border: 0;\r\n border-top: var(--mono-border-width) solid var(--_mono-menu-border-lite);\r\n list-style: none;\r\n}\r\n\r\n/* =========================================\r\n Badge — EXTENSION, borrowing `.badge`'s shape\r\n ========================================= */\r\n\r\n/* basecoat@1.0.2 styles/vega.css .badge — h-5 gap-1 rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium transition-all [&>svg]:size-3! */\r\n:where([mono-menu]) [mono-badge] {\r\n flex-shrink: 0;\r\n display: var(--_mono-menu-label-display);\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--mono-spacing);\r\n margin-inline-start: auto;\r\n height: var(--_mono-menu-badge-height);\r\n padding: 0 var(--_mono-menu-badge-pad-x);\r\n border: var(--mono-border-width) solid transparent;\r\n border-radius: var(--_mono-menu-badge-radius);\r\n font-size: var(--_mono-menu-badge-font);\r\n font-weight: var(--_mono-menu-badge-weight);\r\n line-height: 1;\r\n background: var(--_mono-menu-badge-bg);\r\n color: var(--_mono-menu-badge-color);\r\n}\r\n\r\n[mono-menu] [mono-badge=\"primary\"] {\r\n background: color-mix(in oklab, var(--_mono-menu-primary) var(--mono-mode-tint), transparent);\r\n color: var(--_mono-menu-primary);\r\n}\r\n[mono-menu] [mono-badge=\"success\"] {\r\n background: color-mix(in oklab, var(--_mono-menu-success) var(--mono-mode-tint), transparent);\r\n color: var(--_mono-menu-success);\r\n}\r\n[mono-menu] [mono-badge=\"danger\"] {\r\n background: color-mix(in oklab, var(--_mono-menu-danger) var(--mono-mode-tint), transparent);\r\n color: var(--_mono-menu-danger);\r\n}\r\n[mono-menu] [mono-badge=\"warning\"] {\r\n background: color-mix(in oklab, var(--_mono-menu-warning) var(--mono-mode-tint), transparent);\r\n color: var(--_mono-menu-warning);\r\n}\r\n[mono-menu] [mono-badge=\"info\"] {\r\n background: color-mix(in oklab, var(--_mono-menu-info) var(--mono-mode-tint), transparent);\r\n color: var(--_mono-menu-info);\r\n}\r\n\r\n/* =========================================\r\n Reduced motion\r\n ========================================= */\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n [mono-menu] :is([mono-action], [mono-group-header], [mono-chevron]) {\r\n transition: none;\r\n }\r\n}\r\n";
828
+ //#endregion
829
+ //#region src/components/menu/mono-menu.ts
830
+ var MonoMenu = class MonoMenu extends MonoMenuCore(LitElement) {
831
+ constructor(..._args) {
832
+ super(..._args);
833
+ this._slotsCaptured = false;
834
+ this._hasBodySlot = false;
835
+ this._slotBody = [];
836
+ }
837
+ static {
838
+ this.styles = [unsafeCSS(menu_default)];
839
+ }
840
+ createRenderRoot() {
841
+ return this;
842
+ }
843
+ connectedCallback() {
844
+ super.connectedCallback();
845
+ this._captureSlots();
846
+ this._seedDefaultOpenGroups();
847
+ if (this.isConnected) this.performUpdate();
848
+ }
849
+ _captureSlots() {
850
+ if (this._slotsCaptured) return;
851
+ this._slotsCaptured = true;
852
+ const captured = monoHostChildNodes(this);
853
+ const toRemove = /* @__PURE__ */ new Set();
854
+ for (const node of captured) {
855
+ if (!(node instanceof Element)) continue;
856
+ const slotName = node.getAttribute("slot");
857
+ if (!slotName) continue;
858
+ if (slotName === "body") {
859
+ node.removeAttribute("slot");
860
+ node.setAttribute("mono-slotted", "");
861
+ this._slotBody.push(node);
862
+ toRemove.add(node);
863
+ continue;
864
+ }
865
+ if (slotName.startsWith("icon-")) {
866
+ const id = slotName.slice(5);
867
+ if (!id) continue;
868
+ node.removeAttribute("slot");
869
+ const list = this._slotIcons.get(id) ?? [];
870
+ list.push(node);
871
+ this._slotIcons.set(id, list);
872
+ toRemove.add(node);
873
+ }
874
+ }
875
+ this._hasBodySlot = this._slotBody.length > 0;
876
+ for (const node of toRemove) if (node.parentNode === this) this.removeChild(node);
877
+ }
878
+ updated(changed) {
879
+ super.updated(changed);
880
+ this._placeIconSlots();
881
+ this._placeBodySlot();
882
+ this._notifyListChildren(changed);
883
+ this._orphanHolder = parkDetachedNodes(this._orphanHolder, [...[...this._slotIcons.values()].flat(), ...this._slotBody]);
884
+ }
885
+ _placeIconSlots() {
886
+ if (!this._slotIcons.size) return;
887
+ for (const [id, nodes] of this._slotIcons) {
888
+ const target = this.querySelector(`[data-mono-slot="icon-${id}"]`);
889
+ if (!target) continue;
890
+ for (const node of nodes) placeSlotNode(target, node);
891
+ }
892
+ }
893
+ _placeBodySlot() {
894
+ if (!this._slotBody.length) return;
895
+ const target = this.querySelector("[data-mono-slot=\"body\"]");
896
+ if (!target) return;
897
+ for (const node of this._slotBody) placeSlotNode(target, node);
898
+ }
899
+ /**
900
+ * When any prop that influences the rendered content of descendant
901
+ * `<mono-menu-list>` instances changes, ask each registered child to
902
+ * re-render so they stay in lockstep with the parent.
903
+ */
904
+ _notifyListChildren(changed) {
905
+ if (!this._listChildren.size) return;
906
+ if (![
907
+ "modelValue",
908
+ "_openGroups",
909
+ "multiple",
910
+ "density",
911
+ "color",
912
+ "cssClass",
913
+ "cssClassName",
914
+ "disabled",
915
+ "selectable",
916
+ "nav"
917
+ ].some((k) => changed.has(k))) return;
918
+ for (const child of this._listChildren) child.requestUpdate();
919
+ }
920
+ /** Light body — declarative `slot="body"` placeholder, else items-driven. */
921
+ _renderBody() {
922
+ if (this._hasBodySlot) return html`<div class="mono-menu-body" mono-body data-mono-slot="body"></div>`;
923
+ return super._renderBody();
924
+ }
925
+ };
926
+ __decorate([state()], MonoMenu.prototype, "_slotsCaptured", void 0);
927
+ __decorate([state()], MonoMenu.prototype, "_hasBodySlot", void 0);
928
+ MonoMenu = __decorate([customElement("mono-menu")], MonoMenu);
929
+ //#endregion
930
+ //#region src/components/menu/mono-menu-list.ts
931
+ var autoMenuListId = 0;
932
+ var MonoMenuList = class MonoMenuList extends LitElement {
933
+ constructor(..._args) {
934
+ super(..._args);
935
+ this.items = [];
936
+ this.type = "children";
937
+ this.title = "";
938
+ this.subtitle = "";
939
+ this.icon = "";
940
+ this.appendIcon = "";
941
+ this.href = "";
942
+ this.disabled = false;
943
+ this.defaultOpen = false;
944
+ this._parent = null;
945
+ this._parentList = null;
946
+ this._rootList = null;
947
+ this._nestedChildren = /* @__PURE__ */ new Set();
948
+ this._capturedChildren = [];
949
+ this._childrenCaptured = false;
950
+ this._standaloneOpen = /* @__PURE__ */ new Set();
951
+ this._childObserver = null;
952
+ this._autoId = `mono-menu-list-item-${++autoMenuListId}`;
953
+ }
954
+ createRenderRoot() {
955
+ return this;
956
+ }
957
+ connectedCallback() {
958
+ super.connectedCallback();
959
+ this._parent = this.closest("mono-menu");
960
+ this._parentList = this.parentElement?.closest("mono-menu-list") ?? null;
961
+ this._rootList = this._findRootList();
962
+ if (this._parent) this._parent._registerListChild(this);
963
+ if (this._parentList) this._parentList._registerNestedChild(this);
964
+ this._captureInitialChildren();
965
+ this._setupChildObserver();
966
+ this._seedDefaultOpenIntoParent();
967
+ }
968
+ disconnectedCallback() {
969
+ super.disconnectedCallback();
970
+ if (this._parent) {
971
+ this._parent._unregisterListChild(this);
972
+ this._parent = null;
973
+ }
974
+ if (this._parentList) {
975
+ this._parentList._unregisterNestedChild(this);
976
+ this._parentList = null;
977
+ }
978
+ this._rootList = null;
979
+ if (this._childObserver) {
980
+ this._childObserver.disconnect();
981
+ this._childObserver = null;
982
+ }
983
+ this._capturedChildren = this._capturedChildren.filter((node) => !node.parentNode || this.contains(node));
984
+ }
985
+ willUpdate(changed) {
986
+ if ([
987
+ "items",
988
+ "item",
989
+ "itemType",
990
+ "type",
991
+ "title",
992
+ "subtitle",
993
+ "icon",
994
+ "appendIcon",
995
+ "badge",
996
+ "badgeColor",
997
+ "href",
998
+ "disabled",
999
+ "defaultOpen"
1000
+ ].some((key) => changed.has(key)) && this._parent) this._seedDefaultOpenIntoParent();
1001
+ }
1002
+ updated(_changed) {
1003
+ this._captureExternalSiblings();
1004
+ this._placeBodySlot();
1005
+ }
1006
+ getMenuItems() {
1007
+ return this._getEffectiveItems();
1008
+ }
1009
+ /** @internal called by a nested `<mono-menu-list>` from its connectedCallback. */
1010
+ _registerNestedChild(child) {
1011
+ this._nestedChildren.add(child);
1012
+ }
1013
+ /** @internal */
1014
+ _unregisterNestedChild(child) {
1015
+ this._nestedChildren.delete(child);
1016
+ }
1017
+ /** Standalone (no `<mono-menu>`) group-open queries — root-most list owns the set. */
1018
+ isGroupOpenStandalone(id) {
1019
+ return this._standaloneOpen.has(id);
1020
+ }
1021
+ /** Seed a default-open id into the standalone state set. */
1022
+ seedStandaloneOpen(id) {
1023
+ this._standaloneOpen.add(id);
1024
+ }
1025
+ toggleGroupStandalone(id) {
1026
+ if (this._standaloneOpen.has(id)) this._standaloneOpen.delete(id);
1027
+ else this._standaloneOpen.add(id);
1028
+ this.requestUpdate();
1029
+ for (const child of this._nestedChildren) child.requestUpdate();
1030
+ }
1031
+ _findRootList() {
1032
+ if (!this._parentList) return null;
1033
+ let cur = this._parentList;
1034
+ while (cur._parentList) cur = cur._parentList;
1035
+ return cur;
1036
+ }
1037
+ _captureInitialChildren() {
1038
+ if (this._childrenCaptured) return;
1039
+ this._childrenCaptured = true;
1040
+ for (const node of monoHostChildNodes(this)) {
1041
+ this._capturedChildren.push(node);
1042
+ if (node.parentNode === this) this.removeChild(node);
1043
+ }
1044
+ }
1045
+ /**
1046
+ * Capture external Element children that landed on the host AFTER Lit's
1047
+ * most recent render — typically because a framework (Vue/React) inserted
1048
+ * nodes via `v-for`, `v-if`, etc. We deliberately skip non-Element nodes
1049
+ * (text / comment) because Lit places its own marker comments around the
1050
+ * rendered region and stealing those breaks the part graph.
1051
+ */
1052
+ _captureExternalSiblings() {
1053
+ const root = this.firstElementChild;
1054
+ let captured = false;
1055
+ for (const node of monoHostChildNodes(this)) {
1056
+ if (node === root) continue;
1057
+ if (node.nodeType !== Node.ELEMENT_NODE) continue;
1058
+ if (!this._capturedChildren.includes(node)) this._capturedChildren.push(node);
1059
+ if (node.parentNode === this) this.removeChild(node);
1060
+ captured = true;
1061
+ }
1062
+ return captured;
1063
+ }
1064
+ _setupChildObserver() {
1065
+ if (this._childObserver) return;
1066
+ this._childObserver = new MutationObserver(() => {
1067
+ const root = this.firstElementChild;
1068
+ for (const node of monoHostChildNodes(this)) {
1069
+ if (node === root) continue;
1070
+ if (node.nodeType !== Node.ELEMENT_NODE) continue;
1071
+ this.requestUpdate();
1072
+ return;
1073
+ }
1074
+ });
1075
+ this._childObserver.observe(this, {
1076
+ childList: true,
1077
+ subtree: false
1078
+ });
1079
+ }
1080
+ _placeBodySlot() {
1081
+ if (!this._capturedChildren.length) return;
1082
+ const target = this.querySelector("[data-mono-slot=\"body\"]");
1083
+ if (!target) return;
1084
+ for (const node of this._capturedChildren) placeSlotNode(target, node);
1085
+ }
1086
+ _hasCapturedChildren() {
1087
+ return this._capturedChildren.length > 0;
1088
+ }
1089
+ _hasDirectItemProps() {
1090
+ return !!(this.id || this.title || this.subtitle || this.icon || this.appendIcon || this.badge !== void 0 || this.href || this.itemType || this.type && this.type !== "children" || this.defaultOpen || this.disabled);
1091
+ }
1092
+ /**
1093
+ * Declarative mode: `type` describes MenuItem.type and the body is composed
1094
+ * from captured DOM children instead of `items`.
1095
+ *
1096
+ * The order of the checks is the contract. Captured children win outright —
1097
+ * they ARE the body. An explicit `items` array comes next, and specifically
1098
+ * BEATS direct props: the previous order returned `true` as soon as any direct
1099
+ * prop was set, so `<mono-menu-list type="group" title="Sales" :items.prop="kids">`
1100
+ * — the single-row form documented in the class header and in `MenuListProps` —
1101
+ * landed in declarative mode. `_buildDeclarativeItem()` drops `items` on
1102
+ * purpose, so that row rendered an empty `[data-mono-slot="body"]` nothing was
1103
+ * ever placed into, and `_buildDirectItem()` (the one branch that does carry
1104
+ * `items`) was unreachable.
1105
+ *
1106
+ * It doubles as a safety net for the element form: a group whose DOM children
1107
+ * never made it into `_capturedChildren` now falls back to its `items` array
1108
+ * rather than rendering a chevron over an empty body.
1109
+ */
1110
+ _isDeclarativeMode() {
1111
+ if (this.item) return false;
1112
+ if (this._hasCapturedChildren()) return true;
1113
+ if (this.items.length) return false;
1114
+ return this._hasDirectItemProps();
1115
+ }
1116
+ _typeAsMenuItemType() {
1117
+ if (this.itemType) return this.itemType;
1118
+ switch (this.type) {
1119
+ case "item":
1120
+ case "children": return "item";
1121
+ case "group": return "group";
1122
+ case "divider": return "divider";
1123
+ case "subheader": return "subheader";
1124
+ default: return;
1125
+ }
1126
+ }
1127
+ _normalizeItem(item) {
1128
+ const title = item.title ?? "";
1129
+ const fallbackId = this.id || item.id || item.href || title.toLowerCase().trim().replace(/\s+/g, "-") || this._autoId;
1130
+ const normalized = { id: String(item.id ?? fallbackId) };
1131
+ if (item.type !== void 0) normalized.type = item.type;
1132
+ if (item.title !== void 0) normalized.title = item.title;
1133
+ if (item.subtitle !== void 0) normalized.subtitle = item.subtitle;
1134
+ if (item.icon !== void 0) normalized.icon = item.icon;
1135
+ if (item.appendIcon !== void 0) normalized.appendIcon = item.appendIcon;
1136
+ if (item.badge !== void 0) normalized.badge = item.badge;
1137
+ if (item.badgeColor !== void 0) normalized.badgeColor = item.badgeColor;
1138
+ if (item.href !== void 0) normalized.href = item.href;
1139
+ if (item.disabled !== void 0) normalized.disabled = item.disabled;
1140
+ if (item.items !== void 0) normalized.items = item.items;
1141
+ if (item.defaultOpen !== void 0) normalized.defaultOpen = item.defaultOpen;
1142
+ return normalized;
1143
+ }
1144
+ _buildDirectItem() {
1145
+ return this._normalizeItem({
1146
+ id: this.id || void 0,
1147
+ type: this._typeAsMenuItemType(),
1148
+ title: this.title || void 0,
1149
+ subtitle: this.subtitle || void 0,
1150
+ icon: this.icon || void 0,
1151
+ appendIcon: this.appendIcon || void 0,
1152
+ badge: this.badge,
1153
+ badgeColor: this.badgeColor,
1154
+ href: this.href || void 0,
1155
+ disabled: this.disabled,
1156
+ items: this.items.length ? this.items : void 0,
1157
+ defaultOpen: this.defaultOpen
1158
+ });
1159
+ }
1160
+ _buildDeclarativeItem() {
1161
+ return this._normalizeItem({
1162
+ id: this.id || void 0,
1163
+ type: this._typeAsMenuItemType(),
1164
+ title: this.title || void 0,
1165
+ subtitle: this.subtitle || void 0,
1166
+ icon: this.icon || void 0,
1167
+ appendIcon: this.appendIcon || void 0,
1168
+ badge: this.badge,
1169
+ badgeColor: this.badgeColor,
1170
+ href: this.href || void 0,
1171
+ disabled: this.disabled,
1172
+ defaultOpen: this.defaultOpen
1173
+ });
1174
+ }
1175
+ _getEffectiveItems() {
1176
+ if (this.item) {
1177
+ const normalized = this._normalizeItem(this.item);
1178
+ if (this.items.length) normalized.items = this.items;
1179
+ return [normalized];
1180
+ }
1181
+ if (this._isDeclarativeMode()) return [this._buildDeclarativeItem()];
1182
+ if (this._hasDirectItemProps()) return [this._buildDirectItem()];
1183
+ if (Array.isArray(this.items) && this.items.length) return this.items;
1184
+ return [];
1185
+ }
1186
+ _seedDefaultOpenIntoParent() {
1187
+ if (!this._parent) return;
1188
+ for (const id of collectDefaultOpenGroups(this._getEffectiveItems())) this._parent.expandGroup(id);
1189
+ }
1190
+ /**
1191
+ * A group is "active" while any descendant row is the selected one.
1192
+ * `renderMenuGroup` puts `.mono-menu-group.active` on such a header and
1193
+ * menu.css already styles it — the class simply never appeared, because
1194
+ * nothing supplied this callback.
1195
+ */
1196
+ _hasSelectedDescendant(group, isSelected) {
1197
+ return (group.items ?? []).some((child) => isSelected(child.id) || this._hasSelectedDescendant(child, isSelected));
1198
+ }
1199
+ _buildContext(declarative) {
1200
+ const parent = this._parent;
1201
+ if (parent) return {
1202
+ multiple: parent.multiple,
1203
+ selectable: parent.selectable,
1204
+ disabled: parent.disabled,
1205
+ cssClass: parent.cssClass ?? {},
1206
+ bodySlot: declarative,
1207
+ isSelected: (id) => parent.isItemSelected(id),
1208
+ isGroupActive: (group) => this._hasSelectedDescendant(group, (id) => parent.isItemSelected(id)),
1209
+ isGroupOpen: (id) => parent.isGroupOpenPublic(id),
1210
+ getSlotIconNodes: (id) => parent.getSlotIconNodes(id),
1211
+ onItemClick: (item, e) => parent.requestItemActivation(item, e),
1212
+ onGroupToggle: (group, e) => parent.requestGroupToggle(group, e)
1213
+ };
1214
+ const stateOwner = this._rootList ?? this;
1215
+ return {
1216
+ multiple: false,
1217
+ selectable: true,
1218
+ disabled: false,
1219
+ cssClass: {},
1220
+ bodySlot: declarative,
1221
+ isSelected: () => false,
1222
+ isGroupActive: () => false,
1223
+ isGroupOpen: (id) => stateOwner.isGroupOpenStandalone(id),
1224
+ getSlotIconNodes: () => void 0,
1225
+ onItemClick: () => {},
1226
+ onGroupToggle: (group) => {
1227
+ stateOwner.toggleGroupStandalone(group.id);
1228
+ }
1229
+ };
1230
+ }
1231
+ _renderSingleRow(item, ctx) {
1232
+ if (item.type === "divider") return renderMenuDivider(item, ctx);
1233
+ if (item.type === "subheader") return renderMenuSubheader(item, ctx);
1234
+ if (item.type === "group") return renderMenuGroup(item, ctx);
1235
+ return renderMenuItemRow(item, ctx);
1236
+ }
1237
+ _seedDefaultOpenIntoStandalone(item) {
1238
+ if (this._parent) return;
1239
+ if (!isGroup(item) || !item.defaultOpen) return;
1240
+ (this._rootList ?? this).seedStandaloneOpen(item.id);
1241
+ }
1242
+ render() {
1243
+ if (this._isDeclarativeMode()) {
1244
+ const ctx = this._buildContext(true);
1245
+ const item = this._buildDeclarativeItem();
1246
+ this._seedDefaultOpenIntoStandalone(item);
1247
+ const row = this._renderSingleRow(item, ctx);
1248
+ if (this._parentList) return html`${row}`;
1249
+ return html`<ul class=${ctx.cssClass?.list ? `mono-menu-list ${ctx.cssClass.list}` : "mono-menu-list"} mono-list>${row}</ul>`;
1250
+ }
1251
+ const ctx = this._buildContext(false);
1252
+ const effectiveItems = this._getEffectiveItems();
1253
+ const listClass = ctx.cssClass?.list ? `mono-menu-list ${ctx.cssClass.list}` : "mono-menu-list";
1254
+ if (this.type === "group") {
1255
+ const groupItems = effectiveItems.filter((it) => isGroup(it));
1256
+ if (!this._parent) {
1257
+ for (const group of groupItems) if (group.defaultOpen) (this._rootList ?? this).seedStandaloneOpen(group.id);
1258
+ }
1259
+ return html`<ul class=${listClass} mono-list>${renderMenuGroupsOnly(groupItems, ctx)}</ul>`;
1260
+ }
1261
+ if (!this._parent) {
1262
+ const owner = this._rootList ?? this;
1263
+ for (const id of collectDefaultOpenGroups(effectiveItems)) owner.seedStandaloneOpen(id);
1264
+ }
1265
+ return html`<ul class=${listClass} mono-list>${renderMenuList(effectiveItems, ctx)}</ul>`;
1266
+ }
1267
+ };
1268
+ __decorate([property({
1269
+ attribute: false,
1270
+ hasChanged: arrayHasChanged
1271
+ })], MonoMenuList.prototype, "items", void 0);
1272
+ __decorate([property({ attribute: false })], MonoMenuList.prototype, "item", void 0);
1273
+ __decorate([property({ type: String })], MonoMenuList.prototype, "type", void 0);
1274
+ __decorate([property({ attribute: "item-type" })], MonoMenuList.prototype, "itemType", void 0);
1275
+ __decorate([property({ type: String })], MonoMenuList.prototype, "title", void 0);
1276
+ __decorate([property({ type: String })], MonoMenuList.prototype, "subtitle", void 0);
1277
+ __decorate([property({ type: String })], MonoMenuList.prototype, "icon", void 0);
1278
+ __decorate([property({ attribute: "append-icon" })], MonoMenuList.prototype, "appendIcon", void 0);
1279
+ __decorate([property()], MonoMenuList.prototype, "badge", void 0);
1280
+ __decorate([property({ attribute: "badge-color" })], MonoMenuList.prototype, "badgeColor", void 0);
1281
+ __decorate([property({ type: String })], MonoMenuList.prototype, "href", void 0);
1282
+ __decorate([property({ type: Boolean })], MonoMenuList.prototype, "disabled", void 0);
1283
+ __decorate([property({
1284
+ attribute: "default-open",
1285
+ type: Boolean
1286
+ })], MonoMenuList.prototype, "defaultOpen", void 0);
1287
+ MonoMenuList = __decorate([customElement("mono-menu-list")], MonoMenuList);
1288
+ //#endregion
1289
+ export { MonoMenu, MonoMenuList, collectDefaultOpenGroups, findActivePath, findItem, generateMenuRootClasses, getMenuAlias, isDivider, isGroup, isIconifyClass, isItem, isSubheader, renderMenuAppend, renderMenuBadge, renderMenuDivider, renderMenuGroup, renderMenuGroupsOnly, renderMenuIcon, renderMenuItemRow, renderMenuList, renderMenuSubheader, validateMenuProps };