@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,135 @@
|
|
|
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
|
+
function joinUrl(base, path) {
|
|
8
|
+
if (/^https?:\/\//.test(path))
|
|
9
|
+
return path;
|
|
10
|
+
return base.replace(/\/+$/, '') + '/' + path.replace(/^\/+/, '');
|
|
11
|
+
}
|
|
12
|
+
function appendParams(url, params) {
|
|
13
|
+
if (!params || Object.keys(params).length === 0)
|
|
14
|
+
return url;
|
|
15
|
+
const qs = Object.entries(params)
|
|
16
|
+
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
|
|
17
|
+
.join('&');
|
|
18
|
+
return url + (url.includes('?') ? '&' : '?') + qs;
|
|
19
|
+
}
|
|
20
|
+
function createHttpError(message, config, status, response) {
|
|
21
|
+
const error = new Error(message);
|
|
22
|
+
error.name = 'HttpError';
|
|
23
|
+
error.status = status;
|
|
24
|
+
error.response = response;
|
|
25
|
+
error.config = config;
|
|
26
|
+
return error;
|
|
27
|
+
}
|
|
28
|
+
function isRetryable(error) {
|
|
29
|
+
if (!error.status)
|
|
30
|
+
return true;
|
|
31
|
+
return error.status === 408 || error.status === 429 || error.status >= 500;
|
|
32
|
+
}
|
|
33
|
+
function wait(ms) {
|
|
34
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
35
|
+
}
|
|
36
|
+
/** Create a typed HTTP client instance. */
|
|
37
|
+
export function createHttp(options = {}) {
|
|
38
|
+
const { baseUrl = '', headers: defaultHeaders = {}, timeout: defaultTimeout = 30_000, retries: defaultRetries = 0, retryDelay: defaultRetryDelay = 1_000, retryBackoff = true, credentials, onRequest, onResponse, onError, } = options;
|
|
39
|
+
async function request(config) {
|
|
40
|
+
let cfg = { ...config };
|
|
41
|
+
if (onRequest)
|
|
42
|
+
cfg = await onRequest(cfg);
|
|
43
|
+
const timeout = cfg.timeout ?? defaultTimeout;
|
|
44
|
+
const maxRetries = cfg.retries ?? defaultRetries;
|
|
45
|
+
const fullUrl = appendParams(baseUrl ? joinUrl(baseUrl, cfg.url) : cfg.url, cfg.params);
|
|
46
|
+
const mergedHeaders = { ...defaultHeaders, ...cfg.headers };
|
|
47
|
+
let fetchBody;
|
|
48
|
+
if (cfg.body !== undefined && cfg.body !== null) {
|
|
49
|
+
if (cfg.body instanceof FormData ||
|
|
50
|
+
cfg.body instanceof Blob ||
|
|
51
|
+
cfg.body instanceof ArrayBuffer ||
|
|
52
|
+
cfg.body instanceof URLSearchParams ||
|
|
53
|
+
typeof cfg.body === 'string') {
|
|
54
|
+
fetchBody = cfg.body;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
fetchBody = JSON.stringify(cfg.body);
|
|
58
|
+
if (!mergedHeaders['Content-Type'] && !mergedHeaders['content-type']) {
|
|
59
|
+
mergedHeaders['Content-Type'] = 'application/json';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
let lastError;
|
|
64
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
65
|
+
if (attempt > 0) {
|
|
66
|
+
const delay = retryBackoff
|
|
67
|
+
? Math.min(defaultRetryDelay * Math.pow(2, attempt - 1), 30_000)
|
|
68
|
+
: defaultRetryDelay;
|
|
69
|
+
await wait(delay);
|
|
70
|
+
}
|
|
71
|
+
const controller = new AbortController();
|
|
72
|
+
let timeoutId;
|
|
73
|
+
if (cfg.signal) {
|
|
74
|
+
if (cfg.signal.aborted) {
|
|
75
|
+
controller.abort(cfg.signal.reason);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
cfg.signal.addEventListener('abort', () => controller.abort(cfg.signal.reason), { once: true });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
if (timeout > 0)
|
|
83
|
+
timeoutId = setTimeout(() => controller.abort('timeout'), timeout);
|
|
84
|
+
const init = { method: cfg.method, headers: mergedHeaders, body: fetchBody, signal: controller.signal };
|
|
85
|
+
if (credentials)
|
|
86
|
+
init.credentials = credentials;
|
|
87
|
+
let response = await fetch(fullUrl, init);
|
|
88
|
+
if (timeoutId !== undefined)
|
|
89
|
+
clearTimeout(timeoutId);
|
|
90
|
+
if (onResponse)
|
|
91
|
+
response = await onResponse(response, cfg);
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
const error = createHttpError(`HTTP ${response.status}: ${response.statusText}`, cfg, response.status, response);
|
|
94
|
+
if (attempt < maxRetries && isRetryable(error)) {
|
|
95
|
+
lastError = error;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
onError?.(error);
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
const ct = response.headers.get('content-type') || '';
|
|
102
|
+
if (response.status === 204 || ct.length === 0)
|
|
103
|
+
return undefined;
|
|
104
|
+
if (ct.includes('application/json'))
|
|
105
|
+
return (await response.json());
|
|
106
|
+
return (await response.text());
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (timeoutId !== undefined)
|
|
110
|
+
clearTimeout(timeoutId);
|
|
111
|
+
if (error.name === 'HttpError')
|
|
112
|
+
throw error;
|
|
113
|
+
const isAbort = error instanceof DOMException && error.name === 'AbortError';
|
|
114
|
+
const msg = isAbort ? `Request timeout after ${timeout}ms` : `Network error: ${error.message}`;
|
|
115
|
+
const httpError = createHttpError(msg, cfg);
|
|
116
|
+
if (attempt < maxRetries && !isAbort) {
|
|
117
|
+
lastError = httpError;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
onError?.(httpError);
|
|
121
|
+
throw httpError;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
throw lastError;
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
get(url, config) { return request({ url, method: 'GET', headers: {}, ...config }); },
|
|
128
|
+
post(url, body, config) { return request({ url, method: 'POST', headers: {}, body, ...config }); },
|
|
129
|
+
put(url, body, config) { return request({ url, method: 'PUT', headers: {}, body, ...config }); },
|
|
130
|
+
patch(url, body, config) { return request({ url, method: 'PATCH', headers: {}, body, ...config }); },
|
|
131
|
+
delete(url, config) { return request({ url, method: 'DELETE', headers: {}, ...config }); },
|
|
132
|
+
request,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Internationalization
|
|
3
|
+
*
|
|
4
|
+
* Lightweight reactive i18n with locale switching, interpolation, and pluralization.
|
|
5
|
+
*/
|
|
6
|
+
export interface I18nOptions {
|
|
7
|
+
/** Initial locale, e.g. 'en' */
|
|
8
|
+
locale: string;
|
|
9
|
+
/** Fallback locale if key missing. Default: 'en' */
|
|
10
|
+
fallbackLocale?: string;
|
|
11
|
+
/** Messages keyed by locale, then by translation key */
|
|
12
|
+
messages: Record<string, Record<string, string>>;
|
|
13
|
+
}
|
|
14
|
+
export interface I18nInstance {
|
|
15
|
+
/** Translate a key with optional interpolation params */
|
|
16
|
+
t(key: string, params?: Record<string, string | number>): string;
|
|
17
|
+
/** Current locale */
|
|
18
|
+
readonly locale: string;
|
|
19
|
+
/** Switch to a new locale */
|
|
20
|
+
setLocale(locale: string): void;
|
|
21
|
+
/** Add messages for a locale at runtime */
|
|
22
|
+
addMessages(locale: string, messages: Record<string, string>): void;
|
|
23
|
+
/** Subscribe to locale changes. Returns unsubscribe function. */
|
|
24
|
+
subscribe(fn: (locale: string) => void): () => void;
|
|
25
|
+
}
|
|
26
|
+
/** Create a reactive i18n instance. */
|
|
27
|
+
export declare function createI18n(options: I18nOptions): I18nInstance;
|
|
28
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/i18n/i18n.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;IACjE,qBAAqB;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,2CAA2C;IAC3C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACpE,iEAAiE;IACjE,SAAS,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACrD;AAyCD,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,CA2C7D"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Internationalization
|
|
3
|
+
*
|
|
4
|
+
* Lightweight reactive i18n with locale switching, interpolation, and pluralization.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Interpolate `{param}` placeholders in a string.
|
|
8
|
+
*/
|
|
9
|
+
function interpolate(str, params) {
|
|
10
|
+
return str.replace(/\{(\w+)\}/g, (_, key) => {
|
|
11
|
+
return params[key] !== undefined ? String(params[key]) : `{${key}}`;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Handle pipe-based pluralization.
|
|
16
|
+
* Format: "singular|plural" or "zero|singular|plural"
|
|
17
|
+
* Requires a `count` param.
|
|
18
|
+
*/
|
|
19
|
+
function pluralize(str, params) {
|
|
20
|
+
if (!str.includes('|'))
|
|
21
|
+
return str;
|
|
22
|
+
const count = params.count !== undefined ? Number(params.count) : 1;
|
|
23
|
+
const forms = str.split('|');
|
|
24
|
+
if (forms.length === 2) {
|
|
25
|
+
return count === 1 ? forms[0] : forms[1];
|
|
26
|
+
}
|
|
27
|
+
if (forms.length >= 3) {
|
|
28
|
+
if (count === 0)
|
|
29
|
+
return forms[0];
|
|
30
|
+
if (count === 1)
|
|
31
|
+
return forms[1];
|
|
32
|
+
return forms[2];
|
|
33
|
+
}
|
|
34
|
+
return str;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Look up a key in a flat message map. Supports dot-notation keys directly
|
|
38
|
+
* (keys are stored flat, e.g. 'nav.home').
|
|
39
|
+
*/
|
|
40
|
+
function lookup(messages, key) {
|
|
41
|
+
if (!messages)
|
|
42
|
+
return undefined;
|
|
43
|
+
return messages[key];
|
|
44
|
+
}
|
|
45
|
+
/** Create a reactive i18n instance. */
|
|
46
|
+
export function createI18n(options) {
|
|
47
|
+
const { fallbackLocale = 'en' } = options;
|
|
48
|
+
const allMessages = { ...options.messages };
|
|
49
|
+
const subscribers = new Set();
|
|
50
|
+
let currentLocale = options.locale;
|
|
51
|
+
function resolve(key) {
|
|
52
|
+
return lookup(allMessages[currentLocale], key)
|
|
53
|
+
?? lookup(allMessages[fallbackLocale], key);
|
|
54
|
+
}
|
|
55
|
+
const instance = {
|
|
56
|
+
get locale() { return currentLocale; },
|
|
57
|
+
t(key, params) {
|
|
58
|
+
let value = resolve(key);
|
|
59
|
+
if (value === undefined)
|
|
60
|
+
return key;
|
|
61
|
+
if (params) {
|
|
62
|
+
value = pluralize(value, params);
|
|
63
|
+
value = interpolate(value, params);
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
},
|
|
67
|
+
setLocale(locale) {
|
|
68
|
+
if (locale === currentLocale)
|
|
69
|
+
return;
|
|
70
|
+
currentLocale = locale;
|
|
71
|
+
for (const fn of subscribers)
|
|
72
|
+
fn(locale);
|
|
73
|
+
},
|
|
74
|
+
addMessages(locale, messages) {
|
|
75
|
+
allMessages[locale] = { ...allMessages[locale], ...messages };
|
|
76
|
+
},
|
|
77
|
+
subscribe(fn) {
|
|
78
|
+
subscribers.add(fn);
|
|
79
|
+
return () => { subscribers.delete(fn); };
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
return instance;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/i18n/i18n.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Image Effects
|
|
3
|
+
*
|
|
4
|
+
* Canvas-based filters, color grading, grain overlays, and image processing.
|
|
5
|
+
*/
|
|
6
|
+
export type FilterType = 'grayscale' | 'sepia' | 'invert' | 'blur' | 'brightness' | 'contrast' | 'saturate' | 'hue-rotate' | 'grain' | 'vignette' | 'duotone' | 'posterize' | 'sharpen' | 'emboss' | 'tint';
|
|
7
|
+
export interface FilterOptions {
|
|
8
|
+
/** Filter type */
|
|
9
|
+
type: FilterType;
|
|
10
|
+
/** Intensity 0-1 (or degrees for hue-rotate). Default: 1 */
|
|
11
|
+
intensity?: number;
|
|
12
|
+
/** Additional color for duotone/tint (e.g. '#ff6600') */
|
|
13
|
+
color?: string;
|
|
14
|
+
/** Secondary color for duotone */
|
|
15
|
+
color2?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface FilterPipeline {
|
|
18
|
+
/** Add a filter to the pipeline */
|
|
19
|
+
add(filter: FilterOptions): FilterPipeline;
|
|
20
|
+
/** Apply all filters to a canvas/image */
|
|
21
|
+
apply(source: HTMLImageElement | HTMLCanvasElement): HTMLCanvasElement;
|
|
22
|
+
/** Apply all filters in-place to an existing canvas */
|
|
23
|
+
applyInPlace(canvas: HTMLCanvasElement): void;
|
|
24
|
+
/** Reset the pipeline */
|
|
25
|
+
clear(): FilterPipeline;
|
|
26
|
+
}
|
|
27
|
+
/** Apply a single filter to an image or canvas. Returns a new canvas. */
|
|
28
|
+
export declare function applyFilter(source: HTMLImageElement | HTMLCanvasElement, filter: FilterOptions): HTMLCanvasElement;
|
|
29
|
+
/** Create a composable filter pipeline. */
|
|
30
|
+
export declare function createFilterPipeline(): FilterPipeline;
|
|
31
|
+
/** Extract the dominant color from an image (average of center sample). */
|
|
32
|
+
export declare function extractDominantColor(source: HTMLImageElement | HTMLCanvasElement): string;
|
|
33
|
+
//# sourceMappingURL=effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../src/image/effects.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,UAAU,GAClB,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GACzC,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GACrD,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAC9C,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElC,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAAC;IAC3C,0CAA0C;IAC1C,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;IACvE,uDAAuD;IACvD,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC9C,yBAAyB;IACzB,KAAK,IAAI,cAAc,CAAC;CACzB;AAsMD,yEAAyE;AACzE,wBAAgB,WAAW,CACzB,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,EAC5C,MAAM,EAAE,aAAa,GACpB,iBAAiB,CAInB;AAED,2CAA2C;AAC3C,wBAAgB,oBAAoB,IAAI,cAAc,CAuBrD;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,GAC3C,MAAM,CA4BR"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Image Effects
|
|
3
|
+
*
|
|
4
|
+
* Canvas-based filters, color grading, grain overlays, and image processing.
|
|
5
|
+
*/
|
|
6
|
+
function hexToRgb(hex) {
|
|
7
|
+
const h = hex.replace('#', '');
|
|
8
|
+
return [
|
|
9
|
+
parseInt(h.slice(0, 2), 16),
|
|
10
|
+
parseInt(h.slice(2, 4), 16),
|
|
11
|
+
parseInt(h.slice(4, 6), 16),
|
|
12
|
+
];
|
|
13
|
+
}
|
|
14
|
+
function clamp(v) {
|
|
15
|
+
return Math.max(0, Math.min(255, v));
|
|
16
|
+
}
|
|
17
|
+
function getCanvas(source) {
|
|
18
|
+
if (source instanceof HTMLCanvasElement)
|
|
19
|
+
return source;
|
|
20
|
+
const canvas = document.createElement('canvas');
|
|
21
|
+
canvas.width = source.naturalWidth || source.width;
|
|
22
|
+
canvas.height = source.naturalHeight || source.height;
|
|
23
|
+
const ctx = canvas.getContext('2d');
|
|
24
|
+
ctx.drawImage(source, 0, 0);
|
|
25
|
+
return canvas;
|
|
26
|
+
}
|
|
27
|
+
function processPixels(canvas, fn) {
|
|
28
|
+
const ctx = canvas.getContext('2d');
|
|
29
|
+
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
30
|
+
fn(imageData.data, canvas.width, canvas.height);
|
|
31
|
+
ctx.putImageData(imageData, 0, 0);
|
|
32
|
+
}
|
|
33
|
+
function applyCSS(canvas, filter) {
|
|
34
|
+
const temp = document.createElement('canvas');
|
|
35
|
+
temp.width = canvas.width;
|
|
36
|
+
temp.height = canvas.height;
|
|
37
|
+
const ctx = temp.getContext('2d');
|
|
38
|
+
ctx.filter = filter;
|
|
39
|
+
ctx.drawImage(canvas, 0, 0);
|
|
40
|
+
const destCtx = canvas.getContext('2d');
|
|
41
|
+
destCtx.clearRect(0, 0, canvas.width, canvas.height);
|
|
42
|
+
destCtx.drawImage(temp, 0, 0);
|
|
43
|
+
}
|
|
44
|
+
function applySingleFilter(canvas, opts) {
|
|
45
|
+
const intensity = opts.intensity ?? 1;
|
|
46
|
+
switch (opts.type) {
|
|
47
|
+
case 'grayscale':
|
|
48
|
+
applyCSS(canvas, `grayscale(${intensity})`);
|
|
49
|
+
break;
|
|
50
|
+
case 'sepia':
|
|
51
|
+
applyCSS(canvas, `sepia(${intensity})`);
|
|
52
|
+
break;
|
|
53
|
+
case 'invert':
|
|
54
|
+
applyCSS(canvas, `invert(${intensity})`);
|
|
55
|
+
break;
|
|
56
|
+
case 'blur':
|
|
57
|
+
applyCSS(canvas, `blur(${intensity * 10}px)`);
|
|
58
|
+
break;
|
|
59
|
+
case 'brightness':
|
|
60
|
+
applyCSS(canvas, `brightness(${0.5 + intensity})`);
|
|
61
|
+
break;
|
|
62
|
+
case 'contrast':
|
|
63
|
+
applyCSS(canvas, `contrast(${0.5 + intensity})`);
|
|
64
|
+
break;
|
|
65
|
+
case 'saturate':
|
|
66
|
+
applyCSS(canvas, `saturate(${intensity * 2})`);
|
|
67
|
+
break;
|
|
68
|
+
case 'hue-rotate':
|
|
69
|
+
applyCSS(canvas, `hue-rotate(${intensity}deg)`);
|
|
70
|
+
break;
|
|
71
|
+
case 'grain':
|
|
72
|
+
processPixels(canvas, (data) => {
|
|
73
|
+
const amount = intensity * 50;
|
|
74
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
75
|
+
const noise = (Math.random() - 0.5) * amount;
|
|
76
|
+
data[i] = clamp(data[i] + noise);
|
|
77
|
+
data[i + 1] = clamp(data[i + 1] + noise);
|
|
78
|
+
data[i + 2] = clamp(data[i + 2] + noise);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
break;
|
|
82
|
+
case 'vignette': {
|
|
83
|
+
const ctx = canvas.getContext('2d');
|
|
84
|
+
const cx = canvas.width / 2;
|
|
85
|
+
const cy = canvas.height / 2;
|
|
86
|
+
const radius = Math.max(cx, cy) * (1.2 - intensity * 0.4);
|
|
87
|
+
const gradient = ctx.createRadialGradient(cx, cy, radius * 0.3, cx, cy, radius);
|
|
88
|
+
gradient.addColorStop(0, 'rgba(0,0,0,0)');
|
|
89
|
+
gradient.addColorStop(1, `rgba(0,0,0,${intensity * 0.8})`);
|
|
90
|
+
ctx.fillStyle = gradient;
|
|
91
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 'duotone': {
|
|
95
|
+
const [r1, g1, b1] = hexToRgb(opts.color ?? '#000000');
|
|
96
|
+
const [r2, g2, b2] = hexToRgb(opts.color2 ?? '#ffffff');
|
|
97
|
+
processPixels(canvas, (data) => {
|
|
98
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
99
|
+
const lum = (data[i] * 0.299 + data[i + 1] * 0.587 + data[i + 2] * 0.114) / 255;
|
|
100
|
+
data[i] = clamp(r1 + (r2 - r1) * lum);
|
|
101
|
+
data[i + 1] = clamp(g1 + (g2 - g1) * lum);
|
|
102
|
+
data[i + 2] = clamp(b1 + (b2 - b1) * lum);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case 'posterize': {
|
|
108
|
+
const levels = Math.max(2, Math.round(intensity * 8));
|
|
109
|
+
const step = 255 / (levels - 1);
|
|
110
|
+
processPixels(canvas, (data) => {
|
|
111
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
112
|
+
data[i] = Math.round(data[i] / step) * step;
|
|
113
|
+
data[i + 1] = Math.round(data[i + 1] / step) * step;
|
|
114
|
+
data[i + 2] = Math.round(data[i + 2] / step) * step;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case 'sharpen': {
|
|
120
|
+
const ctx = canvas.getContext('2d');
|
|
121
|
+
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
122
|
+
const src = new Uint8ClampedArray(imageData.data);
|
|
123
|
+
const w = canvas.width;
|
|
124
|
+
const amount = intensity * 2;
|
|
125
|
+
// Unsharp mask: sharpen = original + amount * (original - blur)
|
|
126
|
+
// Simplified 3x3 kernel
|
|
127
|
+
const kernel = [0, -amount, 0, -amount, 1 + 4 * amount, -amount, 0, -amount, 0];
|
|
128
|
+
for (let y = 1; y < canvas.height - 1; y++) {
|
|
129
|
+
for (let x = 1; x < w - 1; x++) {
|
|
130
|
+
for (let c = 0; c < 3; c++) {
|
|
131
|
+
let sum = 0;
|
|
132
|
+
for (let ky = -1; ky <= 1; ky++) {
|
|
133
|
+
for (let kx = -1; kx <= 1; kx++) {
|
|
134
|
+
sum += src[((y + ky) * w + (x + kx)) * 4 + c] * kernel[(ky + 1) * 3 + (kx + 1)];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
imageData.data[(y * w + x) * 4 + c] = clamp(sum);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
ctx.putImageData(imageData, 0, 0);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
case 'emboss': {
|
|
145
|
+
const ctx = canvas.getContext('2d');
|
|
146
|
+
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
147
|
+
const src = new Uint8ClampedArray(imageData.data);
|
|
148
|
+
const w = canvas.width;
|
|
149
|
+
const kernel = [-2 * intensity, -intensity, 0, -intensity, 1, intensity, 0, intensity, 2 * intensity];
|
|
150
|
+
for (let y = 1; y < canvas.height - 1; y++) {
|
|
151
|
+
for (let x = 1; x < w - 1; x++) {
|
|
152
|
+
for (let c = 0; c < 3; c++) {
|
|
153
|
+
let sum = 128;
|
|
154
|
+
for (let ky = -1; ky <= 1; ky++) {
|
|
155
|
+
for (let kx = -1; kx <= 1; kx++) {
|
|
156
|
+
sum += src[((y + ky) * w + (x + kx)) * 4 + c] * kernel[(ky + 1) * 3 + (kx + 1)];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
imageData.data[(y * w + x) * 4 + c] = clamp(sum);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
ctx.putImageData(imageData, 0, 0);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
case 'tint': {
|
|
167
|
+
const [r, g, b] = hexToRgb(opts.color ?? '#ff6600');
|
|
168
|
+
processPixels(canvas, (data) => {
|
|
169
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
170
|
+
data[i] = clamp(data[i] * (1 - intensity) + r * intensity);
|
|
171
|
+
data[i + 1] = clamp(data[i + 1] * (1 - intensity) + g * intensity);
|
|
172
|
+
data[i + 2] = clamp(data[i + 2] * (1 - intensity) + b * intensity);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** Apply a single filter to an image or canvas. Returns a new canvas. */
|
|
180
|
+
export function applyFilter(source, filter) {
|
|
181
|
+
const canvas = getCanvas(source);
|
|
182
|
+
applySingleFilter(canvas, filter);
|
|
183
|
+
return canvas;
|
|
184
|
+
}
|
|
185
|
+
/** Create a composable filter pipeline. */
|
|
186
|
+
export function createFilterPipeline() {
|
|
187
|
+
const filters = [];
|
|
188
|
+
const pipeline = {
|
|
189
|
+
add(filter) {
|
|
190
|
+
filters.push(filter);
|
|
191
|
+
return pipeline;
|
|
192
|
+
},
|
|
193
|
+
apply(source) {
|
|
194
|
+
const canvas = getCanvas(source);
|
|
195
|
+
for (const f of filters)
|
|
196
|
+
applySingleFilter(canvas, f);
|
|
197
|
+
return canvas;
|
|
198
|
+
},
|
|
199
|
+
applyInPlace(canvas) {
|
|
200
|
+
for (const f of filters)
|
|
201
|
+
applySingleFilter(canvas, f);
|
|
202
|
+
},
|
|
203
|
+
clear() {
|
|
204
|
+
filters.length = 0;
|
|
205
|
+
return pipeline;
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
return pipeline;
|
|
209
|
+
}
|
|
210
|
+
/** Extract the dominant color from an image (average of center sample). */
|
|
211
|
+
export function extractDominantColor(source) {
|
|
212
|
+
const canvas = document.createElement('canvas');
|
|
213
|
+
const size = 10;
|
|
214
|
+
canvas.width = size;
|
|
215
|
+
canvas.height = size;
|
|
216
|
+
const ctx = canvas.getContext('2d');
|
|
217
|
+
if (source instanceof HTMLImageElement) {
|
|
218
|
+
ctx.drawImage(source, 0, 0, size, size);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
ctx.drawImage(source, 0, 0, size, size);
|
|
222
|
+
}
|
|
223
|
+
const data = ctx.getImageData(0, 0, size, size).data;
|
|
224
|
+
let r = 0, g = 0, b = 0;
|
|
225
|
+
const pixels = size * size;
|
|
226
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
227
|
+
r += data[i];
|
|
228
|
+
g += data[i + 1];
|
|
229
|
+
b += data[i + 2];
|
|
230
|
+
}
|
|
231
|
+
r = Math.round(r / pixels);
|
|
232
|
+
g = Math.round(g / pixels);
|
|
233
|
+
b = Math.round(b / pixels);
|
|
234
|
+
return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../src/image/effects.ts"],"names":[],"mappings":"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"}
|