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.
- package/AGENTS.md +71 -71
- package/CHANGELOG.md +1 -1
- package/README.md +14 -9
- package/dist/AGENTS.md +71 -71
- package/dist/README.md +14 -9
- package/dist/microui.css +1 -1
- package/dist/microui.esm.js.map +1 -1
- package/dist/microui.min.js.map +1 -1
- package/docs/getting-started.md +3 -3
- package/package.json +39 -11
- package/src/components/mu-schema-form.js +1 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -40
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -33
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
- package/.github/workflows/ci.yml +0 -42
- package/.github/workflows/deploy-pages.yml +0 -112
- package/CODE_OF_CONDUCT.md +0 -59
- package/CONTRIBUTING.md +0 -156
- package/SECURITY.md +0 -58
- package/app/.generated/routes/alerts.js +0 -8
- package/app/.generated/routes/avatars.js +0 -8
- package/app/.generated/routes/badges.js +0 -8
- package/app/.generated/routes/buttons.js +0 -10
- package/app/.generated/routes/cards.js +0 -10
- package/app/.generated/routes/checkboxes.js +0 -9
- package/app/.generated/routes/chips.js +0 -8
- package/app/.generated/routes/dropdowns.js +0 -9
- package/app/.generated/routes/home.js +0 -7
- package/app/.generated/routes/icons.js +0 -9
- package/app/.generated/routes/inputs.js +0 -10
- package/app/.generated/routes/installation.js +0 -7
- package/app/.generated/routes/layout.js +0 -9
- package/app/.generated/routes/modals.js +0 -9
- package/app/.generated/routes/navbar.js +0 -7
- package/app/.generated/routes/progress.js +0 -9
- package/app/.generated/routes/radios.js +0 -9
- package/app/.generated/routes/switches.js +0 -9
- package/app/.generated/routes/tabs.js +0 -8
- package/app/.generated/routes/toasts.js +0 -9
- package/app/index.html +0 -67
- package/app/pages/alerts.html +0 -23
- package/app/pages/avatars.html +0 -22
- package/app/pages/badges.html +0 -22
- package/app/pages/buttons.html +0 -71
- package/app/pages/cards.html +0 -54
- package/app/pages/checkboxes.html +0 -39
- package/app/pages/chips.html +0 -23
- package/app/pages/dropdowns.html +0 -41
- package/app/pages/home.html +0 -59
- package/app/pages/icons.html +0 -29
- package/app/pages/inputs.html +0 -66
- package/app/pages/installation.html +0 -34
- package/app/pages/layout.html +0 -30
- package/app/pages/modals.html +0 -21
- package/app/pages/navbar.html +0 -22
- package/app/pages/progress.html +0 -35
- package/app/pages/radios.html +0 -40
- package/app/pages/switches.html +0 -39
- package/app/pages/tabs.html +0 -30
- package/app/pages/toasts.html +0 -22
- package/app-dist/index.html +0 -67
- package/app-dist/pages/alerts.html +0 -23
- package/app-dist/pages/avatars.html +0 -22
- package/app-dist/pages/badges.html +0 -22
- package/app-dist/pages/buttons.html +0 -71
- package/app-dist/pages/cards.html +0 -54
- package/app-dist/pages/checkboxes.html +0 -39
- package/app-dist/pages/chips.html +0 -23
- package/app-dist/pages/dropdowns.html +0 -41
- package/app-dist/pages/home.html +0 -59
- package/app-dist/pages/icons.html +0 -29
- package/app-dist/pages/inputs.html +0 -66
- package/app-dist/pages/installation.html +0 -34
- package/app-dist/pages/layout.html +0 -30
- package/app-dist/pages/modals.html +0 -21
- package/app-dist/pages/navbar.html +0 -22
- package/app-dist/pages/progress.html +0 -35
- package/app-dist/pages/radios.html +0 -40
- package/app-dist/pages/switches.html +0 -39
- package/app-dist/pages/tabs.html +0 -30
- package/app-dist/pages/toasts.html +0 -22
- package/app-dist/pages.json +0 -217
- package/app-dist/routes/alerts.js +0 -5
- package/app-dist/routes/avatars.js +0 -1
- package/app-dist/routes/badges.js +0 -1
- package/app-dist/routes/buttons.js +0 -1
- package/app-dist/routes/cards.js +0 -1
- package/app-dist/routes/checkboxes.js +0 -9
- package/app-dist/routes/chips.js +0 -4
- package/app-dist/routes/chunk-019e5e2f.js +0 -5
- package/app-dist/routes/chunk-0m4j19yd.js +0 -2
- package/app-dist/routes/chunk-0tmmp5q0.js +0 -1
- package/app-dist/routes/chunk-10xn709r.js +0 -1
- package/app-dist/routes/chunk-15m2qcda.js +0 -2
- package/app-dist/routes/chunk-1bh8g23n.js +0 -1
- package/app-dist/routes/chunk-1vg0v937.js +0 -1
- package/app-dist/routes/chunk-1zvcgy3j.js +0 -1
- package/app-dist/routes/chunk-2afb0861.js +0 -1
- package/app-dist/routes/chunk-2c6ttpzt.js +0 -5
- package/app-dist/routes/chunk-3dy30fhs.js +0 -1
- package/app-dist/routes/chunk-426dnces.js +0 -13
- package/app-dist/routes/chunk-44kgxery.js +0 -1
- package/app-dist/routes/chunk-47fdnejd.js +0 -33
- package/app-dist/routes/chunk-49a6t2vq.js +0 -1
- package/app-dist/routes/chunk-4fe1rm5b.js +0 -1
- package/app-dist/routes/chunk-4ggmvkta.js +0 -33
- package/app-dist/routes/chunk-4vkz81q7.js +0 -33
- package/app-dist/routes/chunk-4w4tmj8f.js +0 -31
- package/app-dist/routes/chunk-532s62kr.js +0 -31
- package/app-dist/routes/chunk-5hm3bssy.js +0 -33
- package/app-dist/routes/chunk-5vrh24hc.js +0 -1
- package/app-dist/routes/chunk-61pcg25a.js +0 -1
- package/app-dist/routes/chunk-6nfhygvf.js +0 -1
- package/app-dist/routes/chunk-700e7je6.js +0 -33
- package/app-dist/routes/chunk-7fsn17kg.js +0 -1
- package/app-dist/routes/chunk-7k789b32.js +0 -1
- package/app-dist/routes/chunk-7r46q0ys.js +0 -36
- package/app-dist/routes/chunk-86fmc1fr.js +0 -5
- package/app-dist/routes/chunk-8qth37vw.js +0 -1
- package/app-dist/routes/chunk-924wv8n0.js +0 -1
- package/app-dist/routes/chunk-9mbhgxk9.js +0 -1
- package/app-dist/routes/chunk-a216hyd9.js +0 -1
- package/app-dist/routes/chunk-akzxykh9.js +0 -33
- package/app-dist/routes/chunk-b3dcvy8c.js +0 -1
- package/app-dist/routes/chunk-b74zahz5.js +0 -31
- package/app-dist/routes/chunk-bftj53p2.js +0 -5
- package/app-dist/routes/chunk-c01hnz3e.js +0 -1
- package/app-dist/routes/chunk-d8pvv5km.js +0 -1
- package/app-dist/routes/chunk-dev0aezr.js +0 -2
- package/app-dist/routes/chunk-dh6vnv0e.js +0 -1
- package/app-dist/routes/chunk-dn2cbpva.js +0 -36
- package/app-dist/routes/chunk-dvn0my90.js +0 -1
- package/app-dist/routes/chunk-dvq8mnve.js +0 -36
- package/app-dist/routes/chunk-e8c2gc4d.js +0 -5
- package/app-dist/routes/chunk-ejf9ak2x.js +0 -1
- package/app-dist/routes/chunk-f083m55s.js +0 -1
- package/app-dist/routes/chunk-fnrj28s1.js +0 -31
- package/app-dist/routes/chunk-fvg3yjdp.js +0 -31
- package/app-dist/routes/chunk-g7k381n1.js +0 -1
- package/app-dist/routes/chunk-h01kq2ae.js +0 -13
- package/app-dist/routes/chunk-h4dk761v.js +0 -5
- package/app-dist/routes/chunk-hmx91z2x.js +0 -5
- package/app-dist/routes/chunk-hxbg4m42.js +0 -36
- package/app-dist/routes/chunk-jbjnfp2b.js +0 -2
- package/app-dist/routes/chunk-jxtz5vv6.js +0 -36
- package/app-dist/routes/chunk-jxzcs0ey.js +0 -36
- package/app-dist/routes/chunk-kt7wwhcx.js +0 -1
- package/app-dist/routes/chunk-kzptszyc.js +0 -33
- package/app-dist/routes/chunk-mhgca4w4.js +0 -2
- package/app-dist/routes/chunk-mhswxa20.js +0 -1
- package/app-dist/routes/chunk-n8zfeex6.js +0 -1
- package/app-dist/routes/chunk-pee47b2r.js +0 -1
- package/app-dist/routes/chunk-pesmw829.js +0 -1
- package/app-dist/routes/chunk-pgc4c6f3.js +0 -36
- package/app-dist/routes/chunk-q8egegm1.js +0 -1
- package/app-dist/routes/chunk-q9mn2qyq.js +0 -36
- package/app-dist/routes/chunk-qh0rtaf3.js +0 -5
- package/app-dist/routes/chunk-qqhmk6ye.js +0 -2
- package/app-dist/routes/chunk-qrxygmf7.js +0 -33
- package/app-dist/routes/chunk-r46yzksx.js +0 -36
- package/app-dist/routes/chunk-rgpbw2w0.js +0 -5
- package/app-dist/routes/chunk-rnpzv3d8.js +0 -2
- package/app-dist/routes/chunk-s5v8cv05.js +0 -2
- package/app-dist/routes/chunk-sbwn5bpc.js +0 -1
- package/app-dist/routes/chunk-sqbg8jbt.js +0 -33
- package/app-dist/routes/chunk-sv8dqnf7.js +0 -1
- package/app-dist/routes/chunk-t67sw3za.js +0 -1
- package/app-dist/routes/chunk-tjdpqwdf.js +0 -31
- package/app-dist/routes/chunk-tq2mfghg.js +0 -1
- package/app-dist/routes/chunk-ttn10vt6.js +0 -1
- package/app-dist/routes/chunk-v2hzpjxr.js +0 -1
- package/app-dist/routes/chunk-wfjjkw9y.js +0 -1
- package/app-dist/routes/chunk-wt8cxzmf.js +0 -31
- package/app-dist/routes/chunk-x45d372k.js +0 -5
- package/app-dist/routes/chunk-y3wsazkt.js +0 -1
- package/app-dist/routes/chunk-y7pmgc7t.js +0 -33
- package/app-dist/routes/chunk-zefdt2q3.js +0 -31
- package/app-dist/routes/dropdowns.js +0 -6
- package/app-dist/routes/home.js +0 -1
- package/app-dist/routes/icons.js +0 -1
- package/app-dist/routes/inputs.js +0 -12
- package/app-dist/routes/installation.js +0 -1
- package/app-dist/routes/layout.js +0 -1
- package/app-dist/routes/modals.js +0 -7
- package/app-dist/routes/navbar.js +0 -1
- package/app-dist/routes/progress.js +0 -1
- package/app-dist/routes/radios.js +0 -6
- package/app-dist/routes/switches.js +0 -6
- package/app-dist/routes/tabs.js +0 -1
- package/app-dist/routes/toasts.js +0 -16
- package/assets/fonts/material-symbols-mini.woff2 +0 -0
- package/assets/fonts/material-symbols.woff2 +0 -0
- package/assets/fonts/roboto-400.woff2 +0 -0
- package/assets/fonts/roboto-500.woff2 +0 -0
- package/assets/fonts/roboto-700.woff2 +0 -0
- package/assets/logo-banner-400.jpg +0 -0
- package/assets/logo-banner-400.webp +0 -0
- package/assets/logo-banner-800.webp +0 -0
- package/assets/logo-banner.jpg +0 -0
- package/assets/logo-icon-64.jpg +0 -0
- package/assets/logo-icon-64.webp +0 -0
- package/assets/logo-icon.jpg +0 -0
- package/assets/logo-square.jpg +0 -0
- package/bun.lock +0 -312
- package/bunfig.toml +0 -4
- package/custom-elements.json +0 -1916
- package/demo/api/sample-data.json +0 -38
- package/demo/content/alerts.html +0 -115
- package/demo/content/avatars.html +0 -70
- package/demo/content/badges.html +0 -65
- package/demo/content/buttons.html +0 -188
- package/demo/content/callouts.html +0 -91
- package/demo/content/cards.html +0 -121
- package/demo/content/checkboxes.html +0 -178
- package/demo/content/chips.html +0 -67
- package/demo/content/codeblocks.html +0 -101
- package/demo/content/confirms.html +0 -115
- package/demo/content/datatables.html +0 -149
- package/demo/content/dividers.html +0 -119
- package/demo/content/dropdowns.html +0 -89
- package/demo/content/enterprise.html +0 -252
- package/demo/content/home.html +0 -149
- package/demo/content/icons.html +0 -89
- package/demo/content/inputs.html +0 -135
- package/demo/content/installation.html +0 -16
- package/demo/content/layout.html +0 -136
- package/demo/content/modals.html +0 -141
- package/demo/content/navbar.html +0 -70
- package/demo/content/progress.html +0 -119
- package/demo/content/radios.html +0 -88
- package/demo/content/skeletons.html +0 -109
- package/demo/content/spinners.html +0 -96
- package/demo/content/switches.html +0 -84
- package/demo/content/tables.html +0 -124
- package/demo/content/tabs.html +0 -85
- package/demo/content/toasts.html +0 -116
- package/demo/content/tooltips.html +0 -107
- package/demo/content/virtual-lists.html +0 -233
- package/demo/favicon.ico +0 -0
- package/demo/favicon.png +0 -0
- package/demo/full.html +0 -52
- package/demo/iife.html +0 -46
- package/demo/manifest.json +0 -34
- package/demo/pages/datatable-demo.html +0 -237
- package/demo/pages/prompt-ui-demo.html +0 -218
- package/demo/pages/responsive-demo.html +0 -122
- package/demo/pages/schema-form-demo.html +0 -270
- package/demo/robots.txt +0 -6
- package/demo/shell.html +0 -712
- package/demo/sw.js +0 -387
- package/lighthouse-audit.mjs +0 -113
- package/scripts/analyze-components.js +0 -105
- package/scripts/build-app.js +0 -193
- package/scripts/build-framework.js +0 -444
- package/scripts/build-utils.js +0 -101
- package/scripts/test-isolated.js +0 -151
- package/server.js +0 -256
- package/tests/agents/agent-integration.test.js +0 -76
- package/tests/benchmark.html +0 -296
- package/tests/build/scan-components.test.js +0 -173
- package/tests/components/all-components.test.js +0 -245
- package/tests/components/all-missing-components.test.js +0 -574
- package/tests/components/mu-alert.test.js +0 -113
- package/tests/components/mu-avatar.test.js +0 -148
- package/tests/components/mu-badge.test.js +0 -92
- package/tests/components/mu-button.test.js +0 -112
- package/tests/components/mu-card.test.js +0 -89
- package/tests/components/mu-checkbox.test.js +0 -158
- package/tests/components/mu-chip.test.js +0 -118
- package/tests/components/mu-container.test.js +0 -120
- package/tests/components/mu-divider.test.js +0 -98
- package/tests/components/mu-drawer-item.test.js +0 -199
- package/tests/components/mu-drawer.test.js +0 -96
- package/tests/components/mu-dropdown.test.js +0 -125
- package/tests/components/mu-form.test.js +0 -138
- package/tests/components/mu-grid.test.js +0 -135
- package/tests/components/mu-icon.test.js +0 -110
- package/tests/components/mu-input.test.js +0 -131
- package/tests/components/mu-lazy.test.js +0 -103
- package/tests/components/mu-modal.test.js +0 -275
- package/tests/components/mu-navbar.test.js +0 -101
- package/tests/components/mu-progress.test.js +0 -115
- package/tests/components/mu-radio.test.js +0 -114
- package/tests/components/mu-repeat.test.js +0 -106
- package/tests/components/mu-sidebar.test.js +0 -126
- package/tests/components/mu-skeleton.test.js +0 -162
- package/tests/components/mu-stack.test.js +0 -143
- package/tests/components/mu-switch.test.js +0 -292
- package/tests/components/mu-table.test.js +0 -124
- package/tests/components/mu-tabs.test.js +0 -104
- package/tests/components/mu-textarea.test.js +0 -115
- package/tests/components/mu-toast.test.js +0 -321
- package/tests/components/mu-tooltip.test.js +0 -133
- package/tests/components/mu-virtual-list.test.js +0 -109
- package/tests/core/MuElement.test.js +0 -120
- package/tests/core/agent-api.test.js +0 -125
- package/tests/core/all-core-modules.test.js +0 -442
- package/tests/core/bus.test.js +0 -364
- package/tests/core/component-schema.test.js +0 -160
- package/tests/core/feature-registry.test.js +0 -198
- package/tests/core/form-state.test.js +0 -167
- package/tests/core/http.test.js +0 -119
- package/tests/core/keyboard.test.js +0 -319
- package/tests/core/layers.test.js +0 -129
- package/tests/core/namespaced-stores.test.js +0 -114
- package/tests/core/render.test.js +0 -121
- package/tests/core/ripple.test.js +0 -131
- package/tests/core/router.test.js +0 -89
- package/tests/core/scheduler.test.js +0 -121
- package/tests/core/signals.test.js +0 -128
- package/tests/core/store.test.js +0 -171
- package/tests/core/transitions.test.js +0 -82
- package/tests/e2e/accessibility-harness.html +0 -58
- package/tests/e2e/accessibility.test.js +0 -401
- package/tests/e2e/agent-features.test.js +0 -372
- package/tests/e2e/card-spacing.test.js +0 -287
- package/tests/e2e/components.test.js +0 -439
- package/tests/e2e/demo-routes.test.js +0 -478
- package/tests/e2e/layout-css-fallback.test.js +0 -334
- package/tests/e2e/mu-alert.e2e.test.js +0 -111
- package/tests/e2e/mu-checkbox.test.js +0 -489
- package/tests/e2e/mu-chip.test.js +0 -347
- package/tests/e2e/mu-form.test.js +0 -499
- package/tests/e2e/mu-icon.test.js +0 -114
- package/tests/e2e/mu-radio.test.js +0 -113
- package/tests/e2e/mu-skeleton.test.js +0 -140
- package/tests/e2e/mu-switch.test.js +0 -415
- package/tests/e2e/mu-tabs.test.js +0 -494
- package/tests/e2e/mu-textarea.test.js +0 -242
- package/tests/e2e/mu-virtual-list.test.js +0 -427
- package/tests/e2e/perf-memory.test.js +0 -161
- package/tests/e2e/puppeteer-helper.js +0 -137
- package/tests/e2e/puppeteer.test.js +0 -226
- package/tests/e2e/pwa.test.js +0 -261
- package/tests/e2e/test-harness.html +0 -319
- package/tests/manual/test-components.html +0 -120
- package/tests/memory-test.html +0 -309
- package/tests/setup-dom.js +0 -93
- package/tests/visual-test.html +0 -301
|
@@ -1,489 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Comprehensive E2E Tests for mu-checkbox Component
|
|
3
|
-
*
|
|
4
|
-
* Tests:
|
|
5
|
-
* - Component registration and basic rendering
|
|
6
|
-
* - Click toggle behavior
|
|
7
|
-
* - Disabled state
|
|
8
|
-
* - Indeterminate state
|
|
9
|
-
* - Keyboard accessibility (Space/Enter)
|
|
10
|
-
* - ARIA attributes
|
|
11
|
-
* - Event emission
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { describe, test, expect, beforeAll, afterEach, afterAll } from 'bun:test';
|
|
15
|
-
import { launchBrowser, puppeteer } from './puppeteer-helper.js';
|
|
16
|
-
import { fileURLToPath } from 'url';
|
|
17
|
-
import { dirname, join } from 'path';
|
|
18
|
-
|
|
19
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
-
const __dirname = dirname(__filename);
|
|
21
|
-
|
|
22
|
-
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
23
|
-
|
|
24
|
-
describe('mu-checkbox E2E Tests', () => {
|
|
25
|
-
let browser;
|
|
26
|
-
let page;
|
|
27
|
-
let server;
|
|
28
|
-
|
|
29
|
-
beforeAll(async () => {
|
|
30
|
-
const projectRoot = join(__dirname, '../..');
|
|
31
|
-
|
|
32
|
-
server = Bun.serve({
|
|
33
|
-
port: 0,
|
|
34
|
-
async fetch(req) {
|
|
35
|
-
const url = new URL(req.url);
|
|
36
|
-
let filePath = join(projectRoot, url.pathname);
|
|
37
|
-
|
|
38
|
-
if (url.pathname === '/') {
|
|
39
|
-
filePath = join(projectRoot, 'demo/shell.html');
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
try {
|
|
43
|
-
const file = Bun.file(filePath);
|
|
44
|
-
if (!await file.exists()) {
|
|
45
|
-
return new Response('Not Found', { status: 404 });
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const content = await file.arrayBuffer();
|
|
49
|
-
const ext = filePath.split('.').pop();
|
|
50
|
-
const mimeTypes = {
|
|
51
|
-
'html': 'text/html',
|
|
52
|
-
'js': 'text/javascript',
|
|
53
|
-
'css': 'text/css',
|
|
54
|
-
'json': 'application/json',
|
|
55
|
-
'svg': 'image/svg+xml'
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
return new Response(content, {
|
|
59
|
-
headers: { 'Content-Type': mimeTypes[ext] || 'application/octet-stream' }
|
|
60
|
-
});
|
|
61
|
-
} catch (e) {
|
|
62
|
-
return new Response('Error: ' + e.message, { status: 500 });
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
console.log(`[mu-checkbox test] Server started at http://localhost:${server.port}`);
|
|
68
|
-
|
|
69
|
-
browser = await puppeteer.launch({
|
|
70
|
-
headless: true,
|
|
71
|
-
executablePath: '/tmp/puppeteer/chrome-headless-shell/mac_arm-144.0.7559.96/chrome-headless-shell-mac-arm64/chrome-headless-shell',
|
|
72
|
-
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
73
|
-
userDataDir: `./.tmp/puppeteer-mu_checkbox-${Date.now()}-${Math.random().toString(36).slice(2)}`
|
|
74
|
-
});
|
|
75
|
-
page = await browser.newPage();
|
|
76
|
-
}, 60000);
|
|
77
|
-
|
|
78
|
-
afterEach(async () => {
|
|
79
|
-
await page.goto('about:blank');
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
afterAll(async () => {
|
|
83
|
-
if (browser) await browser.close();
|
|
84
|
-
if (server) server.stop();
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
// ========================================
|
|
88
|
-
// COMPONENT REGISTRATION
|
|
89
|
-
// ========================================
|
|
90
|
-
|
|
91
|
-
test('should be registered as custom element', async () => {
|
|
92
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
93
|
-
waitUntil: 'networkidle0'
|
|
94
|
-
});
|
|
95
|
-
await delay(500);
|
|
96
|
-
|
|
97
|
-
const isRegistered = await page.evaluate(() =>
|
|
98
|
-
customElements.get('mu-checkbox') !== undefined
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
expect(isRegistered).toBe(true);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
test('should render with base class', async () => {
|
|
105
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
106
|
-
waitUntil: 'networkidle0'
|
|
107
|
-
});
|
|
108
|
-
await delay(500);
|
|
109
|
-
|
|
110
|
-
const hasBaseClass = await page.evaluate(() => {
|
|
111
|
-
const checkbox = document.querySelector('mu-checkbox');
|
|
112
|
-
return checkbox?.classList.contains('mu-checkbox');
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
expect(hasBaseClass).toBe(true);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test('should render checkbox box and label', async () => {
|
|
119
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
120
|
-
waitUntil: 'networkidle0'
|
|
121
|
-
});
|
|
122
|
-
await delay(500);
|
|
123
|
-
|
|
124
|
-
const result = await page.evaluate(() => {
|
|
125
|
-
const checkbox = document.querySelector('mu-checkbox');
|
|
126
|
-
return {
|
|
127
|
-
hasBox: checkbox?.querySelector('.mu-checkbox__box') !== null,
|
|
128
|
-
hasLabel: checkbox?.querySelector('.mu-checkbox__label') !== null
|
|
129
|
-
};
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
expect(result.hasBox).toBe(true);
|
|
133
|
-
expect(result.hasLabel).toBe(true);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
// ========================================
|
|
137
|
-
// CLICK TOGGLE BEHAVIOR
|
|
138
|
-
// ========================================
|
|
139
|
-
|
|
140
|
-
test('should toggle checked state on click', async () => {
|
|
141
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
142
|
-
waitUntil: 'networkidle0'
|
|
143
|
-
});
|
|
144
|
-
await delay(500);
|
|
145
|
-
|
|
146
|
-
const result = await page.evaluate(() => {
|
|
147
|
-
// Find an unchecked checkbox
|
|
148
|
-
const checkboxes = document.querySelectorAll('mu-checkbox:not([disabled])');
|
|
149
|
-
let checkbox = null;
|
|
150
|
-
for (const cb of checkboxes) {
|
|
151
|
-
if (!cb.hasAttribute('checked') && !cb.hasAttribute('indeterminate')) {
|
|
152
|
-
checkbox = cb;
|
|
153
|
-
break;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
if (!checkbox) return { error: 'No unchecked checkbox found' };
|
|
157
|
-
|
|
158
|
-
const before = checkbox.hasAttribute('checked');
|
|
159
|
-
checkbox.click();
|
|
160
|
-
const after = checkbox.hasAttribute('checked');
|
|
161
|
-
checkbox.click();
|
|
162
|
-
const afterSecond = checkbox.hasAttribute('checked');
|
|
163
|
-
return { before, after, afterSecond };
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
expect(result.before).toBe(false);
|
|
167
|
-
expect(result.after).toBe(true);
|
|
168
|
-
expect(result.afterSecond).toBe(false);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
test('should emit mu-change event on toggle', async () => {
|
|
172
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
173
|
-
waitUntil: 'networkidle0'
|
|
174
|
-
});
|
|
175
|
-
await delay(500);
|
|
176
|
-
|
|
177
|
-
const result = await page.evaluate(() => {
|
|
178
|
-
return new Promise(resolve => {
|
|
179
|
-
const checkboxes = document.querySelectorAll('mu-checkbox:not([disabled])');
|
|
180
|
-
let checkbox = null;
|
|
181
|
-
for (const cb of checkboxes) {
|
|
182
|
-
if (!cb.hasAttribute('checked') && !cb.hasAttribute('indeterminate')) {
|
|
183
|
-
checkbox = cb;
|
|
184
|
-
break;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (!checkbox) {
|
|
188
|
-
resolve({ error: 'No checkbox found' });
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
let eventData = null;
|
|
193
|
-
checkbox.addEventListener('mu-change', (e) => {
|
|
194
|
-
eventData = e.detail;
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
checkbox.click();
|
|
198
|
-
|
|
199
|
-
setTimeout(() => {
|
|
200
|
-
resolve({
|
|
201
|
-
fired: eventData !== null,
|
|
202
|
-
checked: eventData?.checked,
|
|
203
|
-
indeterminate: eventData?.indeterminate
|
|
204
|
-
});
|
|
205
|
-
}, 100);
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
expect(result.fired).toBe(true);
|
|
210
|
-
expect(result.checked).toBe(true);
|
|
211
|
-
expect(result.indeterminate).toBe(false);
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
// ========================================
|
|
215
|
-
// DISABLED STATE
|
|
216
|
-
// ========================================
|
|
217
|
-
|
|
218
|
-
test('should not toggle when disabled', async () => {
|
|
219
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
220
|
-
waitUntil: 'networkidle0'
|
|
221
|
-
});
|
|
222
|
-
await delay(500);
|
|
223
|
-
|
|
224
|
-
const result = await page.evaluate(() => {
|
|
225
|
-
const checkbox = document.querySelector('mu-checkbox[disabled]');
|
|
226
|
-
if (!checkbox) return { error: 'No disabled checkbox found' };
|
|
227
|
-
|
|
228
|
-
const before = checkbox.hasAttribute('checked');
|
|
229
|
-
checkbox.click();
|
|
230
|
-
const after = checkbox.hasAttribute('checked');
|
|
231
|
-
return { before, after };
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
expect(result.before).toBe(result.after); // State should not change
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
test('disabled checkbox should have tabindex=-1', async () => {
|
|
238
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
239
|
-
waitUntil: 'networkidle0'
|
|
240
|
-
});
|
|
241
|
-
await delay(500);
|
|
242
|
-
|
|
243
|
-
const tabindex = await page.evaluate(() => {
|
|
244
|
-
const checkbox = document.querySelector('mu-checkbox[disabled]');
|
|
245
|
-
return checkbox?.getAttribute('tabindex');
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
expect(tabindex).toBe('-1');
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
// ========================================
|
|
252
|
-
// INDETERMINATE STATE
|
|
253
|
-
// ========================================
|
|
254
|
-
|
|
255
|
-
test('should have indeterminate state rendered', async () => {
|
|
256
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
257
|
-
waitUntil: 'networkidle0'
|
|
258
|
-
});
|
|
259
|
-
await delay(500);
|
|
260
|
-
|
|
261
|
-
const result = await page.evaluate(() => {
|
|
262
|
-
const checkbox = document.querySelector('mu-checkbox[indeterminate]');
|
|
263
|
-
if (!checkbox) return { error: 'No indeterminate checkbox found' };
|
|
264
|
-
|
|
265
|
-
return {
|
|
266
|
-
hasAttr: checkbox.hasAttribute('indeterminate'),
|
|
267
|
-
ariaMixed: checkbox.getAttribute('aria-checked')
|
|
268
|
-
};
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
expect(result.hasAttr).toBe(true);
|
|
272
|
-
expect(result.ariaMixed).toBe('mixed');
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
test('click should clear indeterminate and set checked', async () => {
|
|
276
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
277
|
-
waitUntil: 'networkidle0'
|
|
278
|
-
});
|
|
279
|
-
await delay(500);
|
|
280
|
-
|
|
281
|
-
const result = await page.evaluate(() => {
|
|
282
|
-
const checkbox = document.querySelector('mu-checkbox[indeterminate]');
|
|
283
|
-
if (!checkbox) return { error: 'No indeterminate checkbox found' };
|
|
284
|
-
|
|
285
|
-
const beforeIndeterminate = checkbox.hasAttribute('indeterminate');
|
|
286
|
-
checkbox.click();
|
|
287
|
-
return {
|
|
288
|
-
beforeIndeterminate,
|
|
289
|
-
afterIndeterminate: checkbox.hasAttribute('indeterminate'),
|
|
290
|
-
afterChecked: checkbox.hasAttribute('checked')
|
|
291
|
-
};
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
expect(result.beforeIndeterminate).toBe(true);
|
|
295
|
-
expect(result.afterIndeterminate).toBe(false);
|
|
296
|
-
expect(result.afterChecked).toBe(true);
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
// ========================================
|
|
300
|
-
// ACCESSIBILITY
|
|
301
|
-
// ========================================
|
|
302
|
-
|
|
303
|
-
test('should have role=checkbox', async () => {
|
|
304
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
305
|
-
waitUntil: 'networkidle0'
|
|
306
|
-
});
|
|
307
|
-
await delay(500);
|
|
308
|
-
|
|
309
|
-
const role = await page.evaluate(() => {
|
|
310
|
-
const checkbox = document.querySelector('mu-checkbox');
|
|
311
|
-
return checkbox?.getAttribute('role');
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
expect(role).toBe('checkbox');
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
test('should have aria-checked matching state', async () => {
|
|
318
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
319
|
-
waitUntil: 'networkidle0'
|
|
320
|
-
});
|
|
321
|
-
await delay(500);
|
|
322
|
-
|
|
323
|
-
const result = await page.evaluate(() => {
|
|
324
|
-
const checked = document.querySelector('mu-checkbox[checked]:not([indeterminate])');
|
|
325
|
-
const indeterminate = document.querySelector('mu-checkbox[indeterminate]');
|
|
326
|
-
// Find unchecked
|
|
327
|
-
const unchecked = Array.from(document.querySelectorAll('mu-checkbox'))
|
|
328
|
-
.find(cb => !cb.hasAttribute('checked') && !cb.hasAttribute('indeterminate'));
|
|
329
|
-
|
|
330
|
-
return {
|
|
331
|
-
unchecked: unchecked?.getAttribute('aria-checked'),
|
|
332
|
-
checked: checked?.getAttribute('aria-checked'),
|
|
333
|
-
indeterminate: indeterminate?.getAttribute('aria-checked')
|
|
334
|
-
};
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
expect(result.unchecked).toBe('false');
|
|
338
|
-
expect(result.checked).toBe('true');
|
|
339
|
-
expect(result.indeterminate).toBe('mixed');
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
test('should have aria-disabled when disabled', async () => {
|
|
343
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
344
|
-
waitUntil: 'networkidle0'
|
|
345
|
-
});
|
|
346
|
-
await delay(500);
|
|
347
|
-
|
|
348
|
-
const ariaDisabled = await page.evaluate(() => {
|
|
349
|
-
const checkbox = document.querySelector('mu-checkbox[disabled]');
|
|
350
|
-
return checkbox?.getAttribute('aria-disabled');
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
expect(ariaDisabled).toBe('true');
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
// ========================================
|
|
357
|
-
// KEYBOARD ACCESSIBILITY
|
|
358
|
-
// ========================================
|
|
359
|
-
|
|
360
|
-
test('should toggle on Space key', async () => {
|
|
361
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
362
|
-
waitUntil: 'networkidle0'
|
|
363
|
-
});
|
|
364
|
-
await delay(500);
|
|
365
|
-
|
|
366
|
-
const result = await page.evaluate(() => {
|
|
367
|
-
const checkboxes = document.querySelectorAll('mu-checkbox:not([disabled])');
|
|
368
|
-
let checkbox = null;
|
|
369
|
-
for (const cb of checkboxes) {
|
|
370
|
-
if (!cb.hasAttribute('checked') && !cb.hasAttribute('indeterminate')) {
|
|
371
|
-
checkbox = cb;
|
|
372
|
-
break;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
if (!checkbox) return { error: 'No checkbox found' };
|
|
376
|
-
|
|
377
|
-
const before = checkbox.hasAttribute('checked');
|
|
378
|
-
|
|
379
|
-
// Simulate Space key
|
|
380
|
-
const event = new KeyboardEvent('keydown', { key: ' ', bubbles: true });
|
|
381
|
-
checkbox.dispatchEvent(event);
|
|
382
|
-
|
|
383
|
-
const after = checkbox.hasAttribute('checked');
|
|
384
|
-
return { before, after };
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
expect(result.before).toBe(false);
|
|
388
|
-
expect(result.after).toBe(true);
|
|
389
|
-
});
|
|
390
|
-
|
|
391
|
-
test('should toggle on Enter key', async () => {
|
|
392
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
393
|
-
waitUntil: 'networkidle0'
|
|
394
|
-
});
|
|
395
|
-
await delay(500);
|
|
396
|
-
|
|
397
|
-
const result = await page.evaluate(() => {
|
|
398
|
-
const checkboxes = document.querySelectorAll('mu-checkbox:not([disabled])');
|
|
399
|
-
let checkbox = null;
|
|
400
|
-
for (const cb of checkboxes) {
|
|
401
|
-
if (!cb.hasAttribute('checked') && !cb.hasAttribute('indeterminate')) {
|
|
402
|
-
checkbox = cb;
|
|
403
|
-
break;
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
if (!checkbox) return { error: 'No checkbox found' };
|
|
407
|
-
|
|
408
|
-
const before = checkbox.hasAttribute('checked');
|
|
409
|
-
|
|
410
|
-
// Simulate Enter key
|
|
411
|
-
const event = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true });
|
|
412
|
-
checkbox.dispatchEvent(event);
|
|
413
|
-
|
|
414
|
-
const after = checkbox.hasAttribute('checked');
|
|
415
|
-
return { before, after };
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
expect(result.before).toBe(false);
|
|
419
|
-
expect(result.after).toBe(true);
|
|
420
|
-
});
|
|
421
|
-
|
|
422
|
-
// ========================================
|
|
423
|
-
// PROPERTY ACCESSORS
|
|
424
|
-
// ========================================
|
|
425
|
-
|
|
426
|
-
test('should support checked property getter/setter', async () => {
|
|
427
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
428
|
-
waitUntil: 'networkidle0'
|
|
429
|
-
});
|
|
430
|
-
await delay(500);
|
|
431
|
-
|
|
432
|
-
const result = await page.evaluate(() => {
|
|
433
|
-
const checkboxes = document.querySelectorAll('mu-checkbox:not([disabled])');
|
|
434
|
-
let checkbox = null;
|
|
435
|
-
for (const cb of checkboxes) {
|
|
436
|
-
if (!cb.hasAttribute('checked') && !cb.hasAttribute('indeterminate')) {
|
|
437
|
-
checkbox = cb;
|
|
438
|
-
break;
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
if (!checkbox) return { error: 'No checkbox found' };
|
|
442
|
-
|
|
443
|
-
const initialProp = checkbox.checked;
|
|
444
|
-
checkbox.checked = true;
|
|
445
|
-
const afterSet = checkbox.checked;
|
|
446
|
-
const attrPresent = checkbox.hasAttribute('checked');
|
|
447
|
-
checkbox.checked = false;
|
|
448
|
-
const afterUnset = checkbox.checked;
|
|
449
|
-
return { initialProp, afterSet, attrPresent, afterUnset };
|
|
450
|
-
});
|
|
451
|
-
|
|
452
|
-
expect(result.initialProp).toBe(false);
|
|
453
|
-
expect(result.afterSet).toBe(true);
|
|
454
|
-
expect(result.attrPresent).toBe(true);
|
|
455
|
-
expect(result.afterUnset).toBe(false);
|
|
456
|
-
});
|
|
457
|
-
|
|
458
|
-
test('should support indeterminate property getter/setter', async () => {
|
|
459
|
-
await page.goto(`http://localhost:${server.port}/demo/shell.html#checkboxes`, {
|
|
460
|
-
waitUntil: 'networkidle0'
|
|
461
|
-
});
|
|
462
|
-
await delay(500);
|
|
463
|
-
|
|
464
|
-
const result = await page.evaluate(() => {
|
|
465
|
-
const checkboxes = document.querySelectorAll('mu-checkbox:not([disabled])');
|
|
466
|
-
let checkbox = null;
|
|
467
|
-
for (const cb of checkboxes) {
|
|
468
|
-
if (!cb.hasAttribute('checked') && !cb.hasAttribute('indeterminate')) {
|
|
469
|
-
checkbox = cb;
|
|
470
|
-
break;
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
if (!checkbox) return { error: 'No checkbox found' };
|
|
474
|
-
|
|
475
|
-
const initialProp = checkbox.indeterminate;
|
|
476
|
-
checkbox.indeterminate = true;
|
|
477
|
-
const afterSet = checkbox.indeterminate;
|
|
478
|
-
const ariaMixed = checkbox.getAttribute('aria-checked');
|
|
479
|
-
checkbox.indeterminate = false;
|
|
480
|
-
const afterUnset = checkbox.indeterminate;
|
|
481
|
-
return { initialProp, afterSet, ariaMixed, afterUnset };
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
expect(result.initialProp).toBe(false);
|
|
485
|
-
expect(result.afterSet).toBe(true);
|
|
486
|
-
expect(result.ariaMixed).toBe('mixed');
|
|
487
|
-
expect(result.afterUnset).toBe(false);
|
|
488
|
-
});
|
|
489
|
-
});
|