@moni-labs/moni-ui 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/README.md +52 -194
  2. package/custom-elements.json +1709 -338
  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 +80 -17
  49. package/dist/components/moni-carousel.d.ts.map +1 -1
  50. package/dist/components/moni-carousel.js +258 -34
  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 +282 -34
  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,3 +1,9 @@
1
+ /**
2
+ * @file components/moni-carousel.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);
@@ -10,23 +16,60 @@ import { MoniElement, sharedStyles } from './_base/index.js';
10
16
  import { gsap } from 'gsap';
11
17
  /**
12
18
  * Material Design 3 Expressive Carousel component.
13
- * Supports three layouts:
14
- * - `multi-browse`: Shows a collection of items (large, medium, and small items).
15
- * - `hero`: Focuses on one large item with a smaller item peeking.
16
- * - `uncontained`: Standard same-sized layout bleeding off the edges.
17
19
  *
18
- * Attributes:
19
- * - layout: 'multi-browse' | 'hero' | 'uncontained'
20
- * - auto: if true, dynamically calculates items sizes to fit the container without gaps.
21
- * - large-width: width of large items (used in non-auto mode or as a guideline).
22
- * - medium-width: width of medium items (multi-browse layout).
23
- * - small-width: width of small/peeking items.
24
- * - gap: spacing between elements (default 8px).
25
- * - padding: leading/trailing padding (default 16px).
26
- * - border-radius: radius of cards (default 28px).
27
- * - header-text: header title of the carousel.
28
- * - show-all: renders a "Show all" action button/link.
29
- * - show-all-text: customize the text for the "Show all" action.
20
+ * Carousels display a collection of related items in a scrollable, horizontal list.
21
+ * They allow users to quickly browse through items like images, cards, or products.
22
+ *
23
+ * **M3 spec reference:** `m3-docs/components/carousel/specs.md`
24
+ *
25
+ * **Layout variants:**
26
+ * - `multi-browse` (default) Shows a mix of large, medium, and small (peeking)
27
+ * items. Best for exploring a large number of items.
28
+ * - `hero` Focuses on one large primary item while showing a sliver of the
29
+ * next item. Best for featuring important content.
30
+ * - `uncontained` Standard layout where all items have the same width and
31
+ * bleed off the edges of the container.
32
+ *
33
+ * **Animation & Gestures:**
34
+ * This component uses GSAP for smooth drag, flick, and snap animations,
35
+ * mirroring the high-fidelity M3 Expressive motion specs. It handles touch
36
+ * gestures for mobile and mouse-drag for desktop.
37
+ *
38
+ * **Auto-sizing (`auto` mode):**
39
+ * When `auto=true` (default), the carousel measures its own width and
40
+ * dynamically calculates the optimal sizes for large, medium, and small items
41
+ * based on the active `layout` to ensure they fit perfectly without awkward gaps
42
+ * or clipping at the edges.
43
+ *
44
+ * @example
45
+ * ```html
46
+ * <!-- Declarative usage via DOM properties (recommended) -->
47
+ * <moni-carousel layout="hero"></moni-carousel>
48
+ * <script>
49
+ * const carousel = document.querySelector('moni-carousel');
50
+ * carousel.items = [
51
+ * { title: 'Item 1', img: '/img1.jpg', href: '/link1' },
52
+ * { title: 'Item 2', img: '/img2.jpg' }
53
+ * ];
54
+ * </script>
55
+ *
56
+ * <!-- Slot-based usage (for SSR or simple static content) -->
57
+ * <moni-carousel layout="uncontained">
58
+ * <div slot="item">
59
+ * <img src="/img1.jpg" />
60
+ * <h3>Static Item</h3>
61
+ * </div>
62
+ * </moni-carousel>
63
+ * ```
64
+ *
65
+ * @slot item - Alternative to the `items` property. Slot individual HTML elements
66
+ * instead of passing data objects.
67
+ *
68
+ * @csspart carousel - The outer wrapper.
69
+ * @csspart track - The scrolling track element.
70
+ * @csspart item - Individual carousel item containers.
71
+ * @csspart img - The image elements inside the items.
72
+ * @csspart title - The title text elements inside the items.
30
73
  */
31
74
  let MoniCarousel = class MoniCarousel extends MoniElement {
32
75
  constructor() {
@@ -44,6 +87,9 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
44
87
  this.showAllText = 'Show all';
45
88
  this.headerText = '';
46
89
  this.hideNav = false;
90
+ this.infinite = false;
91
+ this.autoplay = false;
92
+ this.autoplayInterval = 3000;
47
93
  this._containerWidth = 0;
48
94
  this._slottedItems = [];
49
95
  this._hasSlottedShowAll = false;
@@ -61,6 +107,9 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
61
107
  this._tickerTarget = 0;
62
108
  this._tickerCurrent = 0;
63
109
  this._isTicking = false;
110
+ // Infinite & Autoplay state
111
+ this._infiniteInitialized = false;
112
+ this._autoplayTimer = null;
64
113
  // quickSetter caches — avoid gsap.set() overhead per frame
65
114
  this._cardSetX = [];
66
115
  this._cardSetWidth = [];
@@ -79,6 +128,7 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
79
128
  this._tickerCurrent = this._tickerTarget;
80
129
  gsap.ticker.remove(this._tick);
81
130
  this._isTicking = false;
131
+ this._checkInfiniteWrap();
82
132
  }
83
133
  this._applyLayout(this._tickerCurrent);
84
134
  };
@@ -98,6 +148,30 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
98
148
  if (this._cardSetX.length !== this._cards.length) {
99
149
  this._buildQuickSetters();
100
150
  }
151
+ if (this.infinite && !this._infiniteInitialized && this.effectiveItems.length > 0) {
152
+ const C = this.effectiveItems.length;
153
+ const V = C * this._visualCardsMultiplier;
154
+ const K = this._snapSetsCount;
155
+ const centerSetIndex = Math.floor(K / 2);
156
+ // Wait for the browser to render the new items so scrollWidth is updated
157
+ // A double-rAF or setTimeout ensures the layout engine has processed the new snap-items
158
+ requestAnimationFrame(() => {
159
+ setTimeout(() => {
160
+ if (this._scrollContainer) {
161
+ // Force layout calculation
162
+ this._scrollContainer.scrollWidth;
163
+ this._scrollContainer.scrollLeft = centerSetIndex * V * this.itemSize;
164
+ // If the browser still clamped it, it means it's not ready.
165
+ // But with setTimeout it should be fully ready.
166
+ // Force the visual ticker to match instantly to avoid an animation zoom from 0
167
+ this._tickerTarget = this._scrollContainer.scrollLeft / this.itemSize;
168
+ this._tickerCurrent = this._tickerTarget;
169
+ this._applyLayout(this._tickerCurrent);
170
+ }
171
+ }, 20);
172
+ });
173
+ this._infiniteInitialized = true;
174
+ }
101
175
  this._tickerTarget = this._scrollContainer.scrollLeft / this.itemSize;
102
176
  if (instant || (!this._isTicking && this._tickerCurrent === 0)) {
103
177
  this._tickerCurrent = this._tickerTarget;
@@ -391,6 +465,9 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
391
465
  }
392
466
  this._buildQuickSetters();
393
467
  this.updateLayout(true);
468
+ if (this.autoplay) {
469
+ this._startAutoplay();
470
+ }
394
471
  }
395
472
  updated(changedProperties) {
396
473
  super.updated(changedProperties);
@@ -402,15 +479,30 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
402
479
  changedProperties.has('padding') ||
403
480
  changedProperties.has('items') ||
404
481
  changedProperties.has('hideNav') ||
482
+ changedProperties.has('infinite') ||
483
+ changedProperties.has('autoplay') ||
484
+ changedProperties.has('autoplayInterval') ||
405
485
  changedProperties.has('_containerWidth') ||
406
486
  changedProperties.has('_slottedItems') ||
407
487
  changedProperties.has('_hasSlottedShowAll')) {
488
+ if (changedProperties.has('infinite') || changedProperties.has('items') || changedProperties.has('_slottedItems')) {
489
+ this._infiniteInitialized = false;
490
+ }
408
491
  if (changedProperties.has('layout') && this._scrollContainer) {
409
492
  this._scrollContainer.scrollLeft = 0;
493
+ this._infiniteInitialized = false;
410
494
  this._scrollContainer.style.scrollSnapType =
411
495
  this.layout === 'uncontained' ? 'none' : 'x mandatory';
412
496
  }
413
497
  this.updateLayout(true);
498
+ if (changedProperties.has('autoplay') || changedProperties.has('autoplayInterval') || changedProperties.has('items') || changedProperties.has('_slottedItems')) {
499
+ if (this.autoplay) {
500
+ this._startAutoplay();
501
+ }
502
+ else {
503
+ this._stopAutoplay();
504
+ }
505
+ }
414
506
  }
415
507
  }
416
508
  get computedLayout() {
@@ -596,7 +688,21 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
596
688
  const isMobile = this._isMobile;
597
689
  const cardCount = this._cards.length;
598
690
  for (let i = 0; i < cardCount; i++) {
599
- const p = i - t;
691
+ let p = i - t;
692
+ if (this.infinite) {
693
+ // Modulo wrap so the cards perfectly loop around the center
694
+ p = i - (t % cardCount);
695
+ if (p > cardCount / 2)
696
+ p -= cardCount;
697
+ if (p < -cardCount / 2)
698
+ p += cardCount;
699
+ }
700
+ // Optimization: if the card is far off-screen, hide it to save rendering work
701
+ if (p < -15 || p > 15) {
702
+ this._cardSetX[i](-9999);
703
+ this._titleSetOpacity[i](0);
704
+ continue;
705
+ }
600
706
  const layout = this._getCardLayout(p);
601
707
  // Use quickSetters — ~3x faster than gsap.set() per call
602
708
  this._cardSetX[i](layout.x);
@@ -609,8 +715,97 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
609
715
  this._titleSetOpacity[i](layout.opacity);
610
716
  }
611
717
  }
718
+ get _visualCardsMultiplier() {
719
+ if (!this.infinite || this.effectiveItems.length === 0)
720
+ return 1;
721
+ const C = this.effectiveItems.length;
722
+ // We need at least ~15 cards to fill the screen seamlessly for small datasets
723
+ return Math.max(1, Math.ceil(15 / C));
724
+ }
725
+ get _snapSetsCount() {
726
+ if (!this.infinite || this.effectiveItems.length === 0)
727
+ return 1;
728
+ const C = this.effectiveItems.length;
729
+ const V = C * this._visualCardsMultiplier;
730
+ // We want enough snap items so the user NEVER reaches the end in a single fast swipe.
731
+ // A total of ~1000 items is extremely cheap as empty divs, and provides a massive buffer.
732
+ let K = Math.ceil(1000 / V);
733
+ if (K % 2 === 0)
734
+ K += 1; // Keep it odd for a perfect center
735
+ return Math.max(3, K);
736
+ }
737
+ get _snapItemsCount() {
738
+ if (this.infinite) {
739
+ const C = this.effectiveItems.length;
740
+ const V_mult = this._visualCardsMultiplier;
741
+ const K = this._snapSetsCount;
742
+ return K * (C * V_mult);
743
+ }
744
+ return this.effectiveItems.length;
745
+ }
746
+ _checkInfiniteWrap() {
747
+ if (!this.infinite || this.effectiveItems.length === 0 || !this._scrollContainer)
748
+ return;
749
+ const C = this.effectiveItems.length;
750
+ const V = C * this._visualCardsMultiplier;
751
+ const K = this._snapSetsCount;
752
+ const centerSetIndex = Math.floor(K / 2);
753
+ // The scroll track is divided into K sets, each containing V items.
754
+ const setWidth = V * this.itemSize;
755
+ const currentScroll = this._scrollContainer.scrollLeft;
756
+ const currentSet = Math.floor(currentScroll / setWidth);
757
+ if (currentSet !== centerSetIndex) {
758
+ const delta = (centerSetIndex - currentSet) * setWidth;
759
+ const oldSnap = this._scrollContainer.style.scrollSnapType;
760
+ const oldBehavior = this._scrollContainer.style.scrollBehavior;
761
+ // Temporarily disable snap and smooth behavior so the wrap is instantaneous
762
+ this._scrollContainer.style.scrollSnapType = 'none';
763
+ this._scrollContainer.style.scrollBehavior = 'auto';
764
+ this._scrollContainer.scrollLeft += delta;
765
+ // INSTANTLY update the GSAP visual ticker so it doesn't animate the jump
766
+ this._tickerTarget = this._scrollContainer.scrollLeft / this.itemSize;
767
+ this._tickerCurrent = this._tickerTarget;
768
+ this._applyLayout(this._tickerCurrent);
769
+ // Restore original scroll behavior
770
+ this._scrollContainer.style.scrollBehavior = oldBehavior;
771
+ if (this._isDown) {
772
+ this._scrollLeftStart += delta;
773
+ }
774
+ if (oldSnap && oldSnap !== 'none') {
775
+ // Re-enable snap on the next frame to avoid jumping
776
+ requestAnimationFrame(() => {
777
+ if (this._scrollContainer && !this._isDown) {
778
+ this._scrollContainer.style.scrollSnapType = oldSnap;
779
+ }
780
+ });
781
+ }
782
+ }
783
+ }
784
+ _startAutoplay() {
785
+ this._stopAutoplay();
786
+ if (this.autoplay && this.effectiveItems.length > 0) {
787
+ this._autoplayTimer = setInterval(() => {
788
+ // We removed _isInteracting to make autoplay more robust. It only pauses on active drag.
789
+ if (!this._isDown) {
790
+ this._scrollNext();
791
+ }
792
+ }, this.autoplayInterval);
793
+ }
794
+ }
795
+ _stopAutoplay() {
796
+ if (this._autoplayTimer) {
797
+ clearInterval(this._autoplayTimer);
798
+ this._autoplayTimer = null;
799
+ }
800
+ }
801
+ _handleMouseEnter() {
802
+ }
803
+ _handleMouseLeave() {
804
+ this._handleMouseUp();
805
+ }
612
806
  _handleMouseDown(e) {
613
807
  gsap.killTweensOf(this._scrollContainer);
808
+ this._checkInfiniteWrap();
614
809
  this._isDown = true;
615
810
  this._draggedDistance = 0;
616
811
  this._scrollContainer.style.scrollBehavior = 'auto';
@@ -647,11 +842,20 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
647
842
  }
648
843
  // Dynamic momentum: stronger swipes have a much higher multiplier
649
844
  const momentumMultiplier = 350 + Math.abs(this._velocity) * 300;
650
- const projectedScrollLeft = this._scrollContainer.scrollLeft - this._velocity * momentumMultiplier;
845
+ let projectedScrollLeft = this._scrollContainer.scrollLeft - this._velocity * momentumMultiplier;
846
+ // Cap momentum throw to prevent hitting infinite wrap edges on fast swipes
847
+ const maxThrowDist = 15 * this.itemSize;
848
+ if (projectedScrollLeft < this._scrollContainer.scrollLeft - maxThrowDist) {
849
+ projectedScrollLeft = this._scrollContainer.scrollLeft - maxThrowDist;
850
+ }
851
+ else if (projectedScrollLeft > this._scrollContainer.scrollLeft + maxThrowDist) {
852
+ projectedScrollLeft = this._scrollContainer.scrollLeft + maxThrowDist;
853
+ }
651
854
  if (this.layout !== 'uncontained') {
652
855
  this._scrollContainer.style.scrollSnapType = 'none';
653
856
  let targetIndex = Math.round(projectedScrollLeft / this.itemSize);
654
- targetIndex = Math.max(0, Math.min(this.effectiveItems.length - 1, targetIndex));
857
+ const maxIndex = this.effectiveItems.length > 0 ? this._snapItemsCount - 1 : 0;
858
+ targetIndex = Math.max(0, Math.min(maxIndex, targetIndex));
655
859
  const snapPoint = targetIndex * this.itemSize;
656
860
  // Dynamic duration: longer distance = more time, max 0.85s for faster feeling
657
861
  const currentIndex = Math.round(this._scrollContainer.scrollLeft / this.itemSize);
@@ -672,6 +876,7 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
672
876
  }
673
877
  _handleTouchStart(e) {
674
878
  gsap.killTweensOf(this._scrollContainer);
879
+ this._checkInfiniteWrap();
675
880
  this._isDown = true;
676
881
  this._draggedDistance = 0;
677
882
  this._scrollContainer.style.scrollBehavior = 'auto';
@@ -727,7 +932,7 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
727
932
  if (this._wheelTimeout)
728
933
  clearTimeout(this._wheelTimeout);
729
934
  this._wheelTimeout = setTimeout(() => {
730
- if (this.layout !== 'uncontained') {
935
+ if (this.layout !== 'uncontained' && !this._isDown) {
731
936
  this._scrollContainer.style.scrollSnapType = 'x mandatory';
732
937
  }
733
938
  }, 150);
@@ -739,20 +944,20 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
739
944
  e.stopPropagation();
740
945
  return;
741
946
  }
947
+ const originalIndex = index % this.effectiveItems.length;
742
948
  this.dispatchEvent(new CustomEvent('item-click', {
743
- detail: { item, index },
949
+ detail: { item, index: originalIndex },
744
950
  bubbles: true,
745
951
  composed: true
746
952
  }));
747
953
  }
748
954
  _scrollPrevious() {
749
- const target = Math.max(0, this._scrollContainer.scrollLeft - this.itemSize);
955
+ const target = this._scrollContainer.scrollLeft - this.itemSize;
750
956
  this._scrollContainer.style.scrollBehavior = 'smooth';
751
957
  this._scrollContainer.scrollTo({ left: target, behavior: 'smooth' });
752
958
  }
753
959
  _scrollNext() {
754
- const maxScroll = this._scrollContainer.scrollWidth - this._scrollContainer.clientWidth;
755
- const target = Math.min(maxScroll, this._scrollContainer.scrollLeft + this.itemSize);
960
+ const target = this._scrollContainer.scrollLeft + this.itemSize;
756
961
  this._scrollContainer.style.scrollBehavior = 'smooth';
757
962
  this._scrollContainer.scrollTo({ left: target, behavior: 'smooth' });
758
963
  }
@@ -840,14 +1045,23 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
840
1045
  if (rightPadding < minRightPaddingNeeded) {
841
1046
  rightPadding = minRightPaddingNeeded;
842
1047
  }
1048
+ let snapItemsCount = hasItems ? this._snapItemsCount : 0;
1049
+ let visualItems = this.effectiveItems;
1050
+ if (this.infinite && hasItems) {
1051
+ const V_mult = this._visualCardsMultiplier;
1052
+ visualItems = [];
1053
+ for (let i = 0; i < V_mult; i++) {
1054
+ visualItems = visualItems.concat(this.effectiveItems);
1055
+ }
1056
+ }
843
1057
  const trackWidth = hasItems
844
- ? this.effectiveItems.length * L + (this.effectiveItems.length - 1) * this.gap
1058
+ ? snapItemsCount * L + (snapItemsCount - 1) * this.gap
845
1059
  : 0;
846
1060
  const isScrollable = hasItems && this._scrollContainer &&
847
1061
  (this._scrollContainer.scrollWidth > this._scrollContainer.clientWidth);
848
- const showPrevArrow = isScrollable && this._scrollContainer.scrollLeft > 5;
849
- const showNextArrow = isScrollable &&
850
- (this._scrollContainer.scrollWidth - this._scrollContainer.scrollLeft - this._scrollContainer.clientWidth > 5);
1062
+ const showPrevArrow = this.infinite || (isScrollable && this._scrollContainer.scrollLeft > 5);
1063
+ const showNextArrow = this.infinite || (isScrollable &&
1064
+ (this._scrollContainer.scrollWidth - this._scrollContainer.scrollLeft - this._scrollContainer.clientWidth > 5));
851
1065
  return html `
852
1066
  <div class="carousel-container" style="
853
1067
  --carousel-snap-width: ${L}px;
@@ -894,34 +1108,35 @@ let MoniCarousel = class MoniCarousel extends MoniElement {
894
1108
  @mousedown=${this._handleMouseDown}
895
1109
  @mousemove=${this._handleMouseMove}
896
1110
  @mouseup=${this._handleMouseUp}
897
- @mouseleave=${this._handleMouseUp}
1111
+ @mouseenter=${this._handleMouseEnter}
1112
+ @mouseleave=${this._handleMouseLeave}
898
1113
  @touchstart=${this._handleTouchStart}
899
1114
  @touchmove=${this._handleTouchMove}
900
1115
  @touchend=${this._handleTouchEnd}
901
1116
  @wheel=${this._handleWheel}
902
1117
  >
903
1118
  <div class="snap-track">
904
- ${hasItems ? this.effectiveItems.map(() => html `<div class="snap-item"></div>`) : ''}
1119
+ ${hasItems ? Array.from({ length: snapItemsCount }).map(() => html `<div class="snap-item"></div>`) : ''}
905
1120
  </div>
906
1121
  <div class="visual-track">
907
1122
  ${hasItems
908
- ? this.effectiveItems.map((item, idx) => html `
1123
+ ? visualItems.map((item, idx) => html `
909
1124
  <div
910
1125
  class="card"
911
1126
  @click=${(e) => this._handleCardClick(e, item, idx)}
912
1127
  >
913
1128
  ${item.href
914
1129
  ? html `
915
- <a href="${item.href}" target="${item.target || '_self'}" style="text-decoration:none; color:inherit;">
1130
+ <a href="${item.href}" target="${item.target || '_self'}" style="text-decoration:none; color:inherit;" draggable="false">
916
1131
  <div class="img-parallax-container">
917
- <img src="${item.img}" alt="${item.title}" draggable="false" />
1132
+ <img src="${item.img}" alt="${item.title}" draggable="false" loading="lazy" />
918
1133
  </div>
919
1134
  <h2 class="card-title">${item.title}</h2>
920
1135
  </a>
921
1136
  `
922
1137
  : html `
923
1138
  <div class="img-parallax-container">
924
- <img src="${item.img}" alt="${item.title}" draggable="false" />
1139
+ <img src="${item.img}" alt="${item.title}" draggable="false" loading="lazy" />
925
1140
  </div>
926
1141
  <h2 class="card-title">${item.title}</h2>
927
1142
  `}
@@ -986,6 +1201,15 @@ __decorate([
986
1201
  __decorate([
987
1202
  property({ type: Boolean, attribute: 'hide-nav' })
988
1203
  ], MoniCarousel.prototype, "hideNav", void 0);
1204
+ __decorate([
1205
+ property({ type: Boolean, reflect: true })
1206
+ ], MoniCarousel.prototype, "infinite", void 0);
1207
+ __decorate([
1208
+ property({ type: Boolean, reflect: true })
1209
+ ], MoniCarousel.prototype, "autoplay", void 0);
1210
+ __decorate([
1211
+ property({ type: Number, attribute: 'autoplay-interval' })
1212
+ ], MoniCarousel.prototype, "autoplayInterval", void 0);
989
1213
  __decorate([
990
1214
  state()
991
1215
  ], MoniCarousel.prototype, "_containerWidth", void 0);
@@ -1,34 +1,139 @@
1
+ /**
2
+ * @file components/moni-checkbox.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
- * Checkbox that faithfully ports BeerCSS's `.checkbox` styles.
4
- *
5
- * BeerCSS architecture:
6
- * - `.checkbox` is inline-flex, aligns items center
7
- * - `input` has width/height = --_size, opacity: 0 (occupies real space, no absolute!)
8
- * - `span::before` is the visible checkbox box (position: absolute, inset from the input)
9
- * - `span::after` is the ripple hover effect
10
- * - Content is set via CSS: "check_box_outline_blank" / "check_box" (Material Symbols font)
11
- *
12
- * Attributes:
13
- * - label: text label
14
- * - checked: present input is checked
15
- * - disabled: present → input is disabled
16
- * - size: small | medium (default) | large | extra
17
- * - name: forwarded to input.name
18
- * - value: forwarded to input.value
9
+ * Material Design 3 Checkbox component.
10
+ *
11
+ * Checkboxes allow users to select one or more items from a set, or toggle
12
+ * a single binary option. They are visual-only shells the consumer is
13
+ * responsible for wiring up form submission and validation logic.
14
+ *
15
+ * **Visual architecture (BeerCSS pattern):**
16
+ * The native `<input type="checkbox">` occupies real layout space (16×16 minimum)
17
+ * but is visually hidden via `opacity: 0`. A `<span>` sibling rendered after
18
+ * the input holds two pseudo-elements:
19
+ * - `::before` — the visible checkbox icon (Material Symbols ligature).
20
+ * - `::after` the hover/focus state layer ripple ring.
21
+ *
22
+ * The `::before` content switches between:
23
+ * - `'check_box_outline_blank'` (unchecked)
24
+ * - `'check_box'` (checked)
25
+ * - `'indeterminate_check_box'` (native indeterminate state)
26
+ *
27
+ * **Form integration:**
28
+ * Setting `name` and `value` passes them to the native `<input>` element,
29
+ * enabling participation in HTML form submissions.
30
+ *
31
+ * @fires change - Bubbles and is composed. Fired when the checkbox is toggled.
32
+ * The consumer can read `element.checked` for the new state.
33
+ *
34
+ * @example
35
+ * ```html
36
+ * <moni-checkbox label="Accept terms" name="terms" value="yes"></moni-checkbox>
37
+ *
38
+ * <script>
39
+ * document.querySelector('moni-checkbox').addEventListener('change', (e) => {
40
+ * console.log('checked:', e.target.checked);
41
+ * });
42
+ * </script>
43
+ * ```
44
+ *
45
+ * @csspart checkbox - The outer `<label>` element.
19
46
  */
20
47
  export declare class MoniCheckbox extends MoniElement {
48
+ /**
49
+ * Text label displayed to the right of the checkbox icon.
50
+ *
51
+ * When non-empty, the label is rendered as a text node inside the `<span>`.
52
+ * When empty, the default slot is rendered instead, allowing slotted HTML.
53
+ *
54
+ * @default ''
55
+ */
21
56
  label: string;
57
+ /**
58
+ * Whether the checkbox is currently checked.
59
+ *
60
+ * Reflected as an attribute so CSS attribute selectors and external state
61
+ * readers can observe the checked state without accessing the JS property.
62
+ * Synced to the native input via `updated()`.
63
+ *
64
+ * @default false
65
+ */
22
66
  checked: boolean;
67
+ /**
68
+ * When `true`, the native input is disabled: the checkbox is not interactive
69
+ * and renders at 50% opacity.
70
+ *
71
+ * @default false
72
+ */
23
73
  disabled: boolean;
74
+ /**
75
+ * Visual size of the checkbox icon.
76
+ *
77
+ * Maps to the `--_size` custom property which controls both the invisible
78
+ * input's hit area and the visible `::before` icon size.
79
+ *
80
+ * | Value | `--_size` |
81
+ * |------------|-----------|
82
+ * | `'small'` | 1rem |
83
+ * | `'medium'` | 1.5rem |
84
+ * | `'large'` | 2rem |
85
+ * | `'extra'` | 2.5rem |
86
+ *
87
+ * @default 'medium'
88
+ */
24
89
  size: 'small' | 'medium' | 'large' | 'extra';
90
+ /**
91
+ * Forwarded to the native `<input name>` attribute.
92
+ * Required for grouping checkboxes within a form.
93
+ *
94
+ * @default ''
95
+ */
25
96
  name: string;
97
+ /**
98
+ * Forwarded to the native `<input value>` attribute.
99
+ * The value submitted in a form when this checkbox is checked.
100
+ *
101
+ * @default ''
102
+ */
26
103
  value: string;
104
+ /** Direct reference to the native input element for programmatic access. */
27
105
  private _input;
106
+ /**
107
+ * Syncs `checked` and `disabled` back to the native input element after
108
+ * Lit's render cycle, ensuring the DOM stays in sync with component state.
109
+ *
110
+ * This is necessary because Lit's `.property=${value}` binding updates the
111
+ * DOM property, but the `live()` directive and direct property assignment
112
+ * are more reliable for boolean inputs across browser implementations.
113
+ *
114
+ * @param changed - Map of changed property names to their previous values.
115
+ */
28
116
  updated(changed: Map<string, unknown>): void;
29
117
  static styles: import("lit").CSSResult[];
118
+ /**
119
+ * Handles the native input's `change` event.
120
+ *
121
+ * Reads the new checked state from the input and re-dispatches a composed
122
+ * `'change'` event so the signal crosses shadow DOM boundaries and can be
123
+ * heard by parent elements in the light DOM.
124
+ *
125
+ * @param e - The native `change` event from the hidden `<input>`.
126
+ */
30
127
  private _onChange;
31
- render(): import("lit-html").TemplateResult<1>;
128
+ /**
129
+ * Renders the accessible checkbox label structure.
130
+ *
131
+ * The `<label>` wraps the hidden `<input>` and a `<span>` so that clicking
132
+ * anywhere on the label area (including the text) toggles the checkbox.
133
+ * The `has-label` class on the span adds left padding to separate the icon
134
+ * from the label text.
135
+ */
136
+ render(): import("lit").TemplateResult<1>;
32
137
  }
33
138
  declare global {
34
139
  interface HTMLElementTagNameMap {
@@ -1 +1 @@
1
- {"version":3,"file":"moni-checkbox.d.ts","sourceRoot":"","sources":["../../src/components/moni-checkbox.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;GAiBG;AACH,qBACa,YAAa,SAAQ,WAAW;IACf,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,4BAoHpB;IAEF,OAAO,CAAC,SAAS;IAKR,MAAM;CAiBf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,eAAe,EAAE,YAAY,CAAC;KAC9B;CACD;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"moni-checkbox.d.ts","sourceRoot":"","sources":["../../src/components/moni-checkbox.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBACa,YAAa,SAAQ,WAAW;IAC5C;;;;;;;OAOG;IAC0B,KAAK,SAAM;IAExC;;;;;;;;OAQG;IACyC,OAAO,UAAS;IAE5D;;;;;OAKG;IACyC,QAAQ,UAAS;IAE7D;;;;;;;;;;;;;;OAcG;IAEH,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAY;IAExD;;;;;OAKG;IAC0B,IAAI,SAAM;IAEvC;;;;;OAKG;IAC0B,KAAK,SAAM;IAExC,4EAA4E;IAC5D,OAAO,CAAC,MAAM,CAAoB;IAElD;;;;;;;;;OASG;IACM,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAO9C,OAAgB,MAAM,4BAoHpB;IAEF;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAKjB;;;;;;;OAOG;IACM,MAAM;CAiBf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,eAAe,EAAE,YAAY,CAAC;KAC9B;CACD;AAED,eAAe,YAAY,CAAC"}