@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
package/package.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@adukiorg/anza",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Anza web platform library — reactive state, networking, offline, animations, custom elements. Zero build step. Pure browser ESM.",
|
|
5
|
+
"author": "fescii",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"types": "./types/index.d.ts",
|
|
9
|
+
"homepage": "https://github.com/aduki-org/anza#readme",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/aduki-org/anza.git"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"anza",
|
|
16
|
+
"esm",
|
|
17
|
+
"web-components",
|
|
18
|
+
"reactive",
|
|
19
|
+
"offline",
|
|
20
|
+
"animations",
|
|
21
|
+
"no-build",
|
|
22
|
+
"shadow-dom"
|
|
23
|
+
],
|
|
24
|
+
"bin": {
|
|
25
|
+
"anza": "./bin/anza.js",
|
|
26
|
+
"anza-create": "./bin/create.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"src/",
|
|
30
|
+
"types/",
|
|
31
|
+
"importmap.json",
|
|
32
|
+
"README.md",
|
|
33
|
+
"CHANGELOG.md",
|
|
34
|
+
"LICENSE",
|
|
35
|
+
"bin/"
|
|
36
|
+
],
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./types/index.d.ts",
|
|
40
|
+
"default": "./src/index.js"
|
|
41
|
+
},
|
|
42
|
+
"./api": {
|
|
43
|
+
"types": "./types/core/api/index.d.ts",
|
|
44
|
+
"default": "./src/core/api/index.js"
|
|
45
|
+
},
|
|
46
|
+
"./state": {
|
|
47
|
+
"types": "./types/core/state/index.d.ts",
|
|
48
|
+
"default": "./src/core/state/index.js"
|
|
49
|
+
},
|
|
50
|
+
"./events": {
|
|
51
|
+
"types": "./types/core/events/index.d.ts",
|
|
52
|
+
"default": "./src/core/events/index.js"
|
|
53
|
+
},
|
|
54
|
+
"./router": {
|
|
55
|
+
"types": "./types/core/router/index.d.ts",
|
|
56
|
+
"default": "./src/core/router/index.js"
|
|
57
|
+
},
|
|
58
|
+
"./storage": {
|
|
59
|
+
"types": "./types/core/storage/index.d.ts",
|
|
60
|
+
"default": "./src/core/storage/index.js"
|
|
61
|
+
},
|
|
62
|
+
"./offline": {
|
|
63
|
+
"types": "./types/core/offline/index.d.ts",
|
|
64
|
+
"default": "./src/core/offline/index.js"
|
|
65
|
+
},
|
|
66
|
+
"./animations": {
|
|
67
|
+
"types": "./types/core/animations/index.d.ts",
|
|
68
|
+
"default": "./src/core/animations/index.js"
|
|
69
|
+
},
|
|
70
|
+
"./workers": {
|
|
71
|
+
"types": "./types/core/workers/index.d.ts",
|
|
72
|
+
"default": "./src/core/workers/index.js"
|
|
73
|
+
},
|
|
74
|
+
"./security": {
|
|
75
|
+
"types": "./types/core/security/index.d.ts",
|
|
76
|
+
"default": "./src/core/security/index.js"
|
|
77
|
+
},
|
|
78
|
+
"./platform": {
|
|
79
|
+
"types": "./types/core/platform/index.d.ts",
|
|
80
|
+
"default": "./src/core/platform/index.js"
|
|
81
|
+
},
|
|
82
|
+
"./ui": {
|
|
83
|
+
"types": "./types/core/ui/index.d.ts",
|
|
84
|
+
"default": "./src/core/ui/index.js"
|
|
85
|
+
},
|
|
86
|
+
"./elements": {
|
|
87
|
+
"types": "./types/elements/index.d.ts",
|
|
88
|
+
"default": "./src/elements/index.js"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"scripts": {
|
|
92
|
+
"build:tools": "node ../../scripts/build.js",
|
|
93
|
+
"test": "npx @web/test-runner",
|
|
94
|
+
"serve": "npx @web/dev-server --port 8080 --node-resolve false",
|
|
95
|
+
"check": "tsc --noEmit -p tsconfig.json"
|
|
96
|
+
},
|
|
97
|
+
"devDependencies": {
|
|
98
|
+
"esbuild": "^0.25.0"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/core/animations/index.js
|
|
3
|
+
*
|
|
4
|
+
* Public animations base entry point.
|
|
5
|
+
* Combines animation template registries, standard WAAPI triggers, stagger orchestrators,
|
|
6
|
+
* scroll/view-linked timelines, and standard easing curves.
|
|
7
|
+
*
|
|
8
|
+
* Source: doc 03 — Native CSS Architecture §6, doc 12 — Performance §4
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { registry } from './registry.js';
|
|
12
|
+
import { animate, stagger, sequence } from './play.js';
|
|
13
|
+
import { scroll, view } from './scroll.js';
|
|
14
|
+
import { Timing, timing, keyframes } from './waapi.js';
|
|
15
|
+
import { duration, ease, reduced } from './tokens.js';
|
|
16
|
+
|
|
17
|
+
export const animations = {
|
|
18
|
+
/**
|
|
19
|
+
* Registers a named animation template with keyframes and defaults.
|
|
20
|
+
*/
|
|
21
|
+
register(name, frames, defaultOpts = {}) {
|
|
22
|
+
registry.register(name, frames, defaultOpts);
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
animate,
|
|
26
|
+
stagger,
|
|
27
|
+
sequence,
|
|
28
|
+
scroll,
|
|
29
|
+
view,
|
|
30
|
+
|
|
31
|
+
// Exposed easing curves and timing utilities
|
|
32
|
+
Timing,
|
|
33
|
+
timing,
|
|
34
|
+
keyframes,
|
|
35
|
+
|
|
36
|
+
// Motion-token accessors (single source of truth with CSS)
|
|
37
|
+
duration,
|
|
38
|
+
ease,
|
|
39
|
+
reduced
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
registry,
|
|
44
|
+
animate,
|
|
45
|
+
stagger,
|
|
46
|
+
sequence,
|
|
47
|
+
scroll,
|
|
48
|
+
view,
|
|
49
|
+
Timing,
|
|
50
|
+
timing,
|
|
51
|
+
keyframes,
|
|
52
|
+
duration,
|
|
53
|
+
ease,
|
|
54
|
+
reduced
|
|
55
|
+
};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/core/animations/play.js
|
|
3
|
+
*
|
|
4
|
+
* WAAPI Execution Engine.
|
|
5
|
+
* Wraps browser element.animate(), providing automatic AbortSignal-gated memory-safe
|
|
6
|
+
* cancel cleanups, template resolution, and multi-element stagger calculations.
|
|
7
|
+
*
|
|
8
|
+
* Source: doc 12 — Performance §4, doc 14 — Memory Management §5
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { registry } from './registry.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Animates a single element, resolving templates and binding AbortSignal cleanups.
|
|
15
|
+
*/
|
|
16
|
+
export function animate(el, animationInput, options = {}) {
|
|
17
|
+
let keyframes;
|
|
18
|
+
let defaultOpts = {};
|
|
19
|
+
|
|
20
|
+
// Resolve template from the registry if name string is provided
|
|
21
|
+
if (typeof animationInput === 'string') {
|
|
22
|
+
const config = registry.get(animationInput);
|
|
23
|
+
if (!config) {
|
|
24
|
+
throw new Error(`Animation template "${animationInput}" not found in registry`);
|
|
25
|
+
}
|
|
26
|
+
keyframes = config.keyframes;
|
|
27
|
+
defaultOpts = config.options;
|
|
28
|
+
} else {
|
|
29
|
+
keyframes = animationInput;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const finalOpts = { ...defaultOpts, ...options };
|
|
33
|
+
const anim = el.animate(keyframes, finalOpts);
|
|
34
|
+
|
|
35
|
+
// Secure against memory leaks: cancel active animation when AbortSignal fires
|
|
36
|
+
if (options.signal) {
|
|
37
|
+
const handleAbort = () => {
|
|
38
|
+
try {
|
|
39
|
+
anim.cancel();
|
|
40
|
+
} catch {}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
options.signal.addEventListener('abort', handleAbort);
|
|
44
|
+
anim.addEventListener('finish', () => {
|
|
45
|
+
options.signal.removeEventListener('abort', handleAbort);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return anim;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Animates a sequence of elements with staggered delays.
|
|
54
|
+
*/
|
|
55
|
+
export function stagger(elements, animationInput, options = {}) {
|
|
56
|
+
const step = options.staggerDelay ?? 60; // default 60ms stagger steps
|
|
57
|
+
const list = Array.from(elements);
|
|
58
|
+
|
|
59
|
+
const animations = list.map((el, i) => {
|
|
60
|
+
const itemOpts = {
|
|
61
|
+
...options,
|
|
62
|
+
delay: (options.delay ?? 0) + i * step
|
|
63
|
+
};
|
|
64
|
+
return animate(el, animationInput, itemOpts);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
animations,
|
|
69
|
+
/**
|
|
70
|
+
* Instantly aborts all active staggered animations in this group.
|
|
71
|
+
*/
|
|
72
|
+
cancel() {
|
|
73
|
+
for (const anim of animations) {
|
|
74
|
+
try {
|
|
75
|
+
anim.cancel();
|
|
76
|
+
} catch {}
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
/**
|
|
80
|
+
* Instantly skips all animations to their end state.
|
|
81
|
+
*/
|
|
82
|
+
finish() {
|
|
83
|
+
for (const anim of animations) {
|
|
84
|
+
try {
|
|
85
|
+
anim.finish();
|
|
86
|
+
} catch {}
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
/**
|
|
90
|
+
* Aggregate promise resolving when all staggered animations settle.
|
|
91
|
+
*/
|
|
92
|
+
finished: Promise.all(animations.map((anim) => anim.finished))
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Runs animation steps one after another, each starting when the previous one
|
|
98
|
+
* finishes. Each step is `[el, animationInput, options?]`.
|
|
99
|
+
*
|
|
100
|
+
* Returns `{ finished }` resolving when the whole sequence completes.
|
|
101
|
+
*/
|
|
102
|
+
export function sequence(steps) {
|
|
103
|
+
const finished = (async () => {
|
|
104
|
+
for (const [el, input, options] of steps) {
|
|
105
|
+
const anim = animate(el, input, options ?? {});
|
|
106
|
+
await anim.finished;
|
|
107
|
+
}
|
|
108
|
+
})();
|
|
109
|
+
|
|
110
|
+
return { finished };
|
|
111
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/core/animations/registry.js
|
|
3
|
+
*
|
|
4
|
+
* Animation Registry.
|
|
5
|
+
* A centralized store to register, lookup, and manage reusable WAAPI keyframe
|
|
6
|
+
* configurations and timing options.
|
|
7
|
+
*
|
|
8
|
+
* Source: doc 03 — Native CSS Architecture §6, doc 12 — Performance §4
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { keyframes, timing } from './waapi.js';
|
|
12
|
+
|
|
13
|
+
export class AnimationRegistry {
|
|
14
|
+
#store = new Map();
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Registers a named animation template with keyframes and default timing options.
|
|
18
|
+
*/
|
|
19
|
+
register(name, keyframes, defaultOptions = {}) {
|
|
20
|
+
this.#store.set(name, { keyframes, options: defaultOptions });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Retrieves a registered animation configuration.
|
|
25
|
+
*/
|
|
26
|
+
get(name) {
|
|
27
|
+
return this.#store.get(name) || null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Evicts an animation template from the registry.
|
|
32
|
+
*/
|
|
33
|
+
delete(name) {
|
|
34
|
+
return this.#store.delete(name);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Flushes all stored animation templates.
|
|
39
|
+
*/
|
|
40
|
+
clear() {
|
|
41
|
+
this.#store.clear();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const registry = new AnimationRegistry();
|
|
46
|
+
|
|
47
|
+
// Register common presets
|
|
48
|
+
registry.register('fade', keyframes('fade'), timing());
|
|
49
|
+
registry.register('slide', keyframes('slide'), timing());
|
|
50
|
+
registry.register('slide-x', keyframes('slide', { axis: 'x' }), timing());
|
|
51
|
+
registry.register('slide-y', keyframes('slide', { axis: 'y' }), timing());
|
|
52
|
+
registry.register('scale', keyframes('scale'), timing());
|
|
53
|
+
registry.register('zoom', keyframes('zoom'), timing());
|
|
54
|
+
registry.register('blur', keyframes('blur'), timing());
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/core/animations/scroll.js
|
|
3
|
+
*
|
|
4
|
+
* Scroll-Driven Animations Wrapper.
|
|
5
|
+
* Exposes native browser ScrollTimeline and ViewTimeline constructors for scroll-linked animations,
|
|
6
|
+
* with standard static fallback descriptors for unsupported engines.
|
|
7
|
+
*
|
|
8
|
+
* Source: doc 03 — Native CSS Architecture §6, doc 12 — Performance §4
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates a ScrollTimeline instance or returns a fallback descriptor.
|
|
13
|
+
*/
|
|
14
|
+
export function scroll(options = {}) {
|
|
15
|
+
if (typeof ScrollTimeline !== 'undefined') {
|
|
16
|
+
try {
|
|
17
|
+
return new ScrollTimeline(options);
|
|
18
|
+
} catch (err) {
|
|
19
|
+
console.warn('ScrollTimeline constructor failed:', err);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Resilient descriptor fallback for older browser runtimes
|
|
24
|
+
return {
|
|
25
|
+
source: options.source ?? (typeof document !== 'undefined' ? document.documentElement : null),
|
|
26
|
+
axis: options.axis ?? 'block',
|
|
27
|
+
unsupported: true
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Creates a ViewTimeline instance or returns a fallback descriptor.
|
|
33
|
+
*/
|
|
34
|
+
export function view(options = {}) {
|
|
35
|
+
if (typeof ViewTimeline !== 'undefined') {
|
|
36
|
+
try {
|
|
37
|
+
return new ViewTimeline(options);
|
|
38
|
+
} catch (err) {
|
|
39
|
+
console.warn('ViewTimeline constructor failed:', err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Resilient descriptor fallback for older browser runtimes
|
|
44
|
+
return {
|
|
45
|
+
subject: options.subject ?? null,
|
|
46
|
+
axis: options.axis ?? 'block',
|
|
47
|
+
inset: options.inset ?? '0px',
|
|
48
|
+
unsupported: true
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/core/animations/tokens.js
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth bridge: reads the CSS motion tokens
|
|
5
|
+
* (`--duration-*`, `--ease-*` from src/tokens/primitives/motion.css) at runtime
|
|
6
|
+
* so the WAAPI engine and the stylesheet share the same values. Falls back to
|
|
7
|
+
* the token defaults when the document or a token is unavailable (e.g. SSR).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const FALLBACK = {
|
|
11
|
+
duration: { instant: 50, fast: 100, normal: 200, slow: 300, slower: 500 },
|
|
12
|
+
ease: {
|
|
13
|
+
default: 'cubic-bezier(0.4, 0, 0.2, 1)',
|
|
14
|
+
in: 'cubic-bezier(0.4, 0, 1, 1)',
|
|
15
|
+
out: 'cubic-bezier(0, 0, 0.2, 1)',
|
|
16
|
+
'in-out': 'cubic-bezier(0.4, 0, 0.6, 1)',
|
|
17
|
+
spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)',
|
|
18
|
+
linear: 'linear'
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
function root() {
|
|
23
|
+
if (typeof document === 'undefined' || !document.documentElement) return null;
|
|
24
|
+
return getComputedStyle(document.documentElement);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function parseMs(value) {
|
|
28
|
+
if (!value) return null;
|
|
29
|
+
const v = value.trim();
|
|
30
|
+
if (v.endsWith('ms')) return parseFloat(v);
|
|
31
|
+
if (v.endsWith('s')) return parseFloat(v) * 1000;
|
|
32
|
+
const n = parseFloat(v);
|
|
33
|
+
return Number.isNaN(n) ? null : n;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Resolve a duration token (ms). `name` is one of the --duration-* suffixes. */
|
|
37
|
+
export function duration(name = 'normal') {
|
|
38
|
+
const fallback = FALLBACK.duration[name] ?? FALLBACK.duration.normal;
|
|
39
|
+
const styles = root();
|
|
40
|
+
if (!styles) return fallback;
|
|
41
|
+
return parseMs(styles.getPropertyValue(`--duration-${name}`)) ?? fallback;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Resolve an easing token. `name` is one of the --ease-* suffixes. */
|
|
45
|
+
export function ease(name = 'default') {
|
|
46
|
+
const fallback = FALLBACK.ease[name] ?? FALLBACK.ease.default;
|
|
47
|
+
const styles = root();
|
|
48
|
+
if (!styles) return fallback;
|
|
49
|
+
const value = styles.getPropertyValue(`--ease-${name}`).trim();
|
|
50
|
+
return value || fallback;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** True when the user prefers reduced motion. */
|
|
54
|
+
export function reduced() {
|
|
55
|
+
return typeof window !== 'undefined'
|
|
56
|
+
&& typeof window.matchMedia === 'function'
|
|
57
|
+
&& window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
58
|
+
}
|