@mappoh/nova 0.1.16
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/dist/animation/parallax.d.ts +23 -0
- package/dist/animation/parallax.d.ts.map +1 -0
- package/dist/animation/parallax.js +96 -0
- package/dist/animation/parallax.js.map +1 -0
- package/dist/animation/scroll-animate.d.ts +30 -0
- package/dist/animation/scroll-animate.d.ts.map +1 -0
- package/dist/animation/scroll-animate.js +65 -0
- package/dist/animation/scroll-animate.js.map +1 -0
- package/dist/animation/scroll-observer.d.ts +32 -0
- package/dist/animation/scroll-observer.d.ts.map +1 -0
- package/dist/animation/scroll-observer.js +63 -0
- package/dist/animation/scroll-observer.js.map +1 -0
- package/dist/animation/smooth-scroll.d.ts +47 -0
- package/dist/animation/smooth-scroll.d.ts.map +1 -0
- package/dist/animation/smooth-scroll.js +169 -0
- package/dist/animation/smooth-scroll.js.map +1 -0
- package/dist/animation/text-reveal.d.ts +30 -0
- package/dist/animation/text-reveal.d.ts.map +1 -0
- package/dist/animation/text-reveal.js +164 -0
- package/dist/animation/text-reveal.js.map +1 -0
- package/dist/animation/ticker.d.ts +32 -0
- package/dist/animation/ticker.d.ts.map +1 -0
- package/dist/animation/ticker.js +62 -0
- package/dist/animation/ticker.js.map +1 -0
- package/dist/canvas/dot-grid.d.ts +50 -0
- package/dist/canvas/dot-grid.d.ts.map +1 -0
- package/dist/canvas/dot-grid.js +123 -0
- package/dist/canvas/dot-grid.js.map +1 -0
- package/dist/canvas/noise.d.ts +33 -0
- package/dist/canvas/noise.d.ts.map +1 -0
- package/dist/canvas/noise.js +241 -0
- package/dist/canvas/noise.js.map +1 -0
- package/dist/canvas/particles.d.ts +44 -0
- package/dist/canvas/particles.d.ts.map +1 -0
- package/dist/canvas/particles.js +138 -0
- package/dist/canvas/particles.js.map +1 -0
- package/dist/canvas/sequence.d.ts +43 -0
- package/dist/canvas/sequence.d.ts.map +1 -0
- package/dist/canvas/sequence.js +162 -0
- package/dist/canvas/sequence.js.map +1 -0
- package/dist/component/bind.d.ts +25 -0
- package/dist/component/bind.d.ts.map +1 -0
- package/dist/component/bind.js +28 -0
- package/dist/component/bind.js.map +1 -0
- package/dist/component/component.d.ts +76 -0
- package/dist/component/component.d.ts.map +1 -0
- package/dist/component/component.js +219 -0
- package/dist/component/component.js.map +1 -0
- package/dist/component/connect.d.ts +60 -0
- package/dist/component/connect.d.ts.map +1 -0
- package/dist/component/connect.js +115 -0
- package/dist/component/connect.js.map +1 -0
- package/dist/component/html.d.ts +35 -0
- package/dist/component/html.d.ts.map +1 -0
- package/dist/component/html.js +51 -0
- package/dist/component/html.js.map +1 -0
- package/dist/component/hydrate.d.ts +37 -0
- package/dist/component/hydrate.d.ts.map +1 -0
- package/dist/component/hydrate.js +242 -0
- package/dist/component/hydrate.js.map +1 -0
- package/dist/component/index.d.ts +9 -0
- package/dist/component/index.d.ts.map +1 -0
- package/dist/component/index.js +6 -0
- package/dist/component/index.js.map +1 -0
- package/dist/component/template.d.ts +30 -0
- package/dist/component/template.d.ts.map +1 -0
- package/dist/component/template.js +469 -0
- package/dist/component/template.js.map +1 -0
- package/dist/css/gradient-text.d.ts +40 -0
- package/dist/css/gradient-text.d.ts.map +1 -0
- package/dist/css/gradient-text.js +90 -0
- package/dist/css/gradient-text.js.map +1 -0
- package/dist/css/index.d.ts +3 -0
- package/dist/css/index.d.ts.map +1 -0
- package/dist/css/index.js +2 -0
- package/dist/css/index.js.map +1 -0
- package/dist/devtools/devtools.d.ts +27 -0
- package/dist/devtools/devtools.d.ts.map +1 -0
- package/dist/devtools/devtools.js +237 -0
- package/dist/devtools/devtools.js.map +1 -0
- package/dist/devtools/index.d.ts +3 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/index.js +2 -0
- package/dist/devtools/index.js.map +1 -0
- package/dist/drag/drag.d.ts +38 -0
- package/dist/drag/drag.d.ts.map +1 -0
- package/dist/drag/drag.js +181 -0
- package/dist/drag/drag.js.map +1 -0
- package/dist/drag/index.d.ts +3 -0
- package/dist/drag/index.d.ts.map +1 -0
- package/dist/drag/index.js +2 -0
- package/dist/drag/index.js.map +1 -0
- package/dist/dropdown/dropdown.d.ts +55 -0
- package/dist/dropdown/dropdown.d.ts.map +1 -0
- package/dist/dropdown/dropdown.js +314 -0
- package/dist/dropdown/dropdown.js.map +1 -0
- package/dist/dropdown/group.d.ts +18 -0
- package/dist/dropdown/group.d.ts.map +1 -0
- package/dist/dropdown/group.js +119 -0
- package/dist/dropdown/group.js.map +1 -0
- package/dist/dropdown/index.d.ts +5 -0
- package/dist/dropdown/index.d.ts.map +1 -0
- package/dist/dropdown/index.js +3 -0
- package/dist/dropdown/index.js.map +1 -0
- package/dist/forms/form-engine.d.ts +91 -0
- package/dist/forms/form-engine.d.ts.map +1 -0
- package/dist/forms/form-engine.js +228 -0
- package/dist/forms/form-engine.js.map +1 -0
- package/dist/forms/index.d.ts +3 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +2 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/validators.d.ts +20 -0
- package/dist/forms/validators.d.ts.map +1 -0
- package/dist/forms/validators.js +82 -0
- package/dist/forms/validators.js.map +1 -0
- package/dist/gallery/gallery.d.ts +66 -0
- package/dist/gallery/gallery.d.ts.map +1 -0
- package/dist/gallery/gallery.js +347 -0
- package/dist/gallery/gallery.js.map +1 -0
- package/dist/gallery/index.d.ts +3 -0
- package/dist/gallery/index.d.ts.map +1 -0
- package/dist/gallery/index.js +2 -0
- package/dist/gallery/index.js.map +1 -0
- package/dist/gesture/gesture.d.ts +44 -0
- package/dist/gesture/gesture.d.ts.map +1 -0
- package/dist/gesture/gesture.js +152 -0
- package/dist/gesture/gesture.js.map +1 -0
- package/dist/gesture/index.d.ts +3 -0
- package/dist/gesture/index.d.ts.map +1 -0
- package/dist/gesture/index.js +2 -0
- package/dist/gesture/index.js.map +1 -0
- package/dist/http/http.d.ts +44 -0
- package/dist/http/http.d.ts.map +1 -0
- package/dist/http/http.js +135 -0
- package/dist/http/http.js.map +1 -0
- package/dist/http/index.d.ts +3 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +2 -0
- package/dist/http/index.js.map +1 -0
- package/dist/i18n/i18n.d.ts +28 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/i18n/i18n.js +84 -0
- package/dist/i18n/i18n.js.map +1 -0
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +2 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/image/effects.d.ts +33 -0
- package/dist/image/effects.d.ts.map +1 -0
- package/dist/image/effects.js +236 -0
- package/dist/image/effects.js.map +1 -0
- package/dist/image/image.d.ts +83 -0
- package/dist/image/image.d.ts.map +1 -0
- package/dist/image/image.js +236 -0
- package/dist/image/image.js.map +1 -0
- package/dist/image/index.d.ts +5 -0
- package/dist/image/index.d.ts.map +1 -0
- package/dist/image/index.js +3 -0
- package/dist/image/index.js.map +1 -0
- package/dist/interaction/index.d.ts +3 -0
- package/dist/interaction/index.d.ts.map +1 -0
- package/dist/interaction/index.js +2 -0
- package/dist/interaction/index.js.map +1 -0
- package/dist/interaction/tilt.d.ts +30 -0
- package/dist/interaction/tilt.d.ts.map +1 -0
- package/dist/interaction/tilt.js +131 -0
- package/dist/interaction/tilt.js.map +1 -0
- package/dist/lazy/index.d.ts +3 -0
- package/dist/lazy/index.d.ts.map +1 -0
- package/dist/lazy/index.js +2 -0
- package/dist/lazy/index.js.map +1 -0
- package/dist/lazy/lazy.d.ts +42 -0
- package/dist/lazy/lazy.d.ts.map +1 -0
- package/dist/lazy/lazy.js +80 -0
- package/dist/lazy/lazy.js.map +1 -0
- package/dist/modal/index.d.ts +3 -0
- package/dist/modal/index.d.ts.map +1 -0
- package/dist/modal/index.js +2 -0
- package/dist/modal/index.js.map +1 -0
- package/dist/modal/modal.d.ts +39 -0
- package/dist/modal/modal.d.ts.map +1 -0
- package/dist/modal/modal.js +174 -0
- package/dist/modal/modal.js.map +1 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +2 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/router.d.ts +80 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +256 -0
- package/dist/router/router.js.map +1 -0
- package/dist/router/speculate.d.ts +28 -0
- package/dist/router/speculate.d.ts.map +1 -0
- package/dist/router/speculate.js +36 -0
- package/dist/router/speculate.js.map +1 -0
- package/dist/search/fuzzy.d.ts +16 -0
- package/dist/search/fuzzy.d.ts.map +1 -0
- package/dist/search/fuzzy.js +77 -0
- package/dist/search/fuzzy.js.map +1 -0
- package/dist/search/index.d.ts +5 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +3 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/search.d.ts +56 -0
- package/dist/search/search.d.ts.map +1 -0
- package/dist/search/search.js +540 -0
- package/dist/search/search.js.map +1 -0
- package/dist/search/wasm.d.ts +35 -0
- package/dist/search/wasm.d.ts.map +1 -0
- package/dist/search/wasm.js +51 -0
- package/dist/search/wasm.js.map +1 -0
- package/dist/security/cors.d.ts +61 -0
- package/dist/security/cors.d.ts.map +1 -0
- package/dist/security/cors.js +174 -0
- package/dist/security/cors.js.map +1 -0
- package/dist/security/csp.d.ts +49 -0
- package/dist/security/csp.d.ts.map +1 -0
- package/dist/security/csp.js +143 -0
- package/dist/security/csp.js.map +1 -0
- package/dist/security/csrf.d.ts +47 -0
- package/dist/security/csrf.d.ts.map +1 -0
- package/dist/security/csrf.js +122 -0
- package/dist/security/csrf.js.map +1 -0
- package/dist/security/encrypt.d.ts +64 -0
- package/dist/security/encrypt.d.ts.map +1 -0
- package/dist/security/encrypt.js +129 -0
- package/dist/security/encrypt.js.map +1 -0
- package/dist/security/index.d.ts +21 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +11 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/rate-limit.d.ts +57 -0
- package/dist/security/rate-limit.d.ts.map +1 -0
- package/dist/security/rate-limit.js +222 -0
- package/dist/security/rate-limit.js.map +1 -0
- package/dist/security/rbac.d.ts +84 -0
- package/dist/security/rbac.d.ts.map +1 -0
- package/dist/security/rbac.js +164 -0
- package/dist/security/rbac.js.map +1 -0
- package/dist/security/sanitize.d.ts +44 -0
- package/dist/security/sanitize.d.ts.map +1 -0
- package/dist/security/sanitize.js +230 -0
- package/dist/security/sanitize.js.map +1 -0
- package/dist/security/secure-store.d.ts +44 -0
- package/dist/security/secure-store.d.ts.map +1 -0
- package/dist/security/secure-store.js +164 -0
- package/dist/security/secure-store.js.map +1 -0
- package/dist/security/session.d.ts +76 -0
- package/dist/security/session.d.ts.map +1 -0
- package/dist/security/session.js +251 -0
- package/dist/security/session.js.map +1 -0
- package/dist/security/sri.d.ts +66 -0
- package/dist/security/sri.d.ts.map +1 -0
- package/dist/security/sri.js +159 -0
- package/dist/security/sri.js.map +1 -0
- package/dist/shortcuts/index.d.ts +3 -0
- package/dist/shortcuts/index.d.ts.map +1 -0
- package/dist/shortcuts/index.js +2 -0
- package/dist/shortcuts/index.js.map +1 -0
- package/dist/shortcuts/shortcuts.d.ts +43 -0
- package/dist/shortcuts/shortcuts.d.ts.map +1 -0
- package/dist/shortcuts/shortcuts.js +141 -0
- package/dist/shortcuts/shortcuts.js.map +1 -0
- package/dist/ssr/index.d.ts +3 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +2 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/ssr.d.ts +62 -0
- package/dist/ssr/ssr.d.ts.map +1 -0
- package/dist/ssr/ssr.js +132 -0
- package/dist/ssr/ssr.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +3 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/persistent.d.ts +31 -0
- package/dist/state/persistent.d.ts.map +1 -0
- package/dist/state/persistent.js +132 -0
- package/dist/state/persistent.js.map +1 -0
- package/dist/state/store.d.ts +31 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +107 -0
- package/dist/state/store.js.map +1 -0
- package/dist/store/index.d.ts +3 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +2 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/store.d.ts +36 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +175 -0
- package/dist/store/store.js.map +1 -0
- package/dist/supabase/auth.d.ts +28 -0
- package/dist/supabase/auth.d.ts.map +1 -0
- package/dist/supabase/auth.js +47 -0
- package/dist/supabase/auth.js.map +1 -0
- package/dist/supabase/client.d.ts +18 -0
- package/dist/supabase/client.d.ts.map +1 -0
- package/dist/supabase/client.js +36 -0
- package/dist/supabase/client.js.map +1 -0
- package/dist/supabase/realtime.d.ts +22 -0
- package/dist/supabase/realtime.d.ts.map +1 -0
- package/dist/supabase/realtime.js +51 -0
- package/dist/supabase/realtime.js.map +1 -0
- package/dist/sw/index.d.ts +3 -0
- package/dist/sw/index.d.ts.map +1 -0
- package/dist/sw/index.js +2 -0
- package/dist/sw/index.js.map +1 -0
- package/dist/sw/sw.d.ts +49 -0
- package/dist/sw/sw.d.ts.map +1 -0
- package/dist/sw/sw.js +125 -0
- package/dist/sw/sw.js.map +1 -0
- package/dist/tabs/index.d.ts +3 -0
- package/dist/tabs/index.d.ts.map +1 -0
- package/dist/tabs/index.js +2 -0
- package/dist/tabs/index.js.map +1 -0
- package/dist/tabs/tabs.d.ts +34 -0
- package/dist/tabs/tabs.d.ts.map +1 -0
- package/dist/tabs/tabs.js +173 -0
- package/dist/tabs/tabs.js.map +1 -0
- package/dist/test/index.d.ts +3 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +2 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/test.d.ts +37 -0
- package/dist/test/test.d.ts.map +1 -0
- package/dist/test/test.js +108 -0
- package/dist/test/test.js.map +1 -0
- package/dist/theme/index.d.ts +3 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +2 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme.d.ts +40 -0
- package/dist/theme/theme.d.ts.map +1 -0
- package/dist/theme/theme.js +142 -0
- package/dist/theme/theme.js.map +1 -0
- package/dist/timeline/index.d.ts +3 -0
- package/dist/timeline/index.d.ts.map +1 -0
- package/dist/timeline/index.js +2 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/timeline/timeline.d.ts +44 -0
- package/dist/timeline/timeline.d.ts.map +1 -0
- package/dist/timeline/timeline.js +196 -0
- package/dist/timeline/timeline.js.map +1 -0
- package/dist/toast/index.d.ts +3 -0
- package/dist/toast/index.d.ts.map +1 -0
- package/dist/toast/index.js +2 -0
- package/dist/toast/index.js.map +1 -0
- package/dist/toast/toast.d.ts +31 -0
- package/dist/toast/toast.d.ts.map +1 -0
- package/dist/toast/toast.js +198 -0
- package/dist/toast/toast.js.map +1 -0
- package/dist/tooltip/index.d.ts +3 -0
- package/dist/tooltip/index.d.ts.map +1 -0
- package/dist/tooltip/index.js +2 -0
- package/dist/tooltip/index.js.map +1 -0
- package/dist/tooltip/tooltip.d.ts +27 -0
- package/dist/tooltip/tooltip.d.ts.map +1 -0
- package/dist/tooltip/tooltip.js +229 -0
- package/dist/tooltip/tooltip.js.map +1 -0
- package/dist/transition/index.d.ts +3 -0
- package/dist/transition/index.d.ts.map +1 -0
- package/dist/transition/index.js +2 -0
- package/dist/transition/index.js.map +1 -0
- package/dist/transition/transition.d.ts +31 -0
- package/dist/transition/transition.d.ts.map +1 -0
- package/dist/transition/transition.js +95 -0
- package/dist/transition/transition.js.map +1 -0
- package/dist/webgl/index.d.ts +3 -0
- package/dist/webgl/index.d.ts.map +1 -0
- package/dist/webgl/index.js +2 -0
- package/dist/webgl/index.js.map +1 -0
- package/dist/webgl/webgl.d.ts +49 -0
- package/dist/webgl/webgl.d.ts.map +1 -0
- package/dist/webgl/webgl.js +401 -0
- package/dist/webgl/webgl.js.map +1 -0
- package/package.json +269 -0
- package/styles/base/global.css +47 -0
- package/styles/base/reset.css +73 -0
- package/styles/tokens/colors.css +50 -0
- package/styles/tokens/spacing.css +46 -0
- package/styles/tokens/typography.css +37 -0
- package/styles/utilities/layout.css +46 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Image Gallery
|
|
3
|
+
*
|
|
4
|
+
* Lightbox, zoom, pan, filmstrip navigation, keyboard controls,
|
|
5
|
+
* and touch gestures for image galleries.
|
|
6
|
+
*/
|
|
7
|
+
const STYLE_ID = 'nova-gallery-styles';
|
|
8
|
+
function injectStyles() {
|
|
9
|
+
if (document.getElementById(STYLE_ID))
|
|
10
|
+
return;
|
|
11
|
+
const s = document.createElement('style');
|
|
12
|
+
s.id = STYLE_ID;
|
|
13
|
+
s.textContent = `
|
|
14
|
+
.nova-gallery {
|
|
15
|
+
position: fixed; inset: 0; z-index: 999999;
|
|
16
|
+
background: var(--color-bg-overlay, rgba(0,0,0,0.92)); backdrop-filter: blur(8px);
|
|
17
|
+
display: none; flex-direction: column; align-items: center; justify-content: center;
|
|
18
|
+
color: var(--color-text-primary, #fff); font: 14px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
19
|
+
opacity: 0; transition: opacity 0.25s ease-out;
|
|
20
|
+
user-select: none;
|
|
21
|
+
}
|
|
22
|
+
.nova-gallery--open { display: flex; }
|
|
23
|
+
.nova-gallery--visible { opacity: 1; }
|
|
24
|
+
.nova-gallery__viewport {
|
|
25
|
+
flex: 1; display: flex; align-items: center; justify-content: center;
|
|
26
|
+
width: 100%; position: relative; overflow: hidden; cursor: grab;
|
|
27
|
+
}
|
|
28
|
+
.nova-gallery__viewport:active { cursor: grabbing; }
|
|
29
|
+
.nova-gallery__img {
|
|
30
|
+
max-width: 90vw; max-height: 75vh; object-fit: contain;
|
|
31
|
+
transition: transform 0.2s ease-out, opacity 0.2s ease-out;
|
|
32
|
+
touch-action: none;
|
|
33
|
+
}
|
|
34
|
+
.nova-gallery__topbar {
|
|
35
|
+
display: flex; justify-content: space-between; align-items: center;
|
|
36
|
+
width: 100%; padding: 12px 20px;
|
|
37
|
+
}
|
|
38
|
+
.nova-gallery__counter { font-size: 13px; color: var(--color-text-primary-50, rgba(255,255,255,0.6)); }
|
|
39
|
+
.nova-gallery__caption {
|
|
40
|
+
text-align: center; padding: 8px 20px; font-size: 13px; color: var(--color-text-primary-70, rgba(255,255,255,0.7));
|
|
41
|
+
max-width: 600px;
|
|
42
|
+
}
|
|
43
|
+
.nova-gallery__close {
|
|
44
|
+
background: none; border: none; color: var(--color-text-primary-50, rgba(255,255,255,0.6)); cursor: pointer;
|
|
45
|
+
font-size: 28px; padding: 0; line-height: 1;
|
|
46
|
+
}
|
|
47
|
+
.nova-gallery__close:hover { color: var(--color-text-primary, #fff); }
|
|
48
|
+
.nova-gallery__nav {
|
|
49
|
+
position: absolute; top: 50%; transform: translateY(-50%);
|
|
50
|
+
background: var(--color-text-primary-10, rgba(255,255,255,0.08)); border: 1px solid var(--color-border, rgba(255,255,255,0.1));
|
|
51
|
+
border-radius: 50%; width: 44px; height: 44px;
|
|
52
|
+
display: flex; align-items: center; justify-content: center;
|
|
53
|
+
color: var(--color-text-primary, #fff); cursor: pointer; font-size: 20px; transition: background 0.15s;
|
|
54
|
+
z-index: 2;
|
|
55
|
+
}
|
|
56
|
+
.nova-gallery__nav:hover { background: rgba(255,255,255,0.15); }
|
|
57
|
+
.nova-gallery__nav--prev { left: 16px; }
|
|
58
|
+
.nova-gallery__nav--next { right: 16px; }
|
|
59
|
+
.nova-gallery__filmstrip {
|
|
60
|
+
display: flex; gap: 6px; padding: 10px 20px; overflow-x: auto;
|
|
61
|
+
max-width: 100%;
|
|
62
|
+
}
|
|
63
|
+
.nova-gallery__thumb {
|
|
64
|
+
width: 56px; height: 56px; object-fit: cover; border-radius: 6px;
|
|
65
|
+
border: 2px solid transparent; cursor: pointer; opacity: 0.5;
|
|
66
|
+
transition: opacity 0.15s, border-color 0.15s; flex-shrink: 0;
|
|
67
|
+
}
|
|
68
|
+
.nova-gallery__thumb:hover { opacity: 0.8; }
|
|
69
|
+
.nova-gallery__thumb--active { opacity: 1; border-color: var(--color-text-primary, #fff); }
|
|
70
|
+
@media (prefers-reduced-motion: reduce) {
|
|
71
|
+
.nova-gallery, .nova-gallery__img { transition: none; }
|
|
72
|
+
}`;
|
|
73
|
+
document.head.appendChild(s);
|
|
74
|
+
}
|
|
75
|
+
/** Create a gallery / lightbox instance. */
|
|
76
|
+
export function createGallery(options) {
|
|
77
|
+
const { items, startIndex = 0, filmstrip = true, zoom = true, maxZoom = 3, keyboard = true, swipe = true, loop = true, closeOnBackdrop = true, counter = true, animationDuration = 250, onChange, onClose, } = options;
|
|
78
|
+
injectStyles();
|
|
79
|
+
let currentIndex = startIndex;
|
|
80
|
+
let opened = false;
|
|
81
|
+
let currentZoom = 1;
|
|
82
|
+
let panX = 0, panY = 0;
|
|
83
|
+
// Build DOM
|
|
84
|
+
const overlay = document.createElement('div');
|
|
85
|
+
overlay.className = 'nova-gallery';
|
|
86
|
+
// Top bar
|
|
87
|
+
const topbar = document.createElement('div');
|
|
88
|
+
topbar.className = 'nova-gallery__topbar';
|
|
89
|
+
const counterEl = document.createElement('span');
|
|
90
|
+
counterEl.className = 'nova-gallery__counter';
|
|
91
|
+
const closeBtn = document.createElement('button');
|
|
92
|
+
closeBtn.className = 'nova-gallery__close';
|
|
93
|
+
closeBtn.setAttribute('aria-label', 'Close gallery');
|
|
94
|
+
closeBtn.textContent = '\u00d7';
|
|
95
|
+
topbar.appendChild(counterEl);
|
|
96
|
+
topbar.appendChild(closeBtn);
|
|
97
|
+
overlay.appendChild(topbar);
|
|
98
|
+
// Viewport
|
|
99
|
+
const viewport = document.createElement('div');
|
|
100
|
+
viewport.className = 'nova-gallery__viewport';
|
|
101
|
+
const prevBtn = document.createElement('button');
|
|
102
|
+
prevBtn.className = 'nova-gallery__nav nova-gallery__nav--prev';
|
|
103
|
+
prevBtn.setAttribute('aria-label', 'Previous');
|
|
104
|
+
prevBtn.textContent = '\u2039';
|
|
105
|
+
const nextBtn = document.createElement('button');
|
|
106
|
+
nextBtn.className = 'nova-gallery__nav nova-gallery__nav--next';
|
|
107
|
+
nextBtn.setAttribute('aria-label', 'Next');
|
|
108
|
+
nextBtn.textContent = '\u203a';
|
|
109
|
+
const img = document.createElement('img');
|
|
110
|
+
img.className = 'nova-gallery__img';
|
|
111
|
+
img.draggable = false;
|
|
112
|
+
viewport.appendChild(prevBtn);
|
|
113
|
+
viewport.appendChild(img);
|
|
114
|
+
viewport.appendChild(nextBtn);
|
|
115
|
+
overlay.appendChild(viewport);
|
|
116
|
+
// Caption
|
|
117
|
+
const captionEl = document.createElement('div');
|
|
118
|
+
captionEl.className = 'nova-gallery__caption';
|
|
119
|
+
overlay.appendChild(captionEl);
|
|
120
|
+
// Filmstrip
|
|
121
|
+
let filmstripEl = null;
|
|
122
|
+
const thumbEls = [];
|
|
123
|
+
if (filmstrip) {
|
|
124
|
+
filmstripEl = document.createElement('div');
|
|
125
|
+
filmstripEl.className = 'nova-gallery__filmstrip';
|
|
126
|
+
for (let i = 0; i < items.length; i++) {
|
|
127
|
+
const thumb = document.createElement('img');
|
|
128
|
+
thumb.className = 'nova-gallery__thumb';
|
|
129
|
+
thumb.src = items[i].thumb ?? items[i].src;
|
|
130
|
+
thumb.alt = items[i].alt ?? '';
|
|
131
|
+
thumb.addEventListener('click', () => goTo(i));
|
|
132
|
+
filmstripEl.appendChild(thumb);
|
|
133
|
+
thumbEls.push(thumb);
|
|
134
|
+
}
|
|
135
|
+
overlay.appendChild(filmstripEl);
|
|
136
|
+
}
|
|
137
|
+
document.body.appendChild(overlay);
|
|
138
|
+
function update() {
|
|
139
|
+
const item = items[currentIndex];
|
|
140
|
+
img.src = item.src;
|
|
141
|
+
img.alt = item.alt ?? '';
|
|
142
|
+
if (counter)
|
|
143
|
+
counterEl.textContent = `${currentIndex + 1} / ${items.length}`;
|
|
144
|
+
captionEl.textContent = item.caption ?? '';
|
|
145
|
+
captionEl.style.display = item.caption ? '' : 'none';
|
|
146
|
+
// Reset zoom/pan
|
|
147
|
+
currentZoom = 1;
|
|
148
|
+
panX = 0;
|
|
149
|
+
panY = 0;
|
|
150
|
+
img.style.transform = '';
|
|
151
|
+
// Update filmstrip
|
|
152
|
+
for (let i = 0; i < thumbEls.length; i++) {
|
|
153
|
+
thumbEls[i].classList.toggle('nova-gallery__thumb--active', i === currentIndex);
|
|
154
|
+
}
|
|
155
|
+
// Scroll active thumb into view
|
|
156
|
+
thumbEls[currentIndex]?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });
|
|
157
|
+
// Nav visibility
|
|
158
|
+
if (!loop) {
|
|
159
|
+
prevBtn.style.display = currentIndex === 0 ? 'none' : '';
|
|
160
|
+
nextBtn.style.display = currentIndex === items.length - 1 ? 'none' : '';
|
|
161
|
+
}
|
|
162
|
+
onChange?.(currentIndex);
|
|
163
|
+
}
|
|
164
|
+
function goTo(index) {
|
|
165
|
+
if (index < 0)
|
|
166
|
+
index = loop ? items.length - 1 : 0;
|
|
167
|
+
if (index >= items.length)
|
|
168
|
+
index = loop ? 0 : items.length - 1;
|
|
169
|
+
currentIndex = index;
|
|
170
|
+
update();
|
|
171
|
+
}
|
|
172
|
+
// Zoom
|
|
173
|
+
function handleWheel(e) {
|
|
174
|
+
if (!zoom)
|
|
175
|
+
return;
|
|
176
|
+
e.preventDefault();
|
|
177
|
+
const delta = e.deltaY > 0 ? -0.2 : 0.2;
|
|
178
|
+
currentZoom = Math.max(1, Math.min(maxZoom, currentZoom + delta));
|
|
179
|
+
if (currentZoom === 1) {
|
|
180
|
+
panX = 0;
|
|
181
|
+
panY = 0;
|
|
182
|
+
}
|
|
183
|
+
img.style.transform = `scale(${currentZoom}) translate(${panX}px, ${panY}px)`;
|
|
184
|
+
}
|
|
185
|
+
// Pan
|
|
186
|
+
let isPanning = false;
|
|
187
|
+
let panStartX = 0, panStartY = 0;
|
|
188
|
+
function onPointerDown(e) {
|
|
189
|
+
if (currentZoom <= 1)
|
|
190
|
+
return;
|
|
191
|
+
isPanning = true;
|
|
192
|
+
panStartX = e.clientX - panX;
|
|
193
|
+
panStartY = e.clientY - panY;
|
|
194
|
+
viewport.setPointerCapture(e.pointerId);
|
|
195
|
+
}
|
|
196
|
+
function onPointerMove(e) {
|
|
197
|
+
if (!isPanning)
|
|
198
|
+
return;
|
|
199
|
+
panX = e.clientX - panStartX;
|
|
200
|
+
panY = e.clientY - panStartY;
|
|
201
|
+
img.style.transform = `scale(${currentZoom}) translate(${panX}px, ${panY}px)`;
|
|
202
|
+
}
|
|
203
|
+
function onPointerUp() {
|
|
204
|
+
isPanning = false;
|
|
205
|
+
}
|
|
206
|
+
// Swipe detection (when not zoomed)
|
|
207
|
+
let swipeStartX = 0;
|
|
208
|
+
function onTouchStart(e) {
|
|
209
|
+
if (!swipe || currentZoom > 1)
|
|
210
|
+
return;
|
|
211
|
+
swipeStartX = e.touches[0].clientX;
|
|
212
|
+
}
|
|
213
|
+
function onTouchEnd(e) {
|
|
214
|
+
if (!swipe || currentZoom > 1)
|
|
215
|
+
return;
|
|
216
|
+
const dx = e.changedTouches[0].clientX - swipeStartX;
|
|
217
|
+
if (Math.abs(dx) > 50) {
|
|
218
|
+
if (dx > 0)
|
|
219
|
+
goTo(currentIndex - 1);
|
|
220
|
+
else
|
|
221
|
+
goTo(currentIndex + 1);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Keyboard
|
|
225
|
+
function onKeydown(e) {
|
|
226
|
+
if (!opened || !keyboard)
|
|
227
|
+
return;
|
|
228
|
+
if (e.key === 'Escape')
|
|
229
|
+
instance.close();
|
|
230
|
+
if (e.key === 'ArrowLeft')
|
|
231
|
+
goTo(currentIndex - 1);
|
|
232
|
+
if (e.key === 'ArrowRight')
|
|
233
|
+
goTo(currentIndex + 1);
|
|
234
|
+
if (e.key === 'Home')
|
|
235
|
+
goTo(0);
|
|
236
|
+
if (e.key === 'End')
|
|
237
|
+
goTo(items.length - 1);
|
|
238
|
+
}
|
|
239
|
+
// Backdrop click
|
|
240
|
+
function onBackdropClick(e) {
|
|
241
|
+
if (!closeOnBackdrop)
|
|
242
|
+
return;
|
|
243
|
+
if (e.target === viewport || e.target === overlay)
|
|
244
|
+
instance.close();
|
|
245
|
+
}
|
|
246
|
+
// Events
|
|
247
|
+
closeBtn.addEventListener('click', () => instance.close());
|
|
248
|
+
prevBtn.addEventListener('click', () => goTo(currentIndex - 1));
|
|
249
|
+
nextBtn.addEventListener('click', () => goTo(currentIndex + 1));
|
|
250
|
+
viewport.addEventListener('wheel', handleWheel, { passive: false });
|
|
251
|
+
viewport.addEventListener('pointerdown', onPointerDown);
|
|
252
|
+
viewport.addEventListener('pointermove', onPointerMove);
|
|
253
|
+
viewport.addEventListener('pointerup', onPointerUp);
|
|
254
|
+
viewport.addEventListener('touchstart', onTouchStart, { passive: true });
|
|
255
|
+
viewport.addEventListener('touchend', onTouchEnd);
|
|
256
|
+
overlay.addEventListener('click', onBackdropClick);
|
|
257
|
+
document.addEventListener('keydown', onKeydown);
|
|
258
|
+
// Double-click to zoom
|
|
259
|
+
img.addEventListener('dblclick', () => {
|
|
260
|
+
if (!zoom)
|
|
261
|
+
return;
|
|
262
|
+
if (currentZoom > 1) {
|
|
263
|
+
currentZoom = 1;
|
|
264
|
+
panX = 0;
|
|
265
|
+
panY = 0;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
currentZoom = 2;
|
|
269
|
+
}
|
|
270
|
+
img.style.transform = `scale(${currentZoom}) translate(${panX}px, ${panY}px)`;
|
|
271
|
+
});
|
|
272
|
+
const instance = {
|
|
273
|
+
open(index) {
|
|
274
|
+
if (opened)
|
|
275
|
+
return;
|
|
276
|
+
opened = true;
|
|
277
|
+
if (index !== undefined)
|
|
278
|
+
currentIndex = index;
|
|
279
|
+
update();
|
|
280
|
+
overlay.classList.add('nova-gallery--open');
|
|
281
|
+
requestAnimationFrame(() => {
|
|
282
|
+
void overlay.offsetHeight;
|
|
283
|
+
overlay.classList.add('nova-gallery--visible');
|
|
284
|
+
});
|
|
285
|
+
document.body.style.overflow = 'hidden';
|
|
286
|
+
},
|
|
287
|
+
close() {
|
|
288
|
+
if (!opened)
|
|
289
|
+
return;
|
|
290
|
+
opened = false;
|
|
291
|
+
overlay.classList.remove('nova-gallery--visible');
|
|
292
|
+
const finish = () => {
|
|
293
|
+
overlay.classList.remove('nova-gallery--open');
|
|
294
|
+
document.body.style.overflow = '';
|
|
295
|
+
onClose?.();
|
|
296
|
+
};
|
|
297
|
+
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
|
298
|
+
finish();
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
setTimeout(finish, animationDuration);
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
next() { goTo(currentIndex + 1); },
|
|
305
|
+
prev() { goTo(currentIndex - 1); },
|
|
306
|
+
goTo,
|
|
307
|
+
isOpen() { return opened; },
|
|
308
|
+
destroy() {
|
|
309
|
+
if (opened)
|
|
310
|
+
instance.close();
|
|
311
|
+
document.removeEventListener('keydown', onKeydown);
|
|
312
|
+
overlay.remove();
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
return instance;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Attach a gallery to image elements matching a selector.
|
|
319
|
+
* Automatically builds items from img[src] and img[alt].
|
|
320
|
+
* Returns a cleanup function.
|
|
321
|
+
*/
|
|
322
|
+
export function gallery(selector, options) {
|
|
323
|
+
const images = document.querySelectorAll(selector);
|
|
324
|
+
const items = [];
|
|
325
|
+
for (const img of images) {
|
|
326
|
+
items.push({
|
|
327
|
+
src: img.getAttribute('data-full') ?? img.src,
|
|
328
|
+
thumb: img.src,
|
|
329
|
+
alt: img.alt,
|
|
330
|
+
caption: img.getAttribute('data-caption') ?? undefined,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
const instance = createGallery({ items, ...options });
|
|
334
|
+
const handlers = [];
|
|
335
|
+
images.forEach((img, i) => {
|
|
336
|
+
const handler = () => instance.open(i);
|
|
337
|
+
img.style.cursor = 'pointer';
|
|
338
|
+
img.addEventListener('click', handler);
|
|
339
|
+
handlers.push(() => img.removeEventListener('click', handler));
|
|
340
|
+
});
|
|
341
|
+
return () => {
|
|
342
|
+
instance.destroy();
|
|
343
|
+
for (const h of handlers)
|
|
344
|
+
h();
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=gallery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gallery.js","sourceRoot":"","sources":["../../src/gallery/gallery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gallery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gallery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Touch Gesture Recognition
|
|
3
|
+
*
|
|
4
|
+
* Swipe, pinch, pan, and long-press detection with velocity and direction data.
|
|
5
|
+
*/
|
|
6
|
+
export type GestureType = 'swipe' | 'pinch' | 'pan' | 'longpress' | 'tap';
|
|
7
|
+
export type SwipeDirection = 'up' | 'down' | 'left' | 'right';
|
|
8
|
+
export interface GestureEvent {
|
|
9
|
+
type: GestureType;
|
|
10
|
+
/** Horizontal delta from start */
|
|
11
|
+
deltaX: number;
|
|
12
|
+
/** Vertical delta from start */
|
|
13
|
+
deltaY: number;
|
|
14
|
+
/** Velocity in px/ms */
|
|
15
|
+
velocityX: number;
|
|
16
|
+
velocityY: number;
|
|
17
|
+
/** Swipe direction (for swipe events) */
|
|
18
|
+
direction?: SwipeDirection;
|
|
19
|
+
/** Pinch scale factor (for pinch events) */
|
|
20
|
+
scale?: number;
|
|
21
|
+
/** Distance between two fingers (for pinch events) */
|
|
22
|
+
distance?: number;
|
|
23
|
+
/** Original touch/pointer event */
|
|
24
|
+
originalEvent: Event;
|
|
25
|
+
}
|
|
26
|
+
export interface GestureOptions {
|
|
27
|
+
/** Min distance for swipe detection in px. Default: 50 */
|
|
28
|
+
swipeThreshold?: number;
|
|
29
|
+
/** Min velocity for swipe in px/ms. Default: 0.3 */
|
|
30
|
+
swipeVelocity?: number;
|
|
31
|
+
/** Long press duration in ms. Default: 500 */
|
|
32
|
+
longPressDuration?: number;
|
|
33
|
+
/** Max movement for tap in px. Default: 10 */
|
|
34
|
+
tapTolerance?: number;
|
|
35
|
+
/** Enable specific gesture types. Default: all */
|
|
36
|
+
gestures?: GestureType[];
|
|
37
|
+
}
|
|
38
|
+
export interface GestureInstance {
|
|
39
|
+
on(type: GestureType, handler: (e: GestureEvent) => void): () => void;
|
|
40
|
+
destroy(): void;
|
|
41
|
+
}
|
|
42
|
+
/** Create a gesture recognizer on an element. */
|
|
43
|
+
export declare function gesture(element: string | Element, options?: GestureOptions): GestureInstance;
|
|
44
|
+
//# sourceMappingURL=gesture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gesture.d.ts","sourceRoot":"","sources":["../../src/gesture/gesture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,WAAW,GAAG,KAAK,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,aAAa,EAAE,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACtE,OAAO,IAAI,IAAI,CAAC;CACjB;AAUD,iDAAiD;AACjD,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,GAAG,OAAO,EACzB,OAAO,GAAE,cAAmB,GAC3B,eAAe,CAuJjB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Touch Gesture Recognition
|
|
3
|
+
*
|
|
4
|
+
* Swipe, pinch, pan, and long-press detection with velocity and direction data.
|
|
5
|
+
*/
|
|
6
|
+
function dist(x, y) {
|
|
7
|
+
return Math.sqrt(x * x + y * y);
|
|
8
|
+
}
|
|
9
|
+
function touchDist(a, b) {
|
|
10
|
+
return dist(a.clientX - b.clientX, a.clientY - b.clientY);
|
|
11
|
+
}
|
|
12
|
+
/** Create a gesture recognizer on an element. */
|
|
13
|
+
export function gesture(element, options = {}) {
|
|
14
|
+
const { swipeThreshold = 50, swipeVelocity = 0.3, longPressDuration = 500, tapTolerance = 10, gestures = ['swipe', 'pinch', 'pan', 'longpress', 'tap'], } = options;
|
|
15
|
+
const el = typeof element === 'string'
|
|
16
|
+
? document.querySelector(element)
|
|
17
|
+
: element;
|
|
18
|
+
const handlers = new Map();
|
|
19
|
+
for (const g of gestures)
|
|
20
|
+
handlers.set(g, new Set());
|
|
21
|
+
function emit(type, data) {
|
|
22
|
+
const set = handlers.get(type);
|
|
23
|
+
if (!set)
|
|
24
|
+
return;
|
|
25
|
+
const event = {
|
|
26
|
+
type,
|
|
27
|
+
deltaX: 0,
|
|
28
|
+
deltaY: 0,
|
|
29
|
+
velocityX: 0,
|
|
30
|
+
velocityY: 0,
|
|
31
|
+
...data,
|
|
32
|
+
};
|
|
33
|
+
for (const fn of set)
|
|
34
|
+
fn(event);
|
|
35
|
+
}
|
|
36
|
+
let startX = 0, startY = 0, startTime = 0;
|
|
37
|
+
let longPressTimer;
|
|
38
|
+
let initialPinchDist = 0;
|
|
39
|
+
let isPanning = false;
|
|
40
|
+
function onTouchStart(e) {
|
|
41
|
+
if (e.touches.length === 1) {
|
|
42
|
+
startX = e.touches[0].clientX;
|
|
43
|
+
startY = e.touches[0].clientY;
|
|
44
|
+
startTime = Date.now();
|
|
45
|
+
isPanning = false;
|
|
46
|
+
if (gestures.includes('longpress')) {
|
|
47
|
+
longPressTimer = setTimeout(() => {
|
|
48
|
+
emit('longpress', {
|
|
49
|
+
deltaX: 0, deltaY: 0,
|
|
50
|
+
originalEvent: e,
|
|
51
|
+
});
|
|
52
|
+
}, longPressDuration);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (e.touches.length === 2 && gestures.includes('pinch')) {
|
|
56
|
+
initialPinchDist = touchDist(e.touches[0], e.touches[1]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function onTouchMove(e) {
|
|
60
|
+
if (longPressTimer) {
|
|
61
|
+
const dx = e.touches[0].clientX - startX;
|
|
62
|
+
const dy = e.touches[0].clientY - startY;
|
|
63
|
+
if (dist(dx, dy) > tapTolerance) {
|
|
64
|
+
clearTimeout(longPressTimer);
|
|
65
|
+
longPressTimer = undefined;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (e.touches.length === 1 && gestures.includes('pan')) {
|
|
69
|
+
const dx = e.touches[0].clientX - startX;
|
|
70
|
+
const dy = e.touches[0].clientY - startY;
|
|
71
|
+
if (!isPanning && dist(dx, dy) > tapTolerance)
|
|
72
|
+
isPanning = true;
|
|
73
|
+
if (isPanning) {
|
|
74
|
+
const elapsed = Date.now() - startTime || 1;
|
|
75
|
+
emit('pan', {
|
|
76
|
+
deltaX: dx, deltaY: dy,
|
|
77
|
+
velocityX: dx / elapsed,
|
|
78
|
+
velocityY: dy / elapsed,
|
|
79
|
+
originalEvent: e,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (e.touches.length === 2 && gestures.includes('pinch') && initialPinchDist > 0) {
|
|
84
|
+
const currentDist = touchDist(e.touches[0], e.touches[1]);
|
|
85
|
+
const scale = currentDist / initialPinchDist;
|
|
86
|
+
emit('pinch', {
|
|
87
|
+
scale,
|
|
88
|
+
distance: currentDist,
|
|
89
|
+
deltaX: 0, deltaY: 0,
|
|
90
|
+
originalEvent: e,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function onTouchEnd(e) {
|
|
95
|
+
if (longPressTimer) {
|
|
96
|
+
clearTimeout(longPressTimer);
|
|
97
|
+
longPressTimer = undefined;
|
|
98
|
+
}
|
|
99
|
+
if (e.changedTouches.length === 1) {
|
|
100
|
+
const dx = e.changedTouches[0].clientX - startX;
|
|
101
|
+
const dy = e.changedTouches[0].clientY - startY;
|
|
102
|
+
const elapsed = Date.now() - startTime || 1;
|
|
103
|
+
const d = dist(dx, dy);
|
|
104
|
+
// Tap detection
|
|
105
|
+
if (d < tapTolerance && elapsed < 300 && gestures.includes('tap')) {
|
|
106
|
+
emit('tap', { deltaX: dx, deltaY: dy, originalEvent: e });
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Swipe detection
|
|
110
|
+
if (gestures.includes('swipe') && d >= swipeThreshold) {
|
|
111
|
+
const vx = Math.abs(dx / elapsed);
|
|
112
|
+
const vy = Math.abs(dy / elapsed);
|
|
113
|
+
if (vx >= swipeVelocity || vy >= swipeVelocity) {
|
|
114
|
+
let direction;
|
|
115
|
+
if (Math.abs(dx) > Math.abs(dy)) {
|
|
116
|
+
direction = dx > 0 ? 'right' : 'left';
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
direction = dy > 0 ? 'down' : 'up';
|
|
120
|
+
}
|
|
121
|
+
emit('swipe', {
|
|
122
|
+
deltaX: dx, deltaY: dy,
|
|
123
|
+
velocityX: dx / elapsed, velocityY: dy / elapsed,
|
|
124
|
+
direction,
|
|
125
|
+
originalEvent: e,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
initialPinchDist = 0;
|
|
131
|
+
isPanning = false;
|
|
132
|
+
}
|
|
133
|
+
el.addEventListener('touchstart', onTouchStart, { passive: true });
|
|
134
|
+
el.addEventListener('touchmove', onTouchMove, { passive: true });
|
|
135
|
+
el.addEventListener('touchend', onTouchEnd);
|
|
136
|
+
return {
|
|
137
|
+
on(type, handler) {
|
|
138
|
+
if (!handlers.has(type))
|
|
139
|
+
handlers.set(type, new Set());
|
|
140
|
+
handlers.get(type).add(handler);
|
|
141
|
+
return () => handlers.get(type)?.delete(handler);
|
|
142
|
+
},
|
|
143
|
+
destroy() {
|
|
144
|
+
el.removeEventListener('touchstart', onTouchStart);
|
|
145
|
+
el.removeEventListener('touchmove', onTouchMove);
|
|
146
|
+
el.removeEventListener('touchend', onTouchEnd);
|
|
147
|
+
for (const set of handlers.values())
|
|
148
|
+
set.clear();
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=gesture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gesture.js","sourceRoot":"","sources":["../../src/gesture/gesture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gesture/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gesture/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — HTTP Client
|
|
3
|
+
*
|
|
4
|
+
* Typed fetch wrapper with interceptors, retries, timeout, and abort control.
|
|
5
|
+
* Pure TypeScript, zero external dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export interface HttpOptions {
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
timeout?: number;
|
|
11
|
+
retries?: number;
|
|
12
|
+
retryDelay?: number;
|
|
13
|
+
retryBackoff?: boolean;
|
|
14
|
+
credentials?: RequestCredentials;
|
|
15
|
+
onRequest?: (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;
|
|
16
|
+
onResponse?: (response: Response, config: RequestConfig) => Response | Promise<Response>;
|
|
17
|
+
onError?: (error: HttpError) => void;
|
|
18
|
+
}
|
|
19
|
+
export interface RequestConfig {
|
|
20
|
+
url: string;
|
|
21
|
+
method: string;
|
|
22
|
+
headers: Record<string, string>;
|
|
23
|
+
body?: unknown;
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
timeout?: number;
|
|
26
|
+
retries?: number;
|
|
27
|
+
params?: Record<string, string | number | boolean>;
|
|
28
|
+
}
|
|
29
|
+
export interface HttpError extends Error {
|
|
30
|
+
status?: number;
|
|
31
|
+
response?: Response;
|
|
32
|
+
config: RequestConfig;
|
|
33
|
+
}
|
|
34
|
+
export interface HttpInstance {
|
|
35
|
+
get<T = unknown>(url: string, config?: Partial<RequestConfig>): Promise<T>;
|
|
36
|
+
post<T = unknown>(url: string, body?: unknown, config?: Partial<RequestConfig>): Promise<T>;
|
|
37
|
+
put<T = unknown>(url: string, body?: unknown, config?: Partial<RequestConfig>): Promise<T>;
|
|
38
|
+
patch<T = unknown>(url: string, body?: unknown, config?: Partial<RequestConfig>): Promise<T>;
|
|
39
|
+
delete<T = unknown>(url: string, config?: Partial<RequestConfig>): Promise<T>;
|
|
40
|
+
request<T = unknown>(config: RequestConfig): Promise<T>;
|
|
41
|
+
}
|
|
42
|
+
/** Create a typed HTTP client instance. */
|
|
43
|
+
export declare function createHttp(options?: HttpOptions): HttpInstance;
|
|
44
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9E,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,SAAU,SAAQ,KAAK;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5F,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3F,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACzD;AAiCD,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,OAAO,GAAE,WAAgB,GAAG,YAAY,CA8GlE"}
|