@adukiorg/anza 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +137 -0
- package/README.md +215 -0
- package/bin/anza.js +63 -0
- package/bin/create.js +150 -0
- package/importmap.json +72 -0
- package/package.json +100 -0
- package/src/core/animations/index.js +55 -0
- package/src/core/animations/play.js +111 -0
- package/src/core/animations/registry.js +54 -0
- package/src/core/animations/scroll.js +50 -0
- package/src/core/animations/tokens.js +58 -0
- package/src/core/animations/usage.md +301 -0
- package/src/core/animations/waapi.js +86 -0
- package/src/core/api/cache.js +120 -0
- package/src/core/api/caches/glob.js +24 -0
- package/src/core/api/caches/index.js +118 -0
- package/src/core/api/events/index.js +75 -0
- package/src/core/api/fetch.js +99 -0
- package/src/core/api/index.js +158 -0
- package/src/core/api/pipeline.js +98 -0
- package/src/core/api/plan.md +209 -0
- package/src/core/api/prefixes/index.js +66 -0
- package/src/core/api/retry.js +69 -0
- package/src/core/api/stream.js +127 -0
- package/src/core/api/upload.js +180 -0
- package/src/core/api/usage.md +206 -0
- package/src/core/events/bus.js +38 -0
- package/src/core/events/delegate.js +79 -0
- package/src/core/events/index.js +26 -0
- package/src/core/events/listen.js +50 -0
- package/src/core/events/missing.md +103 -0
- package/src/core/events/once.js +49 -0
- package/src/core/events/plan.md +177 -0
- package/src/core/events/types/index.js +34 -0
- package/src/core/events/usage.md +107 -0
- package/src/core/offline/bridge.js +51 -0
- package/src/core/offline/clock.js +100 -0
- package/src/core/offline/connectivity.js +116 -0
- package/src/core/offline/index.js +41 -0
- package/src/core/offline/missing.md +89 -0
- package/src/core/offline/plan.md +143 -0
- package/src/core/offline/queue.js +168 -0
- package/src/core/offline/state.js +18 -0
- package/src/core/offline/sync.js +106 -0
- package/src/core/offline/usage.md +273 -0
- package/src/core/platform/guard.js +104 -0
- package/src/core/platform/index.js +42 -0
- package/src/core/platform/missing.md +119 -0
- package/src/core/platform/platform.d.ts +88 -0
- package/src/core/platform/polyfills/anchor.js +79 -0
- package/src/core/platform/polyfills/navigation.js +142 -0
- package/src/core/platform/polyfills/popover.js +142 -0
- package/src/core/platform/polyfills/scheduler.js +194 -0
- package/src/core/platform/polyfills/shadow.js +35 -0
- package/src/core/platform/polyfills/urlpattern.js +119 -0
- package/src/core/platform/supports.js +186 -0
- package/src/core/platform/usage.md +287 -0
- package/src/core/router/cache.js +95 -0
- package/src/core/router/container.js +146 -0
- package/src/core/router/handler.js +52 -0
- package/src/core/router/history.js +120 -0
- package/src/core/router/index.js +158 -0
- package/src/core/router/intercept.js +376 -0
- package/src/core/router/match.js +145 -0
- package/src/core/router/missing.md +716 -0
- package/src/core/router/outlet.js +139 -0
- package/src/core/router/plan.md +370 -0
- package/src/core/router/sync/index.js +16 -0
- package/src/core/router/sync/tab.js +115 -0
- package/src/core/router/sync/transport.js +139 -0
- package/src/core/router/transitions.js +59 -0
- package/src/core/router/usage.md +773 -0
- package/src/core/security/crypto.js +159 -0
- package/src/core/security/index.js +49 -0
- package/src/core/security/missing.md +97 -0
- package/src/core/security/permissions.js +64 -0
- package/src/core/security/sanitize.js +100 -0
- package/src/core/security/usage.md +283 -0
- package/src/core/state/derived.js +117 -0
- package/src/core/state/index.js +23 -0
- package/src/core/state/missing.md +165 -0
- package/src/core/state/persist.js +284 -0
- package/src/core/state/store.js +308 -0
- package/src/core/state/sync.js +46 -0
- package/src/core/state/usage.md +440 -0
- package/src/core/storage/cache.js +83 -0
- package/src/core/storage/idb.js +196 -0
- package/src/core/storage/index.js +373 -0
- package/src/core/storage/lru.js +107 -0
- package/src/core/storage/missing.md +165 -0
- package/src/core/storage/opfs.js +190 -0
- package/src/core/storage/plan.md +69 -0
- package/src/core/storage/quota.js +69 -0
- package/src/core/storage/usage.md +226 -0
- package/src/core/ui/base.js +50 -0
- package/src/core/ui/define/container.js +82 -0
- package/src/core/ui/define/define.js +12 -0
- package/src/core/ui/define/element.js +390 -0
- package/src/core/ui/define/index.js +9 -0
- package/src/core/ui/define/orchestrator.js +105 -0
- package/src/core/ui/define/proxy.js +644 -0
- package/src/core/ui/define/state.js +6 -0
- package/src/core/ui/define/utils.js +134 -0
- package/src/core/ui/implementation.md +170 -0
- package/src/core/ui/index.js +41 -0
- package/src/core/ui/observe.js +117 -0
- package/src/core/ui/plan.md +510 -0
- package/src/core/ui/schedule.js +60 -0
- package/src/core/ui/template.js +37 -0
- package/src/core/ui/transitions.js +37 -0
- package/src/core/ui/ui.types.md +890 -0
- package/src/core/ui/usage.md +1124 -0
- package/src/core/ui/watch.md +346 -0
- package/src/core/workers/broadcast.js +138 -0
- package/src/core/workers/dedicated.js +153 -0
- package/src/core/workers/index.js +169 -0
- package/src/core/workers/locks.js +160 -0
- package/src/core/workers/offscreen.js +166 -0
- package/src/core/workers/plan.md +381 -0
- package/src/core/workers/pool.js +267 -0
- package/src/core/workers/shared.js +137 -0
- package/src/core/workers/usage.md +622 -0
- package/src/elements/base.js +12 -0
- package/src/elements/data/card/index.html +9 -0
- package/src/elements/data/card/index.js +19 -0
- package/src/elements/data/card/index.tags.json +1 -0
- package/src/elements/data/card/style.css +46 -0
- package/src/elements/data/chart/index.html +1 -0
- package/src/elements/data/chart/index.js +143 -0
- package/src/elements/data/chart/index.tags.json +1 -0
- package/src/elements/data/chart/style.css +13 -0
- package/src/elements/data/list/index.html +3 -0
- package/src/elements/data/list/index.js +19 -0
- package/src/elements/data/list/index.tags.json +1 -0
- package/src/elements/data/list/style.css +39 -0
- package/src/elements/data/stat/index.html +9 -0
- package/src/elements/data/stat/index.js +19 -0
- package/src/elements/data/stat/index.tags.json +1 -0
- package/src/elements/data/stat/style.css +50 -0
- package/src/elements/data/table/index.html +1 -0
- package/src/elements/data/table/index.js +16 -0
- package/src/elements/data/table/index.tags.json +1 -0
- package/src/elements/data/table/style.css +50 -0
- package/src/elements/feedback/alert/index.html +11 -0
- package/src/elements/feedback/alert/index.js +28 -0
- package/src/elements/feedback/alert/index.tags.json +1 -0
- package/src/elements/feedback/alert/style.css +75 -0
- package/src/elements/feedback/empty/index.html +13 -0
- package/src/elements/feedback/empty/index.js +34 -0
- package/src/elements/feedback/empty/index.tags.json +1 -0
- package/src/elements/feedback/empty/style.css +45 -0
- package/src/elements/feedback/progress/index.html +7 -0
- package/src/elements/feedback/progress/index.js +46 -0
- package/src/elements/feedback/progress/index.tags.json +1 -0
- package/src/elements/feedback/progress/style.css +36 -0
- package/src/elements/feedback/skeleton/index.html +1 -0
- package/src/elements/feedback/skeleton/index.js +78 -0
- package/src/elements/feedback/skeleton/index.tags.json +1 -0
- package/src/elements/feedback/skeleton/style.css +28 -0
- package/src/elements/feedback/toast/index.html +3 -0
- package/src/elements/feedback/toast/index.js +65 -0
- package/src/elements/feedback/toast/index.tags.json +1 -0
- package/src/elements/feedback/toast/style.css +36 -0
- package/src/elements/forms/checkbox/index.html +7 -0
- package/src/elements/forms/checkbox/index.js +104 -0
- package/src/elements/forms/checkbox/index.tags.json +1 -0
- package/src/elements/forms/checkbox/style.css +86 -0
- package/src/elements/forms/field/index.html +13 -0
- package/src/elements/forms/field/index.js +42 -0
- package/src/elements/forms/field/index.tags.json +1 -0
- package/src/elements/forms/field/style.css +42 -0
- package/src/elements/forms/form/index.html +3 -0
- package/src/elements/forms/form/index.js +122 -0
- package/src/elements/forms/form/index.tags.json +1 -0
- package/src/elements/forms/form/style.css +11 -0
- package/src/elements/forms/input/index.html +4 -0
- package/src/elements/forms/input/index.js +103 -0
- package/src/elements/forms/input/index.tags.json +1 -0
- package/src/elements/forms/input/style.css +39 -0
- package/src/elements/forms/radio/index.html +4 -0
- package/src/elements/forms/radio/index.js +109 -0
- package/src/elements/forms/radio/index.tags.json +1 -0
- package/src/elements/forms/radio/style.css +65 -0
- package/src/elements/forms/select/index.html +9 -0
- package/src/elements/forms/select/index.js +114 -0
- package/src/elements/forms/select/index.tags.json +1 -0
- package/src/elements/forms/select/style.css +95 -0
- package/src/elements/forms/textarea/index.html +4 -0
- package/src/elements/forms/textarea/index.js +115 -0
- package/src/elements/forms/textarea/index.tags.json +1 -0
- package/src/elements/forms/textarea/style.css +46 -0
- package/src/elements/forms/toggle/index.html +4 -0
- package/src/elements/forms/toggle/index.js +89 -0
- package/src/elements/forms/toggle/index.tags.json +1 -0
- package/src/elements/forms/toggle/style.css +63 -0
- package/src/elements/forms/upload/index.html +13 -0
- package/src/elements/forms/upload/index.js +120 -0
- package/src/elements/forms/upload/index.tags.json +1 -0
- package/src/elements/forms/upload/style.css +61 -0
- package/src/elements/index.js +71 -0
- package/src/elements/layout/app/index.html +7 -0
- package/src/elements/layout/app/index.js +16 -0
- package/src/elements/layout/app/index.tags.json +1 -0
- package/src/elements/layout/app/style.css +41 -0
- package/src/elements/layout/grid/index.html +3 -0
- package/src/elements/layout/grid/index.js +41 -0
- package/src/elements/layout/grid/index.tags.json +1 -0
- package/src/elements/layout/grid/style.css +12 -0
- package/src/elements/layout/header/index.html +8 -0
- package/src/elements/layout/header/index.js +16 -0
- package/src/elements/layout/header/index.tags.json +1 -0
- package/src/elements/layout/header/style.css +28 -0
- package/src/elements/layout/scroll/index.html +3 -0
- package/src/elements/layout/scroll/index.js +19 -0
- package/src/elements/layout/scroll/index.tags.json +1 -0
- package/src/elements/layout/scroll/style.css +24 -0
- package/src/elements/layout/sidebar/index.html +3 -0
- package/src/elements/layout/sidebar/index.js +24 -0
- package/src/elements/layout/sidebar/index.tags.json +1 -0
- package/src/elements/layout/sidebar/style.css +30 -0
- package/src/elements/layout/split/index.html +3 -0
- package/src/elements/layout/split/index.js +18 -0
- package/src/elements/layout/split/index.tags.json +1 -0
- package/src/elements/layout/split/style.css +28 -0
- package/src/elements/layout/stack/index.html +3 -0
- package/src/elements/layout/stack/index.js +31 -0
- package/src/elements/layout/stack/index.tags.json +1 -0
- package/src/elements/layout/stack/style.css +15 -0
- package/src/elements/layout/surface/index.html +3 -0
- package/src/elements/layout/surface/index.js +19 -0
- package/src/elements/layout/surface/index.tags.json +1 -0
- package/src/elements/layout/surface/style.css +29 -0
- package/src/elements/navigation/breadcrumb/index.html +5 -0
- package/src/elements/navigation/breadcrumb/index.js +16 -0
- package/src/elements/navigation/breadcrumb/index.tags.json +1 -0
- package/src/elements/navigation/breadcrumb/style.css +36 -0
- package/src/elements/navigation/nav/index.html +3 -0
- package/src/elements/navigation/nav/index.js +24 -0
- package/src/elements/navigation/nav/index.tags.json +1 -0
- package/src/elements/navigation/nav/style.css +38 -0
- package/src/elements/navigation/pagination/index.html +3 -0
- package/src/elements/navigation/pagination/index.js +94 -0
- package/src/elements/navigation/pagination/index.tags.json +1 -0
- package/src/elements/navigation/pagination/style.css +39 -0
- package/src/elements/navigation/steps/index.html +6 -0
- package/src/elements/navigation/steps/index.js +64 -0
- package/src/elements/navigation/steps/index.tags.json +1 -0
- package/src/elements/navigation/steps/style.css +78 -0
- package/src/elements/navigation/tabs/index.html +6 -0
- package/src/elements/navigation/tabs/index.js +132 -0
- package/src/elements/navigation/tabs/index.tags.json +1 -0
- package/src/elements/navigation/tabs/style.css +52 -0
- package/src/elements/overlay/dialog/index.html +5 -0
- package/src/elements/overlay/dialog/index.js +57 -0
- package/src/elements/overlay/dialog/index.tags.json +1 -0
- package/src/elements/overlay/dialog/style.css +31 -0
- package/src/elements/overlay/drawer/index.html +3 -0
- package/src/elements/overlay/drawer/index.js +56 -0
- package/src/elements/overlay/drawer/index.tags.json +1 -0
- package/src/elements/overlay/drawer/style.css +48 -0
- package/src/elements/overlay/menu/index.html +3 -0
- package/src/elements/overlay/menu/index.js +107 -0
- package/src/elements/overlay/menu/index.tags.json +1 -0
- package/src/elements/overlay/menu/style.css +43 -0
- package/src/elements/overlay/popover/index.html +3 -0
- package/src/elements/overlay/popover/index.js +44 -0
- package/src/elements/overlay/popover/index.tags.json +1 -0
- package/src/elements/overlay/popover/style.css +21 -0
- package/src/elements/overlay/sheet/index.html +8 -0
- package/src/elements/overlay/sheet/index.js +105 -0
- package/src/elements/overlay/sheet/index.tags.json +1 -0
- package/src/elements/overlay/sheet/style.css +64 -0
- package/src/elements/overlay/tooltip/index.html +6 -0
- package/src/elements/overlay/tooltip/index.js +16 -0
- package/src/elements/overlay/tooltip/index.tags.json +1 -0
- package/src/elements/overlay/tooltip/style.css +41 -0
- package/src/elements/primitives/avatar/index.html +2 -0
- package/src/elements/primitives/avatar/index.js +79 -0
- package/src/elements/primitives/avatar/index.tags.json +1 -0
- package/src/elements/primitives/avatar/style.css +36 -0
- package/src/elements/primitives/badge/index.html +3 -0
- package/src/elements/primitives/badge/index.js +20 -0
- package/src/elements/primitives/badge/index.tags.json +1 -0
- package/src/elements/primitives/badge/style.css +67 -0
- package/src/elements/primitives/button/index.html +3 -0
- package/src/elements/primitives/button/index.js +61 -0
- package/src/elements/primitives/button/index.tags.json +1 -0
- package/src/elements/primitives/button/style.css +66 -0
- package/src/elements/primitives/divider/index.html +1 -0
- package/src/elements/primitives/divider/index.js +43 -0
- package/src/elements/primitives/divider/index.tags.json +1 -0
- package/src/elements/primitives/divider/style.css +39 -0
- package/src/elements/primitives/icon/index.html +3 -0
- package/src/elements/primitives/icon/index.js +66 -0
- package/src/elements/primitives/icon/index.tags.json +1 -0
- package/src/elements/primitives/icon/style.css +20 -0
- package/src/elements/primitives/link/index.html +3 -0
- package/src/elements/primitives/link/index.js +129 -0
- package/src/elements/primitives/link/index.tags.json +1 -0
- package/src/elements/primitives/link/style.css +40 -0
- package/src/elements/primitives/spinner/index.html +1 -0
- package/src/elements/primitives/spinner/index.js +62 -0
- package/src/elements/primitives/spinner/index.tags.json +1 -0
- package/src/elements/primitives/spinner/style.css +20 -0
- package/src/elements/primitives/text/index.html +1 -0
- package/src/elements/primitives/text/index.js +79 -0
- package/src/elements/primitives/text/index.tags.json +1 -0
- package/src/elements/primitives/text/style.css +25 -0
- package/src/index.js +23 -0
- package/src/styles/base.css +66 -0
- package/src/styles/index.css +10 -0
- package/src/styles/layers.css +9 -0
- package/src/styles/reset.css +66 -0
- package/src/sw/activate.js +51 -0
- package/src/sw/expire.js +47 -0
- package/src/sw/index.js +28 -0
- package/src/sw/install.js +35 -0
- package/src/sw/push.js +58 -0
- package/src/sw/queue.js +60 -0
- package/src/sw/routes.js +71 -0
- package/src/sw/strategies.js +247 -0
- package/src/sw/sync.js +80 -0
- package/src/tokens/index.css +26 -0
- package/src/tokens/primitives/colors.css +54 -0
- package/src/tokens/primitives/motion.css +34 -0
- package/src/tokens/primitives/radius.css +16 -0
- package/src/tokens/primitives/shadow.css +34 -0
- package/src/tokens/primitives/spacing.css +27 -0
- package/src/tokens/primitives/typography.css +46 -0
- package/src/tokens/primitives/zindex.css +18 -0
- package/src/tokens/registered/colors.css +133 -0
- package/src/tokens/registered/dimensions.css +31 -0
- package/src/tokens/semantic/components.css +125 -0
- package/src/tokens/semantic/contrast.css +33 -0
- package/src/tokens/semantic/dark.css +61 -0
- package/src/tokens/semantic/light.css +64 -0
- package/types/core/animations/index.d.ts +52 -0
- package/types/core/api/index.d.ts +68 -0
- package/types/core/events/index.d.ts +50 -0
- package/types/core/offline/index.d.ts +68 -0
- package/types/core/platform/index.d.ts +60 -0
- package/types/core/router/index.d.ts +203 -0
- package/types/core/security/index.d.ts +33 -0
- package/types/core/state/index.d.ts +68 -0
- package/types/core/storage/index.d.ts +40 -0
- package/types/core/ui/index.d.ts +446 -0
- package/types/core/workers/index.d.ts +221 -0
- package/types/elements/index.d.ts +150 -0
- package/types/index.d.ts +18 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/platform/platform.d.ts
|
|
3
|
+
*
|
|
4
|
+
* TypeScript definitions for the platform module.
|
|
5
|
+
* Types the supports detection registry, reset function, and guard loader.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface Supports {
|
|
9
|
+
// --- Routing ---
|
|
10
|
+
navigationAPI: boolean;
|
|
11
|
+
urlPattern: boolean;
|
|
12
|
+
|
|
13
|
+
// --- Component Model ---
|
|
14
|
+
declarativeShadowDOM: boolean;
|
|
15
|
+
customStatePseudo: boolean;
|
|
16
|
+
formAssociated: boolean;
|
|
17
|
+
|
|
18
|
+
// --- Overlay / Popover ---
|
|
19
|
+
popoverAPI: boolean;
|
|
20
|
+
anchorPositioning: boolean;
|
|
21
|
+
|
|
22
|
+
// --- Animation ---
|
|
23
|
+
viewTransitions: boolean;
|
|
24
|
+
scrollTimeline: boolean;
|
|
25
|
+
viewTimeline: boolean;
|
|
26
|
+
|
|
27
|
+
// --- Scheduling ---
|
|
28
|
+
schedulerPostTask: boolean;
|
|
29
|
+
schedulerYield: boolean;
|
|
30
|
+
|
|
31
|
+
// --- CSS ---
|
|
32
|
+
contentVisibility: boolean;
|
|
33
|
+
cssScope: boolean;
|
|
34
|
+
cssLayer: boolean;
|
|
35
|
+
cssModuleScripts: boolean;
|
|
36
|
+
|
|
37
|
+
// --- Module System ---
|
|
38
|
+
importMaps: boolean;
|
|
39
|
+
|
|
40
|
+
// --- Security ---
|
|
41
|
+
sanitizerAPI: boolean;
|
|
42
|
+
trustedTypes: boolean;
|
|
43
|
+
subtleCrypto: boolean;
|
|
44
|
+
|
|
45
|
+
// --- Storage ---
|
|
46
|
+
opfs: boolean;
|
|
47
|
+
storageManager: boolean;
|
|
48
|
+
fileSystemPickers: boolean;
|
|
49
|
+
compression: boolean;
|
|
50
|
+
storagePersistence: boolean;
|
|
51
|
+
|
|
52
|
+
// --- Networking / Workers ---
|
|
53
|
+
backgroundSync: boolean;
|
|
54
|
+
speculationRules: boolean;
|
|
55
|
+
sharedWorker: boolean;
|
|
56
|
+
webLocks: boolean;
|
|
57
|
+
offscreenCanvas: boolean;
|
|
58
|
+
|
|
59
|
+
// --- Notifications / Push ---
|
|
60
|
+
pushAPI: boolean;
|
|
61
|
+
notificationsAPI: boolean;
|
|
62
|
+
|
|
63
|
+
// --- Device ---
|
|
64
|
+
screenWakeLock: boolean;
|
|
65
|
+
idleDetection: boolean;
|
|
66
|
+
webAuthn: boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const supports: Supports;
|
|
70
|
+
|
|
71
|
+
export function reset(key: keyof Supports): void;
|
|
72
|
+
|
|
73
|
+
export function typeGuard(key: keyof Supports, message?: string): void;
|
|
74
|
+
|
|
75
|
+
export interface Guard {
|
|
76
|
+
urlPattern(): Promise<typeof URLPattern>;
|
|
77
|
+
navigation(): Promise<Navigation>;
|
|
78
|
+
popover(): Promise<void>;
|
|
79
|
+
shadow(root?: Document | ShadowRoot): Promise<void>;
|
|
80
|
+
anchor(floating: HTMLElement, anchorEl: HTMLElement, options?: object): Promise<void>;
|
|
81
|
+
sanitizer(): Promise<{ sanitizeToString(input: string): string }>;
|
|
82
|
+
scheduler(): Promise<Scheduler>;
|
|
83
|
+
yield(): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
declare const guard: Guard;
|
|
87
|
+
|
|
88
|
+
export default guard;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/platform/polyfills/anchor.js
|
|
3
|
+
*
|
|
4
|
+
* Lightweight CSS Anchor Positioning positional fallback.
|
|
5
|
+
* Computes optimal absolute top/left coordinates based on placement rules and viewport collisions.
|
|
6
|
+
* Source: doc 18 §12, library2.md §Phase 1-A
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export function position(floating, anchor, options = {}) {
|
|
10
|
+
if (!floating || !anchor) return;
|
|
11
|
+
|
|
12
|
+
const placement = options.placement || 'bottom-start';
|
|
13
|
+
const offset = options.offset || 8;
|
|
14
|
+
|
|
15
|
+
const anchorRect = anchor.getBoundingClientRect();
|
|
16
|
+
const floatRect = floating.getBoundingClientRect();
|
|
17
|
+
|
|
18
|
+
const scrollY = globalThis.scrollY || globalThis.pageYOffset || 0;
|
|
19
|
+
const scrollX = globalThis.scrollX || globalThis.pageXOffset || 0;
|
|
20
|
+
|
|
21
|
+
const anchorTop = anchorRect.top + scrollY;
|
|
22
|
+
const anchorLeft = anchorRect.left + scrollX;
|
|
23
|
+
|
|
24
|
+
let top = 0;
|
|
25
|
+
let left = 0;
|
|
26
|
+
|
|
27
|
+
switch (placement) {
|
|
28
|
+
case 'bottom-start':
|
|
29
|
+
top = anchorTop + anchorRect.height + offset;
|
|
30
|
+
left = anchorLeft;
|
|
31
|
+
break;
|
|
32
|
+
case 'bottom-end':
|
|
33
|
+
top = anchorTop + anchorRect.height + offset;
|
|
34
|
+
left = anchorLeft + anchorRect.width - floatRect.width;
|
|
35
|
+
break;
|
|
36
|
+
case 'top-start':
|
|
37
|
+
top = anchorTop - floatRect.height - offset;
|
|
38
|
+
left = anchorLeft;
|
|
39
|
+
break;
|
|
40
|
+
case 'top-end':
|
|
41
|
+
top = anchorTop - floatRect.height - offset;
|
|
42
|
+
left = anchorLeft + anchorRect.width - floatRect.width;
|
|
43
|
+
break;
|
|
44
|
+
case 'right-start':
|
|
45
|
+
top = anchorTop;
|
|
46
|
+
left = anchorLeft + anchorRect.width + offset;
|
|
47
|
+
break;
|
|
48
|
+
case 'left-start':
|
|
49
|
+
top = anchorTop;
|
|
50
|
+
left = anchorLeft - floatRect.width - offset;
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
top = anchorTop + anchorRect.height + offset;
|
|
54
|
+
left = anchorLeft;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Viewport containment checking
|
|
58
|
+
const viewportWidth = globalThis.innerWidth || 0;
|
|
59
|
+
const viewportHeight = globalThis.innerHeight || 0;
|
|
60
|
+
|
|
61
|
+
if (left < scrollX) {
|
|
62
|
+
left = scrollX;
|
|
63
|
+
}
|
|
64
|
+
if (left + floatRect.width > scrollX + viewportWidth) {
|
|
65
|
+
left = Math.max(scrollX, scrollX + viewportWidth - floatRect.width);
|
|
66
|
+
}
|
|
67
|
+
if (top < scrollY) {
|
|
68
|
+
top = scrollY;
|
|
69
|
+
}
|
|
70
|
+
if (top + floatRect.height > scrollY + viewportHeight) {
|
|
71
|
+
top = Math.max(scrollY, scrollY + viewportHeight - floatRect.height);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
floating.style.position = 'absolute';
|
|
75
|
+
floating.style.top = `${top}px`;
|
|
76
|
+
floating.style.left = `${left}px`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export default { position };
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/platform/polyfills/navigation.js
|
|
3
|
+
*
|
|
4
|
+
* A lightweight History-API based polyfill for the WICG Navigation API.
|
|
5
|
+
* Provides the event system, navigate interception, and click delegation.
|
|
6
|
+
* Source: doc 18 §3, library2.md §Phase 1-A
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
class NavigationEvent extends Event {
|
|
10
|
+
constructor(type, init) {
|
|
11
|
+
super(type, init);
|
|
12
|
+
this.destination = init.destination;
|
|
13
|
+
this.navigationType = init.navigationType || 'push';
|
|
14
|
+
this.signal = init.signal;
|
|
15
|
+
this.userInitiated = init.userInitiated !== false;
|
|
16
|
+
this.canIntercept = init.canIntercept !== false;
|
|
17
|
+
this.hashChange = init.hashChange || false;
|
|
18
|
+
this.downloadRequest = init.downloadRequest || false;
|
|
19
|
+
this._intercepted = false;
|
|
20
|
+
this._handlers = [];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
intercept(options) {
|
|
24
|
+
this._intercepted = true;
|
|
25
|
+
if (options && typeof options.handler === 'function') {
|
|
26
|
+
this._handlers.push(options.handler);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
class NavigationPolyfill extends EventTarget {
|
|
32
|
+
constructor() {
|
|
33
|
+
super();
|
|
34
|
+
if (typeof document !== 'undefined') {
|
|
35
|
+
// Global click delegation for same-origin anchor links
|
|
36
|
+
document.addEventListener('click', e => {
|
|
37
|
+
if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
|
|
38
|
+
const anchor = e.target.closest('a[href]');
|
|
39
|
+
if (!anchor) return;
|
|
40
|
+
|
|
41
|
+
// Skip non-HTTP links and external targets
|
|
42
|
+
if (anchor.target && anchor.target !== '_self') return;
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const url = new URL(anchor.href, globalThis.location.href);
|
|
46
|
+
if (url.origin !== globalThis.location.origin) return;
|
|
47
|
+
|
|
48
|
+
const event = this._fireNavigate(url.href, { navigationType: 'push' });
|
|
49
|
+
if (event._intercepted) {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
history.pushState(null, '', url.href);
|
|
52
|
+
this._runHandlers(event);
|
|
53
|
+
}
|
|
54
|
+
} catch {
|
|
55
|
+
// ignore parsing error, let native navigation handle it
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Browser forward/back traversal support
|
|
60
|
+
window.addEventListener('popstate', e => {
|
|
61
|
+
const event = this._fireNavigate(globalThis.location.href, {
|
|
62
|
+
navigationType: 'traverse',
|
|
63
|
+
state: e.state
|
|
64
|
+
});
|
|
65
|
+
if (event._intercepted) {
|
|
66
|
+
this._runHandlers(event);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
get canGoBack() {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
get canGoForward() {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
navigate(url, options = {}) {
|
|
81
|
+
try {
|
|
82
|
+
const targetUrl = new URL(url, globalThis.location.href).href;
|
|
83
|
+
const event = this._fireNavigate(targetUrl, {
|
|
84
|
+
navigationType: options.history === 'replace' ? 'replace' : 'push',
|
|
85
|
+
state: options.state
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
if (event._intercepted) {
|
|
89
|
+
if (options.history === 'replace') {
|
|
90
|
+
history.replaceState(options.state, '', targetUrl);
|
|
91
|
+
} else {
|
|
92
|
+
history.pushState(options.state, '', targetUrl);
|
|
93
|
+
}
|
|
94
|
+
this._runHandlers(event);
|
|
95
|
+
} else {
|
|
96
|
+
globalThis.location.href = targetUrl;
|
|
97
|
+
}
|
|
98
|
+
} catch (err) {
|
|
99
|
+
this.dispatchEvent(new ErrorEvent('navigateerror', { error: err }));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
back() {
|
|
104
|
+
history.back();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
forward() {
|
|
108
|
+
history.forward();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
go(delta) {
|
|
112
|
+
history.go(delta);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
_fireNavigate(url, { navigationType, state } = {}) {
|
|
116
|
+
const controller = new AbortController();
|
|
117
|
+
const event = new NavigationEvent('navigate', {
|
|
118
|
+
cancelable: true,
|
|
119
|
+
destination: { url, state },
|
|
120
|
+
navigationType,
|
|
121
|
+
signal: controller.signal
|
|
122
|
+
});
|
|
123
|
+
this.dispatchEvent(event);
|
|
124
|
+
return event;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async _runHandlers(event) {
|
|
128
|
+
try {
|
|
129
|
+
for (const handler of event._handlers) {
|
|
130
|
+
await handler();
|
|
131
|
+
}
|
|
132
|
+
this.dispatchEvent(new Event('navigatesuccess'));
|
|
133
|
+
} catch (err) {
|
|
134
|
+
this.dispatchEvent(new ErrorEvent('navigateerror', { error: err }));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (!globalThis.navigation) {
|
|
140
|
+
globalThis.navigation = new NavigationPolyfill();
|
|
141
|
+
}
|
|
142
|
+
export default NavigationPolyfill;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/platform/polyfills/popover.js
|
|
3
|
+
*
|
|
4
|
+
* Popover API polyfill offering showPopover, hidePopover, togglePopover,
|
|
5
|
+
* light dismiss, popovertarget click wiring, and simulated top-layer overlay.
|
|
6
|
+
* Source: doc 18 §12, library2.md §Phase 1-A
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
class ToggleEvent extends Event {
|
|
10
|
+
constructor(type, init = {}) {
|
|
11
|
+
super(type, init);
|
|
12
|
+
this.oldState = init.oldState || 'closed';
|
|
13
|
+
this.newState = init.newState || 'closed';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
class PopoverPolyfill {
|
|
18
|
+
static install() {
|
|
19
|
+
if ('popover' in HTMLElement.prototype) return;
|
|
20
|
+
|
|
21
|
+
Object.defineProperty(HTMLElement.prototype, 'popover', {
|
|
22
|
+
get() {
|
|
23
|
+
return this.getAttribute('popover');
|
|
24
|
+
},
|
|
25
|
+
set(val) {
|
|
26
|
+
if (val === null) this.removeAttribute('popover');
|
|
27
|
+
else this.setAttribute('popover', val);
|
|
28
|
+
},
|
|
29
|
+
configurable: true,
|
|
30
|
+
enumerable: true
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
HTMLElement.prototype.showPopover = function() {
|
|
34
|
+
if (this.getAttribute('popover') === null) {
|
|
35
|
+
throw new DOMException("Not a popover", "NotSupportedError");
|
|
36
|
+
}
|
|
37
|
+
if (this.hasAttribute('data-popover-open')) return;
|
|
38
|
+
|
|
39
|
+
// Clean up previous event listeners or observers if any existed
|
|
40
|
+
if (this._popoverDismiss) {
|
|
41
|
+
document.removeEventListener('pointerdown', this._popoverDismiss);
|
|
42
|
+
this._popoverDismiss = null;
|
|
43
|
+
}
|
|
44
|
+
if (this._popoverObserver) {
|
|
45
|
+
this._popoverObserver.disconnect();
|
|
46
|
+
this._popoverObserver = null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
this.setAttribute('data-popover-open', '');
|
|
50
|
+
|
|
51
|
+
// Simulating top-layer styling
|
|
52
|
+
this.style.position = 'fixed';
|
|
53
|
+
this.style.zIndex = '2147483647';
|
|
54
|
+
|
|
55
|
+
// Light-dismiss behavior for "auto" popovers
|
|
56
|
+
const type = this.getAttribute('popover');
|
|
57
|
+
if (type === 'auto' || type === '') {
|
|
58
|
+
const dismiss = (e) => {
|
|
59
|
+
if (!this.contains(e.target) && e.target !== this) {
|
|
60
|
+
this.hidePopover();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
this._popoverDismiss = dismiss;
|
|
64
|
+
// Defer attachment to prevent immediate closing during current click event
|
|
65
|
+
setTimeout(() => {
|
|
66
|
+
if (this.hasAttribute('data-popover-open')) {
|
|
67
|
+
document.addEventListener('pointerdown', dismiss);
|
|
68
|
+
}
|
|
69
|
+
}, 0);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// MutationObserver to automatically clean up when popover is unmounted from DOM while open
|
|
73
|
+
if (typeof MutationObserver !== 'undefined') {
|
|
74
|
+
const observer = new MutationObserver(() => {
|
|
75
|
+
if (!document.contains(this)) {
|
|
76
|
+
this.hidePopover();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
80
|
+
this._popoverObserver = observer;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
this.dispatchEvent(new ToggleEvent('toggle', {
|
|
84
|
+
oldState: 'closed',
|
|
85
|
+
newState: 'open'
|
|
86
|
+
}));
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
HTMLElement.prototype.hidePopover = function() {
|
|
90
|
+
if (!this.hasAttribute('data-popover-open')) return;
|
|
91
|
+
|
|
92
|
+
this.removeAttribute('data-popover-open');
|
|
93
|
+
this.style.position = '';
|
|
94
|
+
this.style.zIndex = '';
|
|
95
|
+
|
|
96
|
+
if (this._popoverDismiss) {
|
|
97
|
+
document.removeEventListener('pointerdown', this._popoverDismiss);
|
|
98
|
+
this._popoverDismiss = null;
|
|
99
|
+
}
|
|
100
|
+
if (this._popoverObserver) {
|
|
101
|
+
this._popoverObserver.disconnect();
|
|
102
|
+
this._popoverObserver = null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
this.dispatchEvent(new ToggleEvent('toggle', {
|
|
106
|
+
oldState: 'open',
|
|
107
|
+
newState: 'closed'
|
|
108
|
+
}));
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
HTMLElement.prototype.togglePopover = function() {
|
|
112
|
+
if (this.hasAttribute('data-popover-open')) {
|
|
113
|
+
this.hidePopover();
|
|
114
|
+
} else {
|
|
115
|
+
this.showPopover();
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// Auto-setup declarative triggers
|
|
120
|
+
if (typeof document !== 'undefined') {
|
|
121
|
+
document.addEventListener('click', e => {
|
|
122
|
+
const trigger = e.target.closest('[popovertarget]');
|
|
123
|
+
if (!trigger) return;
|
|
124
|
+
const targetId = trigger.getAttribute('popovertarget');
|
|
125
|
+
const target = document.getElementById(targetId);
|
|
126
|
+
if (!target) return;
|
|
127
|
+
|
|
128
|
+
const action = trigger.getAttribute('popovertargetaction') || 'toggle';
|
|
129
|
+
if (action === 'show') {
|
|
130
|
+
target.showPopover();
|
|
131
|
+
} else if (action === 'hide') {
|
|
132
|
+
target.hidePopover();
|
|
133
|
+
} else {
|
|
134
|
+
target.togglePopover();
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
PopoverPolyfill.install();
|
|
142
|
+
export default PopoverPolyfill;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/core/platform/polyfills/scheduler.js
|
|
3
|
+
*
|
|
4
|
+
* Priority-Aware Task Scheduling Polyfill.
|
|
5
|
+
* Implements WICG Prioritized Task Scheduling specification interfaces
|
|
6
|
+
* (scheduler.postTask and scheduler.yield) for browsers lacking native support.
|
|
7
|
+
*
|
|
8
|
+
* Source: doc 19 — Browser Runtime Model §16
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
let currentPriority = null;
|
|
12
|
+
|
|
13
|
+
// Standard Priority Hierarchy
|
|
14
|
+
const Priorities = {
|
|
15
|
+
'user-blocking': 3,
|
|
16
|
+
'user-visible': 2,
|
|
17
|
+
'background': 1
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Queue structures
|
|
21
|
+
const queues = {
|
|
22
|
+
'user-blocking': [],
|
|
23
|
+
'user-visible': [],
|
|
24
|
+
'background': []
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
let activeLoop = false;
|
|
28
|
+
|
|
29
|
+
// High-speed macrotask queue using MessageChannel (bypasses 4ms setTimeout limit)
|
|
30
|
+
const channel = typeof MessageChannel !== 'undefined' ? new MessageChannel() : null;
|
|
31
|
+
const macrotaskQueue = [];
|
|
32
|
+
|
|
33
|
+
if (channel) {
|
|
34
|
+
channel.port1.onmessage = () => {
|
|
35
|
+
const next = macrotaskQueue.shift();
|
|
36
|
+
if (next) next();
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function enqueueMacrotask(callback) {
|
|
41
|
+
if (channel) {
|
|
42
|
+
macrotaskQueue.push(callback);
|
|
43
|
+
channel.port2.postMessage('');
|
|
44
|
+
} else {
|
|
45
|
+
setTimeout(callback, 0);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Core loop that processes prioritized tasks.
|
|
51
|
+
*/
|
|
52
|
+
function processQueues() {
|
|
53
|
+
// Find highest priority non-empty queue
|
|
54
|
+
let selectedPriority = null;
|
|
55
|
+
if (queues['user-blocking'].length > 0) {
|
|
56
|
+
selectedPriority = 'user-blocking';
|
|
57
|
+
} else if (queues['user-visible'].length > 0) {
|
|
58
|
+
selectedPriority = 'user-visible';
|
|
59
|
+
} else if (queues['background'].length > 0) {
|
|
60
|
+
selectedPriority = 'background';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!selectedPriority) {
|
|
64
|
+
activeLoop = false;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
activeLoop = true;
|
|
69
|
+
const task = queues[selectedPriority].shift();
|
|
70
|
+
|
|
71
|
+
const runTask = () => {
|
|
72
|
+
if (task.signal?.aborted) {
|
|
73
|
+
task.reject(new DOMException('The user aborted a request.', 'AbortError'));
|
|
74
|
+
processQueues();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const previousPriority = currentPriority;
|
|
79
|
+
currentPriority = selectedPriority;
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
const result = task.callback();
|
|
83
|
+
if (result instanceof Promise) {
|
|
84
|
+
result.then(
|
|
85
|
+
(val) => {
|
|
86
|
+
currentPriority = previousPriority;
|
|
87
|
+
task.resolve(val);
|
|
88
|
+
processQueues();
|
|
89
|
+
},
|
|
90
|
+
(err) => {
|
|
91
|
+
currentPriority = previousPriority;
|
|
92
|
+
task.reject(err);
|
|
93
|
+
processQueues();
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
} else {
|
|
97
|
+
currentPriority = previousPriority;
|
|
98
|
+
task.resolve(result);
|
|
99
|
+
processQueues();
|
|
100
|
+
}
|
|
101
|
+
} catch (err) {
|
|
102
|
+
currentPriority = previousPriority;
|
|
103
|
+
task.reject(err);
|
|
104
|
+
processQueues();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Schedule task execution based on its priority
|
|
109
|
+
if (selectedPriority === 'user-blocking') {
|
|
110
|
+
queueMicrotask(runTask);
|
|
111
|
+
} else if (selectedPriority === 'user-visible') {
|
|
112
|
+
enqueueMacrotask(runTask);
|
|
113
|
+
} else {
|
|
114
|
+
// background priority: prefer requestIdleCallback if available
|
|
115
|
+
if (typeof requestIdleCallback === 'function') {
|
|
116
|
+
requestIdleCallback(runTask, { timeout: 2000 });
|
|
117
|
+
} else {
|
|
118
|
+
setTimeout(runTask, 0);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Enqueues a callback at a prioritized task level.
|
|
125
|
+
*/
|
|
126
|
+
export function postTask(callback, options = {}) {
|
|
127
|
+
const priority = options.priority || 'user-visible';
|
|
128
|
+
if (!(priority in queues)) {
|
|
129
|
+
throw new TypeError(`Invalid priority: ${priority}`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const signal = options.signal;
|
|
133
|
+
if (signal?.aborted) {
|
|
134
|
+
return Promise.reject(new DOMException('The user aborted a request.', 'AbortError'));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
const taskDescriptor = {
|
|
139
|
+
callback,
|
|
140
|
+
resolve,
|
|
141
|
+
reject,
|
|
142
|
+
signal
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const enqueue = () => {
|
|
146
|
+
queues[priority].push(taskDescriptor);
|
|
147
|
+
if (signal) {
|
|
148
|
+
signal.addEventListener('abort', () => {
|
|
149
|
+
const idx = queues[priority].indexOf(taskDescriptor);
|
|
150
|
+
if (idx !== -1) {
|
|
151
|
+
queues[priority].splice(idx, 1);
|
|
152
|
+
reject(new DOMException('The user aborted a request.', 'AbortError'));
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (!activeLoop) {
|
|
157
|
+
processQueues();
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
if (typeof options.delay === 'number' && options.delay > 0) {
|
|
162
|
+
setTimeout(enqueue, options.delay);
|
|
163
|
+
} else {
|
|
164
|
+
enqueue();
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Yields control back to the browser, returning a promise that resolves
|
|
171
|
+
* inside a rescheduled task at the current priority context level.
|
|
172
|
+
*/
|
|
173
|
+
export function yieldTask() {
|
|
174
|
+
const priority = currentPriority || 'user-visible';
|
|
175
|
+
return new Promise((resolve, reject) => {
|
|
176
|
+
postTask(resolve, { priority }).then(resolve, reject);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
class SchedulerPolyfill {
|
|
181
|
+
postTask(callback, options) {
|
|
182
|
+
return postTask(callback, options);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
yield() {
|
|
186
|
+
return yieldTask();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (typeof globalThis.scheduler === 'undefined') {
|
|
191
|
+
globalThis.scheduler = new SchedulerPolyfill();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export default globalThis.scheduler;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/platform/polyfills/shadow.js
|
|
3
|
+
*
|
|
4
|
+
* Declarative Shadow DOM polyfill converting template[shadowrootmode] elements
|
|
5
|
+
* into native shadow roots. Runs automatically on DOM ready and supports manual invocation.
|
|
6
|
+
* Source: doc 18 §4, library2.md §Phase 1-A
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export function apply(root = document) {
|
|
10
|
+
const templates = root.querySelectorAll('template[shadowrootmode]');
|
|
11
|
+
for (const tpl of templates) {
|
|
12
|
+
const mode = tpl.getAttribute('shadowrootmode');
|
|
13
|
+
const host = tpl.parentNode;
|
|
14
|
+
if (host && typeof host.attachShadow === 'function') {
|
|
15
|
+
try {
|
|
16
|
+
const shadow = host.attachShadow({ mode });
|
|
17
|
+
shadow.appendChild(tpl.content);
|
|
18
|
+
tpl.remove();
|
|
19
|
+
} catch (err) {
|
|
20
|
+
console.warn('Declarative Shadow DOM polyfill failed for host:', host, err);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Auto-apply on DOM load completion
|
|
27
|
+
if (typeof document !== 'undefined') {
|
|
28
|
+
if (document.readyState === 'loading') {
|
|
29
|
+
document.addEventListener('DOMContentLoaded', () => apply());
|
|
30
|
+
} else {
|
|
31
|
+
apply();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default apply;
|