@useavalon/avalon 0.1.11 → 0.1.13
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/README.md +54 -54
- package/mod.ts +302 -302
- package/package.json +49 -26
- package/src/build/integration-bundler-plugin.ts +116 -116
- package/src/build/integration-config.ts +168 -168
- package/src/build/integration-detection-plugin.ts +117 -117
- package/src/build/integration-resolver-plugin.ts +90 -90
- package/src/build/island-manifest.ts +269 -269
- package/src/build/island-types-generator.ts +476 -476
- package/src/build/mdx-island-transform.ts +464 -464
- package/src/build/mdx-plugin.ts +98 -98
- package/src/build/page-island-transform.ts +598 -598
- package/src/build/prop-extractors/index.ts +21 -21
- package/src/build/prop-extractors/lit.ts +140 -140
- package/src/build/prop-extractors/qwik.ts +16 -16
- package/src/build/prop-extractors/solid.ts +125 -125
- package/src/build/prop-extractors/svelte.ts +194 -194
- package/src/build/prop-extractors/vue.ts +111 -111
- package/src/build/sidecar-file-manager.ts +104 -104
- package/src/build/sidecar-renderer.ts +30 -30
- package/src/client/adapters/index.ts +21 -13
- package/src/client/components.ts +35 -35
- package/src/client/css-hmr-handler.ts +344 -344
- package/src/client/framework-adapter.ts +462 -462
- package/src/client/hmr-coordinator.ts +396 -396
- package/src/client/hmr-error-overlay.js +533 -533
- package/src/client/main.js +824 -816
- package/src/client/types/framework-runtime.d.ts +68 -68
- package/src/client/types/vite-hmr.d.ts +46 -46
- package/src/client/types/vite-virtual-modules.d.ts +70 -60
- package/src/components/Image.tsx +123 -123
- package/src/components/IslandErrorBoundary.tsx +145 -145
- package/src/components/LayoutDataErrorBoundary.tsx +141 -141
- package/src/components/LayoutErrorBoundary.tsx +127 -127
- package/src/components/PersistentIsland.tsx +52 -52
- package/src/components/StreamingErrorBoundary.tsx +233 -233
- package/src/components/StreamingLayout.tsx +538 -538
- package/src/core/components/component-analyzer.ts +192 -192
- package/src/core/components/component-detection.ts +508 -508
- package/src/core/components/enhanced-framework-detector.ts +500 -500
- package/src/core/components/framework-registry.ts +563 -563
- package/src/core/content/mdx-processor.ts +46 -46
- package/src/core/integrations/index.ts +19 -19
- package/src/core/integrations/loader.ts +125 -125
- package/src/core/integrations/registry.ts +175 -175
- package/src/core/islands/island-persistence.ts +325 -325
- package/src/core/islands/island-state-serializer.ts +258 -258
- package/src/core/islands/persistent-island-context.tsx +80 -80
- package/src/core/islands/use-persistent-state.ts +68 -68
- package/src/core/layout/enhanced-layout-resolver.ts +322 -322
- package/src/core/layout/layout-cache-manager.ts +485 -485
- package/src/core/layout/layout-composer.ts +357 -357
- package/src/core/layout/layout-data-loader.ts +516 -516
- package/src/core/layout/layout-discovery.ts +243 -243
- package/src/core/layout/layout-matcher.ts +299 -299
- package/src/core/layout/layout-types.ts +110 -110
- package/src/core/modules/framework-module-resolver.ts +273 -273
- package/src/islands/component-analysis.ts +213 -213
- package/src/islands/css-utils.ts +565 -565
- package/src/islands/discovery/index.ts +80 -80
- package/src/islands/discovery/registry.ts +340 -340
- package/src/islands/discovery/resolver.ts +477 -477
- package/src/islands/discovery/scanner.ts +386 -386
- package/src/islands/discovery/types.ts +117 -117
- package/src/islands/discovery/validator.ts +544 -544
- package/src/islands/discovery/watcher.ts +368 -368
- package/src/islands/framework-detection.ts +428 -428
- package/src/islands/integration-loader.ts +490 -490
- package/src/islands/island.tsx +565 -565
- package/src/islands/render-cache.ts +550 -550
- package/src/islands/types.ts +80 -80
- package/src/islands/universal-css-collector.ts +157 -157
- package/src/islands/universal-head-collector.ts +137 -137
- package/src/layout-system.d.ts +592 -592
- package/src/layout-system.ts +218 -218
- package/src/middleware/discovery.ts +268 -268
- package/src/middleware/executor.ts +315 -315
- package/src/middleware/index.ts +76 -76
- package/src/middleware/types.ts +99 -99
- package/src/nitro/build-config.ts +575 -575
- package/src/nitro/config.ts +483 -483
- package/src/nitro/error-handler.ts +636 -636
- package/src/nitro/index.ts +173 -173
- package/src/nitro/island-manifest.ts +584 -584
- package/src/nitro/middleware-adapter.ts +260 -260
- package/src/nitro/renderer.ts +1471 -1471
- package/src/nitro/route-discovery.ts +439 -439
- package/src/nitro/types.ts +321 -321
- package/src/render/collect-css.ts +198 -198
- package/src/render/error-pages.ts +79 -79
- package/src/render/isolated-ssr-renderer.ts +654 -654
- package/src/render/ssr.ts +1030 -1030
- package/src/schemas/api.ts +30 -30
- package/src/schemas/core.ts +64 -64
- package/src/schemas/index.ts +212 -212
- package/src/schemas/layout.ts +279 -279
- package/src/schemas/routing/index.ts +38 -38
- package/src/schemas/routing.ts +376 -376
- package/src/types/as-island.ts +20 -20
- package/src/types/image.d.ts +106 -106
- package/src/types/index.d.ts +22 -22
- package/src/types/island-jsx.d.ts +33 -33
- package/src/types/island-prop.d.ts +20 -20
- package/src/types/layout.ts +285 -285
- package/src/types/mdx.d.ts +6 -6
- package/src/types/routing.ts +555 -555
- package/src/types/types.ts +5 -5
- package/src/types/urlpattern.d.ts +49 -49
- package/src/types/vite-env.d.ts +11 -11
- package/src/utils/dev-logger.ts +299 -299
- package/src/utils/fs.ts +151 -151
- package/src/vite-plugin/auto-discover.ts +551 -551
- package/src/vite-plugin/config.ts +266 -266
- package/src/vite-plugin/errors.ts +127 -127
- package/src/vite-plugin/image-optimization.ts +156 -156
- package/src/vite-plugin/integration-activator.ts +126 -126
- package/src/vite-plugin/island-sidecar-plugin.ts +176 -176
- package/src/vite-plugin/module-discovery.ts +189 -189
- package/src/vite-plugin/nitro-integration.ts +1354 -1354
- package/src/vite-plugin/plugin.ts +403 -409
- package/src/vite-plugin/types.ts +327 -327
- package/src/vite-plugin/validation.ts +228 -228
- package/src/client/adapters/index.js +0 -12
- package/src/client/adapters/lit-adapter.js +0 -467
- package/src/client/adapters/lit-adapter.ts +0 -654
- package/src/client/adapters/preact-adapter.js +0 -223
- package/src/client/adapters/preact-adapter.ts +0 -331
- package/src/client/adapters/qwik-adapter.js +0 -259
- package/src/client/adapters/qwik-adapter.ts +0 -345
- package/src/client/adapters/react-adapter.js +0 -220
- package/src/client/adapters/react-adapter.ts +0 -353
- package/src/client/adapters/solid-adapter.js +0 -295
- package/src/client/adapters/solid-adapter.ts +0 -451
- package/src/client/adapters/svelte-adapter.js +0 -368
- package/src/client/adapters/svelte-adapter.ts +0 -524
- package/src/client/adapters/vue-adapter.js +0 -278
- package/src/client/adapters/vue-adapter.ts +0 -467
- package/src/client/components.js +0 -23
- package/src/client/css-hmr-handler.js +0 -263
- package/src/client/framework-adapter.js +0 -283
- package/src/client/hmr-coordinator.js +0 -274
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type declarations for framework runtime imports
|
|
3
|
-
*
|
|
4
|
-
* These are dynamic imports that are resolved by Vite at runtime in the browser.
|
|
5
|
-
* The actual packages are provided by the user's project dependencies.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
declare module 'react' {
|
|
9
|
-
export function createElement<P = Record<string, unknown>>(
|
|
10
|
-
component: unknown,
|
|
11
|
-
props: P | null,
|
|
12
|
-
...children: unknown[]
|
|
13
|
-
): unknown;
|
|
14
|
-
export const version: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
declare module 'react-dom/client' {
|
|
18
|
-
export interface Root {
|
|
19
|
-
render(element: unknown): void;
|
|
20
|
-
unmount(): void;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function hydrateRoot(
|
|
24
|
-
container: HTMLElement,
|
|
25
|
-
element: unknown,
|
|
26
|
-
options?: {
|
|
27
|
-
onRecoverableError?: (error: Error) => void;
|
|
28
|
-
}
|
|
29
|
-
): Root;
|
|
30
|
-
|
|
31
|
-
export function createRoot(container: HTMLElement): Root;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
declare module 'vue' {
|
|
35
|
-
export interface App {
|
|
36
|
-
mount(rootContainer: HTMLElement | string, isHydrate?: boolean): unknown;
|
|
37
|
-
unmount(): void;
|
|
38
|
-
use(plugin: unknown, ...options: unknown[]): App;
|
|
39
|
-
component(name: string, component: unknown): App;
|
|
40
|
-
directive(name: string, directive: unknown): App;
|
|
41
|
-
provide(key: string | symbol, value: unknown): App;
|
|
42
|
-
config: {
|
|
43
|
-
errorHandler?: (err: Error, instance: unknown, info: string) => void;
|
|
44
|
-
warnHandler?: (msg: string, instance: unknown, trace: string) => void;
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function createApp(rootComponent: unknown, rootProps?: Record<string, unknown>): App;
|
|
49
|
-
export const version: string;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
declare module 'svelte' {
|
|
54
|
-
export interface SvelteComponent {
|
|
55
|
-
new (options: {
|
|
56
|
-
target: HTMLElement;
|
|
57
|
-
props?: Record<string, unknown>;
|
|
58
|
-
hydrate?: boolean;
|
|
59
|
-
intro?: boolean;
|
|
60
|
-
anchor?: Element | null;
|
|
61
|
-
context?: Map<unknown, unknown>;
|
|
62
|
-
}): {
|
|
63
|
-
$set(props: Record<string, unknown>): void;
|
|
64
|
-
$destroy(): void;
|
|
65
|
-
$on?(event: string, handler: (...args: unknown[]) => void): () => void;
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Type declarations for framework runtime imports
|
|
3
|
+
*
|
|
4
|
+
* These are dynamic imports that are resolved by Vite at runtime in the browser.
|
|
5
|
+
* The actual packages are provided by the user's project dependencies.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
declare module 'react' {
|
|
9
|
+
export function createElement<P = Record<string, unknown>>(
|
|
10
|
+
component: unknown,
|
|
11
|
+
props: P | null,
|
|
12
|
+
...children: unknown[]
|
|
13
|
+
): unknown;
|
|
14
|
+
export const version: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
declare module 'react-dom/client' {
|
|
18
|
+
export interface Root {
|
|
19
|
+
render(element: unknown): void;
|
|
20
|
+
unmount(): void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function hydrateRoot(
|
|
24
|
+
container: HTMLElement,
|
|
25
|
+
element: unknown,
|
|
26
|
+
options?: {
|
|
27
|
+
onRecoverableError?: (error: Error) => void;
|
|
28
|
+
}
|
|
29
|
+
): Root;
|
|
30
|
+
|
|
31
|
+
export function createRoot(container: HTMLElement): Root;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare module 'vue' {
|
|
35
|
+
export interface App {
|
|
36
|
+
mount(rootContainer: HTMLElement | string, isHydrate?: boolean): unknown;
|
|
37
|
+
unmount(): void;
|
|
38
|
+
use(plugin: unknown, ...options: unknown[]): App;
|
|
39
|
+
component(name: string, component: unknown): App;
|
|
40
|
+
directive(name: string, directive: unknown): App;
|
|
41
|
+
provide(key: string | symbol, value: unknown): App;
|
|
42
|
+
config: {
|
|
43
|
+
errorHandler?: (err: Error, instance: unknown, info: string) => void;
|
|
44
|
+
warnHandler?: (msg: string, instance: unknown, trace: string) => void;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function createApp(rootComponent: unknown, rootProps?: Record<string, unknown>): App;
|
|
49
|
+
export const version: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
declare module 'svelte' {
|
|
54
|
+
export interface SvelteComponent {
|
|
55
|
+
new (options: {
|
|
56
|
+
target: HTMLElement;
|
|
57
|
+
props?: Record<string, unknown>;
|
|
58
|
+
hydrate?: boolean;
|
|
59
|
+
intro?: boolean;
|
|
60
|
+
anchor?: Element | null;
|
|
61
|
+
context?: Map<unknown, unknown>;
|
|
62
|
+
}): {
|
|
63
|
+
$set(props: Record<string, unknown>): void;
|
|
64
|
+
$destroy(): void;
|
|
65
|
+
$on?(event: string, handler: (...args: unknown[]) => void): () => void;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type definitions for Vite HMR API
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
declare module 'vite/types/hmrPayload' {
|
|
6
|
-
export interface HMRPayload {
|
|
7
|
-
type: 'update' | 'full-reload' | 'prune' | 'error' | 'connected' | 'custom';
|
|
8
|
-
updates?: Update[];
|
|
9
|
-
timestamp?: number;
|
|
10
|
-
path?: string;
|
|
11
|
-
err?: Error;
|
|
12
|
-
data?: unknown;
|
|
13
|
-
event?: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface Update {
|
|
17
|
-
type: 'js-update' | 'css-update';
|
|
18
|
-
path: string;
|
|
19
|
-
acceptedPath: string;
|
|
20
|
-
timestamp: number;
|
|
21
|
-
explicitImportRequired?: boolean;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
declare global {
|
|
26
|
-
interface ImportMeta {
|
|
27
|
-
hot?: {
|
|
28
|
-
accept(): void;
|
|
29
|
-
accept(cb: (mod: unknown) => void): void;
|
|
30
|
-
accept(dep: string, cb: (mod: unknown) => void): void;
|
|
31
|
-
accept(deps: readonly string[], cb: (mods: unknown[]) => void): void;
|
|
32
|
-
|
|
33
|
-
dispose(cb: (data: unknown) => void): void;
|
|
34
|
-
decline(): void;
|
|
35
|
-
invalidate(): void;
|
|
36
|
-
|
|
37
|
-
on(event: string, cb: (payload: unknown) => void): void;
|
|
38
|
-
off(event: string, cb: (payload: unknown) => void): void;
|
|
39
|
-
send(event: string, data?: unknown): void;
|
|
40
|
-
|
|
41
|
-
data: unknown;
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export {};
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for Vite HMR API
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
declare module 'vite/types/hmrPayload' {
|
|
6
|
+
export interface HMRPayload {
|
|
7
|
+
type: 'update' | 'full-reload' | 'prune' | 'error' | 'connected' | 'custom';
|
|
8
|
+
updates?: Update[];
|
|
9
|
+
timestamp?: number;
|
|
10
|
+
path?: string;
|
|
11
|
+
err?: Error;
|
|
12
|
+
data?: unknown;
|
|
13
|
+
event?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface Update {
|
|
17
|
+
type: 'js-update' | 'css-update';
|
|
18
|
+
path: string;
|
|
19
|
+
acceptedPath: string;
|
|
20
|
+
timestamp: number;
|
|
21
|
+
explicitImportRequired?: boolean;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare global {
|
|
26
|
+
interface ImportMeta {
|
|
27
|
+
hot?: {
|
|
28
|
+
accept(): void;
|
|
29
|
+
accept(cb: (mod: unknown) => void): void;
|
|
30
|
+
accept(dep: string, cb: (mod: unknown) => void): void;
|
|
31
|
+
accept(deps: readonly string[], cb: (mods: unknown[]) => void): void;
|
|
32
|
+
|
|
33
|
+
dispose(cb: (data: unknown) => void): void;
|
|
34
|
+
decline(): void;
|
|
35
|
+
invalidate(): void;
|
|
36
|
+
|
|
37
|
+
on(event: string, cb: (payload: unknown) => void): void;
|
|
38
|
+
off(event: string, cb: (payload: unknown) => void): void;
|
|
39
|
+
send(event: string, data?: unknown): void;
|
|
40
|
+
|
|
41
|
+
data: unknown;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export {};
|
|
@@ -1,60 +1,70 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type declarations for Vite virtual modules
|
|
3
|
-
*
|
|
4
|
-
* These modules are resolved by Vite at runtime in the browser.
|
|
5
|
-
* They don't exist as actual files but are provided by Vite's plugin system.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
declare module '/@useavalon/preact/client' {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
declare module '/@useavalon/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Type declarations for Vite virtual modules
|
|
3
|
+
*
|
|
4
|
+
* These modules are resolved by Vite at runtime in the browser.
|
|
5
|
+
* They don't exist as actual files but are provided by Vite's plugin system.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
declare module '/@useavalon/preact/client' {
|
|
9
|
+
export function hydrate(container: Element, component: unknown, props?: Record<string, unknown>): void;
|
|
10
|
+
export function getHydrationScript(): string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare module '/@useavalon/react/client' {
|
|
14
|
+
export function hydrate(container: Element, component: unknown, props?: Record<string, unknown>): void;
|
|
15
|
+
export function getHydrationScript(): string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
declare module '/@useavalon/vue/client' {
|
|
19
|
+
export function hydrate(container: Element, component: unknown, props?: Record<string, unknown>): void;
|
|
20
|
+
export function getHydrationScript(): string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
declare module '/@useavalon/svelte/client' {
|
|
24
|
+
export function hydrate(container: Element, component: unknown, props?: Record<string, unknown>): void;
|
|
25
|
+
export function getHydrationScript(): string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
declare module '/@useavalon/solid/client' {
|
|
29
|
+
export function hydrate(container: Element, component: unknown, props?: Record<string, unknown>): void;
|
|
30
|
+
export function getHydrationScript(): string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
declare module '/@useavalon/lit/client' {
|
|
34
|
+
export function hydrate(container: Element, component: unknown, props?: Record<string, unknown>): void;
|
|
35
|
+
export function getHydrationScript(): string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
declare module '/@useavalon/qwik/client' {
|
|
39
|
+
export function hydrate(container: Element, component: unknown, props?: Record<string, unknown>): void;
|
|
40
|
+
export function getHydrationScript(): string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// HMR adapter virtual modules
|
|
44
|
+
declare module '/@useavalon/react/client/hmr' {
|
|
45
|
+
export { reactAdapter } from '@useavalon/react/client/hmr';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare module '/@useavalon/preact/client/hmr' {
|
|
49
|
+
export { preactAdapter } from '@useavalon/preact/client/hmr';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
declare module '/@useavalon/vue/client/hmr' {
|
|
53
|
+
export { vueAdapter } from '@useavalon/vue/client/hmr';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
declare module '/@useavalon/svelte/client/hmr' {
|
|
57
|
+
export { svelteAdapter } from '@useavalon/svelte/client/hmr';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
declare module '/@useavalon/solid/client/hmr' {
|
|
61
|
+
export { solidAdapter } from '@useavalon/solid/client/hmr';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
declare module '/@useavalon/lit/client/hmr' {
|
|
65
|
+
export { litAdapter } from '@useavalon/lit/client/hmr';
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
declare module '/@useavalon/qwik/client/hmr' {
|
|
69
|
+
export { qwikAdapter } from '@useavalon/qwik/client/hmr';
|
|
70
|
+
}
|
package/src/components/Image.tsx
CHANGED
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Image Component for Avalon
|
|
3
|
-
*
|
|
4
|
-
* A responsive image component that works with vite-imagetools to provide
|
|
5
|
-
* optimized images with automatic srcset generation.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* ```tsx
|
|
9
|
-
* import { Image } from '@useavalon/avalon/client';
|
|
10
|
-
* import heroSrc from './hero.jpg?w=400;800;1200&format=webp&as=srcset';
|
|
11
|
-
*
|
|
12
|
-
* <Image
|
|
13
|
-
* src={heroSrc}
|
|
14
|
-
* alt="Hero image"
|
|
15
|
-
* sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
|
|
16
|
-
* />
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* Or with the simpler single-image approach:
|
|
20
|
-
* ```tsx
|
|
21
|
-
* import heroSrc from './hero.jpg?w=800&format=webp';
|
|
22
|
-
*
|
|
23
|
-
* <Image src={heroSrc} alt="Hero image" width={800} height={600} />
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
import type { JSX } from "preact";
|
|
28
|
-
|
|
29
|
-
export interface ImageProps {
|
|
30
|
-
/**
|
|
31
|
-
* Image source - can be:
|
|
32
|
-
* - A string URL (single image)
|
|
33
|
-
* - A srcset string from ?as=srcset (contains " Xw" width descriptors)
|
|
34
|
-
* - An object with src/srcset/width/height from vite-imagetools
|
|
35
|
-
*/
|
|
36
|
-
src: string | { src: string; srcset?: string; width?: number; height?: number };
|
|
37
|
-
|
|
38
|
-
/** Alt text for accessibility (required) */
|
|
39
|
-
alt: string;
|
|
40
|
-
|
|
41
|
-
/** Sizes attribute for responsive images (required when using srcset) */
|
|
42
|
-
sizes?: string;
|
|
43
|
-
|
|
44
|
-
/** Loading strategy */
|
|
45
|
-
loading?: "lazy" | "eager";
|
|
46
|
-
|
|
47
|
-
/** Decoding hint */
|
|
48
|
-
decoding?: "async" | "sync" | "auto";
|
|
49
|
-
|
|
50
|
-
/** Optional width (auto-detected from srcset if available) */
|
|
51
|
-
width?: number | string;
|
|
52
|
-
|
|
53
|
-
/** Optional height (auto-detected from srcset if available) */
|
|
54
|
-
height?: number | string;
|
|
55
|
-
|
|
56
|
-
/** CSS class name */
|
|
57
|
-
className?: string;
|
|
58
|
-
|
|
59
|
-
/** Inline styles */
|
|
60
|
-
style?: string | Record<string, string | number>;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Check if a string looks like a srcset (contains width descriptors like "400w")
|
|
65
|
-
*/
|
|
66
|
-
function isSrcsetString(value: string): boolean {
|
|
67
|
-
return /\s\d+w/.test(value);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Responsive image component with built-in optimization support
|
|
72
|
-
*/
|
|
73
|
-
export function Image({
|
|
74
|
-
src,
|
|
75
|
-
alt,
|
|
76
|
-
sizes,
|
|
77
|
-
loading = "lazy",
|
|
78
|
-
decoding = "async",
|
|
79
|
-
width,
|
|
80
|
-
height,
|
|
81
|
-
className,
|
|
82
|
-
style,
|
|
83
|
-
}: Readonly<ImageProps>): JSX.Element {
|
|
84
|
-
let imgSrc: string | undefined;
|
|
85
|
-
let srcSet: string | undefined;
|
|
86
|
-
let autoWidth: number | undefined;
|
|
87
|
-
let autoHeight: number | undefined;
|
|
88
|
-
|
|
89
|
-
if (typeof src === "object" && src !== null) {
|
|
90
|
-
// Object from vite-imagetools (e.g., ?as=metadata or custom output)
|
|
91
|
-
imgSrc = src.src;
|
|
92
|
-
srcSet = src.srcset;
|
|
93
|
-
autoWidth = src.width;
|
|
94
|
-
autoHeight = src.height;
|
|
95
|
-
} else if (typeof src === "string") {
|
|
96
|
-
if (isSrcsetString(src)) {
|
|
97
|
-
// srcset string from ?as=srcset - use first URL as fallback src
|
|
98
|
-
srcSet = src;
|
|
99
|
-
const firstUrl = src.split(",")[0]?.trim().split(" ")[0];
|
|
100
|
-
imgSrc = firstUrl;
|
|
101
|
-
} else {
|
|
102
|
-
// Regular URL string
|
|
103
|
-
imgSrc = src;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return (
|
|
108
|
-
<img
|
|
109
|
-
src={imgSrc}
|
|
110
|
-
srcSet={srcSet}
|
|
111
|
-
sizes={sizes}
|
|
112
|
-
alt={alt}
|
|
113
|
-
loading={loading}
|
|
114
|
-
decoding={decoding}
|
|
115
|
-
width={width ?? autoWidth}
|
|
116
|
-
height={height ?? autoHeight}
|
|
117
|
-
className={className}
|
|
118
|
-
style={style}
|
|
119
|
-
/>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export default Image;
|
|
1
|
+
/**
|
|
2
|
+
* Image Component for Avalon
|
|
3
|
+
*
|
|
4
|
+
* A responsive image component that works with vite-imagetools to provide
|
|
5
|
+
* optimized images with automatic srcset generation.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { Image } from '@useavalon/avalon/client';
|
|
10
|
+
* import heroSrc from './hero.jpg?w=400;800;1200&format=webp&as=srcset';
|
|
11
|
+
*
|
|
12
|
+
* <Image
|
|
13
|
+
* src={heroSrc}
|
|
14
|
+
* alt="Hero image"
|
|
15
|
+
* sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
|
|
16
|
+
* />
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Or with the simpler single-image approach:
|
|
20
|
+
* ```tsx
|
|
21
|
+
* import heroSrc from './hero.jpg?w=800&format=webp';
|
|
22
|
+
*
|
|
23
|
+
* <Image src={heroSrc} alt="Hero image" width={800} height={600} />
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import type { JSX } from "preact";
|
|
28
|
+
|
|
29
|
+
export interface ImageProps {
|
|
30
|
+
/**
|
|
31
|
+
* Image source - can be:
|
|
32
|
+
* - A string URL (single image)
|
|
33
|
+
* - A srcset string from ?as=srcset (contains " Xw" width descriptors)
|
|
34
|
+
* - An object with src/srcset/width/height from vite-imagetools
|
|
35
|
+
*/
|
|
36
|
+
src: string | { src: string; srcset?: string; width?: number; height?: number };
|
|
37
|
+
|
|
38
|
+
/** Alt text for accessibility (required) */
|
|
39
|
+
alt: string;
|
|
40
|
+
|
|
41
|
+
/** Sizes attribute for responsive images (required when using srcset) */
|
|
42
|
+
sizes?: string;
|
|
43
|
+
|
|
44
|
+
/** Loading strategy */
|
|
45
|
+
loading?: "lazy" | "eager";
|
|
46
|
+
|
|
47
|
+
/** Decoding hint */
|
|
48
|
+
decoding?: "async" | "sync" | "auto";
|
|
49
|
+
|
|
50
|
+
/** Optional width (auto-detected from srcset if available) */
|
|
51
|
+
width?: number | string;
|
|
52
|
+
|
|
53
|
+
/** Optional height (auto-detected from srcset if available) */
|
|
54
|
+
height?: number | string;
|
|
55
|
+
|
|
56
|
+
/** CSS class name */
|
|
57
|
+
className?: string;
|
|
58
|
+
|
|
59
|
+
/** Inline styles */
|
|
60
|
+
style?: string | Record<string, string | number>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Check if a string looks like a srcset (contains width descriptors like "400w")
|
|
65
|
+
*/
|
|
66
|
+
function isSrcsetString(value: string): boolean {
|
|
67
|
+
return /\s\d+w/.test(value);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Responsive image component with built-in optimization support
|
|
72
|
+
*/
|
|
73
|
+
export function Image({
|
|
74
|
+
src,
|
|
75
|
+
alt,
|
|
76
|
+
sizes,
|
|
77
|
+
loading = "lazy",
|
|
78
|
+
decoding = "async",
|
|
79
|
+
width,
|
|
80
|
+
height,
|
|
81
|
+
className,
|
|
82
|
+
style,
|
|
83
|
+
}: Readonly<ImageProps>): JSX.Element {
|
|
84
|
+
let imgSrc: string | undefined;
|
|
85
|
+
let srcSet: string | undefined;
|
|
86
|
+
let autoWidth: number | undefined;
|
|
87
|
+
let autoHeight: number | undefined;
|
|
88
|
+
|
|
89
|
+
if (typeof src === "object" && src !== null) {
|
|
90
|
+
// Object from vite-imagetools (e.g., ?as=metadata or custom output)
|
|
91
|
+
imgSrc = src.src;
|
|
92
|
+
srcSet = src.srcset;
|
|
93
|
+
autoWidth = src.width;
|
|
94
|
+
autoHeight = src.height;
|
|
95
|
+
} else if (typeof src === "string") {
|
|
96
|
+
if (isSrcsetString(src)) {
|
|
97
|
+
// srcset string from ?as=srcset - use first URL as fallback src
|
|
98
|
+
srcSet = src;
|
|
99
|
+
const firstUrl = src.split(",")[0]?.trim().split(" ")[0];
|
|
100
|
+
imgSrc = firstUrl;
|
|
101
|
+
} else {
|
|
102
|
+
// Regular URL string
|
|
103
|
+
imgSrc = src;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<img
|
|
109
|
+
src={imgSrc}
|
|
110
|
+
srcSet={srcSet}
|
|
111
|
+
sizes={sizes}
|
|
112
|
+
alt={alt}
|
|
113
|
+
loading={loading}
|
|
114
|
+
decoding={decoding}
|
|
115
|
+
width={width ?? autoWidth}
|
|
116
|
+
height={height ?? autoHeight}
|
|
117
|
+
className={className}
|
|
118
|
+
style={style}
|
|
119
|
+
/>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export default Image;
|