@moni-labs/moni-ui 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/README.md +52 -194
  2. package/custom-elements.json +1636 -350
  3. package/dist/actions/index.d.ts +6 -0
  4. package/dist/actions/index.d.ts.map +1 -1
  5. package/dist/actions/index.js +6 -0
  6. package/dist/components/_base/field-styles.d.ts +51 -16
  7. package/dist/components/_base/field-styles.d.ts.map +1 -1
  8. package/dist/components/_base/field-styles.js +164 -36
  9. package/dist/components/_base/index.d.ts +25 -0
  10. package/dist/components/_base/index.d.ts.map +1 -1
  11. package/dist/components/_base/index.js +25 -0
  12. package/dist/components/_base/interaction-styles.d.ts +39 -12
  13. package/dist/components/_base/interaction-styles.d.ts.map +1 -1
  14. package/dist/components/_base/interaction-styles.js +85 -33
  15. package/dist/components/_base/moni-element.d.ts +43 -8
  16. package/dist/components/_base/moni-element.d.ts.map +1 -1
  17. package/dist/components/_base/moni-element.js +43 -8
  18. package/dist/components/_base/shared-styles.d.ts +41 -17
  19. package/dist/components/_base/shared-styles.d.ts.map +1 -1
  20. package/dist/components/_base/shared-styles.js +113 -21
  21. package/dist/components/index.d.ts +6 -0
  22. package/dist/components/index.d.ts.map +1 -1
  23. package/dist/components/index.js +6 -0
  24. package/dist/components/loading-shapes.d.ts +6 -0
  25. package/dist/components/loading-shapes.d.ts.map +1 -1
  26. package/dist/components/loading-shapes.js +6 -0
  27. package/dist/components/moni-app-bar.d.ts +128 -33
  28. package/dist/components/moni-app-bar.d.ts.map +1 -1
  29. package/dist/components/moni-app-bar.js +121 -26
  30. package/dist/components/moni-badge.d.ts +122 -14
  31. package/dist/components/moni-badge.d.ts.map +1 -1
  32. package/dist/components/moni-badge.js +122 -14
  33. package/dist/components/moni-bottom-sheet.d.ts +120 -15
  34. package/dist/components/moni-bottom-sheet.d.ts.map +1 -1
  35. package/dist/components/moni-bottom-sheet.js +116 -12
  36. package/dist/components/moni-button-group.d.ts +53 -27
  37. package/dist/components/moni-button-group.d.ts.map +1 -1
  38. package/dist/components/moni-button-group.js +49 -23
  39. package/dist/components/moni-button-segment.d.ts +28 -8
  40. package/dist/components/moni-button-segment.d.ts.map +1 -1
  41. package/dist/components/moni-button-segment.js +27 -7
  42. package/dist/components/moni-button.d.ts +51 -32
  43. package/dist/components/moni-button.d.ts.map +1 -1
  44. package/dist/components/moni-button.js +50 -31
  45. package/dist/components/moni-card.d.ts +91 -31
  46. package/dist/components/moni-card.d.ts.map +1 -1
  47. package/dist/components/moni-card.js +86 -26
  48. package/dist/components/moni-carousel.d.ts +67 -17
  49. package/dist/components/moni-carousel.d.ts.map +1 -1
  50. package/dist/components/moni-carousel.js +59 -16
  51. package/dist/components/moni-checkbox.d.ts +122 -17
  52. package/dist/components/moni-checkbox.d.ts.map +1 -1
  53. package/dist/components/moni-checkbox.js +118 -14
  54. package/dist/components/moni-chip.d.ts +56 -30
  55. package/dist/components/moni-chip.d.ts.map +1 -1
  56. package/dist/components/moni-chip.js +51 -25
  57. package/dist/components/moni-color-field.d.ts +44 -6
  58. package/dist/components/moni-color-field.d.ts.map +1 -1
  59. package/dist/components/moni-color-field.js +43 -5
  60. package/dist/components/moni-context-menu.d.ts +44 -22
  61. package/dist/components/moni-context-menu.d.ts.map +1 -1
  62. package/dist/components/moni-context-menu.js +43 -21
  63. package/dist/components/moni-dialog.d.ts +107 -15
  64. package/dist/components/moni-dialog.d.ts.map +1 -1
  65. package/dist/components/moni-dialog.js +105 -14
  66. package/dist/components/moni-divider.d.ts +50 -15
  67. package/dist/components/moni-divider.d.ts.map +1 -1
  68. package/dist/components/moni-divider.js +49 -14
  69. package/dist/components/moni-expansion.d.ts +44 -8
  70. package/dist/components/moni-expansion.d.ts.map +1 -1
  71. package/dist/components/moni-expansion.js +43 -7
  72. package/dist/components/moni-fab-menu.d.ts +39 -20
  73. package/dist/components/moni-fab-menu.d.ts.map +1 -1
  74. package/dist/components/moni-fab-menu.js +38 -19
  75. package/dist/components/moni-fab.d.ts +49 -23
  76. package/dist/components/moni-fab.d.ts.map +1 -1
  77. package/dist/components/moni-fab.js +46 -20
  78. package/dist/components/moni-file-field.d.ts +54 -14
  79. package/dist/components/moni-file-field.d.ts.map +1 -1
  80. package/dist/components/moni-file-field.js +53 -13
  81. package/dist/components/moni-icon.d.ts +78 -11
  82. package/dist/components/moni-icon.d.ts.map +1 -1
  83. package/dist/components/moni-icon.js +77 -10
  84. package/dist/components/moni-list-item.d.ts +61 -30
  85. package/dist/components/moni-list-item.d.ts.map +1 -1
  86. package/dist/components/moni-list-item.js +55 -24
  87. package/dist/components/moni-list.d.ts +37 -13
  88. package/dist/components/moni-list.d.ts.map +1 -1
  89. package/dist/components/moni-list.js +36 -12
  90. package/dist/components/moni-loading-indicator.d.ts +38 -11
  91. package/dist/components/moni-loading-indicator.d.ts.map +1 -1
  92. package/dist/components/moni-loading-indicator.js +37 -10
  93. package/dist/components/moni-menu-item.d.ts +31 -8
  94. package/dist/components/moni-menu-item.d.ts.map +1 -1
  95. package/dist/components/moni-menu-item.js +30 -7
  96. package/dist/components/moni-menu.d.ts +58 -33
  97. package/dist/components/moni-menu.d.ts.map +1 -1
  98. package/dist/components/moni-menu.js +51 -26
  99. package/dist/components/moni-morph-modal.d.ts +7 -1
  100. package/dist/components/moni-morph-modal.d.ts.map +1 -1
  101. package/dist/components/moni-morph-modal.js +46 -24
  102. package/dist/components/moni-nav-item.d.ts +50 -10
  103. package/dist/components/moni-nav-item.d.ts.map +1 -1
  104. package/dist/components/moni-nav-item.js +48 -8
  105. package/dist/components/moni-nav.d.ts +57 -22
  106. package/dist/components/moni-nav.d.ts.map +1 -1
  107. package/dist/components/moni-nav.js +53 -18
  108. package/dist/components/moni-progress.d.ts +108 -20
  109. package/dist/components/moni-progress.d.ts.map +1 -1
  110. package/dist/components/moni-progress.js +104 -16
  111. package/dist/components/moni-radio.d.ts +106 -14
  112. package/dist/components/moni-radio.d.ts.map +1 -1
  113. package/dist/components/moni-radio.js +104 -13
  114. package/dist/components/moni-ripple.d.ts +121 -10
  115. package/dist/components/moni-ripple.d.ts.map +1 -1
  116. package/dist/components/moni-ripple.js +120 -9
  117. package/dist/components/moni-segmented-button.d.ts +31 -11
  118. package/dist/components/moni-segmented-button.d.ts.map +1 -1
  119. package/dist/components/moni-segmented-button.js +30 -10
  120. package/dist/components/moni-select-option.d.ts +43 -9
  121. package/dist/components/moni-select-option.d.ts.map +1 -1
  122. package/dist/components/moni-select-option.js +41 -7
  123. package/dist/components/moni-select.d.ts +59 -2
  124. package/dist/components/moni-select.d.ts.map +1 -1
  125. package/dist/components/moni-select.js +58 -1
  126. package/dist/components/moni-shape.d.ts +1 -1
  127. package/dist/components/moni-side-sheet.d.ts +56 -19
  128. package/dist/components/moni-side-sheet.d.ts.map +1 -1
  129. package/dist/components/moni-side-sheet.js +53 -16
  130. package/dist/components/moni-slider.d.ts +56 -25
  131. package/dist/components/moni-slider.d.ts.map +1 -1
  132. package/dist/components/moni-slider.js +55 -24
  133. package/dist/components/moni-snackbar.d.ts +86 -17
  134. package/dist/components/moni-snackbar.d.ts.map +1 -1
  135. package/dist/components/moni-snackbar.js +85 -16
  136. package/dist/components/moni-split-button.d.ts +38 -9
  137. package/dist/components/moni-split-button.d.ts.map +1 -1
  138. package/dist/components/moni-split-button.js +37 -8
  139. package/dist/components/moni-step.d.ts +42 -9
  140. package/dist/components/moni-step.d.ts.map +1 -1
  141. package/dist/components/moni-step.js +41 -8
  142. package/dist/components/moni-stepper.d.ts +43 -6
  143. package/dist/components/moni-stepper.d.ts.map +1 -1
  144. package/dist/components/moni-stepper.js +42 -5
  145. package/dist/components/moni-switch.d.ts +103 -16
  146. package/dist/components/moni-switch.d.ts.map +1 -1
  147. package/dist/components/moni-switch.js +99 -13
  148. package/dist/components/moni-tab.d.ts +35 -8
  149. package/dist/components/moni-tab.d.ts.map +1 -1
  150. package/dist/components/moni-tab.js +34 -7
  151. package/dist/components/moni-tabs.d.ts +51 -13
  152. package/dist/components/moni-tabs.d.ts.map +1 -1
  153. package/dist/components/moni-tabs.js +48 -10
  154. package/dist/components/moni-text-field.d.ts +55 -10
  155. package/dist/components/moni-text-field.d.ts.map +1 -1
  156. package/dist/components/moni-text-field.js +54 -9
  157. package/dist/components/moni-textarea.d.ts +51 -21
  158. package/dist/components/moni-textarea.d.ts.map +1 -1
  159. package/dist/components/moni-textarea.js +48 -18
  160. package/dist/components/moni-time-picker.d.ts +41 -11
  161. package/dist/components/moni-time-picker.d.ts.map +1 -1
  162. package/dist/components/moni-time-picker.js +40 -10
  163. package/dist/components/moni-toolbar.d.ts +43 -15
  164. package/dist/components/moni-toolbar.d.ts.map +1 -1
  165. package/dist/components/moni-toolbar.js +42 -14
  166. package/dist/components/moni-tooltip.d.ts +55 -25
  167. package/dist/components/moni-tooltip.d.ts.map +1 -1
  168. package/dist/components/moni-tooltip.js +54 -24
  169. package/dist/components/moni-typography.d.ts +43 -18
  170. package/dist/components/moni-typography.d.ts.map +1 -1
  171. package/dist/components/moni-typography.js +42 -17
  172. package/dist/index.d.ts +47 -0
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.js +59 -2
  175. package/dist/styles/tailwind.css +67 -0
  176. package/dist/styles/tokens.css +111 -99
  177. package/dist/utils/color.d.ts +181 -2
  178. package/dist/utils/color.d.ts.map +1 -1
  179. package/dist/utils/color.js +182 -4
  180. package/dist/utils/theme.svelte.d.ts +305 -2
  181. package/dist/utils/theme.svelte.d.ts.map +1 -1
  182. package/dist/utils/theme.svelte.js +331 -2
  183. package/dist/web-components.d.ts +28 -0
  184. package/dist/web-components.d.ts.map +1 -1
  185. package/dist/web-components.js +29 -2
  186. package/package.json +1 -1
  187. package/src/actions/index.ts +7 -0
  188. package/src/components/_base/field-styles.ts +165 -37
  189. package/src/components/_base/index.ts +27 -0
  190. package/src/components/_base/interaction-styles.ts +86 -33
  191. package/src/components/_base/moni-element.ts +44 -8
  192. package/src/components/_base/shared-styles.ts +114 -21
  193. package/src/components/index.ts +7 -0
  194. package/src/components/loading-shapes.ts +7 -0
  195. package/src/components/moni-app-bar.ts +127 -26
  196. package/src/components/moni-badge.ts +128 -14
  197. package/src/components/moni-bottom-sheet.ts +125 -13
  198. package/src/components/moni-button-group.ts +50 -23
  199. package/src/components/moni-button-segment.ts +28 -7
  200. package/src/components/moni-button.ts +51 -31
  201. package/src/components/moni-card.ts +90 -26
  202. package/src/components/moni-carousel.ts +67 -16
  203. package/src/components/moni-checkbox.ts +125 -14
  204. package/src/components/moni-chip.ts +52 -25
  205. package/src/components/moni-color-field.ts +44 -5
  206. package/src/components/moni-context-menu.ts +44 -21
  207. package/src/components/moni-dialog.ts +111 -14
  208. package/src/components/moni-divider.ts +50 -14
  209. package/src/components/moni-expansion.ts +44 -7
  210. package/src/components/moni-fab-menu.ts +39 -19
  211. package/src/components/moni-fab.ts +47 -20
  212. package/src/components/moni-file-field.ts +54 -13
  213. package/src/components/moni-icon.ts +80 -10
  214. package/src/components/moni-list-item.ts +56 -24
  215. package/src/components/moni-list.ts +37 -12
  216. package/src/components/moni-loading-indicator.ts +38 -10
  217. package/src/components/moni-menu-item.ts +31 -7
  218. package/src/components/moni-menu.ts +52 -26
  219. package/src/components/moni-morph-modal.ts +58 -24
  220. package/src/components/moni-nav-item.ts +49 -8
  221. package/src/components/moni-nav.ts +54 -18
  222. package/src/components/moni-progress.ts +109 -16
  223. package/src/components/moni-radio.ts +111 -13
  224. package/src/components/moni-ripple.ts +126 -9
  225. package/src/components/moni-segmented-button.ts +31 -10
  226. package/src/components/moni-select-option.ts +42 -7
  227. package/src/components/moni-select.ts +79 -1
  228. package/src/components/moni-side-sheet.ts +54 -16
  229. package/src/components/moni-slider.ts +56 -24
  230. package/src/components/moni-snackbar.ts +90 -16
  231. package/src/components/moni-split-button.ts +38 -8
  232. package/src/components/moni-step.ts +42 -8
  233. package/src/components/moni-stepper.ts +43 -5
  234. package/src/components/moni-switch.ts +106 -13
  235. package/src/components/moni-tab.ts +35 -7
  236. package/src/components/moni-tabs.ts +49 -10
  237. package/src/components/moni-text-field.ts +55 -9
  238. package/src/components/moni-textarea.ts +49 -18
  239. package/src/components/moni-time-picker.ts +41 -10
  240. package/src/components/moni-toolbar.ts +43 -14
  241. package/src/components/moni-tooltip.ts +55 -24
  242. package/src/components/moni-typography.ts +43 -17
  243. package/src/index.ts +67 -3
  244. package/src/styles/tailwind.css +67 -0
  245. package/src/styles/tokens.css +111 -99
  246. package/src/types/svelte-runes.d.ts +64 -2
  247. package/src/utils/color.ts +286 -5
  248. package/src/utils/theme.svelte.ts +411 -2
  249. package/src/web-components.ts +31 -2
  250. package/dist/assets/shapes/arch.svg +0 -1
  251. package/dist/assets/shapes/arrow.svg +0 -1
  252. package/dist/assets/shapes/boom.svg +0 -1
  253. package/dist/assets/shapes/burst.svg +0 -1
  254. package/dist/assets/shapes/circle.svg +0 -1
  255. package/dist/assets/shapes/clamshell.svg +0 -1
  256. package/dist/assets/shapes/diamond.svg +0 -1
  257. package/dist/assets/shapes/fan.svg +0 -1
  258. package/dist/assets/shapes/flower.svg +0 -1
  259. package/dist/assets/shapes/gem.svg +0 -1
  260. package/dist/assets/shapes/ghost-ish.svg +0 -1
  261. package/dist/assets/shapes/heart.svg +0 -1
  262. package/dist/assets/shapes/leaf-clover4.svg +0 -1
  263. package/dist/assets/shapes/leaf-clover8.svg +0 -1
  264. package/dist/assets/shapes/loading-indicator.svg +0 -1
  265. package/dist/assets/shapes/oval.svg +0 -1
  266. package/dist/assets/shapes/pentagon.svg +0 -1
  267. package/dist/assets/shapes/pill.svg +0 -1
  268. package/dist/assets/shapes/pixel-circle.svg +0 -1
  269. package/dist/assets/shapes/pixel-triangle.svg +0 -1
  270. package/dist/assets/shapes/puffy-diamond.svg +0 -1
  271. package/dist/assets/shapes/puffy.svg +0 -1
  272. package/dist/assets/shapes/semicircle.svg +0 -1
  273. package/dist/assets/shapes/sided-cookie12.svg +0 -1
  274. package/dist/assets/shapes/sided-cookie4.svg +0 -1
  275. package/dist/assets/shapes/sided-cookie6.svg +0 -1
  276. package/dist/assets/shapes/sided-cookie7.svg +0 -1
  277. package/dist/assets/shapes/sided-cookie9.svg +0 -1
  278. package/dist/assets/shapes/slanted.svg +0 -1
  279. package/dist/assets/shapes/soft-boom.svg +0 -1
  280. package/dist/assets/shapes/soft-burst.svg +0 -1
  281. package/dist/assets/shapes/square.svg +0 -1
  282. package/dist/assets/shapes/sunny.svg +0 -1
  283. package/dist/assets/shapes/triangle.svg +0 -1
  284. package/dist/assets/shapes/very-sunny.svg +0 -1
  285. package/dist/assets/shapes/wavy-circle.svg +0 -1
  286. package/dist/assets/shapes/wavy.svg +0 -1
  287. package/src/assets/shapes/arch.svg +0 -1
  288. package/src/assets/shapes/arrow.svg +0 -1
  289. package/src/assets/shapes/boom.svg +0 -1
  290. package/src/assets/shapes/burst.svg +0 -1
  291. package/src/assets/shapes/circle.svg +0 -1
  292. package/src/assets/shapes/clamshell.svg +0 -1
  293. package/src/assets/shapes/diamond.svg +0 -1
  294. package/src/assets/shapes/fan.svg +0 -1
  295. package/src/assets/shapes/flower.svg +0 -1
  296. package/src/assets/shapes/gem.svg +0 -1
  297. package/src/assets/shapes/ghost-ish.svg +0 -1
  298. package/src/assets/shapes/heart.svg +0 -1
  299. package/src/assets/shapes/leaf-clover4.svg +0 -1
  300. package/src/assets/shapes/leaf-clover8.svg +0 -1
  301. package/src/assets/shapes/loading-indicator.svg +0 -1
  302. package/src/assets/shapes/oval.svg +0 -1
  303. package/src/assets/shapes/pentagon.svg +0 -1
  304. package/src/assets/shapes/pill.svg +0 -1
  305. package/src/assets/shapes/pixel-circle.svg +0 -1
  306. package/src/assets/shapes/pixel-triangle.svg +0 -1
  307. package/src/assets/shapes/puffy-diamond.svg +0 -1
  308. package/src/assets/shapes/puffy.svg +0 -1
  309. package/src/assets/shapes/semicircle.svg +0 -1
  310. package/src/assets/shapes/sided-cookie12.svg +0 -1
  311. package/src/assets/shapes/sided-cookie4.svg +0 -1
  312. package/src/assets/shapes/sided-cookie6.svg +0 -1
  313. package/src/assets/shapes/sided-cookie7.svg +0 -1
  314. package/src/assets/shapes/sided-cookie9.svg +0 -1
  315. package/src/assets/shapes/slanted.svg +0 -1
  316. package/src/assets/shapes/soft-boom.svg +0 -1
  317. package/src/assets/shapes/soft-burst.svg +0 -1
  318. package/src/assets/shapes/square.svg +0 -1
  319. package/src/assets/shapes/sunny.svg +0 -1
  320. package/src/assets/shapes/triangle.svg +0 -1
  321. package/src/assets/shapes/very-sunny.svg +0 -1
  322. package/src/assets/shapes/wavy-circle.svg +0 -1
  323. package/src/assets/shapes/wavy.svg +0 -1
@@ -1,27 +1,97 @@
1
+ /**
2
+ * @file components/moni-icon.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { html, css } from 'lit';
2
9
  import { customElement, property } from 'lit/decorators.js';
3
10
  import { MoniElement, sharedStyles } from './_base/index.js';
4
11
 
5
12
  /**
6
- * Visual-only icon.
13
+ * Visual-only icon component using Material Symbols variable font.
14
+ *
15
+ * Renders a Material Symbols glyph by its ligature name. The icon font
16
+ * must be loaded globally by the host document — it is not bundled with
17
+ * the component. Add the font via the `@moni-labs/moni-ui/styles` stylesheet
18
+ * or by including the Google Fonts CDN link.
19
+ *
20
+ * **Font rendering:**
21
+ * The icon uses `font-family: var(--font-icon)` which defaults to
22
+ * `'Material Symbols Rounded'`. Override `--font-icon-override` in the
23
+ * host document's `:root` to switch to a different icon set variant
24
+ * (e.g. `'Material Symbols Outlined'` or `'Material Symbols Sharp'`).
25
+ *
26
+ * **Variable font settings:**
27
+ * The default `font-variation-settings` is `'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24`.
28
+ * Setting the `filled` attribute switches to `'FILL' 1` for the solid icon variant.
7
29
  *
8
- * Renders a Material Symbols glyph by name. The font must be loaded
9
- * globally in the host document (see `@moni-labs/moni-ui/styles`).
30
+ * **Color inheritance:**
31
+ * The icon always inherits color from its parent via `color: inherit`, making it
32
+ * automatically adapt to button variants, chip selected states, list item active
33
+ * states, and other color-context containers.
10
34
  *
11
- * Attributes:
12
- * - name: icon name from https://fonts.google.com/icons
13
- * - size: tiny | small | medium (default) | large | extra
14
- * - filled: present → switches to the filled variant (font-variation-settings)
35
+ * @example
36
+ * ```html
37
+ * <!-- Basic icon -->
38
+ * <moni-icon name="home"></moni-icon>
15
39
  *
16
- * Slots:
17
- * - default: fallback text if no name is given
18
- * - (also accepts slotted <svg> or <img> as override)
40
+ * <!-- Filled large icon -->
41
+ * <moni-icon name="favorite" size="large" filled></moni-icon>
42
+ *
43
+ * <!-- Custom SVG override via slot -->
44
+ * <moni-icon>
45
+ * <svg slot="default" viewBox="0 0 24 24">...</svg>
46
+ * </moni-icon>
47
+ * ```
48
+ *
49
+ * @slot default - Fallback content when `name` is empty. Accepts `<svg>` or `<img>`
50
+ * elements which are sized to 100% of the icon box.
51
+ *
52
+ * @cssproperty --font-icon-override - Overrides the icon font family at the
53
+ * document level. Set on `:root`.
19
54
  */
20
55
  @customElement('moni-icon')
21
56
  export class MoniIcon extends MoniElement {
57
+ /**
58
+ * Material Symbols ligature name for the icon to render.
59
+ *
60
+ * Use the name exactly as shown on https://fonts.google.com/icons
61
+ * (e.g. `'home'`, `'settings'`, `'arrow_forward'`).
62
+ * When empty, the default slot is rendered instead.
63
+ *
64
+ * @default ''
65
+ */
22
66
  @property({ reflect: true }) name = '';
67
+
68
+ /**
69
+ * Size of the icon bounding box.
70
+ *
71
+ * Maps to the `--_size` custom property:
72
+ * | Value | Size |
73
+ * |------------|----------|
74
+ * | `'tiny'` | 1rem |
75
+ * | `'small'` | 1.25rem |
76
+ * | `'medium'` | 1.5rem |
77
+ * | `'large'` | 1.75rem |
78
+ * | `'extra'` | 2rem |
79
+ *
80
+ * @default 'medium'
81
+ */
23
82
  @property({ reflect: true })
24
83
  size: 'tiny' | 'small' | 'medium' | 'large' | 'extra' = 'medium';
84
+
85
+ /**
86
+ * When `true`, switches to the filled variant of the icon by setting
87
+ * `font-variation-settings: 'FILL' 1`.
88
+ *
89
+ * This works only with variable icon fonts that include the `FILL` axis
90
+ * (all Material Symbols variants do). It has no effect if a different
91
+ * icon font is loaded that does not support `FILL`.
92
+ *
93
+ * @default false
94
+ */
25
95
  @property({ type: Boolean, reflect: true }) filled = false;
26
96
 
27
97
  static override styles = [
@@ -1,38 +1,70 @@
1
+ /**
2
+ * @file components/moni-list-item.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { html, css, nothing } from 'lit';
2
9
  import { customElement, property } from 'lit/decorators.js';
3
10
  import { MoniElement, sharedStyles } from './_base/index.js';
4
11
  import './moni-icon.js';
5
12
 
6
13
  /**
7
- * Material 3 List Item (`m3-docs/components/lists/specs.md`).
14
+ * Material Design 3 List Item component.
15
+ *
16
+ * A single row within a `<moni-list>`. List items display a headline and
17
+ * optional supporting text, metadata, icons, or avatars.
18
+ *
19
+ * **M3 spec reference:** `m3-docs/components/lists/specs.md`
20
+ *
21
+ * **Line configurations:**
22
+ * The `lines` attribute configures the layout and minimum height of the item:
23
+ * - `lines="1"` (default) — 56dp min height. Only the headline slot is shown.
24
+ * - `lines="2"` — 72dp min height. Shows headline and supporting text.
25
+ * - `lines="3"` — 88dp min height. Shows headline, supporting text, and meta text.
26
+ *
27
+ * **Interactive behavior:**
28
+ * By default, items render as `<button>` elements, gaining the M3 state layer
29
+ * (hover, focus, and press ripple effects).
30
+ * If the `href` attribute is provided, the item internally renders as an `<a>`
31
+ * element, allowing native link routing and interactions while preserving the
32
+ * list item styling.
33
+ *
34
+ * **Visual elements:**
35
+ * - `icon` (attribute) — Material Symbol name for the leading icon (24dp).
36
+ * - `avatar` (attribute) — URL for a leading circular image (40dp).
37
+ * - `trailing-icon` (attribute) — Material Symbol name for the trailing icon.
8
38
  *
9
- * One row in a `<moni-list>`. Supports up to 3 lines of text:
10
- * - line 1: headline (required).
11
- * - line 2: supporting text (optional).
12
- * - line 3: trailing meta text (optional).
39
+ * @example
40
+ * ```html
41
+ * <!-- 1-line item with icon -->
42
+ * <moni-list-item icon="inbox">
43
+ * Inbox
44
+ * </moni-list-item>
13
45
  *
14
- * Plus optional leading/trailing icons or avatars.
46
+ * <!-- 2-line item with avatar and trailing meta -->
47
+ * <moni-list-item lines="2" avatar="/user.jpg">
48
+ * Ali Connors
49
+ * <span slot="supporting">Brunch this weekend?</span>
50
+ * <span slot="trailing-meta">10 min</span>
51
+ * </moni-list-item>
15
52
  *
16
- * M3 measurements:
17
- * - Min height: 56dp (1-line), 72dp (2-line), 88dp (3-line).
18
- * - Horizontal padding: 16dp.
19
- * - Vertical padding: 8dp top/bottom (so 1-line is 56dp tall).
20
- * - Leading icon/avatar size: 24dp.
53
+ * <!-- Link item -->
54
+ * <moni-list-item href="/settings" icon="settings">
55
+ * Settings
56
+ * </moni-list-item>
57
+ * ```
21
58
  *
22
- * Attributes:
23
- * - lines: 1 (default) | 2 | 3
24
- * - icon: Material Symbols name (leading icon)
25
- * - avatar: URL for a leading image
26
- * - trailing-icon: Material Symbols name (trailing icon)
27
- * - active: present → background uses secondary-container
28
- * - disabled: present → opacity 38%, cursor not-allowed
29
- * - href: present → renders as <a>; otherwise <button>
59
+ * @slot default - Headline text (Line 1).
60
+ * @slot supporting - Supporting text (Line 2, requires `lines>=2`).
61
+ * @slot meta - Additional meta text (Line 3, requires `lines=3`).
62
+ * @slot trailing-meta - Small text displayed on the far right edge.
30
63
  *
31
- * Slots:
32
- * - default: headline (line 1)
33
- * - supporting:line 2 text
34
- * - meta: line 3 text
35
- * - trailing-meta: trailing small text (right side)
64
+ * @csspart item - The outer `<button>` or `<a>` container.
65
+ * @csspart leading-icon - Container for the leading icon/avatar.
66
+ * @csspart text - Container for the multi-line text block.
67
+ * @csspart trailing-icon - Container for the trailing icon.
36
68
  */
37
69
  @customElement('moni-list-item')
38
70
  export class MoniListItem extends MoniElement {
@@ -1,24 +1,49 @@
1
+ /**
2
+ * @file components/moni-list.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { html, css } from 'lit';
2
9
  import { customElement, property } from 'lit/decorators.js';
3
10
  import { MoniElement, sharedStyles } from './_base/index.js';
4
11
 
5
12
  /**
6
- * Material 3 List (`m3-docs/components/lists/specs.md`).
13
+ * Material Design 3 List component.
14
+ *
15
+ * Lists are continuous, vertical indexes of text or images. They are
16
+ * container elements that provide structural grouping and optional
17
+ * divider lines for `<moni-list-item>` children.
18
+ *
19
+ * **M3 spec reference:** `m3-docs/components/lists/specs.md`
20
+ *
21
+ * **Container role:**
22
+ * The list itself does not apply padding or margins to its children. Spacing
23
+ * and internal padding are controlled entirely by the `<moni-list-item>`
24
+ * elements themselves to ensure proper hit targets and alignment.
7
25
  *
8
- * A list is a continuous vertical index of text and images. The
9
- * container itself is purely structural (no padding); spacing and
10
- * dividers are controlled by `<moni-list-item>` children.
26
+ * **Variants:**
27
+ * - `default` (empty string) A clean, borderless list container.
28
+ * - `border` Adds a bottom border to the list and displays horizontal
29
+ * dividers (`outline-variant` color) between list items.
11
30
  *
12
- * Two visual variants:
13
- * - **default**: 8dp top/bottom padding between items (handled by items).
14
- * - **border**: dividers drawn between items.
31
+ * @example
32
+ * ```html
33
+ * <!-- Standard list -->
34
+ * <moni-list>
35
+ * <moni-list-item headline="Item 1"></moni-list-item>
36
+ * <moni-list-item headline="Item 2"></moni-list-item>
37
+ * </moni-list>
15
38
  *
16
- * Attributes:
17
- * - variant: '' (default) | border
18
- * - rounded: when set, items use a 4dp corner radius.
39
+ * <!-- List with dividers and rounded items -->
40
+ * <moni-list variant="border" rounded>
41
+ * <moni-list-item icon="inbox" headline="Inbox"></moni-list-item>
42
+ * <moni-list-item icon="send" headline="Sent"></moni-list-item>
43
+ * </moni-list>
44
+ * ```
19
45
  *
20
- * Slots:
21
- * - default: <moni-list-item> children.
46
+ * @slot default - `<moni-list-item>` elements.
22
47
  */
23
48
  @customElement('moni-list')
24
49
  export class MoniList extends MoniElement {
@@ -1,21 +1,49 @@
1
+ /**
2
+ * @file components/moni-loading-indicator.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { html, css, unsafeCSS } from 'lit';
2
9
  import { customElement, property, query } from 'lit/decorators.js';
3
10
  import { MoniElement, sharedStyles } from './_base/index.js';
4
11
  import { loadingIndicatorPolygons } from './loading-shapes.js';
5
12
 
6
13
  /**
7
- * Shape-shifting indeterminate loading indicator based on Material 3 Expressive spec.
14
+ * Material Design 3 Loading Indicator component.
15
+ *
16
+ * An indeterminate loading indicator that visually represents an unspecified
17
+ * wait time. Unlike standard circular spinners, this component uses a morphing
18
+ * polygon animation that shifts between shapes (circle, rounded square, etc.)
19
+ * in accordance with the high-fidelity M3 Expressive motion specifications.
20
+ *
21
+ * **Variants:**
22
+ * - `uncontained` (default) — A standalone morphing shape that inherits color
23
+ * from its text context (or defaults to `primary`).
24
+ * - `contained` — The morphing shape is placed inside a circular container
25
+ * with a distinct background color, useful for high-contrast loading states
26
+ * or overlaying imagery.
27
+ *
28
+ * **Animation & Accessibility:**
29
+ * The component manages its own SVG `<animate>` tags. The animation is
30
+ * automatically started/stopped via `connectedCallback`/`disconnectedCallback`
31
+ * to save CPU cycles when the element is off-screen. It applies standard ARIA
32
+ * roles (`role="progressbar"`) and value attributes to ensure screen readers
33
+ * identify it correctly as an indeterminate loading state.
34
+ *
35
+ * @example
36
+ * ```html
37
+ * <!-- Uncontained indicator -->
38
+ * <moni-loading-indicator></moni-loading-indicator>
8
39
  *
9
- * Attributes:
10
- * - variant: 'uncontained' (default) | 'contained'
40
+ * <!-- Contained indicator (default container is secondary-container) -->
41
+ * <moni-loading-indicator variant="contained"></moni-loading-indicator>
42
+ * ```
11
43
  *
12
- * CSS custom properties for customization:
13
- * - --moni-loading-indicator-size: Size of the active indicator (default: 2.375rem)
14
- * - --moni-loading-indicator-active-color: Active indicator color in uncontained mode (default: var(--primary))
15
- * - --moni-loading-indicator-contained-active-color: Active indicator color in contained mode (default: var(--on-primary-container))
16
- * - --moni-loading-indicator-contained-container-color: Background color of container in contained mode (default: var(--secondary-container))
17
- * - --moni-loading-indicator-container-shape: Border radius of container in contained mode (default: 9999px)
18
- * - --moni-loading-indicator-container-size: Container size (default: 3rem)
44
+ * @csspart container - The outer `.container` wrapper.
45
+ * @csspart svg - The inner `<svg>` element.
46
+ * @csspart shape - The `<path>` element that morphs.
19
47
  */
20
48
  @customElement('moni-loading-indicator')
21
49
  export class MoniLoadingIndicator extends MoniElement {
@@ -1,17 +1,41 @@
1
+ /**
2
+ * @file components/moni-menu-item.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { html, css } from 'lit';
2
9
  import { customElement, property } from 'lit/decorators.js';
3
10
  import { MoniElement, sharedStyles } from './_base/index.js';
4
11
  import './moni-icon.js';
5
12
 
6
13
  /**
7
- * Visual-only menu item. Renders an `<li>` styled with the BeerCSS
8
- * `menu > li` rule.
14
+ * Material Design 3 Menu Item component.
15
+ *
16
+ * A single interactive item within a `<moni-menu>` or `<moni-context-menu>`.
17
+ * It provides standard M3 menu item styling, hover states, and optional
18
+ * leading icons.
19
+ *
20
+ * **M3 spec reference:** `m3-docs/components/menus/specs.md`
21
+ *
22
+ * **Interaction states:**
23
+ * - Hover: applies an opacity layer.
24
+ * - Active (`active=true`): applies a `tertiary-container` background highlight,
25
+ * useful for indicating the currently selected option in a list.
26
+ * - Disabled (`disabled=true`): reduces opacity and disables pointer events.
27
+ *
28
+ * @example
29
+ * ```html
30
+ * <moni-menu-item icon="edit">Edit text</moni-menu-item>
31
+ * <moni-menu-item icon="content_copy" disabled>Copy</moni-menu-item>
32
+ * <moni-menu-item active>Currently selected</moni-menu-item>
33
+ * ```
34
+ *
35
+ * @slot default - The text label for the menu item.
9
36
  *
10
- * Attributes:
11
- * - active: present tertiary-container highlight
12
- * - disabled: present
13
- * - icon: Material Symbols name
14
- * - label: item text
37
+ * @csspart item - The outer `<li>` element.
38
+ * @csspart icon - The container for the leading icon.
15
39
  */
16
40
  @customElement('moni-menu-item')
17
41
  export class MoniMenuItem extends MoniElement {
@@ -1,40 +1,66 @@
1
+ /**
2
+ * @file components/moni-menu.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { html, css } from 'lit';
2
9
  import { customElement, property, query, state } from 'lit/decorators.js';
3
10
  import { MoniElement, sharedStyles } from './_base/index.js';
4
11
 
5
12
  /**
6
- * Menu that faithfully ports BeerCSS's `menu` styles.
13
+ * Material Design 3 Menu component.
14
+ *
15
+ * Menus display a list of choices on a temporary surface. They appear when
16
+ * users interact with a button, action, or other control.
17
+ *
18
+ * **M3 spec reference:** `m3-docs/components/menus/guidelines.md`
19
+ *
20
+ * **Positioning architecture:**
21
+ * The menu uses `position: absolute` relative to its nearest positioned
22
+ * ancestor. The component's `:host` uses `display: contents`, meaning the
23
+ * inner `<menu>` element directly participates in the consumer's layout context.
24
+ * **Crucial:** The consumer must apply `position: relative` to the wrapper
25
+ * element that contains both the trigger and the `<moni-menu>`.
26
+ *
27
+ * **Auto-flip positioning:**
28
+ * Per M3 guidelines, menus should flip to the opposite side of the anchor
29
+ * if they overflow the viewport.
30
+ * - **Modern browsers (Chrome/Edge 125+, Safari 18+):** Uses CSS anchor
31
+ * positioning and `@position-try-fallback` natively when `flip=true`.
32
+ * - **Fallback:** A JavaScript polyfill measures the menu after it opens. If
33
+ * it overflows the requested `placement`, it sets an internal state to flip
34
+ * the placement classes.
7
35
  *
8
- * BeerCSS uses a plain `<menu>` with class `.active` toggled by JS —
9
- * NO Popover API. The menu positions itself as `position: absolute`
10
- * relative to the nearest positioned ancestor.
36
+ * **State management:**
37
+ * The `active` attribute controls visibility. Consumers must listen to trigger
38
+ * events (like `click`) and toggle the `active` property.
11
39
  *
12
- * Shadow DOM note: we keep :host as `display: contents` so the inner
13
- * `<menu>` can position relative to the consumer's layout context.
14
- * The consumer must have `position: relative` on the trigger's wrapper.
40
+ * @example
41
+ * ```html
42
+ * <!-- Wrapper must have position: relative -->
43
+ * <div style="position: relative; display: inline-block;">
44
+ * <moni-button id="menu-trigger">Open Menu</moni-button>
15
45
  *
16
- * **M3 spec** (`m3-docs/components/menus/guidelines.md`): menus should
17
- * auto-flip to the opposite side when there isn't enough viewport space
18
- * in the requested placement.
46
+ * <moni-menu placement="bottom" flip id="my-menu">
47
+ * <moni-menu-item icon="edit">Edit</moni-menu-item>
48
+ * <moni-menu-item icon="content_copy">Copy</moni-menu-item>
49
+ * <moni-divider></moni-divider>
50
+ * <moni-menu-item icon="delete">Delete</moni-menu-item>
51
+ * </moni-menu>
52
+ * </div>
19
53
  *
20
- * **Flip implementation** (P4.3):
21
- * - Modern browsers (Chrome 125+, Edge 125+, Safari 18+): uses CSS
22
- * `@position-try-fallback` (Baseline 2024) when `flip` is set.
23
- * - Older browsers (Firefox, Safari < 18): JS polyfill. After the menu
24
- * becomes active, we measure the inner `<menu>` rect; if it overflows
25
- * the viewport on the requested side, we set `_resolvedPlacement`
26
- * to the opposite side and the CSS picks up the change.
54
+ * <script>
55
+ * const btn = document.getElementById('menu-trigger');
56
+ * const menu = document.getElementById('my-menu');
57
+ * btn.addEventListener('click', () => menu.active = !menu.active);
58
+ * </script>
59
+ * ```
27
60
  *
28
- * Attributes:
29
- * - placement: bottom (default) | top | left | right | min | max
30
- * - no-wrap: present
31
- * - space: no-space | space | small-space | medium-space | large-space | extra-space
32
- * - active: present → menu is visible
33
- * - flip: present → enable auto-flip when there is no viewport space
34
- * (works on all browsers; CSS-native when supported)
61
+ * @slot default - `<moni-menu-item>`, `<moni-divider>`, or raw `<li>` elements.
35
62
  *
36
- * Slots:
37
- * - default: menu items (moni-menu-item or li elements)
63
+ * @csspart menu - The inner `<menu>` container.
38
64
  */
39
65
  @customElement('moni-menu')
40
66
  export class MoniMenu extends MoniElement {
@@ -1,3 +1,10 @@
1
+ /**
2
+ * @file components/moni-morph-modal.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { html, css } from 'lit';
2
9
  import { customElement, property, query, state } from 'lit/decorators.js';
3
10
  import { MoniElement, sharedStyles } from './_base/index.js';
@@ -36,6 +43,11 @@ type Placement =
36
43
  | 'viewport-bottom-left'
37
44
  | 'viewport-bottom-right';
38
45
 
46
+ /**
47
+ * Internal coordinate and styling state of the morph target before animation.
48
+ *
49
+ * @internal
50
+ */
39
51
  interface TargetState {
40
52
  rect: DOMRect;
41
53
  backgroundColor: string;
@@ -43,40 +55,62 @@ interface TargetState {
43
55
  borderRadius: string;
44
56
  }
45
57
 
58
+ /**
59
+ * References to the internal icon and text elements animated during the morph.
60
+ *
61
+ * @internal
62
+ */
46
63
  interface MorphElements {
47
64
  text: HTMLElement | null;
48
65
  icon: HTMLElement | null;
49
66
  }
50
67
 
51
68
  /**
52
- * Morph-modal: abre un panel Material Design 3 a partir de cualquier elemento
53
- * del DOM usando una animación FLIP (First / Last / Invert / Play) con GSAP.
69
+ * Material Design 3 Morph Modal component.
70
+ *
71
+ * A highly interactive dialog that uses GSAP FLIP (First, Last, Invert, Play)
72
+ * animations to seamlessly "morph" any clicked element on the page into a full
73
+ * modal surface, and morph it back when closed.
74
+ *
75
+ * **Motion choreography:**
76
+ * This component implements the complex M3 container transform pattern. When
77
+ * triggered, the source element visually expands into the modal. The modal's
78
+ * background color, border radius, and typography fade and cross-dissolve
79
+ * perfectly with the origin element.
80
+ *
81
+ * **Triggering mechanism:**
82
+ * Consumers must provide the `triggerEvent` property containing the original
83
+ * pointer/click `Event` that initiated the open action. The component extracts
84
+ * the `event.target` (or uses `clientX/Y` as a fallback) to determine the exact
85
+ * origin coordinates for the GSAP FLIP animation.
54
86
  *
55
- * El elemento disparador (`target`) no se modifica estructuralmente; solo se
56
- * lee su rectángulo y estilos computados para hacer coincidir el punto inicial
57
- * de la morph-animation. El contenido del panel se declara dentro del propio
58
- * componente, de forma recursiva: dentro de un `<moni-morph-modal>` abierto se
59
- * puede declarar otro `<moni-morph-modal>` apuntando a un botón interior.
87
+ * **Dialog behavior:**
88
+ * Internally, it uses the native `<dialog>` element. It traps focus, supports
89
+ * `Escape` to close, and handles scrim/backdrop clicks (which trigger the
90
+ * reverse morph animation before actually closing the native dialog).
60
91
  *
61
- * Attributes:
62
- * - target: selector CSS del elemento disparador.
63
- * - open: estado abierto/cerrado (reflejado).
64
- * - modal: si se muestra fondo oscuro (scrim).
65
- * - placement: posición final del panel expandido.
66
- * - expanded-width: ancho del panel (px, rem, %, vw).
67
- * - expanded-height: alto del panel (px, rem, %, vh).
68
- * - close-on-click-outside: cierra al clicar fuera.
69
- * - close-on-esc: cierra con Escape.
70
- * - show-close-button: muestra una “X” en el header.
71
- * - morph-label: anima el label/icono del target hacia el header.
72
- * - morph-label-selector: selector dentro del target para targets arbitrarios.
92
+ * @example
93
+ * ```html
94
+ * <moni-morph-modal id="myModal" title="Details">
95
+ * <p>This modal morphed from the button you just clicked.</p>
96
+ * </moni-morph-modal>
73
97
  *
74
- * Slots:
75
- * - default: cuerpo del panel.
76
- * - header: encabezado.
77
- * - footer: acciones al pie.
78
- * - trigger-label: contenido explícito a animar desde el target.
98
+ * <moni-button id="openBtn">Open Details</moni-button>
99
+ *
100
+ * <script>
101
+ * const modal = document.getElementById('myModal');
102
+ * document.getElementById('openBtn').addEventListener('click', (e) => {
103
+ * modal.triggerEvent = e; // Pass the event so it knows where to morph from
104
+ * modal.open = true;
105
+ * });
106
+ * </script>
107
+ * ```
108
+ *
109
+ * @slot default - The main body content of the modal.
110
+ * @slot header - Custom header content (overrides `title` attribute).
111
+ * @slot actions - Action buttons displayed at the bottom right.
79
112
  */
113
+
80
114
  const litBool = {
81
115
  fromAttribute: (value: string | null) => value !== 'false' && value !== null,
82
116
  toAttribute: (value: boolean) => (value ? '' : null)
@@ -1,3 +1,10 @@
1
+ /**
2
+ * @file components/moni-nav-item.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { html, css } from 'lit';
2
9
  import { customElement, property, state } from 'lit/decorators.js';
3
10
  import { ifDefined } from 'lit/directives/if-defined.js';
@@ -5,15 +12,49 @@ import { MoniElement, sharedStyles } from './_base/index.js';
5
12
  import './moni-icon.js';
6
13
 
7
14
  /**
8
- * Visual-only navigation item. Renders an `<a>` styled with the BeerCSS
9
- * nav link helper.
15
+ * Material Design 3 Navigation Item component.
16
+ *
17
+ * A single destination item within a `<moni-nav>` container. Renders as an
18
+ * accessible `<a>` element with an icon, label, and M3 state layer.
19
+ *
20
+ * **M3 spec references:**
21
+ * - Navigation bar item: `m3-docs/components/navigation-bar/specs.md`
22
+ * - Navigation rail item: `m3-docs/components/navigation-rail/specs.md`
23
+ * - Navigation drawer item: `m3-docs/components/navigation-drawer/specs.md`
24
+ *
25
+ * **Layout adaptation:**
26
+ * The `placement`, `variant`, and `layout` properties are forwarded from
27
+ * the parent `<moni-nav>` (typically via attribute binding in the parent's
28
+ * render method). The nav item uses these to conditionally render:
29
+ * - Icon + label below (navigation bar).
30
+ * - Icon only + horizontal label (rail).
31
+ * - Icon + full label (drawer).
32
+ *
33
+ * **Responsive behavior:**
34
+ * Uses `window.matchMedia('(min-width: 601px)')` to detect medium screens
35
+ * and stores the result in `_isMediumScreen`. This drives automatic layout
36
+ * switching between bar and rail styles.
37
+ *
38
+ * **Active state:**
39
+ * The `active` attribute applies the M3 active indicator: a pill-shaped
40
+ * `secondary-container` background behind the icon and a darker label color.
41
+ *
42
+ * @example
43
+ * ```html
44
+ * <moni-nav placement="bottom">
45
+ * <moni-nav-item href="/" icon="home" label="Home" active></moni-nav-item>
46
+ * <moni-nav-item href="/search" icon="search" label="Search"></moni-nav-item>
47
+ * <moni-nav-item href="/profile" icon="person" label="Profile">
48
+ * <moni-badge value="3"></moni-badge> <!-- notification badge -->
49
+ * </moni-nav-item>
50
+ * </moni-nav>
51
+ * ```
52
+ *
53
+ * @slot default - Additional content slotted after the icon (e.g. `<moni-badge>`).
10
54
  *
11
- * Attributes:
12
- * - href: link target
13
- * - target: link target
14
- * - icon: Material Symbols name
15
- * - label: link text
16
- * - active: present → active style
55
+ * @csspart item - The outer `<a>` element.
56
+ * @csspart icon - The icon container.
57
+ * @csspart label - The label text element.
17
58
  */
18
59
  @customElement('moni-nav-item')
19
60
  export class MoniNavItem extends MoniElement {