@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,26 +1,61 @@
1
+ /**
2
+ * @file components/moni-nav.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
1
7
  import { MoniElement } from './_base/index.js';
2
8
  /**
3
- * Visual-only navigation. Renders a `<nav>` styled with BeerCSS helpers.
4
- *
5
- * M3 navigation patterns (`m3-docs/components/navigation-*`):
6
- * - Navigation bar: placement="bottom"
7
- * - Navigation rail: placement="left|right" variant="rail"
8
- * - Navigation drawer: placement="left|right" variant="drawer"
9
- * * Standard drawer: always visible, no scrim (default)
10
- * * Modal drawer: `modal` toggles open/closed, renders a scrim and
11
- * traps focus while open. See `m3-docs/components/navigation-drawer/specs.md`.
12
- *
13
- * Attributes:
14
- * - placement: top (default) | bottom | left | right
15
- * - variant: rail | drawer
16
- * - modal: present drawer is modal (requires variant="drawer")
17
- * - open: present modal drawer is open (default true)
18
- * - layout: vertical | horizontal | auto (default)
19
- *
20
- * Slots:
21
- * - default: <moni-nav-item> children
22
- * - header: content above nav items (drawer only)
23
- * - footer: content below nav items (drawer only)
9
+ * Material Design 3 Navigation container component.
10
+ *
11
+ * `<moni-nav>` is the container that wraps `<moni-nav-item>` elements and
12
+ * controls the M3 navigation pattern: navigation bar, navigation rail, or
13
+ * navigation drawer.
14
+ *
15
+ * **M3 spec references:**
16
+ * - Navigation bar: `m3-docs/components/navigation-bar/specs.md`
17
+ * - Navigation rail: `m3-docs/components/navigation-rail/specs.md`
18
+ * - Navigation drawer: `m3-docs/components/navigation-drawer/specs.md`
19
+ *
20
+ * **Navigation patterns:**
21
+ * - **Navigation bar** (`placement="bottom"`) — Horizontal bar of icon+label
22
+ * items at the bottom of the screen. Best for 3–5 top-level destinations.
23
+ * - **Navigation rail** (`variant="rail"`) Vertical rail of icon+label items
24
+ * on the side of the screen. Best for medium/expanded breakpoints.
25
+ * - **Standard drawer** (`variant="drawer"`) — Always-visible vertical panel
26
+ * with full text labels. No scrim. Best for large screens.
27
+ * - **Modal drawer** (`variant="drawer" modal`) — Overlay drawer with scrim.
28
+ * Opened/closed via the `open` property. Traps keyboard focus while open.
29
+ * Closes on `Escape` key press.
30
+ *
31
+ * **Keyboard handling:**
32
+ * When `modal=true`, the component adds a global `keydown` listener in
33
+ * `connectedCallback` that closes the drawer on `Escape`. The listener is
34
+ * removed in `disconnectedCallback`.
35
+ *
36
+ * @example
37
+ * ```html
38
+ * <!-- Bottom navigation bar -->
39
+ * <moni-nav placement="bottom">
40
+ * <moni-nav-item icon="home" label="Home" active></moni-nav-item>
41
+ * <moni-nav-item icon="search" label="Search"></moni-nav-item>
42
+ * <moni-nav-item icon="person" label="Profile"></moni-nav-item>
43
+ * </moni-nav>
44
+ *
45
+ * <!-- Modal navigation drawer -->
46
+ * <moni-nav variant="drawer" modal open placement="left">
47
+ * <h3 slot="header">My App</h3>
48
+ * <moni-nav-item icon="home" label="Home" active></moni-nav-item>
49
+ * <moni-nav-item icon="settings" label="Settings"></moni-nav-item>
50
+ * </moni-nav>
51
+ * ```
52
+ *
53
+ * @slot default - `<moni-nav-item>` children.
54
+ * @slot header - Content above the nav items (drawer variant only).
55
+ * @slot footer - Content below the nav items (drawer variant only).
56
+ *
57
+ * @csspart nav - The inner `<nav>` element.
58
+ * @csspart scrim - The backdrop scrim (modal drawer only).
24
59
  */
25
60
  export declare class MoniNav extends MoniElement {
26
61
  placement: 'top' | 'bottom' | 'left' | 'right';
@@ -35,7 +70,7 @@ export declare class MoniNav extends MoniElement {
35
70
  updated(changed: Map<string, unknown>): void;
36
71
  private _propagateToItems;
37
72
  static styles: import("lit").CSSResult[];
38
- render(): import("lit-html").TemplateResult<1>;
73
+ render(): import("lit").TemplateResult<1>;
39
74
  }
40
75
  declare global {
41
76
  interface HTMLElementTagNameMap {
@@ -1 +1 @@
1
- {"version":3,"file":"moni-nav.d.ts","sourceRoot":"","sources":["../../src/components/moni-nav.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBACa,OAAQ,SAAQ,WAAW;IAEvC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAS;IAEvD,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAU;IACQ,KAAK,UAAS;IACd,IAAI,UAAQ;IAExD,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAU;IAE3C,iBAAiB;IAMjB,oBAAoB;IAK7B,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,WAAW;IAMV,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAY9C,OAAO,CAAC,iBAAiB,CAOvB;IAEF,OAAgB,MAAM,4BAoJpB;IAEO,MAAM;CAyBf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,UAAU,EAAE,OAAO,CAAC;KACpB;CACD;AAED,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"moni-nav.d.ts","sourceRoot":"","sources":["../../src/components/moni-nav.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,qBACa,OAAQ,SAAQ,WAAW;IAEvC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAS;IAEvD,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAU;IACQ,KAAK,UAAS;IACd,IAAI,UAAQ;IAExD,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAU;IAE3C,iBAAiB;IAMjB,oBAAoB;IAK7B,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,WAAW;IAMV,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAY9C,OAAO,CAAC,iBAAiB,CAOvB;IAEF,OAAgB,MAAM,4BAoJpB;IAEO,MAAM;CAyBf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,UAAU,EAAE,OAAO,CAAC;KACpB;CACD;AAED,eAAe,OAAO,CAAC"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * @file components/moni-nav.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
1
7
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
8
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
9
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -8,27 +14,56 @@ import { html, css } from 'lit';
8
14
  import { customElement, property } from 'lit/decorators.js';
9
15
  import { MoniElement, sharedStyles } from './_base/index.js';
10
16
  /**
11
- * Visual-only navigation. Renders a `<nav>` styled with BeerCSS helpers.
17
+ * Material Design 3 Navigation container component.
18
+ *
19
+ * `<moni-nav>` is the container that wraps `<moni-nav-item>` elements and
20
+ * controls the M3 navigation pattern: navigation bar, navigation rail, or
21
+ * navigation drawer.
22
+ *
23
+ * **M3 spec references:**
24
+ * - Navigation bar: `m3-docs/components/navigation-bar/specs.md`
25
+ * - Navigation rail: `m3-docs/components/navigation-rail/specs.md`
26
+ * - Navigation drawer: `m3-docs/components/navigation-drawer/specs.md`
27
+ *
28
+ * **Navigation patterns:**
29
+ * - **Navigation bar** (`placement="bottom"`) — Horizontal bar of icon+label
30
+ * items at the bottom of the screen. Best for 3–5 top-level destinations.
31
+ * - **Navigation rail** (`variant="rail"`) — Vertical rail of icon+label items
32
+ * on the side of the screen. Best for medium/expanded breakpoints.
33
+ * - **Standard drawer** (`variant="drawer"`) — Always-visible vertical panel
34
+ * with full text labels. No scrim. Best for large screens.
35
+ * - **Modal drawer** (`variant="drawer" modal`) — Overlay drawer with scrim.
36
+ * Opened/closed via the `open` property. Traps keyboard focus while open.
37
+ * Closes on `Escape` key press.
38
+ *
39
+ * **Keyboard handling:**
40
+ * When `modal=true`, the component adds a global `keydown` listener in
41
+ * `connectedCallback` that closes the drawer on `Escape`. The listener is
42
+ * removed in `disconnectedCallback`.
43
+ *
44
+ * @example
45
+ * ```html
46
+ * <!-- Bottom navigation bar -->
47
+ * <moni-nav placement="bottom">
48
+ * <moni-nav-item icon="home" label="Home" active></moni-nav-item>
49
+ * <moni-nav-item icon="search" label="Search"></moni-nav-item>
50
+ * <moni-nav-item icon="person" label="Profile"></moni-nav-item>
51
+ * </moni-nav>
12
52
  *
13
- * M3 navigation patterns (`m3-docs/components/navigation-*`):
14
- * - Navigation bar: placement="bottom"
15
- * - Navigation rail: placement="left|right" variant="rail"
16
- * - Navigation drawer: placement="left|right" variant="drawer"
17
- * * Standard drawer: always visible, no scrim (default)
18
- * * Modal drawer: `modal` toggles open/closed, renders a scrim and
19
- * traps focus while open. See `m3-docs/components/navigation-drawer/specs.md`.
53
+ * <!-- Modal navigation drawer -->
54
+ * <moni-nav variant="drawer" modal open placement="left">
55
+ * <h3 slot="header">My App</h3>
56
+ * <moni-nav-item icon="home" label="Home" active></moni-nav-item>
57
+ * <moni-nav-item icon="settings" label="Settings"></moni-nav-item>
58
+ * </moni-nav>
59
+ * ```
20
60
  *
21
- * Attributes:
22
- * - placement: top (default) | bottom | left | right
23
- * - variant: rail | drawer
24
- * - modal: present → drawer is modal (requires variant="drawer")
25
- * - open: present → modal drawer is open (default true)
26
- * - layout: vertical | horizontal | auto (default)
61
+ * @slot default - `<moni-nav-item>` children.
62
+ * @slot header - Content above the nav items (drawer variant only).
63
+ * @slot footer - Content below the nav items (drawer variant only).
27
64
  *
28
- * Slots:
29
- * - default: <moni-nav-item> children
30
- * - header: content above nav items (drawer only)
31
- * - footer: content below nav items (drawer only)
65
+ * @csspart nav - The inner `<nav>` element.
66
+ * @csspart scrim - The backdrop scrim (modal drawer only).
32
67
  */
33
68
  let MoniNav = class MoniNav extends MoniElement {
34
69
  constructor() {
@@ -1,32 +1,120 @@
1
+ /**
2
+ * @file components/moni-progress.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
1
7
  import { MoniElement } from './_base/index.js';
2
8
  /**
3
- * Progress indicator that faithfully ports BeerCSS's progress styles.
4
- *
5
- * BeerCSS uses the native <progress> element with `::after`, `::before` and
6
- * `mask-image` pseudo-elements. Those don't work inside Shadow DOM because:
7
- * - `<progress>` native pseudo-elements (::webkit-progress-value, ::after)
8
- * are blocked by the UA shadow root in Chrome/Firefox within a custom shadow.
9
- * - `mask-image` on those pseudo-elements doesn't apply at all in shadows.
10
- *
11
- * Solution: use a plain <div> wrapper that replicates BeerCSS's visual rules
12
- * exactly, and an SVG for the circular variant (matching BeerCSS's conic-gradient
13
- * approach but with SVG stroke for better cross-browser support).
14
- *
15
- * Attributes:
16
- * - value: 0..max (omit for indeterminate)
17
- * - max: upper bound (default 100)
18
- * - variant: linear (default) | circular | wavy | circular-wavy
19
- * - size: small | medium (default) | large
20
- * - indeterminate: present infinite animation
9
+ * Material Design 3 Progress Indicator component.
10
+ *
11
+ * Progress indicators express an unspecified wait time or display the length
12
+ * of a process. They inform users about the status of ongoing processes such
13
+ * as loading an app, submitting a form, or saving updates.
14
+ *
15
+ * **M3 spec reference:** `m3-docs/components/progress-indicators/specs.md`
16
+ *
17
+ * **Variants:**
18
+ * - `linear` (default) A horizontal bar that fills left-to-right.
19
+ * - `circular` A circular SVG stroke indicator.
20
+ * - `wavy` — An animated wave bar (Moni extension; not in M3 spec).
21
+ * - `circular-wavy` — Circular + wave combo (Moni extension).
22
+ *
23
+ * **Shadow DOM compatibility note:**
24
+ * BeerCSS's progress uses native `<progress>` pseudo-elements (`::before`,
25
+ * `::after`, `::webkit-progress-value`) and `mask-image`, which are blocked
26
+ * by the UA shadow root in Chrome/Firefox. This component uses a plain `<div>`
27
+ * wrapper that replicates the visual rules exactly, and an `<svg>` element
28
+ * for the circular variant using SVG stroke-dashoffset animation for superior
29
+ * cross-browser support compared to `conic-gradient`.
30
+ *
31
+ * **Percentage computation:**
32
+ * `_pct` is computed in `willUpdate()` as `(value / max) * 100`, clamped to
33
+ * `[0, 100]`. When `indeterminate` is set, `_pct` is fixed at `50` to drive
34
+ * the infinite loop animation.
35
+ *
36
+ * @example
37
+ * ```html
38
+ * <!-- Determinate linear progress -->
39
+ * <moni-progress value="65" max="100"></moni-progress>
40
+ *
41
+ * <!-- Indeterminate circular progress (loading spinner) -->
42
+ * <moni-progress variant="circular" indeterminate></moni-progress>
43
+ * ```
44
+ *
45
+ * @csspart bar - The outer container div.
46
+ * @csspart fill - The inner fill element (linear variant).
47
+ * @csspart svg - The SVG element (circular variant).
21
48
  */
22
49
  export declare class MoniProgress extends MoniElement {
50
+ /**
51
+ * Current progress value.
52
+ *
53
+ * Must be in the range `[0, max]`. Values outside this range are clamped
54
+ * during percentage computation in `willUpdate()`. Ignored when
55
+ * `indeterminate` is set.
56
+ *
57
+ * @default 0
58
+ */
23
59
  value: number;
60
+ /**
61
+ * Maximum value of the progress range.
62
+ *
63
+ * Defaults to `100` so `value` can be set as a percentage directly.
64
+ * For non-percentage ranges (e.g. steps), set `max` to the total step count
65
+ * and `value` to the current step.
66
+ *
67
+ * @default 100
68
+ */
24
69
  max: number;
70
+ /**
71
+ * Visual variant of the progress indicator.
72
+ *
73
+ * - `'linear'` (default) — Horizontal fill bar.
74
+ * - `'circular'` — SVG circle with stroke-dashoffset animation.
75
+ * - `'wavy'` — Animated wave bar.
76
+ * - `'circular-wavy'` — Combination of circular and wave.
77
+ *
78
+ * @default 'linear'
79
+ */
25
80
  variant: 'linear' | 'circular' | 'wavy' | 'circular-wavy';
81
+ /**
82
+ * Visual size of the progress indicator.
83
+ *
84
+ * - `'small'` — Compact; suitable for inline or tight layouts.
85
+ * - `'medium'` — Standard M3 size (default).
86
+ * - `'large'` — Prominent; for full-page loading states.
87
+ *
88
+ * @default 'medium'
89
+ */
26
90
  size: 'small' | 'medium' | 'large';
91
+ /**
92
+ * When `true`, the indicator animates in an infinite loop regardless of `value`.
93
+ *
94
+ * Use for operations where the completion percentage is unknown
95
+ * (e.g. network requests, file processing). When `indeterminate` is set,
96
+ * `_pct` is fixed at `50` to drive a continuous sweep animation.
97
+ *
98
+ * @default false
99
+ */
27
100
  indeterminate: boolean;
28
- /** Computed fill percentage (0-100) used in styles/SVG */
101
+ /**
102
+ * Computed fill percentage in the range `[0, 100]`.
103
+ *
104
+ * Updated in `willUpdate()` whenever `value`, `max`, or `indeterminate` changes.
105
+ * Used directly in CSS custom property bindings and SVG stroke attributes.
106
+ *
107
+ * @internal
108
+ */
29
109
  private _pct;
110
+ /**
111
+ * Computes the fill percentage before each render.
112
+ *
113
+ * Recalculates `_pct` whenever `value`, `max`, or `indeterminate` changes.
114
+ * The `Math.max(1, max)` guard prevents division-by-zero when `max` is 0.
115
+ *
116
+ * @param changed - Map of property names to their previous values.
117
+ */
30
118
  willUpdate(changed: Map<string, unknown>): void;
31
119
  static styles: import("lit").CSSResult[];
32
120
  private _renderLinear;
@@ -34,7 +122,7 @@ export declare class MoniProgress extends MoniElement {
34
122
  private _renderCircular;
35
123
  /** Unique ID per instance for SVG clipPath IDs */
36
124
  private readonly _instanceId;
37
- render(): import("lit-html").TemplateResult<1>;
125
+ render(): import("lit").TemplateResult<1>;
38
126
  }
39
127
  declare global {
40
128
  interface HTMLElementTagNameMap {
@@ -1 +1 @@
1
- {"version":3,"file":"moni-progress.d.ts","sourceRoot":"","sources":["../../src/components/moni-progress.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBACa,YAAa,SAAQ,WAAW;IACD,KAAK,SAAK;IACV,GAAG,SAAO;IAErD,OAAO,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,eAAe,CAAY;IAErE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAY;IACF,aAAa,UAAS;IAElE,0DAA0D;IACjD,OAAO,CAAC,IAAI,CAAK;IAEjB,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAQjD,OAAgB,MAAM,4BA6HpB;IAEF,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,WAAW;IAyDnB,OAAO,CAAC,eAAe;IAoDvB,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAE7D,MAAM;CAYf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,eAAe,EAAE,YAAY,CAAC;KAC9B;CACD;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"moni-progress.d.ts","sourceRoot":"","sources":["../../src/components/moni-progress.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,qBACa,YAAa,SAAQ,WAAW;IAC5C;;;;;;;;OAQG;IACwC,KAAK,SAAK;IAErD;;;;;;;;OAQG;IACwC,GAAG,SAAO;IAErD;;;;;;;;;OASG;IAEH,OAAO,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,eAAe,CAAY;IAErE;;;;;;;;OAQG;IAEH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAY;IAE9C;;;;;;;;OAQG;IACyC,aAAa,UAAS;IAElE;;;;;;;OAOG;IACM,OAAO,CAAC,IAAI,CAAK;IAE1B;;;;;;;OAOG;IACM,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAQjD,OAAgB,MAAM,4BA6HpB;IAEF,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,WAAW;IAyDnB,OAAO,CAAC,eAAe;IAoDvB,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAE7D,MAAM;CAYf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,eAAe,EAAE,YAAY,CAAC;KAC9B;CACD;AAED,eAAe,YAAY,CAAC"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * @file components/moni-progress.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
1
7
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
8
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
9
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -8,38 +14,120 @@ import { html, css, svg, nothing } from 'lit';
8
14
  import { customElement, property, state } from 'lit/decorators.js';
9
15
  import { MoniElement, sharedStyles } from './_base/index.js';
10
16
  /**
11
- * Progress indicator that faithfully ports BeerCSS's progress styles.
17
+ * Material Design 3 Progress Indicator component.
18
+ *
19
+ * Progress indicators express an unspecified wait time or display the length
20
+ * of a process. They inform users about the status of ongoing processes such
21
+ * as loading an app, submitting a form, or saving updates.
22
+ *
23
+ * **M3 spec reference:** `m3-docs/components/progress-indicators/specs.md`
24
+ *
25
+ * **Variants:**
26
+ * - `linear` (default) — A horizontal bar that fills left-to-right.
27
+ * - `circular` — A circular SVG stroke indicator.
28
+ * - `wavy` — An animated wave bar (Moni extension; not in M3 spec).
29
+ * - `circular-wavy` — Circular + wave combo (Moni extension).
30
+ *
31
+ * **Shadow DOM compatibility note:**
32
+ * BeerCSS's progress uses native `<progress>` pseudo-elements (`::before`,
33
+ * `::after`, `::webkit-progress-value`) and `mask-image`, which are blocked
34
+ * by the UA shadow root in Chrome/Firefox. This component uses a plain `<div>`
35
+ * wrapper that replicates the visual rules exactly, and an `<svg>` element
36
+ * for the circular variant using SVG stroke-dashoffset animation for superior
37
+ * cross-browser support compared to `conic-gradient`.
38
+ *
39
+ * **Percentage computation:**
40
+ * `_pct` is computed in `willUpdate()` as `(value / max) * 100`, clamped to
41
+ * `[0, 100]`. When `indeterminate` is set, `_pct` is fixed at `50` to drive
42
+ * the infinite loop animation.
12
43
  *
13
- * BeerCSS uses the native <progress> element with `::after`, `::before` and
14
- * `mask-image` pseudo-elements. Those don't work inside Shadow DOM because:
15
- * - `<progress>` native pseudo-elements (::webkit-progress-value, ::after)
16
- * are blocked by the UA shadow root in Chrome/Firefox within a custom shadow.
17
- * - `mask-image` on those pseudo-elements doesn't apply at all in shadows.
44
+ * @example
45
+ * ```html
46
+ * <!-- Determinate linear progress -->
47
+ * <moni-progress value="65" max="100"></moni-progress>
18
48
  *
19
- * Solution: use a plain <div> wrapper that replicates BeerCSS's visual rules
20
- * exactly, and an SVG for the circular variant (matching BeerCSS's conic-gradient
21
- * approach but with SVG stroke for better cross-browser support).
49
+ * <!-- Indeterminate circular progress (loading spinner) -->
50
+ * <moni-progress variant="circular" indeterminate></moni-progress>
51
+ * ```
22
52
  *
23
- * Attributes:
24
- * - value: 0..max (omit for indeterminate)
25
- * - max: upper bound (default 100)
26
- * - variant: linear (default) | circular | wavy | circular-wavy
27
- * - size: small | medium (default) | large
28
- * - indeterminate: present → infinite animation
53
+ * @csspart bar - The outer container div.
54
+ * @csspart fill - The inner fill element (linear variant).
55
+ * @csspart svg - The SVG element (circular variant).
29
56
  */
30
57
  let MoniProgress = class MoniProgress extends MoniElement {
31
58
  constructor() {
32
59
  super(...arguments);
60
+ /**
61
+ * Current progress value.
62
+ *
63
+ * Must be in the range `[0, max]`. Values outside this range are clamped
64
+ * during percentage computation in `willUpdate()`. Ignored when
65
+ * `indeterminate` is set.
66
+ *
67
+ * @default 0
68
+ */
33
69
  this.value = 0;
70
+ /**
71
+ * Maximum value of the progress range.
72
+ *
73
+ * Defaults to `100` so `value` can be set as a percentage directly.
74
+ * For non-percentage ranges (e.g. steps), set `max` to the total step count
75
+ * and `value` to the current step.
76
+ *
77
+ * @default 100
78
+ */
34
79
  this.max = 100;
80
+ /**
81
+ * Visual variant of the progress indicator.
82
+ *
83
+ * - `'linear'` (default) — Horizontal fill bar.
84
+ * - `'circular'` — SVG circle with stroke-dashoffset animation.
85
+ * - `'wavy'` — Animated wave bar.
86
+ * - `'circular-wavy'` — Combination of circular and wave.
87
+ *
88
+ * @default 'linear'
89
+ */
35
90
  this.variant = 'linear';
91
+ /**
92
+ * Visual size of the progress indicator.
93
+ *
94
+ * - `'small'` — Compact; suitable for inline or tight layouts.
95
+ * - `'medium'` — Standard M3 size (default).
96
+ * - `'large'` — Prominent; for full-page loading states.
97
+ *
98
+ * @default 'medium'
99
+ */
36
100
  this.size = 'medium';
101
+ /**
102
+ * When `true`, the indicator animates in an infinite loop regardless of `value`.
103
+ *
104
+ * Use for operations where the completion percentage is unknown
105
+ * (e.g. network requests, file processing). When `indeterminate` is set,
106
+ * `_pct` is fixed at `50` to drive a continuous sweep animation.
107
+ *
108
+ * @default false
109
+ */
37
110
  this.indeterminate = false;
38
- /** Computed fill percentage (0-100) used in styles/SVG */
111
+ /**
112
+ * Computed fill percentage in the range `[0, 100]`.
113
+ *
114
+ * Updated in `willUpdate()` whenever `value`, `max`, or `indeterminate` changes.
115
+ * Used directly in CSS custom property bindings and SVG stroke attributes.
116
+ *
117
+ * @internal
118
+ */
39
119
  this._pct = 0;
40
120
  /** Unique ID per instance for SVG clipPath IDs */
41
121
  this._instanceId = Math.random().toString(36).slice(2, 8);
42
122
  }
123
+ /**
124
+ * Computes the fill percentage before each render.
125
+ *
126
+ * Recalculates `_pct` whenever `value`, `max`, or `indeterminate` changes.
127
+ * The `Math.max(1, max)` guard prevents division-by-zero when `max` is 0.
128
+ *
129
+ * @param changed - Map of property names to their previous values.
130
+ */
43
131
  willUpdate(changed) {
44
132
  if (changed.has('value') || changed.has('max') || changed.has('indeterminate')) {
45
133
  this._pct = this.indeterminate
@@ -1,33 +1,125 @@
1
+ /**
2
+ * @file components/moni-radio.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
1
7
  import { MoniElement } from './_base/index.js';
2
8
  /**
3
- * Radio that faithfully ports BeerCSS's `.radio` styles.
9
+ * Material Design 3 Radio Button component.
10
+ *
11
+ * Radio buttons allow users to select exactly one item from a set of mutually
12
+ * exclusive options. They share the same visual architecture as
13
+ * `<moni-checkbox>` but use `type="radio"` and implement group deselection.
14
+ *
15
+ * **M3 spec reference:** `m3-docs/components/radio/specs.md`
16
+ *
17
+ * **Visual architecture (BeerCSS pattern):**
18
+ * Identical to the checkbox pattern: the native `<input type="radio">` occupies
19
+ * real layout space at `--_size` × `--_size` but is hidden via `opacity: 0`.
20
+ * A sibling `<span>` renders:
21
+ * - `::before` — the radio icon (`radio_button_unchecked` / `radio_button_checked`).
22
+ * - `::after` — the hover/focus ripple ring.
23
+ *
24
+ * **Group deselection:**
25
+ * When a radio is checked, `_onChange` queries the component's `getRootNode()`
26
+ * for all `moni-radio` elements sharing the same `name` attribute and sets
27
+ * their `checked` property to `false`. This mirrors native browser behavior
28
+ * for radio groups across shadow DOM boundaries where `name` grouping does
29
+ * not work natively.
30
+ *
31
+ * @fires change - Bubbles and is composed. Fired when this radio is selected.
32
+ * Read `element.checked` for the new state.
4
33
  *
5
- * BeerCSS architecture:
6
- * - `.radio` is inline-flex, aligns items center
7
- * - `input` has width/height = --_size, opacity: 0 (real layout space, not absolute)
8
- * - `span::before` shows "radio_button_unchecked" / "radio_button_checked" via Material Symbols font
9
- * - `span::after` is the ripple hover effect
34
+ * @example
35
+ * ```html
36
+ * <moni-radio name="color" value="red" label="Red"></moni-radio>
37
+ * <moni-radio name="color" value="green" label="Green"></moni-radio>
38
+ * <moni-radio name="color" value="blue" label="Blue" checked></moni-radio>
39
+ * ```
10
40
  *
11
- * Attributes:
12
- * - label: text label
13
- * - checked: present
14
- * - disabled: present
15
- * - size: small | medium (default) | large | extra
16
- * - name: forwarded to input.name (group radios by name)
17
- * - value: forwarded to input.value
41
+ * @csspart radio - The outer `<label>` element.
18
42
  */
19
43
  export declare class MoniRadio extends MoniElement {
44
+ /**
45
+ * Text label displayed to the right of the radio icon.
46
+ *
47
+ * When non-empty, renders as a text node. When empty, the default slot
48
+ * is rendered, allowing slotted HTML content as the label.
49
+ *
50
+ * @default ''
51
+ */
20
52
  label: string;
53
+ /**
54
+ * Whether this radio button is currently selected.
55
+ *
56
+ * Reflected as an attribute so CSS selectors can target it. Synced to
57
+ * the native input via `updated()`.
58
+ *
59
+ * @default false
60
+ */
21
61
  checked: boolean;
62
+ /**
63
+ * When `true`, the radio is non-interactive and renders at 50% opacity.
64
+ *
65
+ * @default false
66
+ */
22
67
  disabled: boolean;
68
+ /**
69
+ * Visual size of the radio icon and its invisible hit area.
70
+ *
71
+ * | Value | `--_size` |
72
+ * |------------|-----------|
73
+ * | `'small'` | 1rem |
74
+ * | `'medium'` | 1.5rem |
75
+ * | `'large'` | 2rem |
76
+ * | `'extra'` | 2.5rem |
77
+ *
78
+ * @default 'medium'
79
+ */
23
80
  size: 'small' | 'medium' | 'large' | 'extra';
81
+ /**
82
+ * Radio group name. Radios with the same `name` in the same root node
83
+ * are treated as a mutual-exclusion group by `_onChange`.
84
+ *
85
+ * Note: Native `<input type="radio">` groups only work within the same
86
+ * document root. Since `moni-radio` uses shadow DOM, the deselection
87
+ * of siblings is handled imperatively in `_onChange`.
88
+ *
89
+ * @default ''
90
+ */
24
91
  name: string;
92
+ /**
93
+ * Forwarded to the native `<input value>` attribute.
94
+ * The value submitted in a form when this radio is selected.
95
+ *
96
+ * @default ''
97
+ */
25
98
  value: string;
99
+ /** Direct reference to the native input element for programmatic access. */
26
100
  private _input;
101
+ /**
102
+ * Syncs `checked` and `disabled` to the native input after each render cycle.
103
+ *
104
+ * @param changed - Map of changed property names to their previous values.
105
+ */
27
106
  updated(changed: Map<string, unknown>): void;
28
107
  static styles: import("lit").CSSResult[];
108
+ /**
109
+ * Handles the native input `change` event.
110
+ *
111
+ * On selection, deselects all sibling `moni-radio` elements with the same
112
+ * `name` in the same root node (document or shadow root). This is necessary
113
+ * because native radio group exclusion only works within the same document
114
+ * root and does not cross shadow DOM boundaries.
115
+ *
116
+ * After deselection, dispatches a composed `'change'` event so it is
117
+ * audible to parent elements in the light DOM.
118
+ *
119
+ * @param e - The native `change` event from the hidden `<input>`.
120
+ */
29
121
  private _onChange;
30
- render(): import("lit-html").TemplateResult<1>;
122
+ render(): import("lit").TemplateResult<1>;
31
123
  }
32
124
  declare global {
33
125
  interface HTMLElementTagNameMap {
@@ -1 +1 @@
1
- {"version":3,"file":"moni-radio.d.ts","sourceRoot":"","sources":["../../src/components/moni-radio.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;GAgBG;AACH,qBACa,SAAU,SAAQ,WAAW;IACZ,KAAK,SAAM;IACI,OAAO,UAAS;IAChB,QAAQ,UAAS;IAE7D,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAY;IAC3B,IAAI,SAAM;IACV,KAAK,SAAM;IAExB,OAAO,CAAC,MAAM,CAAoB;IAEzC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAO9C,OAAgB,MAAM,4BA8GpB;IAEF,OAAO,CAAC,SAAS;IAgBR,MAAM;CAiBf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,YAAY,EAAE,SAAS,CAAC;KACxB;CACD;AAED,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"moni-radio.d.ts","sourceRoot":"","sources":["../../src/components/moni-radio.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBACa,SAAU,SAAQ,WAAW;IACzC;;;;;;;OAOG;IAC0B,KAAK,SAAM;IAExC;;;;;;;OAOG;IACyC,OAAO,UAAS;IAE5D;;;;OAIG;IACyC,QAAQ,UAAS;IAE7D;;;;;;;;;;;OAWG;IAEH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAY;IAExD;;;;;;;;;OASG;IAC0B,IAAI,SAAM;IAEvC;;;;;OAKG;IAC0B,KAAK,SAAM;IAExC,4EAA4E;IAC5D,OAAO,CAAC,MAAM,CAAoB;IAElD;;;;OAIG;IACM,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAO9C,OAAgB,MAAM,4BA8GpB;IAEF;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,SAAS;IAgBR,MAAM;CAiBf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,YAAY,EAAE,SAAS,CAAC;KACxB;CACD;AAED,eAAe,SAAS,CAAC"}