microui-wc 0.1.0 → 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 (343) 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 +116 -116
  5. package/dist/README.md +21 -16
  6. package/dist/components.css +1 -1
  7. package/dist/microui.css +1 -1
  8. package/dist/microui.esm.js.map +1 -1
  9. package/dist/microui.min.js.map +1 -1
  10. package/dist/styles/components/switch.css +1 -1
  11. package/docs/getting-started.md +3 -3
  12. package/package.json +38 -10
  13. package/src/components/mu-schema-form.js +1 -1
  14. package/src/styles/components/switch.css +7 -8
  15. package/src/styles/components.css +6 -6
  16. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -40
  17. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -33
  18. package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
  19. package/.github/workflows/ci.yml +0 -42
  20. package/.github/workflows/deploy-pages.yml +0 -112
  21. package/CODE_OF_CONDUCT.md +0 -59
  22. package/CONTRIBUTING.md +0 -156
  23. package/SECURITY.md +0 -58
  24. package/app/.generated/routes/alerts.js +0 -8
  25. package/app/.generated/routes/avatars.js +0 -8
  26. package/app/.generated/routes/badges.js +0 -8
  27. package/app/.generated/routes/buttons.js +0 -10
  28. package/app/.generated/routes/cards.js +0 -10
  29. package/app/.generated/routes/checkboxes.js +0 -9
  30. package/app/.generated/routes/chips.js +0 -8
  31. package/app/.generated/routes/dropdowns.js +0 -9
  32. package/app/.generated/routes/home.js +0 -7
  33. package/app/.generated/routes/icons.js +0 -9
  34. package/app/.generated/routes/inputs.js +0 -10
  35. package/app/.generated/routes/installation.js +0 -7
  36. package/app/.generated/routes/layout.js +0 -9
  37. package/app/.generated/routes/modals.js +0 -9
  38. package/app/.generated/routes/navbar.js +0 -7
  39. package/app/.generated/routes/progress.js +0 -9
  40. package/app/.generated/routes/radios.js +0 -9
  41. package/app/.generated/routes/switches.js +0 -9
  42. package/app/.generated/routes/tabs.js +0 -8
  43. package/app/.generated/routes/toasts.js +0 -9
  44. package/app/index.html +0 -67
  45. package/app/pages/alerts.html +0 -23
  46. package/app/pages/avatars.html +0 -22
  47. package/app/pages/badges.html +0 -22
  48. package/app/pages/buttons.html +0 -71
  49. package/app/pages/cards.html +0 -54
  50. package/app/pages/checkboxes.html +0 -39
  51. package/app/pages/chips.html +0 -23
  52. package/app/pages/dropdowns.html +0 -41
  53. package/app/pages/home.html +0 -59
  54. package/app/pages/icons.html +0 -29
  55. package/app/pages/inputs.html +0 -66
  56. package/app/pages/installation.html +0 -34
  57. package/app/pages/layout.html +0 -30
  58. package/app/pages/modals.html +0 -21
  59. package/app/pages/navbar.html +0 -22
  60. package/app/pages/progress.html +0 -35
  61. package/app/pages/radios.html +0 -40
  62. package/app/pages/switches.html +0 -39
  63. package/app/pages/tabs.html +0 -30
  64. package/app/pages/toasts.html +0 -22
  65. package/app-dist/index.html +0 -67
  66. package/app-dist/pages/alerts.html +0 -23
  67. package/app-dist/pages/avatars.html +0 -22
  68. package/app-dist/pages/badges.html +0 -22
  69. package/app-dist/pages/buttons.html +0 -71
  70. package/app-dist/pages/cards.html +0 -54
  71. package/app-dist/pages/checkboxes.html +0 -39
  72. package/app-dist/pages/chips.html +0 -23
  73. package/app-dist/pages/dropdowns.html +0 -41
  74. package/app-dist/pages/home.html +0 -59
  75. package/app-dist/pages/icons.html +0 -29
  76. package/app-dist/pages/inputs.html +0 -66
  77. package/app-dist/pages/installation.html +0 -34
  78. package/app-dist/pages/layout.html +0 -30
  79. package/app-dist/pages/modals.html +0 -21
  80. package/app-dist/pages/navbar.html +0 -22
  81. package/app-dist/pages/progress.html +0 -35
  82. package/app-dist/pages/radios.html +0 -40
  83. package/app-dist/pages/switches.html +0 -39
  84. package/app-dist/pages/tabs.html +0 -30
  85. package/app-dist/pages/toasts.html +0 -22
  86. package/app-dist/pages.json +0 -217
  87. package/app-dist/routes/alerts.js +0 -5
  88. package/app-dist/routes/avatars.js +0 -1
  89. package/app-dist/routes/badges.js +0 -1
  90. package/app-dist/routes/buttons.js +0 -1
  91. package/app-dist/routes/cards.js +0 -1
  92. package/app-dist/routes/checkboxes.js +0 -9
  93. package/app-dist/routes/chips.js +0 -4
  94. package/app-dist/routes/chunk-019e5e2f.js +0 -5
  95. package/app-dist/routes/chunk-0m4j19yd.js +0 -2
  96. package/app-dist/routes/chunk-0tmmp5q0.js +0 -1
  97. package/app-dist/routes/chunk-10xn709r.js +0 -1
  98. package/app-dist/routes/chunk-15m2qcda.js +0 -2
  99. package/app-dist/routes/chunk-1bh8g23n.js +0 -1
  100. package/app-dist/routes/chunk-1vg0v937.js +0 -1
  101. package/app-dist/routes/chunk-1zvcgy3j.js +0 -1
  102. package/app-dist/routes/chunk-2afb0861.js +0 -1
  103. package/app-dist/routes/chunk-2c6ttpzt.js +0 -5
  104. package/app-dist/routes/chunk-3dy30fhs.js +0 -1
  105. package/app-dist/routes/chunk-426dnces.js +0 -13
  106. package/app-dist/routes/chunk-44kgxery.js +0 -1
  107. package/app-dist/routes/chunk-47fdnejd.js +0 -33
  108. package/app-dist/routes/chunk-49a6t2vq.js +0 -1
  109. package/app-dist/routes/chunk-4fe1rm5b.js +0 -1
  110. package/app-dist/routes/chunk-4ggmvkta.js +0 -33
  111. package/app-dist/routes/chunk-4vkz81q7.js +0 -33
  112. package/app-dist/routes/chunk-4w4tmj8f.js +0 -31
  113. package/app-dist/routes/chunk-532s62kr.js +0 -31
  114. package/app-dist/routes/chunk-5hm3bssy.js +0 -33
  115. package/app-dist/routes/chunk-5vrh24hc.js +0 -1
  116. package/app-dist/routes/chunk-61pcg25a.js +0 -1
  117. package/app-dist/routes/chunk-6nfhygvf.js +0 -1
  118. package/app-dist/routes/chunk-700e7je6.js +0 -33
  119. package/app-dist/routes/chunk-7fsn17kg.js +0 -1
  120. package/app-dist/routes/chunk-7k789b32.js +0 -1
  121. package/app-dist/routes/chunk-7r46q0ys.js +0 -36
  122. package/app-dist/routes/chunk-86fmc1fr.js +0 -5
  123. package/app-dist/routes/chunk-8qth37vw.js +0 -1
  124. package/app-dist/routes/chunk-924wv8n0.js +0 -1
  125. package/app-dist/routes/chunk-9mbhgxk9.js +0 -1
  126. package/app-dist/routes/chunk-a216hyd9.js +0 -1
  127. package/app-dist/routes/chunk-akzxykh9.js +0 -33
  128. package/app-dist/routes/chunk-b3dcvy8c.js +0 -1
  129. package/app-dist/routes/chunk-b74zahz5.js +0 -31
  130. package/app-dist/routes/chunk-bftj53p2.js +0 -5
  131. package/app-dist/routes/chunk-c01hnz3e.js +0 -1
  132. package/app-dist/routes/chunk-d8pvv5km.js +0 -1
  133. package/app-dist/routes/chunk-dev0aezr.js +0 -2
  134. package/app-dist/routes/chunk-dh6vnv0e.js +0 -1
  135. package/app-dist/routes/chunk-dn2cbpva.js +0 -36
  136. package/app-dist/routes/chunk-dvn0my90.js +0 -1
  137. package/app-dist/routes/chunk-dvq8mnve.js +0 -36
  138. package/app-dist/routes/chunk-e8c2gc4d.js +0 -5
  139. package/app-dist/routes/chunk-ejf9ak2x.js +0 -1
  140. package/app-dist/routes/chunk-f083m55s.js +0 -1
  141. package/app-dist/routes/chunk-fnrj28s1.js +0 -31
  142. package/app-dist/routes/chunk-fvg3yjdp.js +0 -31
  143. package/app-dist/routes/chunk-g7k381n1.js +0 -1
  144. package/app-dist/routes/chunk-h01kq2ae.js +0 -13
  145. package/app-dist/routes/chunk-h4dk761v.js +0 -5
  146. package/app-dist/routes/chunk-hmx91z2x.js +0 -5
  147. package/app-dist/routes/chunk-hxbg4m42.js +0 -36
  148. package/app-dist/routes/chunk-jbjnfp2b.js +0 -2
  149. package/app-dist/routes/chunk-jxtz5vv6.js +0 -36
  150. package/app-dist/routes/chunk-jxzcs0ey.js +0 -36
  151. package/app-dist/routes/chunk-kt7wwhcx.js +0 -1
  152. package/app-dist/routes/chunk-kzptszyc.js +0 -33
  153. package/app-dist/routes/chunk-mhgca4w4.js +0 -2
  154. package/app-dist/routes/chunk-mhswxa20.js +0 -1
  155. package/app-dist/routes/chunk-n8zfeex6.js +0 -1
  156. package/app-dist/routes/chunk-pee47b2r.js +0 -1
  157. package/app-dist/routes/chunk-pesmw829.js +0 -1
  158. package/app-dist/routes/chunk-pgc4c6f3.js +0 -36
  159. package/app-dist/routes/chunk-q8egegm1.js +0 -1
  160. package/app-dist/routes/chunk-q9mn2qyq.js +0 -36
  161. package/app-dist/routes/chunk-qh0rtaf3.js +0 -5
  162. package/app-dist/routes/chunk-qqhmk6ye.js +0 -2
  163. package/app-dist/routes/chunk-qrxygmf7.js +0 -33
  164. package/app-dist/routes/chunk-r46yzksx.js +0 -36
  165. package/app-dist/routes/chunk-rgpbw2w0.js +0 -5
  166. package/app-dist/routes/chunk-rnpzv3d8.js +0 -2
  167. package/app-dist/routes/chunk-s5v8cv05.js +0 -2
  168. package/app-dist/routes/chunk-sbwn5bpc.js +0 -1
  169. package/app-dist/routes/chunk-sqbg8jbt.js +0 -33
  170. package/app-dist/routes/chunk-sv8dqnf7.js +0 -1
  171. package/app-dist/routes/chunk-t67sw3za.js +0 -1
  172. package/app-dist/routes/chunk-tjdpqwdf.js +0 -31
  173. package/app-dist/routes/chunk-tq2mfghg.js +0 -1
  174. package/app-dist/routes/chunk-ttn10vt6.js +0 -1
  175. package/app-dist/routes/chunk-v2hzpjxr.js +0 -1
  176. package/app-dist/routes/chunk-wfjjkw9y.js +0 -1
  177. package/app-dist/routes/chunk-wt8cxzmf.js +0 -31
  178. package/app-dist/routes/chunk-x45d372k.js +0 -5
  179. package/app-dist/routes/chunk-y3wsazkt.js +0 -1
  180. package/app-dist/routes/chunk-y7pmgc7t.js +0 -33
  181. package/app-dist/routes/chunk-zefdt2q3.js +0 -31
  182. package/app-dist/routes/dropdowns.js +0 -6
  183. package/app-dist/routes/home.js +0 -1
  184. package/app-dist/routes/icons.js +0 -1
  185. package/app-dist/routes/inputs.js +0 -12
  186. package/app-dist/routes/installation.js +0 -1
  187. package/app-dist/routes/layout.js +0 -1
  188. package/app-dist/routes/modals.js +0 -7
  189. package/app-dist/routes/navbar.js +0 -1
  190. package/app-dist/routes/progress.js +0 -1
  191. package/app-dist/routes/radios.js +0 -6
  192. package/app-dist/routes/switches.js +0 -6
  193. package/app-dist/routes/tabs.js +0 -1
  194. package/app-dist/routes/toasts.js +0 -16
  195. package/assets/fonts/material-symbols-mini.woff2 +0 -0
  196. package/assets/fonts/material-symbols.woff2 +0 -0
  197. package/assets/fonts/roboto-400.woff2 +0 -0
  198. package/assets/fonts/roboto-500.woff2 +0 -0
  199. package/assets/fonts/roboto-700.woff2 +0 -0
  200. package/assets/logo-banner-400.jpg +0 -0
  201. package/assets/logo-banner-400.webp +0 -0
  202. package/assets/logo-banner-800.webp +0 -0
  203. package/assets/logo-banner.jpg +0 -0
  204. package/assets/logo-icon-64.jpg +0 -0
  205. package/assets/logo-icon-64.webp +0 -0
  206. package/assets/logo-icon.jpg +0 -0
  207. package/assets/logo-square.jpg +0 -0
  208. package/bun.lock +0 -312
  209. package/bunfig.toml +0 -4
  210. package/custom-elements.json +0 -1916
  211. package/demo/api/sample-data.json +0 -38
  212. package/demo/content/alerts.html +0 -115
  213. package/demo/content/avatars.html +0 -70
  214. package/demo/content/badges.html +0 -65
  215. package/demo/content/buttons.html +0 -188
  216. package/demo/content/callouts.html +0 -91
  217. package/demo/content/cards.html +0 -121
  218. package/demo/content/checkboxes.html +0 -178
  219. package/demo/content/chips.html +0 -67
  220. package/demo/content/codeblocks.html +0 -101
  221. package/demo/content/confirms.html +0 -115
  222. package/demo/content/datatables.html +0 -149
  223. package/demo/content/dividers.html +0 -119
  224. package/demo/content/dropdowns.html +0 -89
  225. package/demo/content/enterprise.html +0 -252
  226. package/demo/content/home.html +0 -149
  227. package/demo/content/icons.html +0 -89
  228. package/demo/content/inputs.html +0 -135
  229. package/demo/content/installation.html +0 -16
  230. package/demo/content/layout.html +0 -136
  231. package/demo/content/modals.html +0 -141
  232. package/demo/content/navbar.html +0 -70
  233. package/demo/content/progress.html +0 -119
  234. package/demo/content/radios.html +0 -88
  235. package/demo/content/skeletons.html +0 -109
  236. package/demo/content/spinners.html +0 -96
  237. package/demo/content/switches.html +0 -84
  238. package/demo/content/tables.html +0 -124
  239. package/demo/content/tabs.html +0 -85
  240. package/demo/content/toasts.html +0 -116
  241. package/demo/content/tooltips.html +0 -107
  242. package/demo/content/virtual-lists.html +0 -233
  243. package/demo/favicon.ico +0 -0
  244. package/demo/favicon.png +0 -0
  245. package/demo/full.html +0 -52
  246. package/demo/iife.html +0 -46
  247. package/demo/manifest.json +0 -34
  248. package/demo/pages/datatable-demo.html +0 -237
  249. package/demo/pages/prompt-ui-demo.html +0 -218
  250. package/demo/pages/responsive-demo.html +0 -122
  251. package/demo/pages/schema-form-demo.html +0 -270
  252. package/demo/robots.txt +0 -6
  253. package/demo/shell.html +0 -712
  254. package/demo/sw.js +0 -387
  255. package/lighthouse-audit.mjs +0 -113
  256. package/scripts/analyze-components.js +0 -105
  257. package/scripts/build-app.js +0 -193
  258. package/scripts/build-framework.js +0 -444
  259. package/scripts/build-utils.js +0 -101
  260. package/scripts/test-isolated.js +0 -151
  261. package/server.js +0 -256
  262. package/tests/agents/agent-integration.test.js +0 -76
  263. package/tests/benchmark.html +0 -296
  264. package/tests/build/scan-components.test.js +0 -173
  265. package/tests/components/all-components.test.js +0 -245
  266. package/tests/components/all-missing-components.test.js +0 -574
  267. package/tests/components/mu-alert.test.js +0 -113
  268. package/tests/components/mu-avatar.test.js +0 -148
  269. package/tests/components/mu-badge.test.js +0 -92
  270. package/tests/components/mu-button.test.js +0 -112
  271. package/tests/components/mu-card.test.js +0 -89
  272. package/tests/components/mu-checkbox.test.js +0 -158
  273. package/tests/components/mu-chip.test.js +0 -118
  274. package/tests/components/mu-container.test.js +0 -120
  275. package/tests/components/mu-divider.test.js +0 -98
  276. package/tests/components/mu-drawer-item.test.js +0 -199
  277. package/tests/components/mu-drawer.test.js +0 -96
  278. package/tests/components/mu-dropdown.test.js +0 -125
  279. package/tests/components/mu-form.test.js +0 -138
  280. package/tests/components/mu-grid.test.js +0 -135
  281. package/tests/components/mu-icon.test.js +0 -110
  282. package/tests/components/mu-input.test.js +0 -131
  283. package/tests/components/mu-lazy.test.js +0 -103
  284. package/tests/components/mu-modal.test.js +0 -275
  285. package/tests/components/mu-navbar.test.js +0 -101
  286. package/tests/components/mu-progress.test.js +0 -115
  287. package/tests/components/mu-radio.test.js +0 -114
  288. package/tests/components/mu-repeat.test.js +0 -106
  289. package/tests/components/mu-sidebar.test.js +0 -126
  290. package/tests/components/mu-skeleton.test.js +0 -162
  291. package/tests/components/mu-stack.test.js +0 -143
  292. package/tests/components/mu-switch.test.js +0 -292
  293. package/tests/components/mu-table.test.js +0 -124
  294. package/tests/components/mu-tabs.test.js +0 -104
  295. package/tests/components/mu-textarea.test.js +0 -115
  296. package/tests/components/mu-toast.test.js +0 -321
  297. package/tests/components/mu-tooltip.test.js +0 -133
  298. package/tests/components/mu-virtual-list.test.js +0 -109
  299. package/tests/core/MuElement.test.js +0 -120
  300. package/tests/core/agent-api.test.js +0 -125
  301. package/tests/core/all-core-modules.test.js +0 -442
  302. package/tests/core/bus.test.js +0 -364
  303. package/tests/core/component-schema.test.js +0 -160
  304. package/tests/core/feature-registry.test.js +0 -198
  305. package/tests/core/form-state.test.js +0 -167
  306. package/tests/core/http.test.js +0 -119
  307. package/tests/core/keyboard.test.js +0 -319
  308. package/tests/core/layers.test.js +0 -129
  309. package/tests/core/namespaced-stores.test.js +0 -114
  310. package/tests/core/render.test.js +0 -121
  311. package/tests/core/ripple.test.js +0 -131
  312. package/tests/core/router.test.js +0 -89
  313. package/tests/core/scheduler.test.js +0 -121
  314. package/tests/core/signals.test.js +0 -128
  315. package/tests/core/store.test.js +0 -171
  316. package/tests/core/transitions.test.js +0 -82
  317. package/tests/e2e/accessibility-harness.html +0 -58
  318. package/tests/e2e/accessibility.test.js +0 -401
  319. package/tests/e2e/agent-features.test.js +0 -372
  320. package/tests/e2e/card-spacing.test.js +0 -287
  321. package/tests/e2e/components.test.js +0 -439
  322. package/tests/e2e/demo-routes.test.js +0 -478
  323. package/tests/e2e/layout-css-fallback.test.js +0 -334
  324. package/tests/e2e/mu-alert.e2e.test.js +0 -111
  325. package/tests/e2e/mu-checkbox.test.js +0 -489
  326. package/tests/e2e/mu-chip.test.js +0 -347
  327. package/tests/e2e/mu-form.test.js +0 -499
  328. package/tests/e2e/mu-icon.test.js +0 -114
  329. package/tests/e2e/mu-radio.test.js +0 -113
  330. package/tests/e2e/mu-skeleton.test.js +0 -140
  331. package/tests/e2e/mu-switch.test.js +0 -415
  332. package/tests/e2e/mu-tabs.test.js +0 -494
  333. package/tests/e2e/mu-textarea.test.js +0 -242
  334. package/tests/e2e/mu-virtual-list.test.js +0 -427
  335. package/tests/e2e/perf-memory.test.js +0 -161
  336. package/tests/e2e/puppeteer-helper.js +0 -137
  337. package/tests/e2e/puppeteer.test.js +0 -226
  338. package/tests/e2e/pwa.test.js +0 -261
  339. package/tests/e2e/test-harness.html +0 -319
  340. package/tests/manual/test-components.html +0 -120
  341. package/tests/memory-test.html +0 -309
  342. package/tests/setup-dom.js +0 -93
  343. 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
- });