microui-wc 0.1.1 → 0.1.2

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 (339) hide show
  1. package/AGENTS.md +71 -71
  2. package/CHANGELOG.md +1 -1
  3. package/README.md +14 -9
  4. package/dist/AGENTS.md +71 -71
  5. package/dist/README.md +14 -9
  6. package/dist/microui.css +1 -1
  7. package/dist/microui.esm.js.map +1 -1
  8. package/dist/microui.min.js.map +1 -1
  9. package/docs/getting-started.md +3 -3
  10. package/package.json +39 -11
  11. package/src/components/mu-schema-form.js +1 -1
  12. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -40
  13. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -33
  14. package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
  15. package/.github/workflows/ci.yml +0 -42
  16. package/.github/workflows/deploy-pages.yml +0 -112
  17. package/CODE_OF_CONDUCT.md +0 -59
  18. package/CONTRIBUTING.md +0 -156
  19. package/SECURITY.md +0 -58
  20. package/app/.generated/routes/alerts.js +0 -8
  21. package/app/.generated/routes/avatars.js +0 -8
  22. package/app/.generated/routes/badges.js +0 -8
  23. package/app/.generated/routes/buttons.js +0 -10
  24. package/app/.generated/routes/cards.js +0 -10
  25. package/app/.generated/routes/checkboxes.js +0 -9
  26. package/app/.generated/routes/chips.js +0 -8
  27. package/app/.generated/routes/dropdowns.js +0 -9
  28. package/app/.generated/routes/home.js +0 -7
  29. package/app/.generated/routes/icons.js +0 -9
  30. package/app/.generated/routes/inputs.js +0 -10
  31. package/app/.generated/routes/installation.js +0 -7
  32. package/app/.generated/routes/layout.js +0 -9
  33. package/app/.generated/routes/modals.js +0 -9
  34. package/app/.generated/routes/navbar.js +0 -7
  35. package/app/.generated/routes/progress.js +0 -9
  36. package/app/.generated/routes/radios.js +0 -9
  37. package/app/.generated/routes/switches.js +0 -9
  38. package/app/.generated/routes/tabs.js +0 -8
  39. package/app/.generated/routes/toasts.js +0 -9
  40. package/app/index.html +0 -67
  41. package/app/pages/alerts.html +0 -23
  42. package/app/pages/avatars.html +0 -22
  43. package/app/pages/badges.html +0 -22
  44. package/app/pages/buttons.html +0 -71
  45. package/app/pages/cards.html +0 -54
  46. package/app/pages/checkboxes.html +0 -39
  47. package/app/pages/chips.html +0 -23
  48. package/app/pages/dropdowns.html +0 -41
  49. package/app/pages/home.html +0 -59
  50. package/app/pages/icons.html +0 -29
  51. package/app/pages/inputs.html +0 -66
  52. package/app/pages/installation.html +0 -34
  53. package/app/pages/layout.html +0 -30
  54. package/app/pages/modals.html +0 -21
  55. package/app/pages/navbar.html +0 -22
  56. package/app/pages/progress.html +0 -35
  57. package/app/pages/radios.html +0 -40
  58. package/app/pages/switches.html +0 -39
  59. package/app/pages/tabs.html +0 -30
  60. package/app/pages/toasts.html +0 -22
  61. package/app-dist/index.html +0 -67
  62. package/app-dist/pages/alerts.html +0 -23
  63. package/app-dist/pages/avatars.html +0 -22
  64. package/app-dist/pages/badges.html +0 -22
  65. package/app-dist/pages/buttons.html +0 -71
  66. package/app-dist/pages/cards.html +0 -54
  67. package/app-dist/pages/checkboxes.html +0 -39
  68. package/app-dist/pages/chips.html +0 -23
  69. package/app-dist/pages/dropdowns.html +0 -41
  70. package/app-dist/pages/home.html +0 -59
  71. package/app-dist/pages/icons.html +0 -29
  72. package/app-dist/pages/inputs.html +0 -66
  73. package/app-dist/pages/installation.html +0 -34
  74. package/app-dist/pages/layout.html +0 -30
  75. package/app-dist/pages/modals.html +0 -21
  76. package/app-dist/pages/navbar.html +0 -22
  77. package/app-dist/pages/progress.html +0 -35
  78. package/app-dist/pages/radios.html +0 -40
  79. package/app-dist/pages/switches.html +0 -39
  80. package/app-dist/pages/tabs.html +0 -30
  81. package/app-dist/pages/toasts.html +0 -22
  82. package/app-dist/pages.json +0 -217
  83. package/app-dist/routes/alerts.js +0 -5
  84. package/app-dist/routes/avatars.js +0 -1
  85. package/app-dist/routes/badges.js +0 -1
  86. package/app-dist/routes/buttons.js +0 -1
  87. package/app-dist/routes/cards.js +0 -1
  88. package/app-dist/routes/checkboxes.js +0 -9
  89. package/app-dist/routes/chips.js +0 -4
  90. package/app-dist/routes/chunk-019e5e2f.js +0 -5
  91. package/app-dist/routes/chunk-0m4j19yd.js +0 -2
  92. package/app-dist/routes/chunk-0tmmp5q0.js +0 -1
  93. package/app-dist/routes/chunk-10xn709r.js +0 -1
  94. package/app-dist/routes/chunk-15m2qcda.js +0 -2
  95. package/app-dist/routes/chunk-1bh8g23n.js +0 -1
  96. package/app-dist/routes/chunk-1vg0v937.js +0 -1
  97. package/app-dist/routes/chunk-1zvcgy3j.js +0 -1
  98. package/app-dist/routes/chunk-2afb0861.js +0 -1
  99. package/app-dist/routes/chunk-2c6ttpzt.js +0 -5
  100. package/app-dist/routes/chunk-3dy30fhs.js +0 -1
  101. package/app-dist/routes/chunk-426dnces.js +0 -13
  102. package/app-dist/routes/chunk-44kgxery.js +0 -1
  103. package/app-dist/routes/chunk-47fdnejd.js +0 -33
  104. package/app-dist/routes/chunk-49a6t2vq.js +0 -1
  105. package/app-dist/routes/chunk-4fe1rm5b.js +0 -1
  106. package/app-dist/routes/chunk-4ggmvkta.js +0 -33
  107. package/app-dist/routes/chunk-4vkz81q7.js +0 -33
  108. package/app-dist/routes/chunk-4w4tmj8f.js +0 -31
  109. package/app-dist/routes/chunk-532s62kr.js +0 -31
  110. package/app-dist/routes/chunk-5hm3bssy.js +0 -33
  111. package/app-dist/routes/chunk-5vrh24hc.js +0 -1
  112. package/app-dist/routes/chunk-61pcg25a.js +0 -1
  113. package/app-dist/routes/chunk-6nfhygvf.js +0 -1
  114. package/app-dist/routes/chunk-700e7je6.js +0 -33
  115. package/app-dist/routes/chunk-7fsn17kg.js +0 -1
  116. package/app-dist/routes/chunk-7k789b32.js +0 -1
  117. package/app-dist/routes/chunk-7r46q0ys.js +0 -36
  118. package/app-dist/routes/chunk-86fmc1fr.js +0 -5
  119. package/app-dist/routes/chunk-8qth37vw.js +0 -1
  120. package/app-dist/routes/chunk-924wv8n0.js +0 -1
  121. package/app-dist/routes/chunk-9mbhgxk9.js +0 -1
  122. package/app-dist/routes/chunk-a216hyd9.js +0 -1
  123. package/app-dist/routes/chunk-akzxykh9.js +0 -33
  124. package/app-dist/routes/chunk-b3dcvy8c.js +0 -1
  125. package/app-dist/routes/chunk-b74zahz5.js +0 -31
  126. package/app-dist/routes/chunk-bftj53p2.js +0 -5
  127. package/app-dist/routes/chunk-c01hnz3e.js +0 -1
  128. package/app-dist/routes/chunk-d8pvv5km.js +0 -1
  129. package/app-dist/routes/chunk-dev0aezr.js +0 -2
  130. package/app-dist/routes/chunk-dh6vnv0e.js +0 -1
  131. package/app-dist/routes/chunk-dn2cbpva.js +0 -36
  132. package/app-dist/routes/chunk-dvn0my90.js +0 -1
  133. package/app-dist/routes/chunk-dvq8mnve.js +0 -36
  134. package/app-dist/routes/chunk-e8c2gc4d.js +0 -5
  135. package/app-dist/routes/chunk-ejf9ak2x.js +0 -1
  136. package/app-dist/routes/chunk-f083m55s.js +0 -1
  137. package/app-dist/routes/chunk-fnrj28s1.js +0 -31
  138. package/app-dist/routes/chunk-fvg3yjdp.js +0 -31
  139. package/app-dist/routes/chunk-g7k381n1.js +0 -1
  140. package/app-dist/routes/chunk-h01kq2ae.js +0 -13
  141. package/app-dist/routes/chunk-h4dk761v.js +0 -5
  142. package/app-dist/routes/chunk-hmx91z2x.js +0 -5
  143. package/app-dist/routes/chunk-hxbg4m42.js +0 -36
  144. package/app-dist/routes/chunk-jbjnfp2b.js +0 -2
  145. package/app-dist/routes/chunk-jxtz5vv6.js +0 -36
  146. package/app-dist/routes/chunk-jxzcs0ey.js +0 -36
  147. package/app-dist/routes/chunk-kt7wwhcx.js +0 -1
  148. package/app-dist/routes/chunk-kzptszyc.js +0 -33
  149. package/app-dist/routes/chunk-mhgca4w4.js +0 -2
  150. package/app-dist/routes/chunk-mhswxa20.js +0 -1
  151. package/app-dist/routes/chunk-n8zfeex6.js +0 -1
  152. package/app-dist/routes/chunk-pee47b2r.js +0 -1
  153. package/app-dist/routes/chunk-pesmw829.js +0 -1
  154. package/app-dist/routes/chunk-pgc4c6f3.js +0 -36
  155. package/app-dist/routes/chunk-q8egegm1.js +0 -1
  156. package/app-dist/routes/chunk-q9mn2qyq.js +0 -36
  157. package/app-dist/routes/chunk-qh0rtaf3.js +0 -5
  158. package/app-dist/routes/chunk-qqhmk6ye.js +0 -2
  159. package/app-dist/routes/chunk-qrxygmf7.js +0 -33
  160. package/app-dist/routes/chunk-r46yzksx.js +0 -36
  161. package/app-dist/routes/chunk-rgpbw2w0.js +0 -5
  162. package/app-dist/routes/chunk-rnpzv3d8.js +0 -2
  163. package/app-dist/routes/chunk-s5v8cv05.js +0 -2
  164. package/app-dist/routes/chunk-sbwn5bpc.js +0 -1
  165. package/app-dist/routes/chunk-sqbg8jbt.js +0 -33
  166. package/app-dist/routes/chunk-sv8dqnf7.js +0 -1
  167. package/app-dist/routes/chunk-t67sw3za.js +0 -1
  168. package/app-dist/routes/chunk-tjdpqwdf.js +0 -31
  169. package/app-dist/routes/chunk-tq2mfghg.js +0 -1
  170. package/app-dist/routes/chunk-ttn10vt6.js +0 -1
  171. package/app-dist/routes/chunk-v2hzpjxr.js +0 -1
  172. package/app-dist/routes/chunk-wfjjkw9y.js +0 -1
  173. package/app-dist/routes/chunk-wt8cxzmf.js +0 -31
  174. package/app-dist/routes/chunk-x45d372k.js +0 -5
  175. package/app-dist/routes/chunk-y3wsazkt.js +0 -1
  176. package/app-dist/routes/chunk-y7pmgc7t.js +0 -33
  177. package/app-dist/routes/chunk-zefdt2q3.js +0 -31
  178. package/app-dist/routes/dropdowns.js +0 -6
  179. package/app-dist/routes/home.js +0 -1
  180. package/app-dist/routes/icons.js +0 -1
  181. package/app-dist/routes/inputs.js +0 -12
  182. package/app-dist/routes/installation.js +0 -1
  183. package/app-dist/routes/layout.js +0 -1
  184. package/app-dist/routes/modals.js +0 -7
  185. package/app-dist/routes/navbar.js +0 -1
  186. package/app-dist/routes/progress.js +0 -1
  187. package/app-dist/routes/radios.js +0 -6
  188. package/app-dist/routes/switches.js +0 -6
  189. package/app-dist/routes/tabs.js +0 -1
  190. package/app-dist/routes/toasts.js +0 -16
  191. package/assets/fonts/material-symbols-mini.woff2 +0 -0
  192. package/assets/fonts/material-symbols.woff2 +0 -0
  193. package/assets/fonts/roboto-400.woff2 +0 -0
  194. package/assets/fonts/roboto-500.woff2 +0 -0
  195. package/assets/fonts/roboto-700.woff2 +0 -0
  196. package/assets/logo-banner-400.jpg +0 -0
  197. package/assets/logo-banner-400.webp +0 -0
  198. package/assets/logo-banner-800.webp +0 -0
  199. package/assets/logo-banner.jpg +0 -0
  200. package/assets/logo-icon-64.jpg +0 -0
  201. package/assets/logo-icon-64.webp +0 -0
  202. package/assets/logo-icon.jpg +0 -0
  203. package/assets/logo-square.jpg +0 -0
  204. package/bun.lock +0 -312
  205. package/bunfig.toml +0 -4
  206. package/custom-elements.json +0 -1916
  207. package/demo/api/sample-data.json +0 -38
  208. package/demo/content/alerts.html +0 -115
  209. package/demo/content/avatars.html +0 -70
  210. package/demo/content/badges.html +0 -65
  211. package/demo/content/buttons.html +0 -188
  212. package/demo/content/callouts.html +0 -91
  213. package/demo/content/cards.html +0 -121
  214. package/demo/content/checkboxes.html +0 -178
  215. package/demo/content/chips.html +0 -67
  216. package/demo/content/codeblocks.html +0 -101
  217. package/demo/content/confirms.html +0 -115
  218. package/demo/content/datatables.html +0 -149
  219. package/demo/content/dividers.html +0 -119
  220. package/demo/content/dropdowns.html +0 -89
  221. package/demo/content/enterprise.html +0 -252
  222. package/demo/content/home.html +0 -149
  223. package/demo/content/icons.html +0 -89
  224. package/demo/content/inputs.html +0 -135
  225. package/demo/content/installation.html +0 -16
  226. package/demo/content/layout.html +0 -136
  227. package/demo/content/modals.html +0 -141
  228. package/demo/content/navbar.html +0 -70
  229. package/demo/content/progress.html +0 -119
  230. package/demo/content/radios.html +0 -88
  231. package/demo/content/skeletons.html +0 -109
  232. package/demo/content/spinners.html +0 -96
  233. package/demo/content/switches.html +0 -84
  234. package/demo/content/tables.html +0 -124
  235. package/demo/content/tabs.html +0 -85
  236. package/demo/content/toasts.html +0 -116
  237. package/demo/content/tooltips.html +0 -107
  238. package/demo/content/virtual-lists.html +0 -233
  239. package/demo/favicon.ico +0 -0
  240. package/demo/favicon.png +0 -0
  241. package/demo/full.html +0 -52
  242. package/demo/iife.html +0 -46
  243. package/demo/manifest.json +0 -34
  244. package/demo/pages/datatable-demo.html +0 -237
  245. package/demo/pages/prompt-ui-demo.html +0 -218
  246. package/demo/pages/responsive-demo.html +0 -122
  247. package/demo/pages/schema-form-demo.html +0 -270
  248. package/demo/robots.txt +0 -6
  249. package/demo/shell.html +0 -712
  250. package/demo/sw.js +0 -387
  251. package/lighthouse-audit.mjs +0 -113
  252. package/scripts/analyze-components.js +0 -105
  253. package/scripts/build-app.js +0 -193
  254. package/scripts/build-framework.js +0 -444
  255. package/scripts/build-utils.js +0 -101
  256. package/scripts/test-isolated.js +0 -151
  257. package/server.js +0 -256
  258. package/tests/agents/agent-integration.test.js +0 -76
  259. package/tests/benchmark.html +0 -296
  260. package/tests/build/scan-components.test.js +0 -173
  261. package/tests/components/all-components.test.js +0 -245
  262. package/tests/components/all-missing-components.test.js +0 -574
  263. package/tests/components/mu-alert.test.js +0 -113
  264. package/tests/components/mu-avatar.test.js +0 -148
  265. package/tests/components/mu-badge.test.js +0 -92
  266. package/tests/components/mu-button.test.js +0 -112
  267. package/tests/components/mu-card.test.js +0 -89
  268. package/tests/components/mu-checkbox.test.js +0 -158
  269. package/tests/components/mu-chip.test.js +0 -118
  270. package/tests/components/mu-container.test.js +0 -120
  271. package/tests/components/mu-divider.test.js +0 -98
  272. package/tests/components/mu-drawer-item.test.js +0 -199
  273. package/tests/components/mu-drawer.test.js +0 -96
  274. package/tests/components/mu-dropdown.test.js +0 -125
  275. package/tests/components/mu-form.test.js +0 -138
  276. package/tests/components/mu-grid.test.js +0 -135
  277. package/tests/components/mu-icon.test.js +0 -110
  278. package/tests/components/mu-input.test.js +0 -131
  279. package/tests/components/mu-lazy.test.js +0 -103
  280. package/tests/components/mu-modal.test.js +0 -275
  281. package/tests/components/mu-navbar.test.js +0 -101
  282. package/tests/components/mu-progress.test.js +0 -115
  283. package/tests/components/mu-radio.test.js +0 -114
  284. package/tests/components/mu-repeat.test.js +0 -106
  285. package/tests/components/mu-sidebar.test.js +0 -126
  286. package/tests/components/mu-skeleton.test.js +0 -162
  287. package/tests/components/mu-stack.test.js +0 -143
  288. package/tests/components/mu-switch.test.js +0 -292
  289. package/tests/components/mu-table.test.js +0 -124
  290. package/tests/components/mu-tabs.test.js +0 -104
  291. package/tests/components/mu-textarea.test.js +0 -115
  292. package/tests/components/mu-toast.test.js +0 -321
  293. package/tests/components/mu-tooltip.test.js +0 -133
  294. package/tests/components/mu-virtual-list.test.js +0 -109
  295. package/tests/core/MuElement.test.js +0 -120
  296. package/tests/core/agent-api.test.js +0 -125
  297. package/tests/core/all-core-modules.test.js +0 -442
  298. package/tests/core/bus.test.js +0 -364
  299. package/tests/core/component-schema.test.js +0 -160
  300. package/tests/core/feature-registry.test.js +0 -198
  301. package/tests/core/form-state.test.js +0 -167
  302. package/tests/core/http.test.js +0 -119
  303. package/tests/core/keyboard.test.js +0 -319
  304. package/tests/core/layers.test.js +0 -129
  305. package/tests/core/namespaced-stores.test.js +0 -114
  306. package/tests/core/render.test.js +0 -121
  307. package/tests/core/ripple.test.js +0 -131
  308. package/tests/core/router.test.js +0 -89
  309. package/tests/core/scheduler.test.js +0 -121
  310. package/tests/core/signals.test.js +0 -128
  311. package/tests/core/store.test.js +0 -171
  312. package/tests/core/transitions.test.js +0 -82
  313. package/tests/e2e/accessibility-harness.html +0 -58
  314. package/tests/e2e/accessibility.test.js +0 -401
  315. package/tests/e2e/agent-features.test.js +0 -372
  316. package/tests/e2e/card-spacing.test.js +0 -287
  317. package/tests/e2e/components.test.js +0 -439
  318. package/tests/e2e/demo-routes.test.js +0 -478
  319. package/tests/e2e/layout-css-fallback.test.js +0 -334
  320. package/tests/e2e/mu-alert.e2e.test.js +0 -111
  321. package/tests/e2e/mu-checkbox.test.js +0 -489
  322. package/tests/e2e/mu-chip.test.js +0 -347
  323. package/tests/e2e/mu-form.test.js +0 -499
  324. package/tests/e2e/mu-icon.test.js +0 -114
  325. package/tests/e2e/mu-radio.test.js +0 -113
  326. package/tests/e2e/mu-skeleton.test.js +0 -140
  327. package/tests/e2e/mu-switch.test.js +0 -415
  328. package/tests/e2e/mu-tabs.test.js +0 -494
  329. package/tests/e2e/mu-textarea.test.js +0 -242
  330. package/tests/e2e/mu-virtual-list.test.js +0 -427
  331. package/tests/e2e/perf-memory.test.js +0 -161
  332. package/tests/e2e/puppeteer-helper.js +0 -137
  333. package/tests/e2e/puppeteer.test.js +0 -226
  334. package/tests/e2e/pwa.test.js +0 -261
  335. package/tests/e2e/test-harness.html +0 -319
  336. package/tests/manual/test-components.html +0 -120
  337. package/tests/memory-test.html +0 -309
  338. package/tests/setup-dom.js +0 -93
  339. package/tests/visual-test.html +0 -301
@@ -1,131 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for ripple.js Module
3
- * Target: 72% → 95% coverage
4
- */
5
-
6
- import { describe, test, expect, beforeAll, beforeEach } from 'bun:test';
7
- import { parseHTML } from 'linkedom';
8
-
9
- let document, body;
10
- let createRipple, attachRipple, RippleMixin;
11
-
12
- describe('ripple Module Unit Tests', () => {
13
-
14
- beforeAll(async () => {
15
- const dom = parseHTML('<!DOCTYPE html><html><body></body></html>');
16
- document = dom.document;
17
- body = document.body;
18
-
19
- globalThis.window = dom.window;
20
- globalThis.document = document;
21
- globalThis.HTMLElement = dom.HTMLElement;
22
-
23
- // Mock Web Animations API (not supported in linkedom)
24
- if (!dom.HTMLElement.prototype.animate) {
25
- dom.HTMLElement.prototype.animate = function (keyframes, options) {
26
- return {
27
- finished: Promise.resolve(),
28
- cancel: () => { },
29
- play: () => { },
30
- pause: () => { },
31
- onfinish: null
32
- };
33
- };
34
- }
35
-
36
- const module = await import('../../src/core/ripple.js');
37
- createRipple = module.createRipple;
38
- attachRipple = module.attachRipple;
39
- RippleMixin = module.RippleMixin;
40
- });
41
-
42
- beforeEach(() => { body.innerHTML = ''; });
43
-
44
- // CREATE RIPPLE
45
- test('createRipple should be a function', () => {
46
- expect(typeof createRipple).toBe('function');
47
- });
48
-
49
- test('createRipple should create ripple element', () => {
50
- const el = document.createElement('div');
51
- el.style.width = '100px';
52
- el.style.height = '100px';
53
- body.appendChild(el);
54
-
55
- // Mock getBoundingClientRect
56
- el.getBoundingClientRect = () => ({ left: 0, top: 0, width: 100, height: 100 });
57
- // Mock getComputedStyle
58
- globalThis.getComputedStyle = () => ({ position: 'static', overflow: 'visible' });
59
-
60
- const event = { clientX: 50, clientY: 50 };
61
- const ripple = createRipple(el, event);
62
- expect(ripple).toBeDefined();
63
- expect(ripple.className).toBe('mu-ripple-wave');
64
- });
65
-
66
- test('createRipple should work centered', () => {
67
- const el = document.createElement('div');
68
- body.appendChild(el);
69
- el.getBoundingClientRect = () => ({ left: 0, top: 0, width: 100, height: 100 });
70
- globalThis.getComputedStyle = () => ({ position: 'relative', overflow: 'hidden' });
71
-
72
- const ripple = createRipple(el, null, { centered: true });
73
- expect(ripple).toBeDefined();
74
- });
75
-
76
- test('createRipple should handle touch events', () => {
77
- const el = document.createElement('div');
78
- body.appendChild(el);
79
- el.getBoundingClientRect = () => ({ left: 0, top: 0, width: 100, height: 100 });
80
- globalThis.getComputedStyle = () => ({ position: 'relative', overflow: 'hidden' });
81
-
82
- const event = { touches: [{ clientX: 50, clientY: 50 }] };
83
- const ripple = createRipple(el, event);
84
- expect(ripple).toBeDefined();
85
- });
86
-
87
- // ATTACH RIPPLE
88
- test('attachRipple should be a function', () => {
89
- expect(typeof attachRipple).toBe('function');
90
- });
91
-
92
- test('attachRipple should return cleanup function', () => {
93
- const el = document.createElement('div');
94
- body.appendChild(el);
95
- const cleanup = attachRipple(el);
96
- expect(typeof cleanup).toBe('function');
97
- });
98
-
99
- test('attachRipple cleanup should work', () => {
100
- const el = document.createElement('div');
101
- body.appendChild(el);
102
- const cleanup = attachRipple(el);
103
- cleanup();
104
- expect(true).toBe(true);
105
- });
106
-
107
- // RIPPLE MIXIN
108
- test('RippleMixin should be a function', () => {
109
- expect(typeof RippleMixin).toBe('function');
110
- });
111
-
112
- test('RippleMixin should return a class', () => {
113
- class Base { }
114
- const Mixed = RippleMixin(Base);
115
- expect(typeof Mixed).toBe('function');
116
- });
117
-
118
- test('RippleMixin class should have initRipple method', () => {
119
- class Base { }
120
- const Mixed = RippleMixin(Base);
121
- const instance = new Mixed();
122
- expect(typeof instance.initRipple).toBe('function');
123
- });
124
-
125
- test('RippleMixin class should have disconnectedCallback', () => {
126
- class Base { }
127
- const Mixed = RippleMixin(Base);
128
- const instance = new Mixed();
129
- expect(typeof instance.disconnectedCallback).toBe('function');
130
- });
131
- });
@@ -1,89 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for router.js Core Module
3
- * Target: 20.34% → 90% coverage
4
- */
5
-
6
- import { describe, test, expect, beforeAll, beforeEach } from 'bun:test';
7
- import { parseHTML } from 'linkedom';
8
-
9
- let Router;
10
-
11
- describe('router.js Unit Tests', () => {
12
-
13
- beforeAll(async () => {
14
- const dom = parseHTML('<!DOCTYPE html><html><body></body></html>');
15
-
16
- globalThis.window = {
17
- location: { hash: '' },
18
- addEventListener: () => { },
19
- removeEventListener: () => { }
20
- };
21
-
22
- // Fresh import for each test suite
23
- const module = await import('../../src/core/router.js');
24
- Router = module.Router;
25
- });
26
-
27
- beforeEach(() => {
28
- globalThis.window.location.hash = '';
29
- });
30
-
31
- // ========================================
32
- // Route Registration
33
- // ========================================
34
-
35
- test('Router should exist', () => {
36
- expect(Router).toBeDefined();
37
- });
38
-
39
- test('on() should register route and return this', () => {
40
- const result = Router.on('/test-path', () => { });
41
- expect(result).toBe(Router);
42
- });
43
-
44
- test('on() should accept path with params', () => {
45
- const result = Router.on('/user/:id', () => { });
46
- expect(result).toBe(Router);
47
- });
48
-
49
- test('on() should accept multiple params', () => {
50
- const result = Router.on('/org/:org/repo/:repo', () => { });
51
- expect(result).toBe(Router);
52
- });
53
-
54
- // ========================================
55
- // notFound Handler
56
- // ========================================
57
-
58
- test('notFound() should set handler and return this', () => {
59
- const result = Router.notFound(() => { });
60
- expect(result).toBe(Router);
61
- });
62
-
63
- // ========================================
64
- // Navigate
65
- // ========================================
66
-
67
- test('navigate() should set window.location.hash', () => {
68
- Router.navigate('/dashboard');
69
- expect(globalThis.window.location.hash).toBe('/dashboard');
70
- });
71
-
72
- // ========================================
73
- // Current Path
74
- // ========================================
75
-
76
- test('current should return current path', () => {
77
- // After initialization, current might be empty or /
78
- expect(typeof Router.current).toBe('string');
79
- });
80
-
81
- // ========================================
82
- // Start
83
- // ========================================
84
-
85
- test('start() should return this', () => {
86
- const result = Router.start();
87
- expect(result).toBe(Router);
88
- });
89
- });
@@ -1,121 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for scheduler.js (Task Scheduler)
3
- * Target: 56% → 90% coverage
4
- */
5
-
6
- import { describe, test, expect, beforeAll, beforeEach } from 'bun:test';
7
-
8
- let supportsScheduler, scheduleTask, yieldToMain, processWithYield;
9
- let runBackground, runImmediate;
10
-
11
- describe('scheduler.js Unit Tests', () => {
12
-
13
- beforeAll(async () => {
14
- globalThis.setTimeout = (cb, delay) => { cb(); return 0; };
15
-
16
- const module = await import('../../src/core/scheduler.js');
17
- supportsScheduler = module.supportsScheduler;
18
- scheduleTask = module.scheduleTask;
19
- yieldToMain = module.yieldToMain;
20
- processWithYield = module.processWithYield;
21
- runBackground = module.runBackground;
22
- runImmediate = module.runImmediate;
23
- });
24
-
25
- // ========================================
26
- // supportsScheduler
27
- // ========================================
28
-
29
- test('supportsScheduler should be boolean', () => {
30
- expect(typeof supportsScheduler).toBe('boolean');
31
- });
32
-
33
- // ========================================
34
- // scheduleTask
35
- // ========================================
36
-
37
- test('scheduleTask should execute callback', async () => {
38
- let called = false;
39
- await scheduleTask(() => { called = true; });
40
- expect(called).toBe(true);
41
- });
42
-
43
- test('scheduleTask should return result', async () => {
44
- const result = await scheduleTask(() => 42);
45
- expect(result).toBe(42);
46
- });
47
-
48
- test('scheduleTask with user-blocking priority', async () => {
49
- const result = await scheduleTask(() => 'fast', 'user-blocking');
50
- expect(result).toBe('fast');
51
- });
52
-
53
- test('scheduleTask with background priority', async () => {
54
- const result = await scheduleTask(() => 'slow', 'background');
55
- expect(result).toBe('slow');
56
- });
57
-
58
- // ========================================
59
- // yieldToMain
60
- // ========================================
61
-
62
- test('yieldToMain should resolve', async () => {
63
- await yieldToMain();
64
- expect(true).toBe(true);
65
- });
66
-
67
- // ========================================
68
- // processWithYield
69
- // ========================================
70
-
71
- test('processWithYield should process all items', async () => {
72
- const items = [1, 2, 3, 4, 5];
73
- const processed = [];
74
- await processWithYield(items, (item) => { processed.push(item); }, 2);
75
- expect(processed.length).toBe(5);
76
- });
77
-
78
- test('processWithYield with large chunk', async () => {
79
- const items = [1, 2, 3];
80
- const processed = [];
81
- await processWithYield(items, (item) => { processed.push(item); }, 100);
82
- expect(processed.length).toBe(3);
83
- });
84
-
85
- // ========================================
86
- // runBackground / runImmediate
87
- // ========================================
88
-
89
- test('runBackground should execute callback', async () => {
90
- const result = await runBackground(() => 'bg');
91
- expect(result).toBe('bg');
92
- });
93
-
94
- test('runImmediate should execute callback', async () => {
95
- const result = await runImmediate(() => 'imm');
96
- expect(result).toBe('imm');
97
- });
98
-
99
- // ========================================
100
- // afterPaint (double-rAF pattern)
101
- // ========================================
102
-
103
- test('afterPaint should resolve after two animation frames', async () => {
104
- // In test environment, rAF is mocked
105
- const { afterPaint } = await import('../../src/core/scheduler.js');
106
-
107
- let resolved = false;
108
- afterPaint().then(() => { resolved = true; });
109
-
110
- // Should resolve eventually
111
- await new Promise(resolve => setTimeout(resolve, 50));
112
- expect(resolved).toBe(true);
113
- });
114
-
115
- test('afterPaint should return a Promise', async () => {
116
- const { afterPaint } = await import('../../src/core/scheduler.js');
117
- const result = afterPaint();
118
- expect(result).toBeInstanceOf(Promise);
119
- await result;
120
- });
121
- });
@@ -1,128 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for signals.js (Reactive Signals)
3
- * Target: 82% → 95% coverage
4
- */
5
-
6
- import { describe, test, expect, beforeAll } from 'bun:test';
7
-
8
- let signal, computed, effect, batch;
9
-
10
- describe('signals.js Unit Tests', () => {
11
-
12
- beforeAll(async () => {
13
- globalThis.window = globalThis;
14
- const module = await import('../../src/core/signals.js');
15
- signal = module.signal;
16
- computed = module.computed;
17
- effect = module.effect;
18
- batch = module.batch;
19
- });
20
-
21
- // ========================================
22
- // signal
23
- // ========================================
24
-
25
- test('signal should return function', () => {
26
- const s = signal(0);
27
- expect(typeof s).toBe('function');
28
- });
29
-
30
- test('signal should return initial value', () => {
31
- const s = signal(42);
32
- expect(s()).toBe(42);
33
- });
34
-
35
- test('signal.set should update value', () => {
36
- const s = signal(0);
37
- s.set(10);
38
- expect(s()).toBe(10);
39
- });
40
-
41
- test('signal.update should update with function', () => {
42
- const s = signal(5);
43
- s.update(v => v * 2);
44
- expect(s()).toBe(10);
45
- });
46
-
47
- test('signal.peek should return value', () => {
48
- const s = signal(100);
49
- expect(s.peek()).toBe(100);
50
- });
51
-
52
- test('signal should have signalName', () => {
53
- const s = signal(0, 'mySignal');
54
- expect(s.signalName).toBe('mySignal');
55
- });
56
-
57
- test('signal.subscribe should work', () => {
58
- let received = null;
59
- const s = signal(0, 'sub-test');
60
- const unsub = s.subscribe((v) => { received = v; });
61
- s.set(99);
62
- expect(received).toBe(99);
63
- unsub();
64
- });
65
-
66
- test('signal.dispose should be callable', () => {
67
- const s = signal(0);
68
- s.dispose();
69
- expect(true).toBe(true);
70
- });
71
-
72
- // ========================================
73
- // computed
74
- // ========================================
75
-
76
- test('computed should return function', () => {
77
- const c = computed(() => 10);
78
- expect(typeof c).toBe('function');
79
- });
80
-
81
- test('computed should return computed value', () => {
82
- const s = signal(3);
83
- const c = computed(() => s() * 2);
84
- expect(c()).toBe(6);
85
- });
86
-
87
- test('computed should have signalName', () => {
88
- const c = computed(() => 1, 'myComputed');
89
- expect(c.signalName).toBe('myComputed');
90
- });
91
-
92
- test('computed.subscribe should work', () => {
93
- let received = null;
94
- const s = signal(1, 'comp-sub');
95
- const c = computed(() => s() + 1, 'comp-sub-c');
96
- const unsub = c.subscribe((v) => { received = v; });
97
- c(); // Trigger initial computation
98
- s.set(5);
99
- expect(c()).toBe(6);
100
- unsub();
101
- });
102
-
103
- // ========================================
104
- // effect
105
- // ========================================
106
-
107
- test('effect should run immediately', () => {
108
- let ran = false;
109
- const dispose = effect(() => { ran = true; });
110
- expect(ran).toBe(true);
111
- dispose();
112
- });
113
-
114
- test('effect should return dispose function', () => {
115
- const dispose = effect(() => { });
116
- expect(typeof dispose).toBe('function');
117
- });
118
-
119
- // ========================================
120
- // batch
121
- // ========================================
122
-
123
- test('batch should execute function', () => {
124
- let called = false;
125
- batch(() => { called = true; });
126
- expect(called).toBe(true);
127
- });
128
- });
@@ -1,171 +0,0 @@
1
- /**
2
- * @fileoverview Unit Tests for store.js (Reactive Store)
3
- * Target: 50% → 90% coverage
4
- */
5
-
6
- import { describe, test, expect, beforeAll, beforeEach } from 'bun:test';
7
-
8
- let createStore, appStore, createNamespacedStore, getStore, getAllStores;
9
- let captureAppState, restoreAppState, enableObservability, disableObservability;
10
- let clearStateHistory, clearStoreRegistry, getStateHistory;
11
-
12
- describe('store.js Unit Tests', () => {
13
-
14
- beforeAll(async () => {
15
- const module = await import('../../src/core/store.js');
16
- createStore = module.createStore;
17
- appStore = module.appStore;
18
- createNamespacedStore = module.createNamespacedStore;
19
- getStore = module.getStore;
20
- getAllStores = module.getAllStores;
21
- captureAppState = module.captureAppState;
22
- restoreAppState = module.restoreAppState;
23
- enableObservability = module.enableObservability;
24
- disableObservability = module.disableObservability;
25
- clearStateHistory = module.clearStateHistory;
26
- clearStoreRegistry = module.clearStoreRegistry;
27
- getStateHistory = module.getStateHistory;
28
- });
29
-
30
- beforeEach(() => {
31
- clearStoreRegistry();
32
- disableObservability();
33
- });
34
-
35
- // ========================================
36
- // createStore
37
- // ========================================
38
-
39
- test('createStore should return store object', () => {
40
- const store = createStore({ count: 0 });
41
- expect(store).toBeDefined();
42
- expect(typeof store.get).toBe('function');
43
- });
44
-
45
- test('store.get should return state', () => {
46
- const store = createStore({ count: 5 });
47
- expect(store.get().count).toBe(5);
48
- });
49
-
50
- test('store.set should update state', () => {
51
- const store = createStore({ count: 0 });
52
- store.set({ count: 10 });
53
- expect(store.get().count).toBe(10);
54
- });
55
-
56
- test('store.update should update with function', () => {
57
- const store = createStore({ count: 5 });
58
- store.update(s => ({ count: s.count + 5 }));
59
- expect(store.get().count).toBe(10);
60
- });
61
-
62
- test('store.subscribe should call listener immediately', () => {
63
- const store = createStore({ value: 'hello' });
64
- let received = null;
65
- store.subscribe(state => { received = state.value; });
66
- expect(received).toBe('hello');
67
- });
68
-
69
- test('store.subscribe should return unsubscribe', () => {
70
- const store = createStore({});
71
- const unsub = store.subscribe(() => { });
72
- expect(typeof unsub).toBe('function');
73
- });
74
-
75
- test('store.reset should restore initial state', () => {
76
- const store = createStore({ count: 0 });
77
- store.set({ count: 100 });
78
- store.reset();
79
- expect(store.get().count).toBe(0);
80
- });
81
-
82
- // ========================================
83
- // appStore singleton
84
- // ========================================
85
-
86
- test('appStore should exist', () => {
87
- expect(appStore).toBeDefined();
88
- });
89
-
90
- // ========================================
91
- // Namespaced stores
92
- // ========================================
93
-
94
- test('createNamespacedStore should create store', () => {
95
- const store = createNamespacedStore('user', { name: 'John' });
96
- expect(store.get().name).toBe('John');
97
- });
98
-
99
- test('createNamespacedStore should return existing for same namespace', () => {
100
- const store1 = createNamespacedStore('cart', { items: [] });
101
- const store2 = createNamespacedStore('cart', { items: [1] });
102
- expect(store1).toBe(store2);
103
- });
104
-
105
- test('getStore should return store by namespace', () => {
106
- createNamespacedStore('settings', { theme: 'dark' });
107
- const store = getStore('settings');
108
- expect(store.get().theme).toBe('dark');
109
- });
110
-
111
- test('getAllStores should return all stores', () => {
112
- createNamespacedStore('ns1', {});
113
- createNamespacedStore('ns2', {});
114
- const all = getAllStores();
115
- expect(all.ns1).toBeDefined();
116
- expect(all.ns2).toBeDefined();
117
- });
118
-
119
- // ========================================
120
- // Capture/Restore
121
- // ========================================
122
-
123
- test('captureAppState should return snapshot', () => {
124
- createNamespacedStore('test', { val: 1 });
125
- const snapshot = captureAppState();
126
- expect(snapshot.stores.test.val).toBe(1);
127
- });
128
-
129
- test('restoreAppState should restore state', () => {
130
- const store = createNamespacedStore('restore-test', { x: 1 });
131
- const snapshot = { stores: { 'restore-test': { x: 99 } } };
132
- restoreAppState(snapshot);
133
- expect(store.get().x).toBe(99);
134
- });
135
-
136
- test('restoreAppState should handle invalid snapshot', () => {
137
- restoreAppState(null); // Should not throw
138
- expect(true).toBe(true);
139
- });
140
-
141
- test('restoreAppState with createMissing should create stores', () => {
142
- const snapshot = { stores: { 'newstore': { foo: 'bar' } } };
143
- restoreAppState(snapshot, { createMissing: true });
144
- const store = getStore('newstore');
145
- expect(store.get().foo).toBe('bar');
146
- });
147
-
148
- // ========================================
149
- // Observability
150
- // ========================================
151
-
152
- test('enableObservability should enable tracking', () => {
153
- enableObservability();
154
- const store = createNamespacedStore('obs-test', { v: 1 });
155
- store.set({ v: 2 });
156
- store.set({ v: 3 });
157
- const history = getStateHistory('obs-test');
158
- expect(history.length).toBeGreaterThanOrEqual(1);
159
- });
160
-
161
- test('clearStateHistory should clear history', () => {
162
- enableObservability();
163
- createNamespacedStore('clear-test', {});
164
- clearStateHistory();
165
- expect(getStateHistory('clear-test').length).toBe(0);
166
- });
167
-
168
- test('getStateHistory returns empty for unknown namespace', () => {
169
- expect(getStateHistory('unknown').length).toBe(0);
170
- });
171
- });