@adukiorg/anza 0.2.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 (349) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/README.md +215 -0
  3. package/bin/anza.js +63 -0
  4. package/bin/create.js +150 -0
  5. package/importmap.json +72 -0
  6. package/package.json +100 -0
  7. package/src/core/animations/index.js +55 -0
  8. package/src/core/animations/play.js +111 -0
  9. package/src/core/animations/registry.js +54 -0
  10. package/src/core/animations/scroll.js +50 -0
  11. package/src/core/animations/tokens.js +58 -0
  12. package/src/core/animations/usage.md +301 -0
  13. package/src/core/animations/waapi.js +86 -0
  14. package/src/core/api/cache.js +120 -0
  15. package/src/core/api/caches/glob.js +24 -0
  16. package/src/core/api/caches/index.js +118 -0
  17. package/src/core/api/events/index.js +75 -0
  18. package/src/core/api/fetch.js +99 -0
  19. package/src/core/api/index.js +158 -0
  20. package/src/core/api/pipeline.js +98 -0
  21. package/src/core/api/plan.md +209 -0
  22. package/src/core/api/prefixes/index.js +66 -0
  23. package/src/core/api/retry.js +69 -0
  24. package/src/core/api/stream.js +127 -0
  25. package/src/core/api/upload.js +180 -0
  26. package/src/core/api/usage.md +206 -0
  27. package/src/core/events/bus.js +38 -0
  28. package/src/core/events/delegate.js +79 -0
  29. package/src/core/events/index.js +26 -0
  30. package/src/core/events/listen.js +50 -0
  31. package/src/core/events/missing.md +103 -0
  32. package/src/core/events/once.js +49 -0
  33. package/src/core/events/plan.md +177 -0
  34. package/src/core/events/types/index.js +34 -0
  35. package/src/core/events/usage.md +107 -0
  36. package/src/core/offline/bridge.js +51 -0
  37. package/src/core/offline/clock.js +100 -0
  38. package/src/core/offline/connectivity.js +116 -0
  39. package/src/core/offline/index.js +41 -0
  40. package/src/core/offline/missing.md +89 -0
  41. package/src/core/offline/plan.md +143 -0
  42. package/src/core/offline/queue.js +168 -0
  43. package/src/core/offline/state.js +18 -0
  44. package/src/core/offline/sync.js +106 -0
  45. package/src/core/offline/usage.md +273 -0
  46. package/src/core/platform/guard.js +104 -0
  47. package/src/core/platform/index.js +42 -0
  48. package/src/core/platform/missing.md +119 -0
  49. package/src/core/platform/platform.d.ts +88 -0
  50. package/src/core/platform/polyfills/anchor.js +79 -0
  51. package/src/core/platform/polyfills/navigation.js +142 -0
  52. package/src/core/platform/polyfills/popover.js +142 -0
  53. package/src/core/platform/polyfills/scheduler.js +194 -0
  54. package/src/core/platform/polyfills/shadow.js +35 -0
  55. package/src/core/platform/polyfills/urlpattern.js +119 -0
  56. package/src/core/platform/supports.js +186 -0
  57. package/src/core/platform/usage.md +287 -0
  58. package/src/core/router/cache.js +95 -0
  59. package/src/core/router/container.js +146 -0
  60. package/src/core/router/handler.js +52 -0
  61. package/src/core/router/history.js +120 -0
  62. package/src/core/router/index.js +158 -0
  63. package/src/core/router/intercept.js +376 -0
  64. package/src/core/router/match.js +145 -0
  65. package/src/core/router/missing.md +716 -0
  66. package/src/core/router/outlet.js +139 -0
  67. package/src/core/router/plan.md +370 -0
  68. package/src/core/router/sync/index.js +16 -0
  69. package/src/core/router/sync/tab.js +115 -0
  70. package/src/core/router/sync/transport.js +139 -0
  71. package/src/core/router/transitions.js +59 -0
  72. package/src/core/router/usage.md +773 -0
  73. package/src/core/security/crypto.js +159 -0
  74. package/src/core/security/index.js +49 -0
  75. package/src/core/security/missing.md +97 -0
  76. package/src/core/security/permissions.js +64 -0
  77. package/src/core/security/sanitize.js +100 -0
  78. package/src/core/security/usage.md +283 -0
  79. package/src/core/state/derived.js +117 -0
  80. package/src/core/state/index.js +23 -0
  81. package/src/core/state/missing.md +165 -0
  82. package/src/core/state/persist.js +284 -0
  83. package/src/core/state/store.js +308 -0
  84. package/src/core/state/sync.js +46 -0
  85. package/src/core/state/usage.md +440 -0
  86. package/src/core/storage/cache.js +83 -0
  87. package/src/core/storage/idb.js +196 -0
  88. package/src/core/storage/index.js +373 -0
  89. package/src/core/storage/lru.js +107 -0
  90. package/src/core/storage/missing.md +165 -0
  91. package/src/core/storage/opfs.js +190 -0
  92. package/src/core/storage/plan.md +69 -0
  93. package/src/core/storage/quota.js +69 -0
  94. package/src/core/storage/usage.md +226 -0
  95. package/src/core/ui/base.js +50 -0
  96. package/src/core/ui/define/container.js +82 -0
  97. package/src/core/ui/define/define.js +12 -0
  98. package/src/core/ui/define/element.js +390 -0
  99. package/src/core/ui/define/index.js +9 -0
  100. package/src/core/ui/define/orchestrator.js +105 -0
  101. package/src/core/ui/define/proxy.js +644 -0
  102. package/src/core/ui/define/state.js +6 -0
  103. package/src/core/ui/define/utils.js +134 -0
  104. package/src/core/ui/implementation.md +170 -0
  105. package/src/core/ui/index.js +41 -0
  106. package/src/core/ui/observe.js +117 -0
  107. package/src/core/ui/plan.md +510 -0
  108. package/src/core/ui/schedule.js +60 -0
  109. package/src/core/ui/template.js +37 -0
  110. package/src/core/ui/transitions.js +37 -0
  111. package/src/core/ui/ui.types.md +890 -0
  112. package/src/core/ui/usage.md +1124 -0
  113. package/src/core/ui/watch.md +346 -0
  114. package/src/core/workers/broadcast.js +138 -0
  115. package/src/core/workers/dedicated.js +153 -0
  116. package/src/core/workers/index.js +169 -0
  117. package/src/core/workers/locks.js +160 -0
  118. package/src/core/workers/offscreen.js +166 -0
  119. package/src/core/workers/plan.md +381 -0
  120. package/src/core/workers/pool.js +267 -0
  121. package/src/core/workers/shared.js +137 -0
  122. package/src/core/workers/usage.md +622 -0
  123. package/src/elements/base.js +12 -0
  124. package/src/elements/data/card/index.html +9 -0
  125. package/src/elements/data/card/index.js +19 -0
  126. package/src/elements/data/card/index.tags.json +1 -0
  127. package/src/elements/data/card/style.css +46 -0
  128. package/src/elements/data/chart/index.html +1 -0
  129. package/src/elements/data/chart/index.js +143 -0
  130. package/src/elements/data/chart/index.tags.json +1 -0
  131. package/src/elements/data/chart/style.css +13 -0
  132. package/src/elements/data/list/index.html +3 -0
  133. package/src/elements/data/list/index.js +19 -0
  134. package/src/elements/data/list/index.tags.json +1 -0
  135. package/src/elements/data/list/style.css +39 -0
  136. package/src/elements/data/stat/index.html +9 -0
  137. package/src/elements/data/stat/index.js +19 -0
  138. package/src/elements/data/stat/index.tags.json +1 -0
  139. package/src/elements/data/stat/style.css +50 -0
  140. package/src/elements/data/table/index.html +1 -0
  141. package/src/elements/data/table/index.js +16 -0
  142. package/src/elements/data/table/index.tags.json +1 -0
  143. package/src/elements/data/table/style.css +50 -0
  144. package/src/elements/feedback/alert/index.html +11 -0
  145. package/src/elements/feedback/alert/index.js +28 -0
  146. package/src/elements/feedback/alert/index.tags.json +1 -0
  147. package/src/elements/feedback/alert/style.css +75 -0
  148. package/src/elements/feedback/empty/index.html +13 -0
  149. package/src/elements/feedback/empty/index.js +34 -0
  150. package/src/elements/feedback/empty/index.tags.json +1 -0
  151. package/src/elements/feedback/empty/style.css +45 -0
  152. package/src/elements/feedback/progress/index.html +7 -0
  153. package/src/elements/feedback/progress/index.js +46 -0
  154. package/src/elements/feedback/progress/index.tags.json +1 -0
  155. package/src/elements/feedback/progress/style.css +36 -0
  156. package/src/elements/feedback/skeleton/index.html +1 -0
  157. package/src/elements/feedback/skeleton/index.js +78 -0
  158. package/src/elements/feedback/skeleton/index.tags.json +1 -0
  159. package/src/elements/feedback/skeleton/style.css +28 -0
  160. package/src/elements/feedback/toast/index.html +3 -0
  161. package/src/elements/feedback/toast/index.js +65 -0
  162. package/src/elements/feedback/toast/index.tags.json +1 -0
  163. package/src/elements/feedback/toast/style.css +36 -0
  164. package/src/elements/forms/checkbox/index.html +7 -0
  165. package/src/elements/forms/checkbox/index.js +104 -0
  166. package/src/elements/forms/checkbox/index.tags.json +1 -0
  167. package/src/elements/forms/checkbox/style.css +86 -0
  168. package/src/elements/forms/field/index.html +13 -0
  169. package/src/elements/forms/field/index.js +42 -0
  170. package/src/elements/forms/field/index.tags.json +1 -0
  171. package/src/elements/forms/field/style.css +42 -0
  172. package/src/elements/forms/form/index.html +3 -0
  173. package/src/elements/forms/form/index.js +122 -0
  174. package/src/elements/forms/form/index.tags.json +1 -0
  175. package/src/elements/forms/form/style.css +11 -0
  176. package/src/elements/forms/input/index.html +4 -0
  177. package/src/elements/forms/input/index.js +103 -0
  178. package/src/elements/forms/input/index.tags.json +1 -0
  179. package/src/elements/forms/input/style.css +39 -0
  180. package/src/elements/forms/radio/index.html +4 -0
  181. package/src/elements/forms/radio/index.js +109 -0
  182. package/src/elements/forms/radio/index.tags.json +1 -0
  183. package/src/elements/forms/radio/style.css +65 -0
  184. package/src/elements/forms/select/index.html +9 -0
  185. package/src/elements/forms/select/index.js +114 -0
  186. package/src/elements/forms/select/index.tags.json +1 -0
  187. package/src/elements/forms/select/style.css +95 -0
  188. package/src/elements/forms/textarea/index.html +4 -0
  189. package/src/elements/forms/textarea/index.js +115 -0
  190. package/src/elements/forms/textarea/index.tags.json +1 -0
  191. package/src/elements/forms/textarea/style.css +46 -0
  192. package/src/elements/forms/toggle/index.html +4 -0
  193. package/src/elements/forms/toggle/index.js +89 -0
  194. package/src/elements/forms/toggle/index.tags.json +1 -0
  195. package/src/elements/forms/toggle/style.css +63 -0
  196. package/src/elements/forms/upload/index.html +13 -0
  197. package/src/elements/forms/upload/index.js +120 -0
  198. package/src/elements/forms/upload/index.tags.json +1 -0
  199. package/src/elements/forms/upload/style.css +61 -0
  200. package/src/elements/index.js +71 -0
  201. package/src/elements/layout/app/index.html +7 -0
  202. package/src/elements/layout/app/index.js +16 -0
  203. package/src/elements/layout/app/index.tags.json +1 -0
  204. package/src/elements/layout/app/style.css +41 -0
  205. package/src/elements/layout/grid/index.html +3 -0
  206. package/src/elements/layout/grid/index.js +41 -0
  207. package/src/elements/layout/grid/index.tags.json +1 -0
  208. package/src/elements/layout/grid/style.css +12 -0
  209. package/src/elements/layout/header/index.html +8 -0
  210. package/src/elements/layout/header/index.js +16 -0
  211. package/src/elements/layout/header/index.tags.json +1 -0
  212. package/src/elements/layout/header/style.css +28 -0
  213. package/src/elements/layout/scroll/index.html +3 -0
  214. package/src/elements/layout/scroll/index.js +19 -0
  215. package/src/elements/layout/scroll/index.tags.json +1 -0
  216. package/src/elements/layout/scroll/style.css +24 -0
  217. package/src/elements/layout/sidebar/index.html +3 -0
  218. package/src/elements/layout/sidebar/index.js +24 -0
  219. package/src/elements/layout/sidebar/index.tags.json +1 -0
  220. package/src/elements/layout/sidebar/style.css +30 -0
  221. package/src/elements/layout/split/index.html +3 -0
  222. package/src/elements/layout/split/index.js +18 -0
  223. package/src/elements/layout/split/index.tags.json +1 -0
  224. package/src/elements/layout/split/style.css +28 -0
  225. package/src/elements/layout/stack/index.html +3 -0
  226. package/src/elements/layout/stack/index.js +31 -0
  227. package/src/elements/layout/stack/index.tags.json +1 -0
  228. package/src/elements/layout/stack/style.css +15 -0
  229. package/src/elements/layout/surface/index.html +3 -0
  230. package/src/elements/layout/surface/index.js +19 -0
  231. package/src/elements/layout/surface/index.tags.json +1 -0
  232. package/src/elements/layout/surface/style.css +29 -0
  233. package/src/elements/navigation/breadcrumb/index.html +5 -0
  234. package/src/elements/navigation/breadcrumb/index.js +16 -0
  235. package/src/elements/navigation/breadcrumb/index.tags.json +1 -0
  236. package/src/elements/navigation/breadcrumb/style.css +36 -0
  237. package/src/elements/navigation/nav/index.html +3 -0
  238. package/src/elements/navigation/nav/index.js +24 -0
  239. package/src/elements/navigation/nav/index.tags.json +1 -0
  240. package/src/elements/navigation/nav/style.css +38 -0
  241. package/src/elements/navigation/pagination/index.html +3 -0
  242. package/src/elements/navigation/pagination/index.js +94 -0
  243. package/src/elements/navigation/pagination/index.tags.json +1 -0
  244. package/src/elements/navigation/pagination/style.css +39 -0
  245. package/src/elements/navigation/steps/index.html +6 -0
  246. package/src/elements/navigation/steps/index.js +64 -0
  247. package/src/elements/navigation/steps/index.tags.json +1 -0
  248. package/src/elements/navigation/steps/style.css +78 -0
  249. package/src/elements/navigation/tabs/index.html +6 -0
  250. package/src/elements/navigation/tabs/index.js +132 -0
  251. package/src/elements/navigation/tabs/index.tags.json +1 -0
  252. package/src/elements/navigation/tabs/style.css +52 -0
  253. package/src/elements/overlay/dialog/index.html +5 -0
  254. package/src/elements/overlay/dialog/index.js +57 -0
  255. package/src/elements/overlay/dialog/index.tags.json +1 -0
  256. package/src/elements/overlay/dialog/style.css +31 -0
  257. package/src/elements/overlay/drawer/index.html +3 -0
  258. package/src/elements/overlay/drawer/index.js +56 -0
  259. package/src/elements/overlay/drawer/index.tags.json +1 -0
  260. package/src/elements/overlay/drawer/style.css +48 -0
  261. package/src/elements/overlay/menu/index.html +3 -0
  262. package/src/elements/overlay/menu/index.js +107 -0
  263. package/src/elements/overlay/menu/index.tags.json +1 -0
  264. package/src/elements/overlay/menu/style.css +43 -0
  265. package/src/elements/overlay/popover/index.html +3 -0
  266. package/src/elements/overlay/popover/index.js +44 -0
  267. package/src/elements/overlay/popover/index.tags.json +1 -0
  268. package/src/elements/overlay/popover/style.css +21 -0
  269. package/src/elements/overlay/sheet/index.html +8 -0
  270. package/src/elements/overlay/sheet/index.js +105 -0
  271. package/src/elements/overlay/sheet/index.tags.json +1 -0
  272. package/src/elements/overlay/sheet/style.css +64 -0
  273. package/src/elements/overlay/tooltip/index.html +6 -0
  274. package/src/elements/overlay/tooltip/index.js +16 -0
  275. package/src/elements/overlay/tooltip/index.tags.json +1 -0
  276. package/src/elements/overlay/tooltip/style.css +41 -0
  277. package/src/elements/primitives/avatar/index.html +2 -0
  278. package/src/elements/primitives/avatar/index.js +79 -0
  279. package/src/elements/primitives/avatar/index.tags.json +1 -0
  280. package/src/elements/primitives/avatar/style.css +36 -0
  281. package/src/elements/primitives/badge/index.html +3 -0
  282. package/src/elements/primitives/badge/index.js +20 -0
  283. package/src/elements/primitives/badge/index.tags.json +1 -0
  284. package/src/elements/primitives/badge/style.css +67 -0
  285. package/src/elements/primitives/button/index.html +3 -0
  286. package/src/elements/primitives/button/index.js +61 -0
  287. package/src/elements/primitives/button/index.tags.json +1 -0
  288. package/src/elements/primitives/button/style.css +66 -0
  289. package/src/elements/primitives/divider/index.html +1 -0
  290. package/src/elements/primitives/divider/index.js +43 -0
  291. package/src/elements/primitives/divider/index.tags.json +1 -0
  292. package/src/elements/primitives/divider/style.css +39 -0
  293. package/src/elements/primitives/icon/index.html +3 -0
  294. package/src/elements/primitives/icon/index.js +66 -0
  295. package/src/elements/primitives/icon/index.tags.json +1 -0
  296. package/src/elements/primitives/icon/style.css +20 -0
  297. package/src/elements/primitives/link/index.html +3 -0
  298. package/src/elements/primitives/link/index.js +129 -0
  299. package/src/elements/primitives/link/index.tags.json +1 -0
  300. package/src/elements/primitives/link/style.css +40 -0
  301. package/src/elements/primitives/spinner/index.html +1 -0
  302. package/src/elements/primitives/spinner/index.js +62 -0
  303. package/src/elements/primitives/spinner/index.tags.json +1 -0
  304. package/src/elements/primitives/spinner/style.css +20 -0
  305. package/src/elements/primitives/text/index.html +1 -0
  306. package/src/elements/primitives/text/index.js +79 -0
  307. package/src/elements/primitives/text/index.tags.json +1 -0
  308. package/src/elements/primitives/text/style.css +25 -0
  309. package/src/index.js +23 -0
  310. package/src/styles/base.css +66 -0
  311. package/src/styles/index.css +10 -0
  312. package/src/styles/layers.css +9 -0
  313. package/src/styles/reset.css +66 -0
  314. package/src/sw/activate.js +51 -0
  315. package/src/sw/expire.js +47 -0
  316. package/src/sw/index.js +28 -0
  317. package/src/sw/install.js +35 -0
  318. package/src/sw/push.js +58 -0
  319. package/src/sw/queue.js +60 -0
  320. package/src/sw/routes.js +71 -0
  321. package/src/sw/strategies.js +247 -0
  322. package/src/sw/sync.js +80 -0
  323. package/src/tokens/index.css +26 -0
  324. package/src/tokens/primitives/colors.css +54 -0
  325. package/src/tokens/primitives/motion.css +34 -0
  326. package/src/tokens/primitives/radius.css +16 -0
  327. package/src/tokens/primitives/shadow.css +34 -0
  328. package/src/tokens/primitives/spacing.css +27 -0
  329. package/src/tokens/primitives/typography.css +46 -0
  330. package/src/tokens/primitives/zindex.css +18 -0
  331. package/src/tokens/registered/colors.css +133 -0
  332. package/src/tokens/registered/dimensions.css +31 -0
  333. package/src/tokens/semantic/components.css +125 -0
  334. package/src/tokens/semantic/contrast.css +33 -0
  335. package/src/tokens/semantic/dark.css +61 -0
  336. package/src/tokens/semantic/light.css +64 -0
  337. package/types/core/animations/index.d.ts +52 -0
  338. package/types/core/api/index.d.ts +68 -0
  339. package/types/core/events/index.d.ts +50 -0
  340. package/types/core/offline/index.d.ts +68 -0
  341. package/types/core/platform/index.d.ts +60 -0
  342. package/types/core/router/index.d.ts +203 -0
  343. package/types/core/security/index.d.ts +33 -0
  344. package/types/core/state/index.d.ts +68 -0
  345. package/types/core/storage/index.d.ts +40 -0
  346. package/types/core/ui/index.d.ts +446 -0
  347. package/types/core/workers/index.d.ts +221 -0
  348. package/types/elements/index.d.ts +150 -0
  349. package/types/index.d.ts +18 -0
@@ -0,0 +1,143 @@
1
+ /**
2
+ * src/elements/data/chart/index.js
3
+ *
4
+ * Data Element: <ui-chart>
5
+ * Lightweight canvas-based declarative chart component supporting bar/line charts
6
+ * with automatic high-DPI scaling and responsive resizing.
7
+ *
8
+ * Source: doc 04 — Web Components §3, doc 05 — Native UI Primitives §3
9
+ */
10
+
11
+ import { ui } from '../../../core/ui/index.js';
12
+
13
+ ui.element('ui-chart', {
14
+ style: './style.css',
15
+ template: './index.html',
16
+ props: {
17
+ type: { type: String, reflect: true },
18
+ data: { type: String, reflect: true }
19
+ },
20
+ mount({ el, tags, watch }) {
21
+ const canvas = tags.one('canvas');
22
+
23
+ // Track sizing changes to automatically redraw High-DPI canvas
24
+ const observer = new ResizeObserver(() => draw(el, tags));
25
+ observer.observe(canvas);
26
+ el.ctrl.signal.addEventListener('abort', () => observer.disconnect());
27
+
28
+ draw(el, tags);
29
+ },
30
+ unmount({ el }) {
31
+ // ResizeObserver is cleaned up via AbortSignal in mount
32
+ },
33
+ update({ el, tags }) {
34
+ draw(el, tags);
35
+ }
36
+ }, import.meta.url);
37
+
38
+ function draw(el, tags) {
39
+ const canvas = tags.one('canvas');
40
+ const ctx = canvas.getContext('2d');
41
+ if (!ctx) return;
42
+
43
+ // Get dimensions and scale for high-DPI retina displays
44
+ const rect = canvas.getBoundingClientRect();
45
+ const dpr = window.devicePixelRatio || 1;
46
+ canvas.width = rect.width * dpr;
47
+ canvas.height = rect.height * dpr;
48
+ ctx.scale(dpr, dpr);
49
+
50
+ const width = rect.width;
51
+ const height = rect.height;
52
+
53
+ ctx.clearRect(0, 0, width, height);
54
+
55
+ // Parse data points
56
+ let data = [];
57
+ try {
58
+ data = el.data ? JSON.parse(el.data) : [10, 30, 20, 50, 40, 60];
59
+ } catch {
60
+ data = [10, 30, 20, 50, 40, 60];
61
+ }
62
+
63
+ const type = el.type || 'bar';
64
+ const maxVal = Math.max(...data, 1) * 1.1;
65
+
66
+ // Retrieve active token styles for canvas drawing
67
+ const style = getComputedStyle(el);
68
+ const colorInteractive = style.getPropertyValue('--color-interactive').trim() || '#3b82f6';
69
+ const colorBorder = style.getPropertyValue('--color-border-default').trim() || '#e5e7eb';
70
+ const colorText = style.getPropertyValue('--color-content-secondary').trim() || '#4b5563';
71
+
72
+ // Draw baseline grid lines
73
+ ctx.strokeStyle = colorBorder;
74
+ ctx.lineWidth = 1;
75
+ for (let i = 0; i <= 4; i++) {
76
+ const y = height - (i * (height - 30)) / 4 - 20;
77
+ ctx.beginPath();
78
+ ctx.moveTo(30, y);
79
+ ctx.lineTo(width - 10, y);
80
+ ctx.stroke();
81
+
82
+ // Axis labels text
83
+ ctx.fillStyle = colorText;
84
+ ctx.font = '10px sans-serif';
85
+ ctx.fillText(Math.round((maxVal * i) / 4).toString(), 5, y + 3);
86
+ }
87
+
88
+ const graphWidth = width - 40;
89
+ const graphHeight = height - 50;
90
+ const step = graphWidth / (data.length - 1 || 1);
91
+
92
+ if (type === 'line') {
93
+ ctx.strokeStyle = colorInteractive;
94
+ ctx.lineWidth = 3;
95
+ ctx.lineCap = 'round';
96
+ ctx.lineJoin = 'round';
97
+
98
+ ctx.beginPath();
99
+ data.forEach((val, idx) => {
100
+ const x = 30 + idx * step;
101
+ const y = height - 20 - (val / maxVal) * graphHeight;
102
+ if (idx === 0) {
103
+ ctx.moveTo(x, y);
104
+ } else {
105
+ ctx.lineTo(x, y);
106
+ }
107
+ });
108
+ ctx.stroke();
109
+
110
+ // Draw standard line fill gradient
111
+ ctx.lineTo(30 + (data.length - 1) * step, height - 20);
112
+ ctx.lineTo(30, height - 20);
113
+ ctx.closePath();
114
+ const grad = ctx.createLinearGradient(0, 0, 0, height);
115
+ grad.addColorStop(0, colorInteractive + '33'); // Fade opacity overlay
116
+ grad.addColorStop(1, colorInteractive + '00');
117
+ ctx.fillStyle = grad;
118
+ ctx.fill();
119
+
120
+ } else {
121
+ // Draw bar charts columns
122
+ const barWidth = Math.max(10, step * 0.6);
123
+ ctx.fillStyle = colorInteractive;
124
+
125
+ data.forEach((val, idx) => {
126
+ const x = 30 + idx * step - barWidth / 2;
127
+ const y = height - 20 - (val / maxVal) * graphHeight;
128
+ const barH = (val / maxVal) * graphHeight;
129
+
130
+ // Custom rounded top corners on charts bar rectangles
131
+ const radius = 4;
132
+ ctx.beginPath();
133
+ ctx.moveTo(x, y + barH);
134
+ ctx.lineTo(x, y + radius);
135
+ ctx.quadraticCurveTo(x, y, x + radius, y);
136
+ ctx.lineTo(x + barWidth - radius, y);
137
+ ctx.quadraticCurveTo(x + barWidth, y, x + barWidth, y + radius);
138
+ ctx.lineTo(x + barWidth, y + barH);
139
+ ctx.closePath();
140
+ ctx.fill();
141
+ });
142
+ }
143
+ }
@@ -0,0 +1 @@
1
+ {"version":1,"refs":[],"ids":[],"classes":[],"tags":["canvas"],"compound":[],"attrs":[],"refTypes":{}}
@@ -0,0 +1,13 @@
1
+ :host {
2
+ display: block;
3
+ width: 100%;
4
+ height: calc(var(--space-24) * 3);
5
+ position: relative;
6
+ font-family: var(--font-family-sans);
7
+ }
8
+
9
+ canvas {
10
+ width: 100%;
11
+ height: 100%;
12
+ display: block;
13
+ }
@@ -0,0 +1,3 @@
1
+ <div class="list" part="list" role="list">
2
+ <slot></slot>
3
+ </div>
@@ -0,0 +1,19 @@
1
+ /**
2
+ * src/elements/data/list/index.js
3
+ *
4
+ * Data Element: <ui-list>
5
+ * Flexible list wrapper supplying clean spacer dividers, bordered panels,
6
+ * and semantic token alignments.
7
+ *
8
+ * Source: doc 04 — Web Components §3, doc 05 — Native UI Primitives §3
9
+ */
10
+
11
+ import { ui } from '../../../core/ui/index.js';
12
+
13
+ ui.element('ui-list', {
14
+ style: './style.css',
15
+ template: './index.html',
16
+ props: {
17
+ bordered: { type: Boolean, reflect: true }
18
+ }
19
+ }, import.meta.url);
@@ -0,0 +1 @@
1
+ {"version":1,"refs":[],"ids":[],"classes":["list"],"tags":["div","slot"],"compound":["div.list"],"attrs":["class","part","role"],"refTypes":{}}
@@ -0,0 +1,39 @@
1
+ :host {
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 100%;
5
+ font-family: var(--font-family-sans);
6
+ }
7
+
8
+ .list {
9
+ display: flex;
10
+ flex-direction: column;
11
+ width: 100%;
12
+ box-sizing: border-box;
13
+ }
14
+
15
+ :host([bordered]) .list {
16
+ border: var(--space-px) solid var(--color-border-default);
17
+ border-radius: var(--radius-md);
18
+ background: var(--color-surface-elevated);
19
+ overflow: hidden;
20
+ }
21
+
22
+ /* Target items slotted inside list */
23
+ ::slotted(ui-list-item), ::slotted(div[role="listitem"]) {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: space-between;
27
+ padding: var(--space-3) var(--space-4);
28
+ border-bottom: var(--space-px) solid var(--color-border-default);
29
+ box-sizing: border-box;
30
+ transition: background-color var(--duration-fast) var(--ease-out);
31
+ }
32
+
33
+ ::slotted(ui-list-item:last-child), ::slotted(div[role="listitem"]:last-child) {
34
+ border-bottom: none;
35
+ }
36
+
37
+ ::slotted(ui-list-item:hover), ::slotted(div[role="listitem"]:hover) {
38
+ background: var(--color-surface-page);
39
+ }
@@ -0,0 +1,9 @@
1
+ <div class="label" part="label">
2
+ <slot name="label"></slot>
3
+ </div>
4
+ <div class="value" part="value">
5
+ <slot></slot>
6
+ </div>
7
+ <div class="trend-box" part="trend">
8
+ <slot name="change"></slot>
9
+ </div>
@@ -0,0 +1,19 @@
1
+ /**
2
+ * src/elements/data/stat/index.js
3
+ *
4
+ * Data Element: <ui-stat>
5
+ * Standard KPI statistic display panel offering large numerical values,
6
+ * secondary descriptive labels, and styled positive/negative/neutral trend change metrics.
7
+ *
8
+ * Source: doc 04 — Web Components §3, doc 05 — Native UI Primitives §3
9
+ */
10
+
11
+ import { ui } from '../../../core/ui/index.js';
12
+
13
+ ui.element('ui-stat', {
14
+ style: './style.css',
15
+ template: './index.html',
16
+ props: {
17
+ trend: { type: String, reflect: true, default: 'neutral' }
18
+ }
19
+ }, import.meta.url);
@@ -0,0 +1 @@
1
+ {"version":1,"refs":[],"ids":[],"classes":["label","trend-box","value"],"tags":["div","slot"],"compound":["div.label","div.trend-box","div.value"],"attrs":["class","name","part"],"refTypes":{}}
@@ -0,0 +1,50 @@
1
+ :host {
2
+ display: flex;
3
+ flex-direction: column;
4
+ background: var(--color-surface-elevated);
5
+ border: var(--space-px) solid var(--color-border-default);
6
+ border-radius: var(--radius-lg);
7
+ padding: var(--space-6);
8
+ box-shadow: var(--shadow-sm);
9
+ font-family: var(--font-family-sans);
10
+ box-sizing: border-box;
11
+ width: 100%;
12
+ }
13
+
14
+ .label {
15
+ font-size: var(--font-size-xs);
16
+ font-weight: var(--font-weight-medium);
17
+ color: var(--color-content-secondary);
18
+ text-transform: uppercase;
19
+ letter-spacing: var(--space-0-5);
20
+ margin-bottom: var(--space-1);
21
+ }
22
+
23
+ .value {
24
+ font-size: var(--font-size-3xl);
25
+ font-weight: var(--font-weight-bold);
26
+ color: var(--color-content-primary);
27
+ line-height: var(--line-height-none);
28
+ margin-bottom: var(--space-2);
29
+ }
30
+
31
+ .trend-box {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: var(--space-1);
35
+ font-size: var(--font-size-xs);
36
+ font-weight: var(--font-weight-medium);
37
+ }
38
+
39
+ /* Trend variance color configurations mapping only to semantic feedback tokens */
40
+ :host([trend="positive"]) .trend-box {
41
+ color: var(--color-feedback-success);
42
+ }
43
+
44
+ :host([trend="negative"]) .trend-box {
45
+ color: var(--color-feedback-error);
46
+ }
47
+
48
+ :host([trend="neutral"]) .trend-box {
49
+ color: var(--color-content-secondary);
50
+ }
@@ -0,0 +1 @@
1
+ <slot></slot>
@@ -0,0 +1,16 @@
1
+ /**
2
+ * src/elements/data/table/index.js
3
+ *
4
+ * Data Element: <ui-table>
5
+ * Responsive data table layout wrapping native standard <table> tags and attaching
6
+ * complete semantic design token styles using slotted tree CSS.
7
+ *
8
+ * Source: doc 04 — Web Components §3, doc 05 — Native UI Primitives §3
9
+ */
10
+
11
+ import { ui } from '../../../core/ui/index.js';
12
+
13
+ ui.element('ui-table', {
14
+ style: './style.css',
15
+ template: './index.html'
16
+ }, import.meta.url);
@@ -0,0 +1 @@
1
+ {"version":1,"refs":[],"ids":[],"classes":[],"tags":["slot"],"compound":[],"attrs":[],"refTypes":{}}
@@ -0,0 +1,50 @@
1
+ :host {
2
+ display: block;
3
+ width: 100%;
4
+ overflow-x: auto;
5
+ -webkit-overflow-scrolling: touch;
6
+ border: var(--space-px) solid var(--color-border-default);
7
+ border-radius: var(--radius-md);
8
+ background: var(--color-surface-elevated);
9
+ }
10
+
11
+ /* Target standard table tags distributed into slot */
12
+ ::slotted(table) {
13
+ width: 100%;
14
+ border-collapse: collapse;
15
+ border-spacing: 0;
16
+ font-family: var(--font-family-sans);
17
+ font-size: var(--font-size-sm);
18
+ color: var(--color-content-primary);
19
+ text-align: left;
20
+ }
21
+
22
+ ::slotted(thead) {
23
+ background: var(--color-surface-page);
24
+ border-bottom: var(--space-px) solid var(--color-border-default);
25
+ }
26
+
27
+ ::slotted(th) {
28
+ padding: var(--space-3) var(--space-4);
29
+ font-weight: var(--font-weight-semibold);
30
+ color: var(--color-content-secondary);
31
+ user-select: none;
32
+ }
33
+
34
+ ::slotted(tr) {
35
+ border-bottom: var(--space-px) solid var(--color-border-default);
36
+ transition: background-color var(--duration-fast) var(--ease-out);
37
+ }
38
+
39
+ ::slotted(tr:last-child) {
40
+ border-bottom: none;
41
+ }
42
+
43
+ ::slotted(tbody tr:hover) {
44
+ background: var(--color-interactive-disabled);
45
+ }
46
+
47
+ ::slotted(td) {
48
+ padding: var(--space-4);
49
+ vertical-align: middle;
50
+ }
@@ -0,0 +1,11 @@
1
+ <div class="alert" part="alert" role="alert">
2
+ <div class="body" part="body">
3
+ <slot></slot>
4
+ </div>
5
+ <button part="close-button" type="button" aria-label="Close alert">
6
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
7
+ <line x1="18" y1="6" x2="6" y2="18" />
8
+ <line x1="6" y1="6" x2="18" y2="18" />
9
+ </svg>
10
+ </button>
11
+ </div>
@@ -0,0 +1,28 @@
1
+ /**
2
+ * src/elements/feedback/alert/index.js
3
+ *
4
+ * Feedback Element: <ui-alert>
5
+ * Inline severity notifications (info, success, warning, error) incorporating WAI-ARIA
6
+ * role="alert" live regions and dismiss action controllers.
7
+ *
8
+ * Source: doc 04 — Web Components §3, doc 05 — Native UI Primitives §3
9
+ */
10
+
11
+ import { ui } from '../../../core/ui/index.js';
12
+
13
+ ui.element('ui-alert', {
14
+ style: './style.css',
15
+ template: './index.html',
16
+ props: {
17
+ variant: { type: String, reflect: true },
18
+ dismissible: { type: Boolean, reflect: true }
19
+ },
20
+ mount({ el, tags, on }) {
21
+ const closeBtn = tags.one('button');
22
+
23
+ on.click(closeBtn, () => {
24
+ el.dispatchEvent(new CustomEvent('dismiss', { bubbles: true, composed: true }));
25
+ el.remove();
26
+ });
27
+ }
28
+ }, import.meta.url);
@@ -0,0 +1 @@
1
+ {"version":1,"refs":[],"ids":[],"classes":["alert","body"],"tags":["button","div","line","slot","svg"],"compound":["div.alert","div.body"],"attrs":["aria-label","class","fill","height","part","role","stroke","stroke-linecap","stroke-linejoin","stroke-width","type","viewBox","width","x1","x2","y1","y2"],"refTypes":{}}
@@ -0,0 +1,75 @@
1
+ :host {
2
+ display: block;
3
+ font-family: var(--font-family-sans);
4
+ width: 100%;
5
+ /* Component Tokens — Semantic Reference Only */
6
+ --alert-radius: var(--radius-md);
7
+ --alert-bg: var(--color-surface-elevated);
8
+ --alert-color: var(--color-content-primary);
9
+ --alert-border: var(--color-border-default);
10
+ }
11
+
12
+ .alert {
13
+ display: flex;
14
+ align-items: flex-start;
15
+ gap: var(--space-3);
16
+ padding: var(--space-4);
17
+ background: var(--alert-bg);
18
+ color: var(--alert-color);
19
+ border: var(--space-px) solid var(--alert-border);
20
+ border-radius: var(--alert-radius);
21
+ box-sizing: border-box;
22
+ position: relative;
23
+ }
24
+
25
+ .body {
26
+ flex: 1;
27
+ font-size: var(--font-size-sm);
28
+ line-height: var(--line-height-normal);
29
+ }
30
+
31
+ button {
32
+ background: transparent;
33
+ border: none;
34
+ color: currentColor;
35
+ opacity: 0.6;
36
+ cursor: pointer;
37
+ padding: 0;
38
+ display: none;
39
+ align-items: center;
40
+ justify-content: center;
41
+ transition: opacity var(--duration-fast) var(--ease-out);
42
+ }
43
+
44
+ button:hover {
45
+ opacity: 1;
46
+ }
47
+
48
+ :host([dismissible]) button {
49
+ display: inline-flex;
50
+ }
51
+
52
+ /* Variant mappings using semantic feedback tokens only */
53
+ :host([variant="success"]) {
54
+ --alert-bg: var(--color-surface-page);
55
+ --alert-border: var(--color-feedback-success);
56
+ --alert-color: var(--color-content-primary);
57
+ }
58
+
59
+ :host([variant="warning"]) {
60
+ --alert-bg: var(--color-surface-page);
61
+ --alert-border: var(--color-feedback-warning);
62
+ --alert-color: var(--color-content-primary);
63
+ }
64
+
65
+ :host([variant="error"]) {
66
+ --alert-bg: var(--color-surface-page);
67
+ --alert-border: var(--color-feedback-error);
68
+ --alert-color: var(--color-content-primary);
69
+ }
70
+
71
+ :host([variant="info"]) {
72
+ --alert-bg: var(--color-surface-page);
73
+ --alert-border: var(--color-feedback-info);
74
+ --alert-color: var(--color-content-primary);
75
+ }
@@ -0,0 +1,13 @@
1
+ <div class="illustration" part="illustration">
2
+ <slot name="illustration">
3
+ <svg width="64" height="64" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
4
+ <circle cx="12" cy="12" r="10" />
5
+ <line x1="8" y1="12" x2="16" y2="12" />
6
+ </svg>
7
+ </slot>
8
+ </div>
9
+ <h3 id="title-label" part="title"></h3>
10
+ <p id="desc-label" part="description"></p>
11
+ <div class="actions" part="actions">
12
+ <slot></slot>
13
+ </div>
@@ -0,0 +1,34 @@
1
+ /**
2
+ * src/elements/feedback/empty/index.js
3
+ *
4
+ * Feedback Element: <ui-empty>
5
+ * Informative empty state component supporting custom illustrations slots,
6
+ * titles, secondary paragraphs, and CTA actions triggers.
7
+ *
8
+ * Source: doc 04 — Web Components §3, doc 05 — Native UI Primitives §3
9
+ */
10
+
11
+ import { ui } from '../../../core/ui/index.js';
12
+
13
+ ui.element('ui-empty', {
14
+ style: './style.css',
15
+ template: './index.html',
16
+ props: {
17
+ title: { type: String, reflect: true },
18
+ description: { type: String, reflect: true }
19
+ },
20
+ mount({ el, tags }) {
21
+ update(el, tags);
22
+ },
23
+ update({ el, tags }) {
24
+ update(el, tags);
25
+ }
26
+ }, import.meta.url);
27
+
28
+ function update(el, tags) {
29
+ const title = el.title || 'No records found';
30
+ const description = el.description || 'Try adjusting your search criteria or add new records.';
31
+
32
+ tags.one('#title-label').textContent = title;
33
+ tags.one('#desc-label').textContent = description;
34
+ }
@@ -0,0 +1 @@
1
+ {"version":1,"refs":[],"ids":["desc-label","title-label"],"classes":["actions","illustration"],"tags":["circle","div","h3","line","p","slot","svg"],"compound":["div.actions","div.illustration"],"attrs":["class","cx","cy","fill","height","id","name","part","r","stroke","stroke-linecap","stroke-linejoin","stroke-width","viewBox","width","x1","x2","y1","y2"],"refTypes":{}}
@@ -0,0 +1,45 @@
1
+ :host {
2
+ display: flex;
3
+ flex-direction: column;
4
+ align-items: center;
5
+ justify-content: center;
6
+ text-align: center;
7
+ padding: var(--space-12) var(--space-6);
8
+ font-family: var(--font-family-sans);
9
+ box-sizing: border-box;
10
+ width: 100%;
11
+ }
12
+
13
+ .illustration {
14
+ margin-bottom: var(--space-4);
15
+ color: var(--color-content-secondary);
16
+ display: flex;
17
+ justify-content: center;
18
+ }
19
+
20
+ /* Slotted illustration size constraints */
21
+ ::slotted(svg), ::slotted(img) {
22
+ width: calc(var(--space-12) * 2);
23
+ height: calc(var(--space-12) * 2);
24
+ }
25
+
26
+ h3 {
27
+ font-size: var(--font-size-lg);
28
+ font-weight: var(--font-weight-semibold);
29
+ color: var(--color-content-primary);
30
+ margin: 0 0 var(--space-2) 0;
31
+ }
32
+
33
+ p {
34
+ font-size: var(--font-size-sm);
35
+ color: var(--color-content-secondary);
36
+ max-width: calc(var(--space-32) * 3);
37
+ margin: 0 0 var(--space-6) 0;
38
+ line-height: var(--line-height-normal);
39
+ }
40
+
41
+ .actions {
42
+ display: flex;
43
+ gap: var(--space-3);
44
+ justify-content: center;
45
+ }
@@ -0,0 +1,7 @@
1
+ <div class="label-box" part="labels">
2
+ <slot name="label">Progress</slot>
3
+ <span id="percent-label">0%</span>
4
+ </div>
5
+ <div class="track" part="track">
6
+ <div class="fill" part="fill"></div>
7
+ </div>
@@ -0,0 +1,46 @@
1
+ /**
2
+ * src/elements/feedback/progress/index.js
3
+ *
4
+ * Feedback Element: <ui-progress>
5
+ * Premium progress indicator mapping directly to native progress states
6
+ * while incorporating smooth CSS animations and active percentage labels.
7
+ *
8
+ * Source: doc 04 — Web Components §3, doc 05 — Native UI Primitives §3
9
+ */
10
+
11
+ import { ui } from '../../../core/ui/index.js';
12
+
13
+ ui.element('ui-progress', {
14
+ style: './style.css',
15
+ template: './index.html',
16
+ props: {
17
+ value: { type: Number, reflect: true },
18
+ max: { type: Number, reflect: true }
19
+ },
20
+ mount({ el, tags }) {
21
+ // ARIA updates
22
+ if (!el.hasAttribute('role')) {
23
+ el.setAttribute('role', 'progressbar');
24
+ }
25
+ update(el, tags);
26
+ },
27
+ update({ el, tags }) {
28
+ update(el, tags);
29
+ }
30
+ }, import.meta.url);
31
+
32
+ function update(el, tags) {
33
+ const val = el.value || 0;
34
+ const max = el.max || 100;
35
+ const fill = tags.one('.fill');
36
+ const label = tags.one('#percent-label');
37
+
38
+ const pct = Math.min(100, Math.max(0, Math.round((val / max) * 100)));
39
+
40
+ fill.style.width = `${pct}%`;
41
+ label.textContent = `${pct}%`;
42
+
43
+ el.setAttribute('aria-valuenow', val);
44
+ el.setAttribute('aria-valuemin', 0);
45
+ el.setAttribute('aria-valuemax', max);
46
+ }
@@ -0,0 +1 @@
1
+ {"version":1,"refs":[],"ids":["percent-label"],"classes":["fill","label-box","track"],"tags":["div","slot","span"],"compound":["div.fill","div.label-box","div.track"],"attrs":["class","id","name","part"],"refTypes":{}}