@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,107 +1,158 @@
1
+ /**
2
+ * @file components/_base/interaction-styles.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { css } from 'lit';
2
9
 
3
10
  /**
4
- * M3 State Layer system — CSS-only implementation.
11
+ * Material Design 3 State Layer system — CSS-only implementation.
5
12
  *
6
- * Material Design 3 defines "state layers" as semi-transparent overlays that
7
- * communicate interactive state: hover, focus, pressed, dragged. These are
8
- * applied via a `::before` pseudo-element so they compose with any background.
13
+ * Material Design 3 defines **state layers** as semi-transparent color overlays
14
+ * that communicate interactive state visually to the user. They are applied on
15
+ * top of a component's background without altering its base color, allowing
16
+ * correct rendering across all surface and container colors.
9
17
  *
10
- * The host element MUST have:
11
- * position: relative (so the pseudo-element positions inside it)
12
- * overflow: hidden (so the layer clips to the element's shape)
18
+ * **M3 state layer opacity values (from the spec):**
19
+ * | State | Opacity |
20
+ * |-----------|---------|
21
+ * | Hover | 8% |
22
+ * | Focus | 12% |
23
+ * | Pressed | 12% |
24
+ * | Dragged | 16% |
13
25
  *
14
- * Usage — include in any interactive component's `static styles`:
15
- * static override styles = [sharedStyles, interactionStyles, css`...`];
26
+ * **Implementation strategy:**
27
+ * The state layer is rendered as a `::before` pseudo-element whose `opacity`
28
+ * transitions between states. A second `::after` pseudo-element provides a
29
+ * CSS-only center-origin ripple on press. For pointer-origin ripples
30
+ * (where the ripple starts at the tap/click point), use `<moni-ripple>` instead.
16
31
  *
17
- * The `.interactive` class activates the state layer. Apply it to the inner
18
- * element (button, anchor, div) that the user interacts with.
32
+ * **Host element requirements:**
33
+ * The element bearing the `.interactive` class MUST have:
34
+ * - `position: relative` — so `::before` / `::after` are contained within it.
35
+ * - `overflow: hidden` — so the expanding ripple clips to the element's shape.
36
+ * - `isolation: isolate` — prevents the pseudo-elements from bleeding into
37
+ * stacking contexts created by parent elements.
19
38
  *
20
- * Reference: https://m3.material.io/foundations/interaction/states/overview
39
+ * **Usage:**
40
+ * ```ts
41
+ * static override styles = [sharedStyles, interactionStyles, css`...`];
42
+ * ```
43
+ * Then in the template:
44
+ * ```html
45
+ * <button class="interactive">Click me</button>
46
+ * ```
47
+ *
48
+ * @see {@link https://m3.material.io/foundations/interaction/states/overview M3 State overview}
21
49
  */
22
50
  export const interactionStyles = css`
23
- /* ─── State layer opacity tokens (M3 spec) ─── */
51
+ /* ─── State layer opacity tokens (M3 spec values) ──────────────────────── */
24
52
  :host {
53
+ /** Opacity applied on hover. M3 spec: 8%. */
25
54
  --_state-hover: 0.08;
55
+ /** Opacity applied on keyboard focus. M3 spec: 12%. */
26
56
  --_state-focus: 0.12;
57
+ /** Opacity applied on press/active. M3 spec: 12%. */
27
58
  --_state-pressed: 0.12;
59
+ /** Opacity applied during drag. M3 spec: 16%. */
28
60
  --_state-dragged: 0.16;
61
+ /**
62
+ * Color of the state layer overlay.
63
+ * Defaults to currentColor so it adapts to the element's text color.
64
+ * Override with --_state-color: var(--primary) for selected states.
65
+ */
29
66
  --_state-color: currentColor;
30
67
  }
31
68
 
32
- /* ─── The pseudo-element overlay ─── */
69
+ /* ─── The interactive container ─────────────────────────────────────────── */
33
70
  .interactive {
34
71
  position: relative;
35
72
  overflow: hidden;
36
- /* Needed for ripple containment */
73
+ /* isolation: isolate prevents the pseudo-elements from mixing with
74
+ parent stacking contexts that use opacity or transform. */
37
75
  isolation: isolate;
38
76
  }
39
77
 
78
+ /* ─── State layer pseudo-element (::before) ─────────────────────────────── */
79
+ /* The layer sits above the element's background but below its content. */
40
80
  .interactive::before {
41
81
  content: '';
42
82
  position: absolute;
43
83
  inset: 0;
84
+ /* Inherit the border-radius from the host so the layer clips correctly
85
+ on rounded buttons, chips, and cards. */
44
86
  border-radius: inherit;
45
87
  background-color: var(--_state-color);
46
- opacity: 0;
47
- pointer-events: none;
48
- /* Use the same transition speed as other properties on the element */
88
+ opacity: 0; /* Hidden by default; transitions in on state change. */
89
+ pointer-events: none; /* Never intercept pointer events. */
49
90
  transition: opacity var(--speed2, 200ms) ease;
50
- /* Ensure the layer sits above background but below content */
91
+ /* z-index 0 places the layer above the background (z=-1 would be behind). */
51
92
  z-index: 0;
52
93
  }
53
94
 
54
- /* Hover */
95
+ /* Hover: slight overlay to signal interactivity. */
55
96
  .interactive:hover::before {
56
97
  opacity: var(--_state-hover);
57
98
  }
58
99
 
59
- /* Focus-visible (keyboard / programmatic) */
100
+ /* Focus-visible: stronger overlay for keyboard / programmatic focus.
101
+ :focus-visible is preferred over :focus to avoid showing the indicator
102
+ on mouse clicks (which have their own press state). */
60
103
  .interactive:focus-visible::before {
61
104
  opacity: var(--_state-focus);
62
105
  }
63
106
 
64
- /* Pressed / active */
107
+ /* Pressed / active: same opacity as focus but instant onset — the transition
108
+ handles the fade-out on pointer-up via the inherited duration. */
65
109
  .interactive:active::before {
66
110
  opacity: var(--_state-pressed);
67
- /* Instant on press fade out on release handled by transition */
111
+ /* transition-duration: 0sstate layer appears instantaneously on press. */
68
112
  transition-duration: 0s;
69
113
  }
70
114
 
71
- /* Disabled — no state layer at all */
115
+ /* Disabled — no state layer rendered at all (not just hidden). */
72
116
  .interactive:disabled::before,
73
117
  .interactive[aria-disabled='true']::before,
74
118
  :host([disabled]) .interactive::before {
75
119
  display: none;
76
120
  }
77
121
 
78
- /* ─── Selected/active modifier ─── */
79
- /* When an element is in a "selected" state (e.g. active nav item, checked
80
- chip) the state layer color shifts to match the container color. */
122
+ /* ─── Selected / active modifier ────────────────────────────────────────── */
123
+ /* When a component is in a "selected" state (active nav item, checked chip,
124
+ current tab), the state layer color switches to the primary color so the
125
+ overlay is visually meaningful even on primary-container backgrounds. */
81
126
  .interactive.selected::before,
82
127
  .interactive[aria-selected='true']::before,
83
128
  .interactive[aria-current]::before {
84
129
  --_state-color: var(--primary);
130
+ /* Always show a subtle primary overlay to reinforce the selected state. */
85
131
  opacity: var(--_state-hover);
86
132
  }
87
133
  .interactive.selected:hover::before,
88
134
  .interactive[aria-selected='true']:hover::before {
135
+ /* Increase opacity slightly on hover within a selected element. */
89
136
  opacity: calc(var(--_state-hover) * 1.5);
90
137
  }
91
138
 
92
- /* ─── Ensure content renders above the state layer ─── */
139
+ /* ─── Content z-index ────────────────────────────────────────────────────── */
140
+ /* Ensure all direct children of .interactive render above the state layer
141
+ (z-index: 0) and the ripple pseudo-element (z-index: 0). */
93
142
  .interactive > * {
94
143
  position: relative;
95
144
  z-index: 1;
96
145
  }
97
146
 
98
- /* ─── Ripple (CSS-only expanding circle) ─── */
99
- /* This provides a basic CSS ripple from center on :active.
100
- For a pointer-origin ripple, use <moni-ripple> with JS activation. */
147
+ /* ─── CSS-only center-origin ripple (::after) ───────────────────────────── */
148
+ /* Provides a basic expanding circle animation on :active. The circle always
149
+ originates from the element's center. For a pointer-origin ripple (where
150
+ the ripple starts at the exact tap/click coordinate), use <moni-ripple>
151
+ with JS activation instead. */
101
152
  .interactive::after {
102
153
  content: '';
103
154
  position: absolute;
104
- inset: 50%;
155
+ inset: 50%; /* Collapses to a point at the center. */
105
156
  border-radius: 50%;
106
157
  background-color: var(--_state-color);
107
158
  opacity: 0;
@@ -110,11 +161,13 @@ export const interactionStyles = css`
110
161
  z-index: 0;
111
162
  }
112
163
 
164
+ /* Trigger the ripple keyframe animation on active/press. */
113
165
  .interactive:active::after {
114
166
  animation: to-ripple var(--speed3, 300ms) cubic-bezier(0.2, 0, 0, 1) forwards;
115
167
  }
116
168
 
117
- /* Disable ripple animation when motion is reduced */
169
+ /* Respect the user's reduced-motion preference by disabling the ripple.
170
+ The ::before state layer still functions, providing a static visual cue. */
118
171
  @media (prefers-reduced-motion: reduce) {
119
172
  .interactive::after {
120
173
  display: none;
@@ -1,18 +1,54 @@
1
+ /**
2
+ * @file components/_base/moni-element.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { LitElement } from 'lit';
2
9
 
3
10
  /**
4
- * Base class for every Moni UI Web Component.
11
+ * Abstract base class for every Moni UI Web Component.
12
+ *
13
+ * **Design philosophy — visual shells, no behavior:**
14
+ * All Moni components are intentionally "dumb" — they encapsulate only
15
+ * visual structure, styling, and attribute-to-DOM mapping. Consumers own
16
+ * interaction logic, validation, async data fetching, and state management.
17
+ * This keeps components framework-agnostic and composable with any
18
+ * state management solution (Svelte stores, Vue reactive, vanilla JS, etc.).
19
+ *
20
+ * **Shadow DOM:**
21
+ * The default `LitElement.createRenderRoot()` returns an open shadow root,
22
+ * which is preserved here unchanged. Shadow DOM encapsulation ensures that
23
+ * internal CSS class names (`.button`, `.field`, `.slider`, etc.) do not leak
24
+ * into or collide with the consumer's global stylesheet.
25
+ *
26
+ * **Extension contract:**
27
+ * Every subclass must:
28
+ * 1. Be decorated with `@customElement('moni-<name>')`.
29
+ * 2. Define `static override styles = [sharedStyles, css`...`]`.
30
+ * 3. Implement `override render(): TemplateResult`.
5
31
  *
6
- * This class intentionally adds **no behavior**: components are visual-only
7
- * shells. All styling, slots, and attribute-to-DOM mapping are owned by each
8
- * individual element. Consumers wire up interaction, validation, async logic,
9
- * and state management themselves.
32
+ * Subclasses MUST NOT add behavior (event handling, timers, fetch calls) that
33
+ * is not directly related to rendering the shadow DOM. See CONTRIBUTING.md
34
+ * for the full component authoring guide.
10
35
  *
11
- * The default LitElement `createRenderRoot` returns a standard open shadow
12
- * root, which is what we want — BeerCSS class names like `.button`, `.field`,
13
- * `.slider`, etc. live inside the shadow root and stay encapsulated.
36
+ * @see {@link https://lit.dev/docs/components/overview/ Lit component overview}
14
37
  */
15
38
  export class MoniElement extends LitElement {
39
+ /**
40
+ * Returns the component's render root.
41
+ *
42
+ * Delegates to `LitElement.createRenderRoot()` which attaches an **open**
43
+ * shadow root (`{ mode: 'open' }`). Open mode allows external tools (browser
44
+ * devtools, testing frameworks) to traverse the shadow tree.
45
+ *
46
+ * This override exists explicitly to document the shadow root mode and to
47
+ * provide a hook for subclasses that may need to change the root in the future
48
+ * (e.g. to support `adoptedStyleSheets` in a specific environment).
49
+ *
50
+ * @returns The shadow root that Lit will render templates into.
51
+ */
16
52
  protected override createRenderRoot() {
17
53
  return super.createRenderRoot();
18
54
  }
@@ -1,25 +1,51 @@
1
+ /**
2
+ * @file components/_base/shared-styles.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  import { css } from 'lit';
2
9
 
3
10
  /**
4
- * Shared baseline injected into every Moni Web Component shadow root.
11
+ * Baseline CSS injected into the shadow root of **every** Moni Web Component.
12
+ *
13
+ * This stylesheet is the foundational layer of the Moni design system. It serves
14
+ * four distinct responsibilities:
15
+ *
16
+ * **1. Box-sizing reset**
17
+ * Applies `box-sizing: border-box` to `:host`, all descendants, and slotted
18
+ * elements so every component has predictable sizing without override surprises.
19
+ *
20
+ * **2. CSS custom property bridge (Token namespace)**
21
+ * The component library uses short "bare" variable names internally (e.g.
22
+ * `var(--primary)`) for concise CSS. Because shadow DOM isolates custom
23
+ * properties by default, this sheet creates a bridge that resolves these
24
+ * internal names from the global token namespaces in the following priority:
5
25
  *
6
- * Provides:
7
- * 1. Box-sizing reset on the host and its descendants.
8
- * 2. CSS custom property bridge: exposes the **BeerCSS token namespace**
9
- * (`--primary`, `--on-primary`, `--surface`, `--elevate1`, …) inside the
10
- * shadow root, falling back to sensible Material 3 defaults if the host
11
- * document has not provided the alias yet.
12
- * 3. The `--md-sys-color-*` and `--color-*` aliases kept for backward
13
- * compatibility with the MD3 theme engine that the rest of the Moni apps
14
- * (MoniAuth-Client, MoniAuth-Yo, Moni-Labs) still rely on.
15
- * 4. Helper utility classes (`.truncate`, `.visually-hidden`).
26
+ * `--moni-*` (Moni namespace) → `--md-sys-color-*` (MD3 spec) → hardcoded M3 default
16
27
  *
17
- * The MD3 BeerCSS mapping is intentionally *inverted* with respect to the
18
- * previous design: BeerCSS variables are the primary, MD3 ones are aliases.
19
- * Components authored against `var(--primary)` will work in any environment
20
- * that ships the MD3 scheme because the alias resolves upstream.
28
+ * This lets a host document use any of the three namespaces to theme components.
29
+ *
30
+ * **3. MD3 `--color-*` aliases**
31
+ * A second `:host` block maps the older `--color-<role>` prefix to the primary
32
+ * bare tokens. These aliases ensure backward compatibility with Moni apps
33
+ * (MoniAuth-Client, MoniAuth-Yo) that still reference `--color-primary`, etc.
34
+ *
35
+ * **4. Utility classes**
36
+ * Provides `.truncate` (single-line text clipping) and `.visually-hidden`
37
+ * (screen-reader-only content) for use inside component shadow trees.
38
+ *
39
+ * **Usage:**
40
+ * ```ts
41
+ * static override styles = [sharedStyles, css`/* component-specific styles *\/`];
42
+ * ```
43
+ *
44
+ * @see {@link fieldStyles} — Additional styles for input field components.
45
+ * @see {@link interactionStyles} — M3 state layer system for interactive elements.
21
46
  */
22
47
  export const sharedStyles = css`
48
+ /* ─── 1. Box-sizing reset ─────────────────────────────────────────────── */
23
49
  :host {
24
50
  box-sizing: border-box;
25
51
  font-family: var(--font);
@@ -39,15 +65,67 @@ export const sharedStyles = css`
39
65
  font-style: normal;
40
66
  }
41
67
 
42
- /* ─── BeerCSS primary tokens (with MD3 fallbacks) ─── */
68
+ /* ─── 2. CSS custom property bridge ──────────────────────────────────── */
69
+ /* Each token resolves in order: Moni namespace → MD3 spec → M3 default. */
43
70
  :host {
44
- /* ─── BeerCSS structural tokens ─── */
71
+ /* ─── Primary palette ─── */
72
+ --primary: var(--moni-primary, var(--md-sys-color-primary, #6750A4));
73
+ --on-primary: var(--moni-on-primary, var(--md-sys-color-on-primary, #ffffff));
74
+ --primary-container: var(--moni-primary-container, var(--md-sys-color-primary-container, #eaddff));
75
+ --on-primary-container: var(--moni-on-primary-container, var(--md-sys-color-on-primary-container, #21005d));
76
+
77
+ /* ─── Secondary palette ─── */
78
+ --secondary: var(--moni-secondary, var(--md-sys-color-secondary, #625b71));
79
+ --on-secondary: var(--moni-on-secondary, var(--md-sys-color-on-secondary, #ffffff));
80
+ --secondary-container: var(--moni-secondary-container, var(--md-sys-color-secondary-container, #e8def8));
81
+ --on-secondary-container: var(--moni-on-secondary-container, var(--md-sys-color-on-secondary-container, #1d192b));
82
+
83
+ /* ─── Tertiary palette ─── */
84
+ --tertiary: var(--moni-tertiary, var(--md-sys-color-tertiary, #7d5260));
85
+ --on-tertiary: var(--moni-on-tertiary, var(--md-sys-color-on-tertiary, #ffffff));
86
+ --tertiary-container: var(--moni-tertiary-container, var(--md-sys-color-tertiary-container, #ffd8e4));
87
+ --on-tertiary-container: var(--moni-on-tertiary-container, var(--md-sys-color-on-tertiary-container, #31111d));
88
+
89
+ /* ─── Error palette ─── */
90
+ --error: var(--moni-error, var(--md-sys-color-error, #b3261e));
91
+ --on-error: var(--moni-on-error, var(--md-sys-color-on-error, #ffffff));
92
+ --error-container: var(--moni-error-container, var(--md-sys-color-error-container, #f9dedc));
93
+ --on-error-container: var(--moni-on-error-container, var(--md-sys-color-on-error-container, #410e0b));
94
+
95
+ /* ─── Background & surface ─── */
96
+ --background: var(--moni-background, var(--md-sys-color-background, #fef7ff));
97
+ --on-background: var(--moni-on-background, var(--md-sys-color-on-background, #1d1b20));
98
+ --surface: var(--moni-surface, var(--md-sys-color-surface, #fef7ff));
99
+ --on-surface: var(--moni-on-surface, var(--md-sys-color-on-surface, #1d1b20));
100
+ --surface-variant: var(--moni-surface-variant, var(--md-sys-color-surface-variant, #e7e0ec));
101
+ --on-surface-variant: var(--moni-on-surface-variant, var(--md-sys-color-on-surface-variant, #49454f));
102
+
103
+ /* ─── Outline ─── */
104
+ --outline: var(--moni-outline, var(--md-sys-color-outline, #79747e));
105
+ --outline-variant: var(--moni-outline-variant, var(--md-sys-color-outline-variant, #cac4d0));
106
+
107
+ /* ─── Surface container hierarchy (5-level elevation tones) ─── */
108
+ --surface-container-lowest: var(--moni-surface-container-lowest, var(--md-sys-color-surface-container-lowest, #ffffff));
109
+ --surface-container-low: var(--moni-surface-container-low, var(--md-sys-color-surface-container-low, #f7f2fa));
110
+ --surface-container: var(--moni-surface-container, var(--md-sys-color-surface-container, #f3edf7));
111
+ --surface-container-high: var(--moni-surface-container-high, var(--md-sys-color-surface-container-high, #ece6f0));
112
+ --surface-container-highest: var(--moni-surface-container-highest, var(--md-sys-color-surface-container-highest, #e6e1e5));
113
+
114
+ /* ─── Inverse surfaces (snackbar, tooltip) ─── */
115
+ --inverse-surface: var(--moni-inverse-surface, var(--md-sys-color-inverse-surface, #313033));
116
+ --inverse-on-surface: var(--moni-inverse-on-surface, var(--md-sys-color-inverse-on-surface, #f4f0f4));
117
+ --inverse-primary: var(--moni-inverse-primary, var(--md-sys-color-inverse-primary, #d0bcff));
118
+
119
+ /* ─── Structural / non-color tokens ─── */
120
+ /* Scrim overlay used in modals, bottom sheets, dialogs. */
45
121
  --shadow: 0 0 0 0 transparent;
46
122
  --scrim: rgb(0 0 0 / 0.5);
123
+ /* State layer color for hover/pressed overlays. */
47
124
  --active: color-mix(in srgb, currentColor 10%, transparent);
48
125
  --overlay: rgb(0 0 0 / 0.5);
49
126
  --image: linear-gradient(currentColor 0 0);
50
127
 
128
+ /* ─── Typography tokens ─── */
51
129
  --font: var(--moni-font-sans, 'Geist', system-ui, -apple-system, sans-serif);
52
130
  --font-title: var(
53
131
  --moni-font-title,
@@ -56,19 +134,25 @@ export const sharedStyles = css`
56
134
  serif
57
135
  );
58
136
  --font-mono: 'Geist Mono', 'Fira Code', monospace;
137
+ /* Icon font: override via --font-icon-override to use a different icon set. */
59
138
  --font-icon: var(--font-icon-override, 'Material Symbols Rounded');
60
139
 
140
+ /* ─── Elevation shadows (MD3 tonal levels 1–3) ─── */
61
141
  --elevate1: 0 0.125rem 0.125rem 0 rgb(0 0 0 / 0.32);
62
142
  --elevate2: 0 0.25rem 0.5rem 0 rgb(0 0 0 / 0.4);
63
143
  --elevate3: 0 0.375rem 0.75rem 0 rgb(0 0 0 / 0.48);
64
144
 
145
+ /* ─── Transition speed scale ─── */
146
+ /* speed1 = fastest micro-interactions; speed4 = slowest page transitions. */
65
147
  --speed1: 100ms;
66
148
  --speed2: 200ms;
67
149
  --speed3: 300ms;
68
150
  --speed4: 400ms;
69
151
  }
70
152
 
71
- /* ─── MD3 aliases (kept for backward compatibility) ─── */
153
+ /* ─── 3. MD3 --color-* backward-compatibility aliases ─────────────── */
154
+ /* These map the older --color-<role> naming convention used in legacy */
155
+ /* Moni apps to the primary bare tokens above. Do not remove. */
72
156
  :host {
73
157
  --color-primary: var(--primary);
74
158
  --color-on-primary: var(--on-primary);
@@ -110,8 +194,7 @@ export const sharedStyles = css`
110
194
  --color-inverse-on-surface: var(--inverse-on-surface);
111
195
  --color-inverse-primary: var(--inverse-primary);
112
196
 
113
- /* Tokens previously defined in tokens.css keep names stable so the
114
- apps that import them continue to work. */
197
+ /* Named aliases for tokens defined in the legacy tokens.css stylesheet. */
115
198
  --font-sans: var(--font);
116
199
  --shadow-1: var(--elevate1);
117
200
  --shadow-2: var(--elevate2);
@@ -125,13 +208,23 @@ export const sharedStyles = css`
125
208
  --duration-normal: 250ms;
126
209
  }
127
210
 
128
- /* ─── Utility classes ─── */
211
+ /* ─── 4. Utility classes ─────────────────────────────────────────────── */
212
+
213
+ /**
214
+ * Clamps text to a single line with an ellipsis when overflow occurs.
215
+ * Apply to any element inside a shadow root where text needs to be truncated.
216
+ */
129
217
  .truncate {
130
218
  overflow: hidden;
131
219
  white-space: nowrap;
132
220
  text-overflow: ellipsis;
133
221
  }
134
222
 
223
+ /**
224
+ * Visually hides an element while keeping it accessible to screen readers
225
+ * and maintaining its position in the DOM and tab order.
226
+ * Use for labeling icon-only buttons, skip links, etc.
227
+ */
135
228
  .visually-hidden {
136
229
  position: absolute;
137
230
  width: 1px;
@@ -1,3 +1,10 @@
1
+ /**
2
+ * @file components/index.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  // Auto-register all Moni UI Web Components.
2
9
  // Importing this file defines every <moni-*> custom element.
3
10
 
@@ -1,3 +1,10 @@
1
+ /**
2
+ * @file components/loading-shapes.ts
3
+ * @package @moni-labs/moni-ui
4
+ * @license MIT
5
+ * @contributors Moni Labs & Contributors
6
+ */
7
+
1
8
  export const loadingIndicatorPolygons = {
2
9
  '4-sided-cookie': '63.83% 2.22%, 65.10% 1.70%, 66.36% 1.26%, 67.62% 0.89%, 68.88% 0.58%, 70.14% 0.34%, 71.39% 0.16%, 72.63% 0.05%, 73.86% 0.00%, 75.08% 0.01%, 76.28% 0.08%, 77.48% 0.21%, 78.66% 0.40%, 79.82% 0.63%, 80.97% 0.93%, 82.09% 1.27%, 83.20% 1.67%, 84.28% 2.11%, 85.34% 2.60%, 86.37% 3.14%, 87.38% 3.72%, 88.36% 4.35%, 89.31% 5.02%, 90.23% 5.73%, 91.12% 6.48%, 91.98% 7.26%, 92.80% 8.09%, 93.58% 8.94%, 94.32% 9.83%, 95.03% 10.76%, 95.70% 11.71%, 96.32% 12.69%, 96.90% 13.70%, 97.43% 14.74%, 97.92% 15.80%, 98.36% 16.88%, 98.76% 17.99%, 99.10% 19.12%, 99.38% 20.26%, 99.62% 21.43%, 99.80% 22.61%, 99.92% 23.80%, 99.99% 25.01%, 100.00% 26.23%, 99.94% 27.47%, 99.83% 28.71%, 99.65% 29.95%, 99.40% 31.21%, 99.09% 32.47%, 98.71% 33.73%, 98.26% 35.00%, 97.75% 36.25%, 97.26% 37.36%, 96.78% 38.47%, 96.30% 39.59%, 95.83% 40.72%, 95.42% 41.87%, 95.06% 43.03%, 94.76% 44.21%, 94.52% 45.40%, 94.33% 46.59%, 94.20% 47.79%, 94.12% 48.99%, 94.11% 50.19%, 94.14% 51.40%, 94.24% 52.60%, 94.39% 53.80%, 94.59% 54.99%, 94.85% 56.17%, 95.17% 57.34%, 95.55% 58.50%, 95.98% 59.65%, 96.45% 60.77%, 96.94% 61.89%, 97.42% 63.00%, 97.92% 64.15%, 98.41% 65.41%, 98.84% 66.68%, 99.20% 67.94%, 99.49% 69.20%, 99.71% 70.45%, 99.87% 71.70%, 99.97% 72.93%, 100.00% 74.16%, 99.97% 75.38%, 99.89% 76.58%, 99.75% 77.78%, 99.55% 78.95%, 99.30% 80.11%, 98.99% 81.25%, 98.63% 82.37%, 98.23% 83.47%, 97.77% 84.55%, 97.27% 85.60%, 96.72% 86.63%, 96.12% 87.63%, 95.49% 88.60%, 94.81% 89.55%, 94.09% 90.46%, 93.33% 91.34%, 92.54% 92.19%, 91.70% 93.00%, 90.84% 93.77%, 89.94% 94.51%, 89.01% 95.20%, 88.05% 95.86%, 87.06% 96.47%, 86.04% 97.04%, 85.00% 97.56%, 83.93% 98.04%, 82.84% 98.47%, 81.73% 98.85%, 80.60% 99.17%, 79.45% 99.45%, 78.28% 99.67%, 77.09% 99.84%, 75.89% 99.95%, 74.68% 100.00%, 73.46% 99.99%, 72.23% 99.92%, 70.98% 99.79%, 69.73% 99.59%, 68.48% 99.33%, 67.22% 99.00%, 65.95% 98.60%, 64.69% 98.14%, 63.47% 97.63%, 62.36% 97.14%, 61.25% 96.66%, 60.13% 96.18%, 58.99% 95.72%, 57.84% 95.32%, 56.67% 94.98%, 55.49% 94.70%, 54.31% 94.47%, 53.11% 94.29%, 51.91% 94.18%, 50.71% 94.11%, 49.50% 94.11%, 48.30% 94.16%, 47.10% 94.27%, 45.90% 94.43%, 44.71% 94.65%, 43.53% 94.93%, 42.36% 95.26%, 41.21% 95.65%, 40.07% 96.09%, 38.95% 96.58%, 37.84% 97.06%, 36.72% 97.54%, 35.54% 98.05%, 34.27% 98.53%, 33.01% 98.94%, 31.74% 99.28%, 30.49% 99.55%, 29.24% 99.76%, 27.99% 99.90%, 26.76% 99.98%, 25.53% 100.00%, 24.32% 99.96%, 23.12% 99.86%, 21.93% 99.70%, 20.76% 99.49%, 19.60% 99.23%, 18.47% 98.91%, 17.35% 98.54%, 16.26% 98.12%, 15.19% 97.65%, 14.14% 97.13%, 13.12% 96.57%, 12.12% 95.97%, 11.16% 95.32%, 10.22% 94.63%, 9.32% 93.90%, 8.45% 93.14%, 7.61% 92.33%, 6.81% 91.49%, 6.04% 90.62%, 5.32% 89.71%, 4.63% 88.77%, 3.99% 87.80%, 3.38% 86.81%, 2.83% 85.78%, 2.31% 84.74%, 1.85% 83.66%, 1.43% 82.57%, 1.07% 81.45%, 0.75% 80.31%, 0.49% 79.16%, 0.28% 77.98%, 0.13% 76.80%, 0.04% 75.59%, 0.00% 74.38%, 0.02% 73.15%, 0.11% 71.92%, 0.26% 70.67%, 0.47% 69.42%, 0.75% 68.16%, 1.09% 66.90%, 1.51% 65.64%, 1.99% 64.37%, 2.49% 63.19%, 2.98% 62.08%, 3.46% 60.97%, 3.94% 59.85%, 4.38% 58.71%, 4.77% 57.55%, 5.09% 56.38%, 5.37% 55.20%, 5.58% 54.01%, 5.74% 52.81%, 5.84% 51.61%, 5.89% 50.41%, 5.88% 49.20%, 5.82% 48.00%, 5.70% 46.80%, 5.52% 45.61%, 5.28% 44.42%, 4.99% 43.24%, 4.65% 42.07%, 4.25% 40.92%, 3.79% 39.78%, 3.30% 38.67%, 2.82% 37.56%, 2.34% 36.45%, 1.82% 35.22%, 1.36% 33.95%, 0.97% 32.69%, 0.65% 31.43%, 0.39% 30.18%, 0.20% 28.93%, 0.07% 27.68%, 0.01% 26.45%, 0.01% 25.23%, 0.06% 24.02%, 0.17% 22.82%, 0.34% 21.64%, 0.57% 20.47%, 0.85% 19.32%, 1.18% 18.19%, 1.56% 17.08%, 2.00% 15.99%, 2.48% 14.92%, 3.00% 13.88%, 3.57% 12.87%, 4.19% 11.88%, 4.85% 10.92%, 5.55% 9.99%, 6.29% 9.10%, 7.06% 8.23%, 7.88% 7.41%, 8.72% 6.61%, 9.61% 5.86%, 10.52% 5.14%, 11.47% 4.47%, 12.44% 3.83%, 13.45% 3.24%, 14.48% 2.69%, 15.53% 2.19%, 16.61% 1.74%, 17.71% 1.34%, 18.83% 0.98%, 19.98% 0.68%, 21.14% 0.43%, 22.31% 0.24%, 23.50% 0.10%, 24.71% 0.02%, 25.93% 0.00%, 27.16% 0.04%, 28.39% 0.14%, 29.64% 0.30%, 30.89% 0.53%, 32.15% 0.83%, 33.41% 1.19%, 34.68% 1.62%, 35.94% 2.12%, 37.08% 2.61%, 38.20% 3.10%, 39.31% 3.58%, 40.43% 4.06%, 41.58% 4.48%, 42.74% 4.85%, 43.91% 5.17%, 45.10% 5.43%, 46.29% 5.63%, 47.49% 5.77%, 48.69% 5.86%, 49.89% 5.90%, 51.10% 5.87%, 52.30% 5.79%, 53.50% 5.66%, 54.69% 5.47%, 55.88% 5.22%, 57.05% 4.91%, 58.21% 4.55%, 59.36% 4.14%, 60.49% 3.67%, 61.61% 3.18%, 62.72% 2.70%, 63.83% 2.22%',
3
10
  '9-sided-cookie': '61.39% 5.18%, 62.25% 5.81%, 63.15% 6.37%, 64.08% 6.88%, 65.04% 7.33%, 66.03% 7.71%, 67.04% 8.02%, 68.07% 8.27%, 69.11% 8.45%, 70.17% 8.57%, 71.18% 8.61%, 72.43% 8.63%, 73.38% 8.68%, 74.46% 8.80%, 75.52% 9.00%, 76.56% 9.26%, 77.57% 9.59%, 78.55% 9.98%, 79.50% 10.44%, 80.42% 10.95%, 81.30% 11.52%, 82.14% 12.14%, 82.93% 12.81%, 83.69% 13.54%, 84.39% 14.31%, 85.05% 15.13%, 85.65% 15.99%, 86.20% 16.89%, 86.69% 17.84%, 87.12% 18.81%, 87.49% 19.83%, 87.79% 20.87%, 87.99% 21.78%, 88.22% 23.01%, 88.46% 24.01%, 88.76% 25.02%, 89.14% 26.02%, 89.57% 26.98%, 90.07% 27.91%, 90.63% 28.81%, 91.24% 29.67%, 91.91% 30.49%, 92.64% 31.27%, 93.40% 31.98%, 94.34% 32.79%, 95.02% 33.41%, 95.78% 34.19%, 96.48% 35.02%, 97.12% 35.88%, 97.70% 36.77%, 98.21% 37.69%, 98.66% 38.65%, 99.05% 39.62%, 99.37% 40.62%, 99.63% 41.63%, 99.82% 42.66%, 99.94% 43.70%, 100.00% 44.74%, 99.99% 45.79%, 99.91% 46.84%, 99.76% 47.88%, 99.54% 48.92%, 99.26% 49.95%, 98.90% 50.97%, 98.47% 51.97%, 98.04% 52.81%, 97.43% 53.91%, 96.96% 54.80%, 96.53% 55.77%, 96.16% 56.77%, 95.86% 57.78%, 95.63% 58.81%, 95.46% 59.86%, 95.36% 60.91%, 95.34% 61.97%, 95.38% 63.03%, 95.49% 64.09%, 95.68% 65.27%, 95.82% 66.19%, 95.91% 67.28%, 95.93% 68.36%, 95.88% 69.43%, 95.76% 70.49%, 95.57% 71.53%, 95.32% 72.55%, 95.00% 73.55%, 94.61% 74.53%, 94.17% 75.47%, 93.66% 76.39%, 93.10% 77.27%, 92.48% 78.11%, 91.81% 78.92%, 91.09% 79.68%, 90.31% 80.39%, 89.48% 81.06%, 88.61% 81.68%, 87.69% 82.23%, 86.73% 82.74%, 85.81% 83.14%, 84.74% 83.55%, 83.75% 83.94%, 82.78% 84.40%, 81.85% 84.91%, 80.96% 85.49%, 80.11% 86.11%, 79.30% 86.80%, 78.54% 87.53%, 77.83% 88.31%, 77.17% 89.14%, 76.56% 90.02%, 75.97% 90.98%, 75.43% 91.87%, 74.84% 92.73%, 74.17% 93.59%, 73.45% 94.38%, 72.69% 95.13%, 71.89% 95.82%, 71.04% 96.45%, 70.16% 97.02%, 69.25% 97.53%, 68.30% 97.99%, 67.34% 98.38%, 66.34% 98.71%, 65.33% 98.97%, 64.30% 99.17%, 63.26% 99.30%, 62.21% 99.37%, 61.15% 99.37%, 60.08% 99.29%, 59.02% 99.15%, 57.96% 98.93%, 56.92% 98.65%, 55.99% 98.34%, 54.89% 97.96%, 53.86% 97.67%, 52.82% 97.46%, 51.77% 97.31%, 50.72% 97.23%, 49.66% 97.21%, 48.61% 97.27%, 47.55% 97.39%, 46.51% 97.59%, 45.48% 97.85%, 44.51% 98.16%, 43.35% 98.56%, 42.42% 98.84%, 41.36% 99.08%, 40.30% 99.25%, 39.24% 99.35%, 38.18% 99.38%, 37.12% 99.34%, 36.07% 99.23%, 35.04% 99.05%, 34.02% 98.81%, 33.02% 98.50%, 32.04% 98.13%, 31.09% 97.70%, 30.17% 97.21%, 29.27% 96.66%, 28.42% 96.05%, 27.60% 95.38%, 26.82% 94.66%, 26.08% 93.88%, 25.40% 93.04%, 24.76% 92.16%, 24.27% 91.38%, 23.64% 90.33%, 23.06% 89.45%, 22.42% 88.60%, 21.72% 87.80%, 20.98% 87.05%, 20.19% 86.35%, 19.35% 85.70%, 18.47% 85.11%, 17.56% 84.58%, 16.60% 84.10%, 15.67% 83.70%, 14.49% 83.26%, 13.63% 82.90%, 12.65% 82.42%, 11.72% 81.88%, 10.83% 81.29%, 9.98% 80.64%, 9.19% 79.94%, 8.45% 79.20%, 7.75% 78.41%, 7.12% 77.58%, 6.53% 76.71%, 6.01% 75.81%, 5.54% 74.87%, 5.14% 73.91%, 4.80% 72.92%, 4.52% 71.90%, 4.30% 70.87%, 4.16% 69.82%, 4.08% 68.75%, 4.08% 67.67%, 4.15% 66.59%, 4.26% 65.66%, 4.47% 64.41%, 4.59% 63.41%, 4.66% 62.35%, 4.66% 61.29%, 4.59% 60.23%, 4.44% 59.18%, 4.24% 58.15%, 3.96% 57.13%, 3.62% 56.12%, 3.21% 55.14%, 2.73% 54.19%, 2.14% 53.14%, 1.71% 52.32%, 1.25% 51.33%, 0.87% 50.32%, 0.55% 49.29%, 0.31% 48.25%, 0.14% 47.21%, 0.04% 46.16%, 0.00% 45.11%, 0.03% 44.07%, 0.13% 43.03%, 0.30% 42.00%, 0.53% 40.98%, 0.83% 39.98%, 1.19% 38.99%, 1.62% 38.03%, 2.11% 37.10%, 2.67% 36.19%, 3.28% 35.32%, 3.96% 34.48%, 4.70% 33.69%, 5.41% 33.02%, 6.33% 32.22%, 7.09% 31.54%, 7.84% 30.78%, 8.53% 29.97%, 9.16% 29.12%, 9.74% 28.24%, 10.26% 27.32%, 10.72% 26.37%, 11.11% 25.38%, 11.45% 24.37%, 11.71% 23.34%, 11.94% 22.20%, 12.13% 21.24%, 12.40% 20.20%, 12.75% 19.17%, 13.15% 18.18%, 13.62% 17.23%, 14.15% 16.31%, 14.73% 15.43%, 15.37% 14.60%, 16.06% 13.81%, 16.80% 13.07%, 17.58% 12.37%, 18.40% 11.73%, 19.27% 11.14%, 20.17% 10.61%, 21.11% 10.14%, 22.08% 9.72%, 23.08% 9.37%, 24.11% 9.09%, 25.16% 8.87%, 26.24% 8.72%, 27.27% 8.64%, 28.33% 8.62%, 29.45% 8.59%, 30.51% 8.50%, 31.56% 8.34%, 32.60% 8.12%, 33.62% 7.83%, 34.61% 7.47%, 35.58% 7.05%, 36.52% 6.56%, 37.43% 6.02%, 38.31% 5.41%, 39.15% 4.75%, 39.15% 4.75%, 40.04% 4.03%, 40.85% 3.44%, 41.76% 2.86%, 42.71% 2.35%, 43.68% 1.90%, 44.67% 1.52%, 45.68% 1.21%, 46.70% 0.96%, 47.73% 0.78%, 48.77% 0.67%, 49.81% 0.62%, 50.86% 0.65%, 51.90% 0.73%, 52.94% 0.89%, 53.96% 1.11%, 54.98% 1.40%, 55.97% 1.76%, 56.95% 2.18%, 57.90% 2.67%, 58.83% 3.23%, 59.73% 3.85%, 60.46% 4.43%',