aeico-components 0.1.5 → 0.1.6

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 (284) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +0 -0
  3. package/dist/chunks/action-button.cjs +296 -0
  4. package/dist/chunks/action-button.cjs.map +1 -0
  5. package/dist/chunks/action-button.js +297 -0
  6. package/dist/chunks/action-button.js.map +1 -0
  7. package/dist/chunks/alert.cjs +4 -4
  8. package/dist/chunks/alert.cjs.map +1 -1
  9. package/dist/chunks/alert.js +5 -5
  10. package/dist/chunks/alert.js.map +1 -1
  11. package/dist/chunks/badge.cjs +1 -1
  12. package/dist/chunks/badge.cjs.map +1 -1
  13. package/dist/chunks/badge.js +2 -2
  14. package/dist/chunks/badge.js.map +1 -1
  15. package/dist/chunks/breadcrumb-item.cjs +2 -2
  16. package/dist/chunks/breadcrumb-item.cjs.map +1 -1
  17. package/dist/chunks/breadcrumb-item.js +3 -3
  18. package/dist/chunks/breadcrumb-item.js.map +1 -1
  19. package/dist/chunks/button-group.cjs +1 -1
  20. package/dist/chunks/button-group.cjs.map +1 -1
  21. package/dist/chunks/button-group.js +2 -2
  22. package/dist/chunks/button-group.js.map +1 -1
  23. package/dist/chunks/button.cjs +1 -1
  24. package/dist/chunks/button.cjs.map +1 -1
  25. package/dist/chunks/button.js +2 -2
  26. package/dist/chunks/button.js.map +1 -1
  27. package/dist/chunks/card.cjs +1 -1
  28. package/dist/chunks/card.cjs.map +1 -1
  29. package/dist/chunks/card.js +2 -2
  30. package/dist/chunks/card.js.map +1 -1
  31. package/dist/chunks/checkbox.cjs +18 -5
  32. package/dist/chunks/checkbox.cjs.map +1 -1
  33. package/dist/chunks/checkbox.js +18 -5
  34. package/dist/chunks/checkbox.js.map +1 -1
  35. package/dist/chunks/copy-button.cjs +168 -0
  36. package/dist/chunks/copy-button.cjs.map +1 -0
  37. package/dist/chunks/copy-button.js +169 -0
  38. package/dist/chunks/copy-button.js.map +1 -0
  39. package/dist/chunks/detail.cjs +7 -4
  40. package/dist/chunks/detail.cjs.map +1 -1
  41. package/dist/chunks/detail.js +8 -5
  42. package/dist/chunks/detail.js.map +1 -1
  43. package/dist/chunks/dialog.cjs +1 -1
  44. package/dist/chunks/dialog.cjs.map +1 -1
  45. package/dist/chunks/dialog.js +2 -2
  46. package/dist/chunks/dialog.js.map +1 -1
  47. package/dist/chunks/divider.cjs +1 -1
  48. package/dist/chunks/divider.cjs.map +1 -1
  49. package/dist/chunks/divider.js +2 -2
  50. package/dist/chunks/divider.js.map +1 -1
  51. package/dist/chunks/drawer.cjs +180 -0
  52. package/dist/chunks/drawer.cjs.map +1 -0
  53. package/dist/chunks/drawer.js +181 -0
  54. package/dist/chunks/drawer.js.map +1 -0
  55. package/dist/chunks/dropdown-button.cjs +2 -2
  56. package/dist/chunks/dropdown-button.cjs.map +1 -1
  57. package/dist/chunks/dropdown-button.js +3 -3
  58. package/dist/chunks/dropdown-button.js.map +1 -1
  59. package/dist/chunks/icon.cjs +31 -1
  60. package/dist/chunks/icon.cjs.map +1 -1
  61. package/dist/chunks/icon.js +32 -2
  62. package/dist/chunks/icon.js.map +1 -1
  63. package/dist/chunks/menu.cjs +396 -0
  64. package/dist/chunks/menu.cjs.map +1 -0
  65. package/dist/chunks/menu.js +397 -0
  66. package/dist/chunks/menu.js.map +1 -0
  67. package/dist/chunks/navbar.cjs +1 -1
  68. package/dist/chunks/navbar.cjs.map +1 -1
  69. package/dist/chunks/navbar.js +2 -2
  70. package/dist/chunks/navbar.js.map +1 -1
  71. package/dist/chunks/pagination.cjs +475 -0
  72. package/dist/chunks/pagination.cjs.map +1 -0
  73. package/dist/chunks/pagination.js +476 -0
  74. package/dist/chunks/pagination.js.map +1 -0
  75. package/dist/chunks/progress-bar.cjs +101 -0
  76. package/dist/chunks/progress-bar.cjs.map +1 -0
  77. package/dist/chunks/progress-bar.js +102 -0
  78. package/dist/chunks/progress-bar.js.map +1 -0
  79. package/dist/chunks/radio.cjs +11 -7
  80. package/dist/chunks/radio.cjs.map +1 -1
  81. package/dist/chunks/radio.js +11 -7
  82. package/dist/chunks/radio.js.map +1 -1
  83. package/dist/chunks/select.cjs +97 -66
  84. package/dist/chunks/select.cjs.map +1 -1
  85. package/dist/chunks/select.js +97 -66
  86. package/dist/chunks/select.js.map +1 -1
  87. package/dist/chunks/slider.cjs +9 -46
  88. package/dist/chunks/slider.cjs.map +1 -1
  89. package/dist/chunks/slider.js +9 -46
  90. package/dist/chunks/slider.js.map +1 -1
  91. package/dist/chunks/spinner.cjs +102 -0
  92. package/dist/chunks/spinner.cjs.map +1 -0
  93. package/dist/chunks/spinner.js +103 -0
  94. package/dist/chunks/spinner.js.map +1 -0
  95. package/dist/chunks/switch.cjs +110 -16
  96. package/dist/chunks/switch.cjs.map +1 -1
  97. package/dist/chunks/switch.js +111 -17
  98. package/dist/chunks/switch.js.map +1 -1
  99. package/dist/chunks/tab-panel.cjs +3 -3
  100. package/dist/chunks/tab-panel.cjs.map +1 -1
  101. package/dist/chunks/tab-panel.js +4 -4
  102. package/dist/chunks/tab-panel.js.map +1 -1
  103. package/dist/chunks/tag.cjs +1 -1
  104. package/dist/chunks/tag.cjs.map +1 -1
  105. package/dist/chunks/tag.js +2 -2
  106. package/dist/chunks/tag.js.map +1 -1
  107. package/dist/chunks/text-input.cjs +11 -16
  108. package/dist/chunks/text-input.cjs.map +1 -1
  109. package/dist/chunks/text-input.js +11 -16
  110. package/dist/chunks/text-input.js.map +1 -1
  111. package/dist/chunks/textarea.cjs +137 -0
  112. package/dist/chunks/textarea.cjs.map +1 -0
  113. package/dist/chunks/textarea.js +138 -0
  114. package/dist/chunks/textarea.js.map +1 -0
  115. package/dist/chunks/tooltip.cjs +293 -0
  116. package/dist/chunks/tooltip.cjs.map +1 -0
  117. package/dist/chunks/tooltip.js +294 -0
  118. package/dist/chunks/tooltip.js.map +1 -0
  119. package/dist/chunks/tree.cjs +468 -0
  120. package/dist/chunks/tree.cjs.map +1 -0
  121. package/dist/chunks/tree.js +469 -0
  122. package/dist/chunks/tree.js.map +1 -0
  123. package/dist/chunks/variables.cjs +2 -2
  124. package/dist/chunks/variables.js +2 -2
  125. package/dist/copy-button.cjs +6 -0
  126. package/dist/copy-button.cjs.map +1 -0
  127. package/dist/copy-button.js +6 -0
  128. package/dist/copy-button.js.map +1 -0
  129. package/dist/drawer.cjs +6 -0
  130. package/dist/drawer.cjs.map +1 -0
  131. package/dist/drawer.js +6 -0
  132. package/dist/drawer.js.map +1 -0
  133. package/dist/index.cjs +175 -88
  134. package/dist/index.cjs.map +1 -1
  135. package/dist/index.js +186 -99
  136. package/dist/index.js.map +1 -1
  137. package/dist/menu.cjs +6 -0
  138. package/dist/menu.cjs.map +1 -0
  139. package/dist/menu.js +6 -0
  140. package/dist/menu.js.map +1 -0
  141. package/dist/pagination.cjs +6 -0
  142. package/dist/pagination.cjs.map +1 -0
  143. package/dist/pagination.js +6 -0
  144. package/dist/pagination.js.map +1 -0
  145. package/dist/progress-bar.cjs +6 -0
  146. package/dist/progress-bar.cjs.map +1 -0
  147. package/dist/progress-bar.js +6 -0
  148. package/dist/progress-bar.js.map +1 -0
  149. package/dist/select.cjs +1 -1
  150. package/dist/select.cjs.map +1 -1
  151. package/dist/select.js +2 -2
  152. package/dist/select.js.map +1 -1
  153. package/dist/spinner.cjs +6 -0
  154. package/dist/spinner.cjs.map +1 -0
  155. package/dist/spinner.js +6 -0
  156. package/dist/spinner.js.map +1 -0
  157. package/dist/textarea.cjs +5 -0
  158. package/dist/textarea.cjs.map +1 -0
  159. package/dist/textarea.js +5 -0
  160. package/dist/textarea.js.map +1 -0
  161. package/dist/tooltip.cjs +6 -0
  162. package/dist/tooltip.cjs.map +1 -0
  163. package/dist/tooltip.js +6 -0
  164. package/dist/tooltip.js.map +1 -0
  165. package/dist/tree.cjs +6 -0
  166. package/dist/tree.cjs.map +1 -0
  167. package/dist/tree.js +6 -0
  168. package/dist/tree.js.map +1 -0
  169. package/dist/types/aeico-field.d.ts +52 -0
  170. package/dist/types/alert/alert.d.ts +1 -0
  171. package/dist/types/copy-button/copy-button.d.ts +32 -0
  172. package/dist/types/copy-button/defines.d.ts +1 -0
  173. package/dist/types/copy-button/index.d.ts +3 -0
  174. package/dist/types/detail/defines.d.ts +1 -0
  175. package/dist/types/detail/detail.d.ts +3 -1
  176. package/dist/types/detail/index.d.ts +1 -1
  177. package/dist/types/detail-group/detail-group.d.ts +39 -0
  178. package/dist/types/detail-group/index.d.ts +2 -0
  179. package/dist/types/drawer/defines.d.ts +1 -0
  180. package/dist/types/drawer/drawer.d.ts +31 -0
  181. package/dist/types/drawer/index.d.ts +3 -0
  182. package/dist/types/icon/built-in-icons.d.ts +1 -0
  183. package/dist/types/icon/icon.d.ts +1 -0
  184. package/dist/types/icon/registry.d.ts +8 -0
  185. package/dist/types/index.d.ts +17 -0
  186. package/dist/types/menu/defines.d.ts +15 -0
  187. package/dist/types/menu/index.d.ts +5 -0
  188. package/dist/types/menu/menu-item.d.ts +63 -0
  189. package/dist/types/menu/menu.d.ts +34 -0
  190. package/dist/types/number-input/index.d.ts +2 -0
  191. package/dist/types/number-input/number-input.d.ts +35 -0
  192. package/dist/types/pagination/defines.d.ts +2 -0
  193. package/dist/types/pagination/index.d.ts +3 -0
  194. package/dist/types/pagination/pagination.d.ts +77 -0
  195. package/dist/types/select/select.d.ts +2 -2
  196. package/dist/types/spinner/defines.d.ts +3 -0
  197. package/dist/types/spinner/index.d.ts +3 -0
  198. package/dist/types/spinner/spinner.d.ts +35 -0
  199. package/dist/types/switch/defines.d.ts +1 -0
  200. package/dist/types/switch/switch.d.ts +8 -4
  201. package/dist/types/text-input/text-input.d.ts +0 -4
  202. package/dist/types/textarea/index.d.ts +1 -0
  203. package/dist/types/textarea/textarea.d.ts +26 -0
  204. package/dist/types/tooltip/defines.d.ts +2 -0
  205. package/dist/types/tooltip/index.d.ts +4 -0
  206. package/dist/types/tooltip/tooltip.d.ts +48 -0
  207. package/dist/types/tree/defines.d.ts +23 -0
  208. package/dist/types/tree/index.d.ts +5 -0
  209. package/dist/types/tree/tree-item.d.ts +54 -0
  210. package/dist/types/tree/tree.d.ts +64 -0
  211. package/package.json +5 -5
  212. package/src/aeico-field.ts +142 -7
  213. package/src/alert/alert.ts +3 -2
  214. package/src/checkbox/checkbox.ts +17 -2
  215. package/src/copy-button/copy-button.ts +146 -0
  216. package/src/copy-button/defines.ts +5 -0
  217. package/src/copy-button/index.ts +3 -0
  218. package/src/detail/defines.ts +1 -0
  219. package/src/detail/detail.ts +5 -1
  220. package/src/detail/index.ts +1 -1
  221. package/src/detail-group/detail-group.ts +104 -0
  222. package/src/detail-group/index.ts +2 -0
  223. package/src/drawer/defines.ts +1 -0
  224. package/src/drawer/drawer.ts +157 -0
  225. package/src/drawer/index.ts +3 -0
  226. package/src/icon/built-in-icons.ts +21 -0
  227. package/src/icon/icon.ts +1 -0
  228. package/src/icon/registry.ts +22 -0
  229. package/src/index.ts +30 -0
  230. package/src/menu/defines.ts +17 -0
  231. package/src/menu/index.ts +5 -0
  232. package/src/menu/menu-item.ts +315 -0
  233. package/src/menu/menu.ts +81 -0
  234. package/src/number-input/index.ts +2 -0
  235. package/src/number-input/number-input.ts +137 -0
  236. package/src/pagination/defines.ts +2 -0
  237. package/src/pagination/index.ts +3 -0
  238. package/src/pagination/pagination.ts +310 -0
  239. package/src/radio-group/radio-group.ts +11 -4
  240. package/src/select/select.ts +111 -70
  241. package/src/slider/slider.ts +9 -2
  242. package/src/spinner/defines.ts +12 -0
  243. package/src/spinner/index.ts +3 -0
  244. package/src/spinner/spinner.ts +81 -0
  245. package/src/styles/components/action-button.css +37 -0
  246. package/src/styles/components/checkbox.css +4 -26
  247. package/src/styles/components/copy-button.css +119 -0
  248. package/src/styles/components/detail-group.css +10 -0
  249. package/src/styles/components/detail.css +10 -1
  250. package/src/styles/components/drawer.css +161 -0
  251. package/src/styles/components/field-label.css +120 -0
  252. package/src/styles/components/menu-item.css +168 -0
  253. package/src/styles/components/menu.css +17 -0
  254. package/src/styles/components/number-input.css +167 -0
  255. package/src/styles/components/pagination.css +205 -0
  256. package/src/styles/components/radio-group.css +0 -23
  257. package/src/styles/components/select.css +12 -39
  258. package/src/styles/components/slider.css +0 -42
  259. package/src/styles/components/spinner.css +80 -0
  260. package/src/styles/components/switch.css +68 -19
  261. package/src/styles/components/tab-panel.css +1 -1
  262. package/src/styles/components/tabs.css +1 -0
  263. package/src/styles/components/text-input.css +7 -45
  264. package/src/styles/components/textarea.css +75 -0
  265. package/src/styles/components/tooltip.css +103 -0
  266. package/src/styles/components/tree-item.css +152 -0
  267. package/src/styles/components/tree.css +10 -0
  268. package/src/styles/layout.css +457 -25
  269. package/src/switch/defines.ts +1 -0
  270. package/src/switch/switch.ts +61 -12
  271. package/src/text-input/text-input.ts +10 -15
  272. package/src/textarea/index.ts +1 -0
  273. package/src/textarea/textarea.ts +107 -0
  274. package/src/tooltip/defines.ts +11 -0
  275. package/src/tooltip/index.ts +4 -0
  276. package/src/tooltip/tooltip.ts +183 -0
  277. package/src/tree/defines.ts +26 -0
  278. package/src/tree/index.ts +5 -0
  279. package/src/tree/tree-item.ts +258 -0
  280. package/src/tree/tree.ts +237 -0
  281. package/dist/chunks/aeico-field.cjs +0 -179
  282. package/dist/chunks/aeico-field.cjs.map +0 -1
  283. package/dist/chunks/aeico-field.js +0 -180
  284. package/dist/chunks/aeico-field.js.map +0 -1
@@ -3,12 +3,13 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
  import { A as AeicoComponent, S as SVG_NS } from "./aeico-component.js";
5
5
  import { html } from "aeico";
6
- import { s as styleVariables } from "./variables.js";
6
+ import { v as variables } from "./variables.js";
7
7
  import { s as sizeCSS } from "./size.js";
8
8
  import { c as colorCSS } from "./color.js";
9
9
  const style = ":host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n width: 1em;\n height: 1em;\n color: inherit;\n flex-shrink: 0;\n line-height: 0;\n vertical-align: middle;\n}\n\n:host([color]) {\n color: var(--color-solid);\n}\n\n.icon-svg {\n display: block;\n width: 100%;\n height: 100%;\n fill: var(--icon-fill, currentColor);\n stroke: var(--icon-stroke, none);\n stroke-width: var(--icon-stroke-width, 2);\n stroke-linecap: var(--icon-stroke-linecap, round);\n stroke-linejoin: var(--icon-stroke-linejoin, round);\n pointer-events: none;\n overflow: visible;\n}\n";
10
10
  const defaultViewBox = "0 0 24 24";
11
11
  class IconRegistry {
12
+ /** Register user icons. Always takes priority over built-in icons. */
12
13
  static add(icons) {
13
14
  for (const [name, data] of Object.entries(icons)) {
14
15
  if (typeof data === "string") {
@@ -16,6 +17,22 @@ class IconRegistry {
16
17
  } else {
17
18
  this._icons.set(name, data);
18
19
  }
20
+ this._builtInKeys.delete(name);
21
+ }
22
+ }
23
+ /**
24
+ * Register built-in icons provided by the library.
25
+ * A built-in icon will NOT overwrite an icon already registered by the user.
26
+ */
27
+ static addBuiltIn(icons) {
28
+ for (const [name, data] of Object.entries(icons)) {
29
+ if (this._icons.has(name) && !this._builtInKeys.has(name)) continue;
30
+ if (typeof data === "string") {
31
+ this._icons.set(name, { path: data, viewBox: defaultViewBox });
32
+ } else {
33
+ this._icons.set(name, data);
34
+ }
35
+ this._builtInKeys.add(name);
19
36
  }
20
37
  }
21
38
  static get(name) {
@@ -26,6 +43,19 @@ class IconRegistry {
26
43
  }
27
44
  }
28
45
  __publicField(IconRegistry, "_icons", /* @__PURE__ */ new Map());
46
+ /** Names registered via addBuiltIn — can be overridden by user add() calls */
47
+ __publicField(IconRegistry, "_builtInKeys", /* @__PURE__ */ new Set());
48
+ IconRegistry.addBuiltIn({
49
+ copy: "M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z",
50
+ check: "M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z",
51
+ "chevron-left": "M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z",
52
+ "chevron-right": "M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z",
53
+ "chevron-up": "M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z",
54
+ "chevron-down": "M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z",
55
+ "chevrons-left": "M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z",
56
+ "chevrons-right": "M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z",
57
+ close: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"
58
+ });
29
59
  class Icon extends AeicoComponent {
30
60
  render() {
31
61
  const def = this.name ? IconRegistry.get(this.name) : void 0;
@@ -70,7 +100,7 @@ __publicField(Icon, "props", {
70
100
  stroke: { type: Boolean },
71
101
  strokeWidth: { type: Number }
72
102
  });
73
- __publicField(Icon, "styles", [styleVariables, sizeCSS, colorCSS, style]);
103
+ __publicField(Icon, "styles", [variables, sizeCSS, colorCSS, style]);
74
104
  Icon.register();
75
105
  export {
76
106
  Icon as I,
@@ -1 +1 @@
1
- {"version":3,"file":"icon.js","sources":["../../src/icon/defines.ts","../../src/icon/registry.ts","../../src/icon/icon.ts"],"sourcesContent":["export type IconSize = '3xs' | '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | number;\n\nexport type IconColor =\n | 'default'\n | 'primary'\n | 'secondary'\n | 'success'\n | 'danger'\n | 'warning'\n | 'info';\n\nexport interface IconDefinition {\n path: string;\n viewBox?: string;\n stroke?: boolean;\n strokeWidth?: number;\n}\n\nexport const defaultViewBox = '0 0 24 24';\n\nexport type IconRegistryData = Record<string, string | IconDefinition>;\n","import { IconDefinition, IconRegistryData, defaultViewBox } from './defines';\n\nclass IconRegistry {\n private static _icons: Map<string, IconDefinition> = new Map();\n\n static add(icons: IconRegistryData) {\n for (const [name, data] of Object.entries(icons)) {\n if (typeof data === 'string') {\n this._icons.set(name, { path: data, viewBox: defaultViewBox });\n } else {\n this._icons.set(name, data);\n }\n }\n }\n\n static get(name: string): IconDefinition | undefined {\n return this._icons.get(name);\n }\n\n static has(name: string): boolean {\n return this._icons.has(name);\n }\n}\n\nexport default IconRegistry;\n","import type { InferProps, Props } from 'aeico';\nimport { SVG_NS } from '../utils';\nimport AeicoComponent from '../aeico-component';\nimport { html } from 'aeico';\nimport styleVariables from '../styles/variables.css?inline';\nimport sizeCSS from '../styles/size.css?inline';\nimport colorCSS from '../styles/color.css?inline';\nimport style from '../styles/components/icon.css?inline';\nimport type { IconSize, IconColor } from './defines';\nimport { defaultViewBox } from './defines';\nimport IconRegistry from './registry';\n\nclass Icon extends AeicoComponent {\n static tagName = 'icon';\n\n static props: Props = {\n name: { type: String },\n size: { type: String },\n color: { type: String },\n stroke: { type: Boolean },\n strokeWidth: { type: Number },\n };\n\n declare name?: string;\n declare size?: IconSize;\n declare color?: IconColor;\n declare stroke?: boolean;\n declare strokeWidth?: number;\n\n protected static styles = [styleVariables, sizeCSS, colorCSS, style];\n\n protected render() {\n const def = this.name ? IconRegistry.get(this.name) : undefined;\n\n // Numeric size: set font-size directly (string sizes are handled by size.css)\n const numericSize = Number(this.size);\n if (this.size !== undefined && !isNaN(numericSize) && numericSize > 0) {\n this.style.setProperty('font-size', `${numericSize}px`);\n } else {\n this.style.removeProperty('font-size');\n }\n\n // Resolve stroke: component prop takes priority over registry definition\n const useStroke = this.stroke ?? def?.stroke ?? false;\n const useStrokeWidth = this.strokeWidth ?? def?.strokeWidth ?? 2;\n\n if (useStroke) {\n this.style.setProperty('--icon-fill', 'none');\n this.style.setProperty('--icon-stroke', 'currentColor');\n this.style.setProperty('--icon-stroke-width', String(useStrokeWidth));\n } else {\n this.style.removeProperty('--icon-fill');\n this.style.removeProperty('--icon-stroke');\n this.style.removeProperty('--icon-stroke-width');\n }\n\n if (!def) return;\n\n return html(({ svg, path }) => {\n svg(\n {\n className: 'icon-svg',\n viewBox: def.viewBox ?? defaultViewBox,\n 'aria-hidden': 'true',\n xmlns: SVG_NS,\n },\n () => {\n path({ d: def.path });\n },\n );\n });\n }\n}\n\nIcon.register();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ae-icon': Icon;\n }\n}\n\nexport default Icon;\nexport type IconProps = InferProps<typeof Icon>;\n"],"names":[],"mappings":";;;;;;;;;AAkBO,MAAM,iBAAiB;AChB9B,MAAM,aAAa;AAAA,EAGjB,OAAO,IAAI,OAAyB;AAClC,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAI,OAAO,SAAS,UAAU;AAC5B,aAAK,OAAO,IAAI,MAAM,EAAE,MAAM,MAAM,SAAS,gBAAgB;AAAA,MAC/D,OAAO;AACL,aAAK,OAAO,IAAI,MAAM,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,IAAI,MAA0C;AACnD,WAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,OAAO,IAAI,MAAuB;AAChC,WAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EAC7B;AACF;AAnBE,cADI,cACW,UAAsC,oBAAI,IAAA;ACS3D,MAAM,aAAa,eAAe;AAAA,EAmBtB,SAAS;AACjB,UAAM,MAAM,KAAK,OAAO,aAAa,IAAI,KAAK,IAAI,IAAI;AAGtD,UAAM,cAAc,OAAO,KAAK,IAAI;AACpC,QAAI,KAAK,SAAS,UAAa,CAAC,MAAM,WAAW,KAAK,cAAc,GAAG;AACrE,WAAK,MAAM,YAAY,aAAa,GAAG,WAAW,IAAI;AAAA,IACxD,OAAO;AACL,WAAK,MAAM,eAAe,WAAW;AAAA,IACvC;AAGA,UAAM,YAAY,KAAK,WAAU,2BAAK,WAAU;AAChD,UAAM,iBAAiB,KAAK,gBAAe,2BAAK,gBAAe;AAE/D,QAAI,WAAW;AACb,WAAK,MAAM,YAAY,eAAe,MAAM;AAC5C,WAAK,MAAM,YAAY,iBAAiB,cAAc;AACtD,WAAK,MAAM,YAAY,uBAAuB,OAAO,cAAc,CAAC;AAAA,IACtE,OAAO;AACL,WAAK,MAAM,eAAe,aAAa;AACvC,WAAK,MAAM,eAAe,eAAe;AACzC,WAAK,MAAM,eAAe,qBAAqB;AAAA,IACjD;AAEA,QAAI,CAAC,IAAK;AAEV,WAAO,KAAK,CAAC,EAAE,KAAK,WAAW;AAC7B;AAAA,QACE;AAAA,UACE,WAAW;AAAA,UACX,SAAS,IAAI,WAAW;AAAA,UACxB,eAAe;AAAA,UACf,OAAO;AAAA,QAAA;AAAA,QAET,MAAM;AACJ,eAAK,EAAE,GAAG,IAAI,KAAA,CAAM;AAAA,QACtB;AAAA,MAAA;AAAA,IAEJ,CAAC;AAAA,EACH;AACF;AA3DE,cADI,MACG,WAAU;AAEjB,cAHI,MAGG,SAAe;AAAA,EACpB,MAAM,EAAE,MAAM,OAAA;AAAA,EACd,MAAM,EAAE,MAAM,OAAA;AAAA,EACd,OAAO,EAAE,MAAM,OAAA;AAAA,EACf,QAAQ,EAAE,MAAM,QAAA;AAAA,EAChB,aAAa,EAAE,MAAM,OAAA;AAAO;AAS9B,cAjBI,MAiBa,UAAS,CAAC,gBAAgB,SAAS,UAAU,KAAK;AA6CrE,KAAK,SAAA;"}
1
+ {"version":3,"file":"icon.js","sources":["../../src/icon/defines.ts","../../src/icon/registry.ts","../../src/icon/built-in-icons.ts","../../src/icon/icon.ts"],"sourcesContent":["export type IconSize = '3xs' | '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | number;\n\nexport type IconColor =\n | 'default'\n | 'primary'\n | 'secondary'\n | 'success'\n | 'danger'\n | 'warning'\n | 'info';\n\nexport interface IconDefinition {\n path: string;\n viewBox?: string;\n stroke?: boolean;\n strokeWidth?: number;\n}\n\nexport const defaultViewBox = '0 0 24 24';\n\nexport type IconRegistryData = Record<string, string | IconDefinition>;\n","import { IconDefinition, IconRegistryData, defaultViewBox } from './defines';\n\nclass IconRegistry {\n private static _icons: Map<string, IconDefinition> = new Map();\n /** Names registered via addBuiltIn — can be overridden by user add() calls */\n private static _builtInKeys: Set<string> = new Set();\n\n /** Register user icons. Always takes priority over built-in icons. */\n static add(icons: IconRegistryData) {\n for (const [name, data] of Object.entries(icons)) {\n if (typeof data === 'string') {\n this._icons.set(name, { path: data, viewBox: defaultViewBox });\n } else {\n this._icons.set(name, data);\n }\n // Mark as user-defined (removes built-in status)\n this._builtInKeys.delete(name);\n }\n }\n\n /**\n * Register built-in icons provided by the library.\n * A built-in icon will NOT overwrite an icon already registered by the user.\n */\n static addBuiltIn(icons: IconRegistryData) {\n for (const [name, data] of Object.entries(icons)) {\n // Skip if the user has already registered this icon\n if (this._icons.has(name) && !this._builtInKeys.has(name)) continue;\n if (typeof data === 'string') {\n this._icons.set(name, { path: data, viewBox: defaultViewBox });\n } else {\n this._icons.set(name, data);\n }\n this._builtInKeys.add(name);\n }\n }\n\n static get(name: string): IconDefinition | undefined {\n return this._icons.get(name);\n }\n\n static has(name: string): boolean {\n return this._icons.has(name);\n }\n}\n\nexport default IconRegistry;\n","/**\n * Built-in system icons used internally by aeico components.\n * These are pre-registered so components work out of the box.\n * Users can override any of them by calling IconRegistry.add({ 'name': '...' }).\n *\n * All paths use the Material Design 24×24 viewBox.\n */\nimport IconRegistry from './registry';\n\nIconRegistry.addBuiltIn({\n copy: 'M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z',\n check: 'M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z',\n 'chevron-left': 'M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z',\n 'chevron-right': 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z',\n 'chevron-up': 'M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z',\n 'chevron-down': 'M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z',\n 'chevrons-left': 'M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z',\n 'chevrons-right': 'M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z',\n close:\n 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z',\n});\n","import type { InferProps, Props } from 'aeico';\nimport { SVG_NS } from '../utils';\nimport AeicoComponent from '../aeico-component';\nimport { html } from 'aeico';\nimport styleVariables from '../styles/variables.css?inline';\nimport sizeCSS from '../styles/size.css?inline';\nimport colorCSS from '../styles/color.css?inline';\nimport style from '../styles/components/icon.css?inline';\nimport type { IconSize, IconColor } from './defines';\nimport { defaultViewBox } from './defines';\nimport IconRegistry from './registry';\nimport './built-in-icons';\n\nclass Icon extends AeicoComponent {\n static tagName = 'icon';\n\n static props: Props = {\n name: { type: String },\n size: { type: String },\n color: { type: String },\n stroke: { type: Boolean },\n strokeWidth: { type: Number },\n };\n\n declare name?: string;\n declare size?: IconSize;\n declare color?: IconColor;\n declare stroke?: boolean;\n declare strokeWidth?: number;\n\n protected static styles = [styleVariables, sizeCSS, colorCSS, style];\n\n protected render() {\n const def = this.name ? IconRegistry.get(this.name) : undefined;\n\n // Numeric size: set font-size directly (string sizes are handled by size.css)\n const numericSize = Number(this.size);\n if (this.size !== undefined && !isNaN(numericSize) && numericSize > 0) {\n this.style.setProperty('font-size', `${numericSize}px`);\n } else {\n this.style.removeProperty('font-size');\n }\n\n // Resolve stroke: component prop takes priority over registry definition\n const useStroke = this.stroke ?? def?.stroke ?? false;\n const useStrokeWidth = this.strokeWidth ?? def?.strokeWidth ?? 2;\n\n if (useStroke) {\n this.style.setProperty('--icon-fill', 'none');\n this.style.setProperty('--icon-stroke', 'currentColor');\n this.style.setProperty('--icon-stroke-width', String(useStrokeWidth));\n } else {\n this.style.removeProperty('--icon-fill');\n this.style.removeProperty('--icon-stroke');\n this.style.removeProperty('--icon-stroke-width');\n }\n\n if (!def) return;\n\n return html(({ svg, path }) => {\n svg(\n {\n className: 'icon-svg',\n viewBox: def.viewBox ?? defaultViewBox,\n 'aria-hidden': 'true',\n xmlns: SVG_NS,\n },\n () => {\n path({ d: def.path });\n },\n );\n });\n }\n}\n\nIcon.register();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ae-icon': Icon;\n }\n}\n\nexport default Icon;\nexport type IconProps = InferProps<typeof Icon>;\n"],"names":["styleVariables"],"mappings":"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"}
@@ -0,0 +1,396 @@
1
+ "use strict";
2
+ const aeicoComponent = require("./aeico-component.cjs");
3
+ const aeico = require("aeico");
4
+ const variables = require("./variables.cjs");
5
+ const style$1 = ":host {\n display: block;\n}\n\n.menu-list {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n gap: 0;\n}\n\n.menu-list--horizontal {\n flex-direction: row;\n align-items: stretch;\n}\n";
6
+ const style = ':host {\n display: block;\n position: relative;\n\n --menu-item-height: 2.5rem;\n --menu-item-padding-x: 0.875rem;\n --menu-item-font-size: 0.9375rem;\n --menu-item-color: inherit;\n --menu-item-color-disabled: var(--color-text-disabled);\n --menu-item-bg: transparent;\n --menu-item-bg-hover: var(--surface-raised, rgba(0, 0, 0, 0.05));\n --menu-item-active-color: var(--color-primary, var(--blue-500));\n --menu-item-active-border-color: var(--color-primary, var(--blue-500));\n\n --submenu-z-index: 1001;\n --submenu-bg: var(--surface-overlay, #fff);\n --submenu-border: 1px solid var(--border-default);\n --submenu-border-radius: var(--ae-radius-md, 6px);\n --submenu-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n --submenu-min-width: 10rem;\n --submenu-padding: 0.25rem 0;\n}\n\n.item {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n width: 100%;\n height: var(--menu-item-height);\n padding: 0 var(--menu-item-padding-x);\n font-size: var(--menu-item-font-size);\n font-family: inherit;\n color: var(--menu-item-color);\n background: var(--menu-item-bg);\n border: none;\n border-bottom: 2px solid transparent;\n text-align: left;\n text-decoration: none;\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n box-sizing: border-box;\n outline: none;\n transition: background 0.1s, color 0.1s, border-color 0.1s;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.item--leaf-in-panel {\n height: auto;\n padding: 0.5rem var(--menu-item-padding-x);\n border-bottom: none;\n}\n\n.item:hover:not(:disabled) {\n background: var(--menu-item-bg-hover);\n}\n\n.item:focus-visible {\n background: var(--menu-item-bg-hover);\n outline: 2px solid var(--menu-item-active-color);\n outline-offset: -2px;\n}\n\n:host([disabled]) .item,\n.item:disabled {\n color: var(--menu-item-color-disabled);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n:host([selected]) .item {\n color: var(--menu-item-active-color);\n border-bottom-color: var(--menu-item-active-border-color);\n}\n\n.item-arrow {\n display: inline-block;\n width: 0;\n height: 0;\n flex-shrink: 0;\n}\n\n.item-arrow--right {\n border-top: 0.3em solid transparent;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.item-arrow--bottom {\n border-left: 0.3em solid transparent;\n border-right: 0.3em solid transparent;\n border-top: 0.3em solid;\n}\n\n.item--open .item-arrow--right {\n transform: rotate(90deg);\n}\n\nslot[name="expand"],\nslot[name="collapse"] {\n display: inline-flex;\n align-items: center;\n margin-inline-start: auto;\n flex-shrink: 0;\n}\n\nslot[name="collapse"] {\n display: none;\n}\n\n.item--open slot[name="expand"] {\n display: none;\n}\n\n.item--open slot[name="collapse"] {\n display: inline-flex;\n align-items: center;\n}\n\nslot[name="collapse"] .item-arrow--right {\n transform: rotate(90deg);\n}\n\n:host([icon-placement="start"]) slot[name="expand"],\n:host([icon-placement="start"]) slot[name="collapse"] {\n order: -1;\n margin-inline-start: 0;\n}\n\n.submenu-panel {\n display: none;\n position: absolute;\n z-index: var(--submenu-z-index);\n background: var(--submenu-bg);\n border: var(--submenu-border);\n border-radius: var(--submenu-border-radius);\n box-shadow: var(--submenu-shadow);\n min-width: var(--submenu-min-width);\n padding: var(--submenu-padding);\n box-sizing: border-box;\n max-width: calc(100vw - 16px);\n}\n\n.submenu-panel.open {\n display: block;\n}\n\n.submenu-panel.placement-bottom {\n top: 100%;\n left: 0;\n margin-top: 2px;\n}\n\n.submenu-panel.placement-right {\n top: 0;\n left: 100%;\n margin-left: 2px;\n}\n\n.submenu-inline {\n display: none;\n padding-left: 1rem;\n}\n\n.submenu-inline.open {\n display: block;\n}\n';
7
+ var __create$1 = Object.create;
8
+ var __defProp$1 = Object.defineProperty;
9
+ var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
10
+ var __knownSymbol$1 = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
11
+ var __typeError$1 = (msg) => {
12
+ throw TypeError(msg);
13
+ };
14
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
+ var __decoratorStart$1 = (base) => [, , , __create$1((base == null ? void 0 : base[__knownSymbol$1("metadata")]) ?? null)];
16
+ var __decoratorStrings$1 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
17
+ var __expectFn$1 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$1("Function expected") : fn;
18
+ var __decoratorContext$1 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$1[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$1("Already initialized") : fns.push(__expectFn$1(fn || null)) });
19
+ var __decoratorMetadata$1 = (array, target) => __defNormalProp$1(target, __knownSymbol$1("metadata"), array[3]);
20
+ var __runInitializers$1 = (array, flags, self, value) => {
21
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
22
+ return value;
23
+ };
24
+ var __decorateElement$1 = (array, flags, name, decorators, target, extra) => {
25
+ var fn, it, done, ctx, access, k = flags & 7, s = false, p = false;
26
+ var j = array.length + 1, key = __decoratorStrings$1[k + 5];
27
+ var initializers = array[j - 1] = [], extraInitializers = array[j] || (array[j] = []);
28
+ var desc = (target = target.prototype, __getOwnPropDesc$1({ get [name]() {
29
+ return __privateGet$1(this, extra);
30
+ }, set [name](x) {
31
+ return __privateSet$1(this, extra, x);
32
+ } }, name));
33
+ for (var i = decorators.length - 1; i >= 0; i--) {
34
+ ctx = __decoratorContext$1(k, name, done = {}, array[3], extraInitializers);
35
+ {
36
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: (x) => name in x };
37
+ access.get = (x) => x[name];
38
+ access.set = (x, y) => x[name] = y;
39
+ }
40
+ it = (0, decorators[i])({ get: desc.get, set: desc.set }, ctx), done._ = 1;
41
+ if (it === void 0) __expectFn$1(it) && (desc[key] = it);
42
+ else if (typeof it !== "object" || it === null) __typeError$1("Object expected");
43
+ else __expectFn$1(fn = it.get) && (desc.get = fn), __expectFn$1(fn = it.set) && (desc.set = fn), __expectFn$1(fn = it.init) && initializers.unshift(fn);
44
+ }
45
+ return desc && __defProp$1(target, name, desc), target;
46
+ };
47
+ var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
48
+ var __accessCheck$1 = (obj, member, msg) => member.has(obj) || __typeError$1("Cannot " + msg);
49
+ var __privateGet$1 = (obj, member, getter) => (__accessCheck$1(obj, member, "read from private field"), member.get(obj));
50
+ var __privateAdd$1 = (obj, member, value) => member.has(obj) ? __typeError$1("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
51
+ var __privateSet$1 = (obj, member, value, setter) => (__accessCheck$1(obj, member, "write to private field"), member.set(obj, value), value);
52
+ var _iconPlacement_dec, _open_dec, _selected_dec, _href_dec, _disabled_dec, _label_dec, _key_dec, _a$1, _init$1, _key, _label, _disabled, _href, _selected, _open, _iconPlacement;
53
+ class MenuItem extends (_a$1 = aeicoComponent.AeicoComponent, _key_dec = [aeico.prop({ type: String })], _label_dec = [aeico.prop({ type: String })], _disabled_dec = [aeico.prop({ type: Boolean })], _href_dec = [aeico.prop({ type: String })], _selected_dec = [aeico.prop({ type: Boolean })], _open_dec = [aeico.prop({ type: Boolean })], _iconPlacement_dec = [aeico.prop({ type: String })], _a$1) {
54
+ constructor() {
55
+ super(...arguments);
56
+ __privateAdd$1(this, _key, __runInitializers$1(_init$1, 8, this)), __runInitializers$1(_init$1, 11, this);
57
+ __privateAdd$1(this, _label, __runInitializers$1(_init$1, 12, this)), __runInitializers$1(_init$1, 15, this);
58
+ __privateAdd$1(this, _disabled, __runInitializers$1(_init$1, 16, this, false)), __runInitializers$1(_init$1, 19, this);
59
+ __privateAdd$1(this, _href, __runInitializers$1(_init$1, 20, this)), __runInitializers$1(_init$1, 23, this);
60
+ __privateAdd$1(this, _selected, __runInitializers$1(_init$1, 24, this, false)), __runInitializers$1(_init$1, 27, this);
61
+ __privateAdd$1(this, _open, __runInitializers$1(_init$1, 28, this, false)), __runInitializers$1(_init$1, 31, this);
62
+ __privateAdd$1(this, _iconPlacement, __runInitializers$1(_init$1, 32, this, "end")), __runInitializers$1(_init$1, 35, this);
63
+ __publicField$1(this, "_outsideClickHandler", null);
64
+ __publicField$1(this, "_closeTimer", null);
65
+ __publicField$1(this, "_handleMouseEnter", () => {
66
+ if (!this._isHoverTrigger()) return;
67
+ if (this._closeTimer !== null) {
68
+ clearTimeout(this._closeTimer);
69
+ this._closeTimer = null;
70
+ }
71
+ this.open = true;
72
+ });
73
+ __publicField$1(this, "_handleMouseLeave", () => {
74
+ if (!this._isHoverTrigger()) return;
75
+ this._closeTimer = setTimeout(() => {
76
+ this.open = false;
77
+ this._closeTimer = null;
78
+ }, 150);
79
+ });
80
+ __publicField$1(this, "_handleParentClick", () => {
81
+ if (this.disabled) return;
82
+ const mode = this._mode;
83
+ const trigger = this._trigger;
84
+ if (mode === "flyout" && trigger === "hover") {
85
+ this.open = !this.open;
86
+ return;
87
+ }
88
+ this.open = !this.open;
89
+ });
90
+ __publicField$1(this, "_handleLeafClick", (e) => {
91
+ var _a2;
92
+ if (this.disabled) {
93
+ e.preventDefault();
94
+ return;
95
+ }
96
+ const path = this._buildKeyPath();
97
+ const label = ((_a2 = this.textContent) == null ? void 0 : _a2.trim()) ?? "";
98
+ this.dispatchEvent(
99
+ new CustomEvent("_menu-item-select", {
100
+ bubbles: true,
101
+ composed: true,
102
+ detail: { key: this.key ?? "", label, keyPath: path }
103
+ })
104
+ );
105
+ });
106
+ __publicField$1(this, "_handleChildSelect", () => {
107
+ if (this._mode === "flyout") {
108
+ this.open = false;
109
+ }
110
+ });
111
+ __publicField$1(this, "_handleKeydown", (e) => {
112
+ if (e.key === "Escape" && this.open) {
113
+ e.stopPropagation();
114
+ this.open = false;
115
+ }
116
+ });
117
+ }
118
+ connectedCallback() {
119
+ var _a2;
120
+ super.connectedCallback();
121
+ const depth = ((_a2 = this.parentElement) == null ? void 0 : _a2.closest("ae-menu-item")) ? 1 : 0;
122
+ this.dataset.depth = String(depth);
123
+ this.listen("mouseenter", this._handleMouseEnter);
124
+ this.listen("mouseleave", this._handleMouseLeave);
125
+ this._outsideClickHandler = (e) => {
126
+ if (!this.open) return;
127
+ if (this._mode === "inline") return;
128
+ if (!e.composedPath().includes(this)) this.open = false;
129
+ };
130
+ document.addEventListener("click", this._outsideClickHandler);
131
+ this.listen("_menu-item-select", this._handleChildSelect);
132
+ }
133
+ disconnectedCallback() {
134
+ super.disconnectedCallback();
135
+ if (this._outsideClickHandler) {
136
+ document.removeEventListener("click", this._outsideClickHandler);
137
+ this._outsideClickHandler = null;
138
+ }
139
+ if (this._closeTimer !== null) {
140
+ clearTimeout(this._closeTimer);
141
+ this._closeTimer = null;
142
+ }
143
+ }
144
+ get _parentMenu() {
145
+ return this.closest("ae-menu");
146
+ }
147
+ get _mode() {
148
+ var _a2;
149
+ return ((_a2 = this._parentMenu) == null ? void 0 : _a2.mode) ?? "flyout";
150
+ }
151
+ get _orientation() {
152
+ var _a2;
153
+ return ((_a2 = this._parentMenu) == null ? void 0 : _a2.orientation) ?? "horizontal";
154
+ }
155
+ get _trigger() {
156
+ var _a2;
157
+ return ((_a2 = this._parentMenu) == null ? void 0 : _a2.trigger) ?? "click";
158
+ }
159
+ get _isParent() {
160
+ return this.label != null && this.label !== "";
161
+ }
162
+ /** Compute flyout panel placement based on depth and parent orientation. */
163
+ get _panelPlacement() {
164
+ var _a2;
165
+ const isNested = !!((_a2 = this.parentElement) == null ? void 0 : _a2.closest("ae-menu-item"));
166
+ if (!isNested && this._orientation === "horizontal") return "bottom";
167
+ return "right";
168
+ }
169
+ _isHoverTrigger() {
170
+ return this._isParent && this._mode === "flyout" && this._trigger === "hover";
171
+ }
172
+ _buildKeyPath() {
173
+ const path = [];
174
+ if (this.key) path.unshift(this.key);
175
+ let el = this.parentElement;
176
+ while (el) {
177
+ const tag = el.tagName.toLowerCase();
178
+ if (tag === "ae-menu-item") {
179
+ const k = el.key;
180
+ if (k) path.unshift(k);
181
+ } else if (tag === "ae-menu") {
182
+ break;
183
+ }
184
+ el = el.parentElement;
185
+ }
186
+ return path;
187
+ }
188
+ render() {
189
+ var _a2;
190
+ const mode = this._mode;
191
+ const panelPlacement = this._panelPlacement;
192
+ const isParent = this._isParent;
193
+ const isInline = mode === "inline";
194
+ const arrowDir = !isInline && panelPlacement === "bottom" ? "bottom" : "right";
195
+ const isNested = !!((_a2 = this.parentElement) == null ? void 0 : _a2.closest("ae-menu-item"));
196
+ return aeico.html(({ div, button, a, span, slot }) => {
197
+ if (isParent) {
198
+ div({ className: "item-wrapper" }, () => {
199
+ button(
200
+ {
201
+ type: "button",
202
+ className: { item: true, "item--parent": true, "item--open": this.open },
203
+ disabled: this.disabled,
204
+ "aria-haspopup": "menu",
205
+ "aria-expanded": String(this.open),
206
+ "@click": this._handleParentClick,
207
+ "@keydown": this._handleKeydown
208
+ },
209
+ () => {
210
+ span({ text: this.label });
211
+ slot({ name: "expand" }, () => {
212
+ span({ className: `item-arrow item-arrow--${arrowDir}`, "aria-hidden": "true" });
213
+ });
214
+ slot({ name: "collapse" }, () => {
215
+ span({ className: `item-arrow item-arrow--${arrowDir}`, "aria-hidden": "true" });
216
+ });
217
+ }
218
+ );
219
+ if (isInline) {
220
+ div(
221
+ {
222
+ className: { "submenu-inline": true, open: this.open },
223
+ role: "menu"
224
+ },
225
+ () => {
226
+ slot();
227
+ }
228
+ );
229
+ } else {
230
+ div(
231
+ {
232
+ className: {
233
+ "submenu-panel": true,
234
+ [`placement-${panelPlacement}`]: true,
235
+ open: this.open
236
+ },
237
+ role: "menu"
238
+ },
239
+ () => {
240
+ slot();
241
+ }
242
+ );
243
+ }
244
+ });
245
+ } else {
246
+ const sharedProps = {
247
+ className: { item: true, "item--leaf-in-panel": isNested },
248
+ role: "menuitem",
249
+ "@click": this._handleLeafClick,
250
+ "@keydown": this._handleKeydown
251
+ };
252
+ if (this.href) {
253
+ a(
254
+ {
255
+ ...sharedProps,
256
+ href: this.disabled ? void 0 : this.href,
257
+ "aria-disabled": this.disabled ? "true" : void 0
258
+ },
259
+ () => {
260
+ slot();
261
+ }
262
+ );
263
+ } else {
264
+ button(
265
+ {
266
+ ...sharedProps,
267
+ type: "button",
268
+ disabled: this.disabled
269
+ },
270
+ () => {
271
+ slot();
272
+ }
273
+ );
274
+ }
275
+ }
276
+ });
277
+ }
278
+ }
279
+ _init$1 = __decoratorStart$1(_a$1);
280
+ _key = /* @__PURE__ */ new WeakMap();
281
+ _label = /* @__PURE__ */ new WeakMap();
282
+ _disabled = /* @__PURE__ */ new WeakMap();
283
+ _href = /* @__PURE__ */ new WeakMap();
284
+ _selected = /* @__PURE__ */ new WeakMap();
285
+ _open = /* @__PURE__ */ new WeakMap();
286
+ _iconPlacement = /* @__PURE__ */ new WeakMap();
287
+ __decorateElement$1(_init$1, 4, "key", _key_dec, MenuItem, _key);
288
+ __decorateElement$1(_init$1, 4, "label", _label_dec, MenuItem, _label);
289
+ __decorateElement$1(_init$1, 4, "disabled", _disabled_dec, MenuItem, _disabled);
290
+ __decorateElement$1(_init$1, 4, "href", _href_dec, MenuItem, _href);
291
+ __decorateElement$1(_init$1, 4, "selected", _selected_dec, MenuItem, _selected);
292
+ __decorateElement$1(_init$1, 4, "open", _open_dec, MenuItem, _open);
293
+ __decorateElement$1(_init$1, 4, "iconPlacement", _iconPlacement_dec, MenuItem, _iconPlacement);
294
+ __decoratorMetadata$1(_init$1, MenuItem);
295
+ __publicField$1(MenuItem, "tagName", "menu-item");
296
+ __publicField$1(MenuItem, "styles", [variables.variables, style]);
297
+ MenuItem.register();
298
+ var __create = Object.create;
299
+ var __defProp = Object.defineProperty;
300
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
301
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
302
+ var __typeError = (msg) => {
303
+ throw TypeError(msg);
304
+ };
305
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
306
+ var __decoratorStart = (base) => [, , , __create((base == null ? void 0 : base[__knownSymbol("metadata")]) ?? null)];
307
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
308
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
309
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
310
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
311
+ var __runInitializers = (array, flags, self, value) => {
312
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
313
+ return value;
314
+ };
315
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
316
+ var fn, it, done, ctx, access, k = flags & 7, s = false, p = false;
317
+ var j = array.length + 1, key = __decoratorStrings[k + 5];
318
+ var initializers = array[j - 1] = [], extraInitializers = array[j] || (array[j] = []);
319
+ var desc = (target = target.prototype, __getOwnPropDesc({ get [name]() {
320
+ return __privateGet(this, extra);
321
+ }, set [name](x) {
322
+ return __privateSet(this, extra, x);
323
+ } }, name));
324
+ for (var i = decorators.length - 1; i >= 0; i--) {
325
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
326
+ {
327
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: (x) => name in x };
328
+ access.get = (x) => x[name];
329
+ access.set = (x, y) => x[name] = y;
330
+ }
331
+ it = (0, decorators[i])({ get: desc.get, set: desc.set }, ctx), done._ = 1;
332
+ if (it === void 0) __expectFn(it) && (desc[key] = it);
333
+ else if (typeof it !== "object" || it === null) __typeError("Object expected");
334
+ else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
335
+ }
336
+ return desc && __defProp(target, name, desc), target;
337
+ };
338
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
339
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
340
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
341
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
342
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
343
+ var _selectedKey_dec, _trigger_dec, _orientation_dec, _mode_dec, _a, _init, _mode, _orientation, _trigger, _selectedKey;
344
+ class Menu extends (_a = aeicoComponent.AeicoComponent, _mode_dec = [aeico.prop({ type: String })], _orientation_dec = [aeico.prop({ type: String })], _trigger_dec = [aeico.prop({ type: String })], _selectedKey_dec = [aeico.prop({ type: String })], _a) {
345
+ constructor() {
346
+ super(...arguments);
347
+ __privateAdd(this, _mode, __runInitializers(_init, 8, this, "flyout")), __runInitializers(_init, 11, this);
348
+ __privateAdd(this, _orientation, __runInitializers(_init, 12, this, "horizontal")), __runInitializers(_init, 15, this);
349
+ __privateAdd(this, _trigger, __runInitializers(_init, 16, this, "click")), __runInitializers(_init, 19, this);
350
+ __privateAdd(this, _selectedKey, __runInitializers(_init, 20, this)), __runInitializers(_init, 23, this);
351
+ __publicField(this, "_handleItemSelect", (e) => {
352
+ const { key, label, keyPath } = e.detail;
353
+ this.querySelectorAll("ae-menu-item").forEach((el) => {
354
+ const item = el;
355
+ item.selected = item.key === key && !item.label;
356
+ });
357
+ this.selectedKey = key;
358
+ this.emit("select", { detail: { key, label, keyPath } });
359
+ });
360
+ }
361
+ connectedCallback() {
362
+ super.connectedCallback();
363
+ this.listen("_menu-item-select", this._handleItemSelect);
364
+ }
365
+ render() {
366
+ const isHorizontal = this.orientation === "horizontal";
367
+ return aeico.html(({ div, slot }) => {
368
+ div(
369
+ {
370
+ className: { "menu-list": true, "menu-list--horizontal": isHorizontal },
371
+ role: isHorizontal ? "menubar" : "menu",
372
+ "aria-orientation": this.orientation
373
+ },
374
+ () => {
375
+ slot();
376
+ }
377
+ );
378
+ });
379
+ }
380
+ }
381
+ _init = __decoratorStart(_a);
382
+ _mode = /* @__PURE__ */ new WeakMap();
383
+ _orientation = /* @__PURE__ */ new WeakMap();
384
+ _trigger = /* @__PURE__ */ new WeakMap();
385
+ _selectedKey = /* @__PURE__ */ new WeakMap();
386
+ __decorateElement(_init, 4, "mode", _mode_dec, Menu, _mode);
387
+ __decorateElement(_init, 4, "orientation", _orientation_dec, Menu, _orientation);
388
+ __decorateElement(_init, 4, "trigger", _trigger_dec, Menu, _trigger);
389
+ __decorateElement(_init, 4, "selectedKey", _selectedKey_dec, Menu, _selectedKey);
390
+ __decoratorMetadata(_init, Menu);
391
+ __publicField(Menu, "tagName", "menu");
392
+ __publicField(Menu, "styles", [variables.variables, style$1]);
393
+ Menu.register();
394
+ exports.Menu = Menu;
395
+ exports.MenuItem = MenuItem;
396
+ //# sourceMappingURL=menu.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.cjs","sources":["../../src/menu/menu-item.ts","../../src/menu/menu.ts"],"sourcesContent":["import AeicoComponent from '../aeico-component';\nimport type { InferProps } from 'aeico';\nimport { html, prop } from 'aeico';\nimport style from '../styles/components/menu-item.css?inline';\nimport variables from '../styles/variables.css?inline';\nimport type {\n MenuMode,\n MenuOrientation,\n MenuTrigger,\n ParentMenuLike,\n MenuIconPlacement,\n} from './defines';\n\n/**\n * Menu item — used as a direct child of `<ae-menu>` or nested inside another\n * `<ae-menu-item>` to create a two-level submenu.\n *\n * - **Leaf item**: omit `label`; slot contains the item text.\n * - **Parent item**: set `label` to the trigger text; slot children are\n * `<ae-menu-item>` elements that appear in the submenu panel/section.\n *\n * **Slots (parent items only)**\n * - `expand` — icon shown when the submenu is closed (default: CSS triangle).\n * - `collapse` — icon shown when the submenu is open (default: rotated CSS triangle).\n *\n * @example\n * ```html\n * <ae-menu-item label=\"Settings\" icon-placement=\"start\">\n * <ae-icon name=\"chevron-right\" slot=\"expand\"></ae-icon>\n * <ae-icon name=\"chevron-down\" slot=\"collapse\"></ae-icon>\n * <ae-menu-item key=\"profile\">Profile</ae-menu-item>\n * </ae-menu-item>\n * ```\n */\nclass MenuItem extends AeicoComponent {\n static tagName = 'menu-item';\n\n protected static styles = [variables, style];\n\n @prop({ type: String })\n accessor key: string | undefined;\n\n @prop({ type: String })\n accessor label: string | undefined;\n\n @prop({ type: Boolean })\n accessor disabled: boolean = false;\n\n @prop({ type: String })\n accessor href: string | undefined;\n\n @prop({ type: Boolean })\n accessor selected: boolean = false;\n\n @prop({ type: Boolean })\n accessor open: boolean = false;\n\n @prop({ type: String })\n accessor iconPlacement: MenuIconPlacement = 'end';\n\n private _outsideClickHandler: ((e: MouseEvent) => void) | null = null;\n private _closeTimer: ReturnType<typeof setTimeout> | null = null;\n\n connectedCallback() {\n super.connectedCallback();\n\n // data-depth lets CSS apply depth-specific styles without JS\n const depth = this.parentElement?.closest('ae-menu-item') ? 1 : 0;\n this.dataset.depth = String(depth);\n\n // Hover listeners — check mode/trigger at runtime\n this.listen('mouseenter', this._handleMouseEnter);\n this.listen('mouseleave', this._handleMouseLeave);\n\n // Outside-click to close flyout panel (not applicable in inline mode)\n this._outsideClickHandler = (e: MouseEvent) => {\n if (!this.open) return;\n if (this._mode === 'inline') return;\n if (!e.composedPath().includes(this)) this.open = false;\n };\n\n document.addEventListener('click', this._outsideClickHandler);\n\n // Close own submenu when a leaf inside it is selected (flyout)\n this.listen('_menu-item-select', this._handleChildSelect as EventListener);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this._outsideClickHandler) {\n document.removeEventListener('click', this._outsideClickHandler);\n this._outsideClickHandler = null;\n }\n if (this._closeTimer !== null) {\n clearTimeout(this._closeTimer);\n this._closeTimer = null;\n }\n }\n\n private get _parentMenu(): ParentMenuLike | null {\n return this.closest<ParentMenuLike>('ae-menu');\n }\n\n private get _mode(): MenuMode {\n return this._parentMenu?.mode ?? 'flyout';\n }\n\n private get _orientation(): MenuOrientation {\n return this._parentMenu?.orientation ?? 'horizontal';\n }\n\n private get _trigger(): MenuTrigger {\n return this._parentMenu?.trigger ?? 'click';\n }\n\n private get _isParent(): boolean {\n return this.label != null && this.label !== '';\n }\n\n /** Compute flyout panel placement based on depth and parent orientation. */\n private get _panelPlacement(): 'bottom' | 'right' {\n const isNested = !!this.parentElement?.closest('ae-menu-item');\n if (!isNested && this._orientation === 'horizontal') return 'bottom';\n return 'right';\n }\n\n private _isHoverTrigger(): boolean {\n return this._isParent && this._mode === 'flyout' && this._trigger === 'hover';\n }\n\n private _handleMouseEnter = (): void => {\n if (!this._isHoverTrigger()) return;\n if (this._closeTimer !== null) {\n clearTimeout(this._closeTimer);\n this._closeTimer = null;\n }\n this.open = true;\n };\n\n private _handleMouseLeave = (): void => {\n if (!this._isHoverTrigger()) return;\n this._closeTimer = setTimeout(() => {\n this.open = false;\n this._closeTimer = null;\n }, 150);\n };\n\n private _handleParentClick = (): void => {\n if (this.disabled) return;\n const mode = this._mode;\n const trigger = this._trigger;\n // In hover mode, click should still toggle (accessibility)\n if (mode === 'flyout' && trigger === 'hover') {\n this.open = !this.open;\n return;\n }\n this.open = !this.open;\n };\n\n private _handleLeafClick = (e: Event): void => {\n if (this.disabled) {\n e.preventDefault();\n return;\n }\n const path = this._buildKeyPath();\n const label = this.textContent?.trim() ?? '';\n this.dispatchEvent(\n new CustomEvent('_menu-item-select', {\n bubbles: true,\n composed: true,\n detail: { key: this.key ?? '', label, keyPath: path },\n }),\n );\n };\n\n private _handleChildSelect = (): void => {\n // Close flyout panel after a child leaf is selected\n if (this._mode === 'flyout') {\n this.open = false;\n }\n };\n\n private _handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.open) {\n e.stopPropagation();\n this.open = false;\n }\n };\n\n private _buildKeyPath(): string[] {\n const path: string[] = [];\n if (this.key) path.unshift(this.key);\n let el: Element | null = this.parentElement;\n while (el) {\n const tag = el.tagName.toLowerCase();\n if (tag === 'ae-menu-item') {\n const k = (el as MenuItem).key;\n if (k) path.unshift(k);\n } else if (tag === 'ae-menu') {\n break;\n }\n el = el.parentElement;\n }\n return path;\n }\n\n protected render() {\n const mode = this._mode;\n const panelPlacement = this._panelPlacement;\n const isParent = this._isParent;\n const isInline = mode === 'inline';\n // Arrow direction: inline always shows ► (rotates to ▼ on open)\n // flyout-bottom shows ▼; flyout-right shows ►\n const arrowDir = !isInline && panelPlacement === 'bottom' ? 'bottom' : 'right';\n // Leaf items inside a submenu panel (depth > 0) need different padding\n const isNested = !!this.parentElement?.closest('ae-menu-item');\n\n return html(({ div, button, a, span, slot }) => {\n if (isParent) {\n div({ className: 'item-wrapper' }, () => {\n button(\n {\n type: 'button',\n className: { item: true, 'item--parent': true, 'item--open': this.open },\n disabled: this.disabled,\n 'aria-haspopup': 'menu',\n 'aria-expanded': String(this.open),\n '@click': this._handleParentClick,\n '@keydown': this._handleKeydown,\n },\n () => {\n span({ text: this.label });\n slot({ name: 'expand' }, () => {\n span({ className: `item-arrow item-arrow--${arrowDir}`, 'aria-hidden': 'true' });\n });\n slot({ name: 'collapse' }, () => {\n span({ className: `item-arrow item-arrow--${arrowDir}`, 'aria-hidden': 'true' });\n });\n },\n );\n\n if (isInline) {\n div(\n {\n className: { 'submenu-inline': true, open: this.open },\n role: 'menu',\n },\n () => {\n slot();\n },\n );\n } else {\n div(\n {\n className: {\n 'submenu-panel': true,\n [`placement-${panelPlacement}`]: true,\n open: this.open,\n },\n role: 'menu',\n },\n () => {\n slot();\n },\n );\n }\n });\n } else {\n // Leaf item\n const sharedProps = {\n className: { item: true, 'item--leaf-in-panel': isNested },\n role: 'menuitem',\n '@click': this._handleLeafClick,\n '@keydown': this._handleKeydown,\n };\n\n if (this.href) {\n a(\n {\n ...sharedProps,\n href: this.disabled ? undefined : this.href,\n 'aria-disabled': this.disabled ? 'true' : undefined,\n },\n () => {\n slot();\n },\n );\n } else {\n button(\n {\n ...sharedProps,\n type: 'button',\n disabled: this.disabled,\n },\n () => {\n slot();\n },\n );\n }\n }\n });\n }\n}\n\nMenuItem.register();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ae-menu-item': MenuItem;\n }\n}\n\nexport default MenuItem;\nexport type MenuItemProps = InferProps<typeof MenuItem>;\nexport type { MenuIconPlacement };\n","import AeicoComponent from '../aeico-component';\nimport type { InferProps } from 'aeico';\nimport { html, prop } from 'aeico';\nimport style from '../styles/components/menu.css?inline';\nimport variables from '../styles/variables.css?inline';\nimport type { MenuMode, MenuOrientation, MenuSelectDetail, MenuTrigger } from './defines';\n// Ensure ae-menu-item is registered when this module is used\nimport './menu-item';\n\n/**\n * Menu navigation component. Renders a horizontal or vertical menu with\n * optional two-level flyout or inline (accordion) submenus.\n *\n * Two modes:\n * - `flyout` (default) — submenus open as floating panels (like a nav bar or\n * context menu).\n * - `inline` — submenus expand in-place (accordion-style sidebar).\n *\n * Emits:\n * - `select` — `{ detail: { key, label, keyPath } }` when a leaf item is clicked.\n */\nclass Menu extends AeicoComponent {\n static tagName = 'menu';\n\n protected static styles = [variables, style];\n\n @prop({ type: String })\n accessor mode: MenuMode = 'flyout';\n\n @prop({ type: String })\n accessor orientation: MenuOrientation = 'horizontal';\n\n @prop({ type: String })\n accessor trigger: MenuTrigger = 'click';\n\n @prop({ type: String })\n accessor selectedKey: string | undefined;\n\n connectedCallback() {\n super.connectedCallback();\n this.listen('_menu-item-select', this._handleItemSelect as EventListener);\n }\n\n private _handleItemSelect = (e: CustomEvent<MenuSelectDetail>): void => {\n const { key, label, keyPath } = e.detail;\n // Update visual selection on all leaf items\n this.querySelectorAll('ae-menu-item').forEach((el) => {\n const item = el;\n item.selected = item.key === key && !item.label; // only leaf items\n });\n this.selectedKey = key;\n this.emit('select', { detail: { key, label, keyPath } });\n };\n\n protected render() {\n const isHorizontal = this.orientation === 'horizontal';\n return html(({ div, slot }) => {\n div(\n {\n className: { 'menu-list': true, 'menu-list--horizontal': isHorizontal },\n role: isHorizontal ? 'menubar' : 'menu',\n 'aria-orientation': this.orientation,\n },\n () => {\n slot();\n },\n );\n });\n }\n}\n\nMenu.register();\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ae-menu': Menu;\n }\n}\n\nexport default Menu;\nexport type MenuProps = InferProps<typeof Menu>;\n"],"names":["_a","_init","prop","__privateAdd","__runInitializers","__publicField","html","__decoratorStart","__decorateElement","__decoratorMetadata","variables","AeicoComponent","style"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,oBAAA,WAAA,eAAA,WAAA,eAAA,YAAA,UAAAA,MAAAC,SAAA,MAAA,QAAA,WAAA,OAAA,WAAA,OAAA;AAkCA,MAAM,kBAAiBD,sCAKrB,WAAA,CAACE,MAAAA,KAAK,EAAE,MAAM,OAAA,CAAQ,CAAA,GAGtB,aAAA,CAACA,MAAAA,KAAK,EAAE,MAAM,OAAA,CAAQ,CAAA,GAGtB,gBAAA,CAACA,MAAAA,KAAK,EAAE,MAAM,QAAA,CAAS,CAAA,GAGvB,YAAA,CAACA,MAAAA,KAAK,EAAE,MAAM,OAAA,CAAQ,CAAA,GAGtB,gBAAA,CAACA,WAAK,EAAE,MAAM,SAAS,CAAA,GAGvB,YAAA,CAACA,WAAK,EAAE,MAAM,SAAS,CAAA,GAGvB,qBAAA,CAACA,WAAK,EAAE,MAAM,QAAQ,CAAA,GAvBDF,MAAe;AAAA,EAAtC,cAAA;AAAA,UAAA,GAAA,SAAA;AAMEG,mBAAA,MAAS,MAATC,oBAAAH,SAAA,GAAA,IAAA,CAAA,GAAAG,oBAAAH,SAAA,IAAA,IAAA;AAGAE,mBAAA,MAAS,QAATC,oBAAAH,SAAA,IAAA,IAAA,CAAA,GAAAG,oBAAAH,SAAA,IAAA,IAAA;AAGAE,mBAAA,MAAS,WAAoBC,oBAA7BH,SAAA,IAAA,MAA6B,KAAA,CAAA,GAA7BG,oBAAAH,SAAA,IAAA,IAAA;AAGAE,mBAAA,MAAS,OAATC,oBAAAH,SAAA,IAAA,IAAA,CAAA,GAAAG,oBAAAH,SAAA,IAAA,IAAA;AAGAE,mBAAA,MAAS,WAAoBC,oBAA7BH,SAAA,IAAA,MAA6B,KAAA,CAAA,GAA7BG,oBAAAH,SAAA,IAAA,IAAA;AAGAE,mBAAA,MAAS,OAAgBC,oBAAzBH,SAAA,IAAA,MAAyB,KAAA,CAAA,GAAzBG,oBAAAH,SAAA,IAAA,IAAA;AAGAE,mBAAA,MAAS,gBAAmCC,oBAA5CH,SAAA,IAAA,MAA4C,KAAA,CAAA,GAA5CG,oBAAAH,SAAA,IAAA,IAAA;AAEAI,oBAAA,MAAQ,wBAAyD,IAAA;AACjEA,oBAAA,MAAQ,eAAoD,IAAA;AAqE5DA,oBAAA,MAAQ,qBAAoB,MAAY;AACtC,UAAI,CAAC,KAAK,kBAAmB;AAC7B,UAAI,KAAK,gBAAgB,MAAM;AAC7B,qBAAa,KAAK,WAAW;AAC7B,aAAK,cAAc;AAAA,MACrB;AACA,WAAK,OAAO;AAAA,IACd,CAAA;AAEAA,oBAAA,MAAQ,qBAAoB,MAAY;AACtC,UAAI,CAAC,KAAK,kBAAmB;AAC7B,WAAK,cAAc,WAAW,MAAM;AAClC,aAAK,OAAO;AACZ,aAAK,cAAc;AAAA,MACrB,GAAG,GAAG;AAAA,IACR,CAAA;AAEAA,oBAAA,MAAQ,sBAAqB,MAAY;AACvC,UAAI,KAAK,SAAU;AACnB,YAAM,OAAO,KAAK;AAClB,YAAM,UAAU,KAAK;AAErB,UAAI,SAAS,YAAY,YAAY,SAAS;AAC5C,aAAK,OAAO,CAAC,KAAK;AAClB;AAAA,MACF;AACA,WAAK,OAAO,CAAC,KAAK;AAAA,IACpB,CAAA;AAEAA,oBAAA,MAAQ,oBAAmB,CAAC,MAAmB;;AAC7C,UAAI,KAAK,UAAU;AACjB,UAAE,eAAA;AACF;AAAA,MACF;AACA,YAAM,OAAO,KAAK,cAAA;AAClB,YAAM,UAAQL,MAAA,KAAK,gBAAL,gBAAAA,IAAkB,WAAU;AAC1C,WAAK;AAAA,QACH,IAAI,YAAY,qBAAqB;AAAA,UACnC,SAAS;AAAA,UACT,UAAU;AAAA,UACV,QAAQ,EAAE,KAAK,KAAK,OAAO,IAAI,OAAO,SAAS,KAAA;AAAA,QAAK,CACrD;AAAA,MAAA;AAAA,IAEL,CAAA;AAEAK,oBAAA,MAAQ,sBAAqB,MAAY;AAEvC,UAAI,KAAK,UAAU,UAAU;AAC3B,aAAK,OAAO;AAAA,MACd;AAAA,IACF,CAAA;AAEAA,oBAAA,MAAQ,kBAAiB,CAAC,MAA2B;AACnD,UAAI,EAAE,QAAQ,YAAY,KAAK,MAAM;AACnC,UAAE,gBAAA;AACF,aAAK,OAAO;AAAA,MACd;AAAA,IACF,CAAA;AAAA,EAAA;AAAA,EA5HA,oBAAoB;;AAClB,UAAM,kBAAA;AAGN,UAAM,UAAQL,MAAA,KAAK,kBAAL,gBAAAA,IAAoB,QAAQ,mBAAkB,IAAI;AAChE,SAAK,QAAQ,QAAQ,OAAO,KAAK;AAGjC,SAAK,OAAO,cAAc,KAAK,iBAAiB;AAChD,SAAK,OAAO,cAAc,KAAK,iBAAiB;AAGhD,SAAK,uBAAuB,CAAC,MAAkB;AAC7C,UAAI,CAAC,KAAK,KAAM;AAChB,UAAI,KAAK,UAAU,SAAU;AAC7B,UAAI,CAAC,EAAE,eAAe,SAAS,IAAI,QAAQ,OAAO;AAAA,IACpD;AAEA,aAAS,iBAAiB,SAAS,KAAK,oBAAoB;AAG5D,SAAK,OAAO,qBAAqB,KAAK,kBAAmC;AAAA,EAC3E;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAA;AACN,QAAI,KAAK,sBAAsB;AAC7B,eAAS,oBAAoB,SAAS,KAAK,oBAAoB;AAC/D,WAAK,uBAAuB;AAAA,IAC9B;AACA,QAAI,KAAK,gBAAgB,MAAM;AAC7B,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,IAAY,cAAqC;AAC/C,WAAO,KAAK,QAAwB,SAAS;AAAA,EAC/C;AAAA,EAEA,IAAY,QAAkB;;AAC5B,aAAOA,MAAA,KAAK,gBAAL,gBAAAA,IAAkB,SAAQ;AAAA,EACnC;AAAA,EAEA,IAAY,eAAgC;;AAC1C,aAAOA,MAAA,KAAK,gBAAL,gBAAAA,IAAkB,gBAAe;AAAA,EAC1C;AAAA,EAEA,IAAY,WAAwB;;AAClC,aAAOA,MAAA,KAAK,gBAAL,gBAAAA,IAAkB,YAAW;AAAA,EACtC;AAAA,EAEA,IAAY,YAAqB;AAC/B,WAAO,KAAK,SAAS,QAAQ,KAAK,UAAU;AAAA,EAC9C;AAAA;AAAA,EAGA,IAAY,kBAAsC;;AAChD,UAAM,WAAW,CAAC,GAACA,MAAA,KAAK,kBAAL,gBAAAA,IAAoB,QAAQ;AAC/C,QAAI,CAAC,YAAY,KAAK,iBAAiB,aAAc,QAAO;AAC5D,WAAO;AAAA,EACT;AAAA,EAEQ,kBAA2B;AACjC,WAAO,KAAK,aAAa,KAAK,UAAU,YAAY,KAAK,aAAa;AAAA,EACxE;AAAA,EA6DQ,gBAA0B;AAChC,UAAM,OAAiB,CAAA;AACvB,QAAI,KAAK,IAAK,MAAK,QAAQ,KAAK,GAAG;AACnC,QAAI,KAAqB,KAAK;AAC9B,WAAO,IAAI;AACT,YAAM,MAAM,GAAG,QAAQ,YAAA;AACvB,UAAI,QAAQ,gBAAgB;AAC1B,cAAM,IAAK,GAAgB;AAC3B,YAAI,EAAG,MAAK,QAAQ,CAAC;AAAA,MACvB,WAAW,QAAQ,WAAW;AAC5B;AAAA,MACF;AACA,WAAK,GAAG;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAAA,EAEU,SAAS;;AACjB,UAAM,OAAO,KAAK;AAClB,UAAM,iBAAiB,KAAK;AAC5B,UAAM,WAAW,KAAK;AACtB,UAAM,WAAW,SAAS;AAG1B,UAAM,WAAW,CAAC,YAAY,mBAAmB,WAAW,WAAW;AAEvE,UAAM,WAAW,CAAC,GAACA,MAAA,KAAK,kBAAL,gBAAAA,IAAoB,QAAQ;AAE/C,WAAOM,MAAAA,KAAK,CAAC,EAAE,KAAK,QAAQ,GAAG,MAAM,WAAW;AAC9C,UAAI,UAAU;AACZ,YAAI,EAAE,WAAW,eAAA,GAAkB,MAAM;AACvC;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,WAAW,EAAE,MAAM,MAAM,gBAAgB,MAAM,cAAc,KAAK,KAAA;AAAA,cAClE,UAAU,KAAK;AAAA,cACf,iBAAiB;AAAA,cACjB,iBAAiB,OAAO,KAAK,IAAI;AAAA,cACjC,UAAU,KAAK;AAAA,cACf,YAAY,KAAK;AAAA,YAAA;AAAA,YAEnB,MAAM;AACJ,mBAAK,EAAE,MAAM,KAAK,MAAA,CAAO;AACzB,mBAAK,EAAE,MAAM,SAAA,GAAY,MAAM;AAC7B,qBAAK,EAAE,WAAW,0BAA0B,QAAQ,IAAI,eAAe,QAAQ;AAAA,cACjF,CAAC;AACD,mBAAK,EAAE,MAAM,WAAA,GAAc,MAAM;AAC/B,qBAAK,EAAE,WAAW,0BAA0B,QAAQ,IAAI,eAAe,QAAQ;AAAA,cACjF,CAAC;AAAA,YACH;AAAA,UAAA;AAGF,cAAI,UAAU;AACZ;AAAA,cACE;AAAA,gBACE,WAAW,EAAE,kBAAkB,MAAM,MAAM,KAAK,KAAA;AAAA,gBAChD,MAAM;AAAA,cAAA;AAAA,cAER,MAAM;AACJ,qBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UAEJ,OAAO;AACL;AAAA,cACE;AAAA,gBACE,WAAW;AAAA,kBACT,iBAAiB;AAAA,kBACjB,CAAC,aAAa,cAAc,EAAE,GAAG;AAAA,kBACjC,MAAM,KAAK;AAAA,gBAAA;AAAA,gBAEb,MAAM;AAAA,cAAA;AAAA,cAER,MAAM;AACJ,qBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AAEL,cAAM,cAAc;AAAA,UAClB,WAAW,EAAE,MAAM,MAAM,uBAAuB,SAAA;AAAA,UAChD,MAAM;AAAA,UACN,UAAU,KAAK;AAAA,UACf,YAAY,KAAK;AAAA,QAAA;AAGnB,YAAI,KAAK,MAAM;AACb;AAAA,YACE;AAAA,cACE,GAAG;AAAA,cACH,MAAM,KAAK,WAAW,SAAY,KAAK;AAAA,cACvC,iBAAiB,KAAK,WAAW,SAAS;AAAA,YAAA;AAAA,YAE5C,MAAM;AACJ,mBAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAEJ,OAAO;AACL;AAAA,YACE;AAAA,cACE,GAAG;AAAA,cACH,MAAM;AAAA,cACN,UAAU,KAAK;AAAA,YAAA;AAAA,YAEjB,MAAM;AACJ,mBAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AA5QAL,UAAAM,mBAAAP,IAAA;AAMW,OAAA,oBAAA,QAAA;AAGA,SAAA,oBAAA,QAAA;AAGA,YAAA,oBAAA,QAAA;AAGA,QAAA,oBAAA,QAAA;AAGA,YAAA,oBAAA,QAAA;AAGA,QAAA,oBAAA,QAAA;AAGA,iBAAA,oBAAA,QAAA;AAlBTQ,oBAAAP,SAAA,GAAS,OADT,UALI,UAMK,IAAA;AAGTO,oBAAAP,SAAA,GAAS,SADT,YARI,UASK,MAAA;AAGTO,oBAAAP,SAAA,GAAS,YADT,eAXI,UAYK,SAAA;AAGTO,oBAAAP,SAAA,GAAS,QADT,WAdI,UAeK,KAAA;AAGTO,oBAAAP,SAAA,GAAS,YADT,eAjBI,UAkBK,SAAA;AAGTO,oBAAAP,SAAA,GAAS,QADT,WApBI,UAqBK,KAAA;AAGTO,oBAAAP,SAAA,GAAS,iBADT,oBAvBI,UAwBK,cAAA;AAxBXQ,sBAAAR,SAAM,QAAA;AACJI,gBADI,UACG,WAAU,WAAA;AAEjBA,gBAHI,UAGa,UAAS,CAACK,UAAAA,WAAW,KAAK,CAAA;AA2Q7C,SAAS,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChTT,IAAA,kBAAA,cAAA,kBAAA,WAAA,IAAA,OAAA,OAAA,cAAA,UAAA;AAqBA,MAAM,cAAa,KAAAC,eAAAA,gBAKjB,YAAA,CAACT,MAAAA,KAAK,EAAE,MAAM,OAAA,CAAQ,CAAA,GAGtB,mBAAA,CAACA,MAAAA,KAAK,EAAE,MAAM,OAAA,CAAQ,CAAA,GAGtB,eAAA,CAACA,MAAAA,KAAK,EAAE,MAAM,OAAA,CAAQ,CAAA,GAGtB,mBAAA,CAACA,MAAAA,KAAK,EAAE,MAAM,OAAA,CAAQ,IAdL,IAAe;AAAA,EAAlC,cAAA;AAAA,UAAA,GAAA,SAAA;AAME,iBAAA,MAAS,OAAiB,kBAA1B,OAAA,GAAA,MAA0B,QAAA,CAAA,GAA1B,kBAAA,OAAA,IAAA,IAAA;AAGA,iBAAA,MAAS,cAA+B,kBAAxC,OAAA,IAAA,MAAwC,YAAA,CAAA,GAAxC,kBAAA,OAAA,IAAA,IAAA;AAGA,iBAAA,MAAS,UAAuB,kBAAhC,OAAA,IAAA,MAAgC,OAAA,CAAA,GAAhC,kBAAA,OAAA,IAAA,IAAA;AAGA,iBAAA,MAAS,cAAT,kBAAA,OAAA,IAAA,IAAA,CAAA,GAAA,kBAAA,OAAA,IAAA,IAAA;AAOA,kBAAA,MAAQ,qBAAoB,CAAC,MAA2C;AACtE,YAAM,EAAE,KAAK,OAAO,QAAA,IAAY,EAAE;AAElC,WAAK,iBAAiB,cAAc,EAAE,QAAQ,CAAC,OAAO;AACpD,cAAM,OAAO;AACb,aAAK,WAAW,KAAK,QAAQ,OAAO,CAAC,KAAK;AAAA,MAC5C,CAAC;AACD,WAAK,cAAc;AACnB,WAAK,KAAK,UAAU,EAAE,QAAQ,EAAE,KAAK,OAAO,QAAA,GAAW;AAAA,IACzD,CAAA;AAAA,EAAA;AAAA,EAdA,oBAAoB;AAClB,UAAM,kBAAA;AACN,SAAK,OAAO,qBAAqB,KAAK,iBAAkC;AAAA,EAC1E;AAAA,EAaU,SAAS;AACjB,UAAM,eAAe,KAAK,gBAAgB;AAC1C,WAAOI,WAAK,CAAC,EAAE,KAAK,WAAW;AAC7B;AAAA,QACE;AAAA,UACE,WAAW,EAAE,aAAa,MAAM,yBAAyB,aAAA;AAAA,UACzD,MAAM,eAAe,YAAY;AAAA,UACjC,oBAAoB,KAAK;AAAA,QAAA;AAAA,QAE3B,MAAM;AACJ,eAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,CAAC;AAAA,EACH;AACF;AAhDA,QAAA,iBAAA,EAAA;AAMW,QAAA,oBAAA,QAAA;AAGA,eAAA,oBAAA,QAAA;AAGA,WAAA,oBAAA,QAAA;AAGA,eAAA,oBAAA,QAAA;AATT,kBAAA,OAAA,GAAS,QADT,WALI,MAMK,KAAA;AAGT,kBAAA,OAAA,GAAS,eADT,kBARI,MASK,YAAA;AAGT,kBAAA,OAAA,GAAS,WADT,cAXI,MAYK,QAAA;AAGT,kBAAA,OAAA,GAAS,eADT,kBAdI,MAeK,YAAA;AAfX,oBAAA,OAAM,IAAA;AACJ,cADI,MACG,WAAU,MAAA;AAEjB,cAHI,MAGa,UAAS,CAACI,UAAAA,WAAWE,OAAK,CAAA;AA+C7C,KAAK,SAAA;;;"}