@absolutejs/absolute 0.19.0-beta.177 → 0.19.0-beta.178
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.
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Metadata, RobotsDirective } from '../../../types/metadata';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
title = 'AbsoluteJS',
|
|
6
|
+
description = 'A page created using AbsoluteJS',
|
|
7
|
+
icon = '/assets/ico/favicon.ico',
|
|
8
|
+
font,
|
|
9
|
+
cssPath,
|
|
10
|
+
canonical,
|
|
11
|
+
openGraph,
|
|
12
|
+
twitter,
|
|
13
|
+
robots,
|
|
14
|
+
meta
|
|
15
|
+
}: Metadata = $props();
|
|
16
|
+
|
|
17
|
+
const robotsContent = (r: RobotsDirective) => {
|
|
18
|
+
const directives: string[] = [];
|
|
19
|
+
if (r.index === false) directives.push('noindex');
|
|
20
|
+
if (r.index === true) directives.push('index');
|
|
21
|
+
if (r.follow === false) directives.push('nofollow');
|
|
22
|
+
if (r.follow === true) directives.push('follow');
|
|
23
|
+
if (r.noarchive) directives.push('noarchive');
|
|
24
|
+
if (r.nosnippet) directives.push('nosnippet');
|
|
25
|
+
if (r.noimageindex) directives.push('noimageindex');
|
|
26
|
+
if (r.maxSnippet !== undefined)
|
|
27
|
+
directives.push(`max-snippet:${r.maxSnippet}`);
|
|
28
|
+
if (r.maxImagePreview)
|
|
29
|
+
directives.push(`max-image-preview:${r.maxImagePreview}`);
|
|
30
|
+
if (r.maxVideoPreview !== undefined)
|
|
31
|
+
directives.push(`max-video-preview:${r.maxVideoPreview}`);
|
|
32
|
+
return directives.join(', ');
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const cssPaths = $derived(
|
|
36
|
+
cssPath ? (Array.isArray(cssPath) ? cssPath : [cssPath]) : []
|
|
37
|
+
);
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<svelte:head>
|
|
41
|
+
<meta charset="utf-8" />
|
|
42
|
+
<title>{title}</title>
|
|
43
|
+
<meta name="description" content={description} />
|
|
44
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
45
|
+
<link rel="icon" href={icon} />
|
|
46
|
+
|
|
47
|
+
{#if canonical}
|
|
48
|
+
<link rel="canonical" href={canonical} />
|
|
49
|
+
{/if}
|
|
50
|
+
|
|
51
|
+
{#if openGraph}
|
|
52
|
+
<meta property="og:title" content={openGraph.title ?? title} />
|
|
53
|
+
<meta
|
|
54
|
+
property="og:description"
|
|
55
|
+
content={openGraph.description ?? description}
|
|
56
|
+
/>
|
|
57
|
+
{#if openGraph.url}
|
|
58
|
+
<meta property="og:url" content={openGraph.url} />
|
|
59
|
+
{/if}
|
|
60
|
+
{#if openGraph.image}
|
|
61
|
+
<meta property="og:image" content={openGraph.image} />
|
|
62
|
+
{/if}
|
|
63
|
+
{#if openGraph.imageAlt}
|
|
64
|
+
<meta property="og:image:alt" content={openGraph.imageAlt} />
|
|
65
|
+
{/if}
|
|
66
|
+
{#if openGraph.imageWidth}
|
|
67
|
+
<meta
|
|
68
|
+
property="og:image:width"
|
|
69
|
+
content={String(openGraph.imageWidth)}
|
|
70
|
+
/>
|
|
71
|
+
{/if}
|
|
72
|
+
{#if openGraph.imageHeight}
|
|
73
|
+
<meta
|
|
74
|
+
property="og:image:height"
|
|
75
|
+
content={String(openGraph.imageHeight)}
|
|
76
|
+
/>
|
|
77
|
+
{/if}
|
|
78
|
+
{#if openGraph.type}
|
|
79
|
+
<meta property="og:type" content={openGraph.type} />
|
|
80
|
+
{/if}
|
|
81
|
+
{#if openGraph.siteName}
|
|
82
|
+
<meta property="og:site_name" content={openGraph.siteName} />
|
|
83
|
+
{/if}
|
|
84
|
+
{#if openGraph.locale}
|
|
85
|
+
<meta property="og:locale" content={openGraph.locale} />
|
|
86
|
+
{/if}
|
|
87
|
+
{/if}
|
|
88
|
+
|
|
89
|
+
{#if twitter}
|
|
90
|
+
{#if twitter.card}
|
|
91
|
+
<meta name="twitter:card" content={twitter.card} />
|
|
92
|
+
{/if}
|
|
93
|
+
<meta name="twitter:title" content={twitter.title ?? title} />
|
|
94
|
+
<meta
|
|
95
|
+
name="twitter:description"
|
|
96
|
+
content={twitter.description ?? description}
|
|
97
|
+
/>
|
|
98
|
+
{#if twitter.image}
|
|
99
|
+
<meta name="twitter:image" content={twitter.image} />
|
|
100
|
+
{/if}
|
|
101
|
+
{#if twitter.imageAlt}
|
|
102
|
+
<meta name="twitter:image:alt" content={twitter.imageAlt} />
|
|
103
|
+
{/if}
|
|
104
|
+
{#if twitter.site}
|
|
105
|
+
<meta name="twitter:site" content={twitter.site} />
|
|
106
|
+
{/if}
|
|
107
|
+
{#if twitter.creator}
|
|
108
|
+
<meta name="twitter:creator" content={twitter.creator} />
|
|
109
|
+
{/if}
|
|
110
|
+
{/if}
|
|
111
|
+
|
|
112
|
+
{#if robots}
|
|
113
|
+
{@const content = robotsContent(robots)}
|
|
114
|
+
{#if content}
|
|
115
|
+
<meta name="robots" {content} />
|
|
116
|
+
{/if}
|
|
117
|
+
{/if}
|
|
118
|
+
|
|
119
|
+
{#if meta}
|
|
120
|
+
{#each meta as tag}
|
|
121
|
+
{#if tag.property}
|
|
122
|
+
<meta property={tag.property} content={tag.content} />
|
|
123
|
+
{:else if tag.httpEquiv}
|
|
124
|
+
<meta http-equiv={tag.httpEquiv} content={tag.content} />
|
|
125
|
+
{:else if tag.name}
|
|
126
|
+
<meta name={tag.name} content={tag.content} />
|
|
127
|
+
{/if}
|
|
128
|
+
{/each}
|
|
129
|
+
{/if}
|
|
130
|
+
|
|
131
|
+
{#if font}
|
|
132
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
133
|
+
<link
|
|
134
|
+
rel="preconnect"
|
|
135
|
+
href="https://fonts.gstatic.com"
|
|
136
|
+
crossOrigin="anonymous"
|
|
137
|
+
/>
|
|
138
|
+
<link
|
|
139
|
+
href={`https://fonts.googleapis.com/css2?family=${font}:wght@100..900&display=swap`}
|
|
140
|
+
rel="stylesheet"
|
|
141
|
+
/>
|
|
142
|
+
{/if}
|
|
143
|
+
|
|
144
|
+
{#each cssPaths as path}
|
|
145
|
+
<link rel="stylesheet" href={path} type="text/css" />
|
|
146
|
+
{/each}
|
|
147
|
+
</svelte:head>
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { ImageProps } from '../../../types/image';
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_QUALITY,
|
|
5
|
+
buildOptimizedUrl,
|
|
6
|
+
generateBlurSvg,
|
|
7
|
+
generateSrcSet
|
|
8
|
+
} from '../../utils/imageProcessing';
|
|
9
|
+
|
|
10
|
+
let {
|
|
11
|
+
src,
|
|
12
|
+
alt,
|
|
13
|
+
width,
|
|
14
|
+
height,
|
|
15
|
+
fill,
|
|
16
|
+
quality = DEFAULT_QUALITY,
|
|
17
|
+
sizes,
|
|
18
|
+
loader,
|
|
19
|
+
unoptimized,
|
|
20
|
+
loading,
|
|
21
|
+
priority,
|
|
22
|
+
placeholder,
|
|
23
|
+
blurDataURL,
|
|
24
|
+
className,
|
|
25
|
+
style,
|
|
26
|
+
onLoad,
|
|
27
|
+
onError,
|
|
28
|
+
crossOrigin,
|
|
29
|
+
referrerPolicy,
|
|
30
|
+
fetchPriority,
|
|
31
|
+
overrideSrc
|
|
32
|
+
}: ImageProps = $props();
|
|
33
|
+
|
|
34
|
+
const resolvedSrc = $derived.by(() => {
|
|
35
|
+
if (overrideSrc) return overrideSrc;
|
|
36
|
+
if (unoptimized) return src;
|
|
37
|
+
if (loader) return loader({ src, width: width ?? 0, quality });
|
|
38
|
+
if (!width) return buildOptimizedUrl(src, 0, quality);
|
|
39
|
+
return buildOptimizedUrl(src, width, quality);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const srcSet = $derived(
|
|
43
|
+
unoptimized
|
|
44
|
+
? undefined
|
|
45
|
+
: generateSrcSet(src, width, sizes, undefined, loader ?? undefined)
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const resolvedSizes = $derived(sizes ?? (fill ? '100vw' : undefined));
|
|
49
|
+
|
|
50
|
+
const resolvedLoading = $derived(priority ? 'eager' : (loading ?? 'lazy'));
|
|
51
|
+
|
|
52
|
+
const resolvedFetchPriority = $derived(priority ? 'high' : fetchPriority);
|
|
53
|
+
|
|
54
|
+
const hasBlur = $derived(
|
|
55
|
+
placeholder === 'blur' ||
|
|
56
|
+
(typeof placeholder === 'string' &&
|
|
57
|
+
placeholder !== 'empty' &&
|
|
58
|
+
placeholder.startsWith('data:'))
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const blurBackground = $derived.by(() => {
|
|
62
|
+
if (!hasBlur) return undefined;
|
|
63
|
+
if (
|
|
64
|
+
typeof placeholder === 'string' &&
|
|
65
|
+
placeholder !== 'blur' &&
|
|
66
|
+
placeholder.startsWith('data:')
|
|
67
|
+
) {
|
|
68
|
+
return generateBlurSvg(placeholder);
|
|
69
|
+
}
|
|
70
|
+
if (blurDataURL) return generateBlurSvg(blurDataURL);
|
|
71
|
+
return undefined;
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const imgStyle = $derived.by(() => {
|
|
75
|
+
const base: Record<string, string | number> = {
|
|
76
|
+
...(style ?? {}),
|
|
77
|
+
color: 'transparent'
|
|
78
|
+
};
|
|
79
|
+
if (blurBackground) {
|
|
80
|
+
base.backgroundImage = blurBackground;
|
|
81
|
+
base.backgroundSize = 'cover';
|
|
82
|
+
base.backgroundPosition = 'center';
|
|
83
|
+
base.backgroundRepeat = 'no-repeat';
|
|
84
|
+
}
|
|
85
|
+
if (fill) {
|
|
86
|
+
base.position = 'absolute';
|
|
87
|
+
base.height = '100%';
|
|
88
|
+
base.width = '100%';
|
|
89
|
+
base.inset = 0;
|
|
90
|
+
base.objectFit = 'cover';
|
|
91
|
+
}
|
|
92
|
+
return Object.entries(base)
|
|
93
|
+
.map(([k, v]) => `${k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${v}`)
|
|
94
|
+
.join(';');
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const handleLoad = (e: Event) => {
|
|
98
|
+
if (blurBackground) {
|
|
99
|
+
(e.target as HTMLImageElement).style.backgroundImage = 'none';
|
|
100
|
+
}
|
|
101
|
+
if (onLoad) (onLoad as (event: Event) => void)(e);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const handleError = (e: Event) => {
|
|
105
|
+
if (onError) (onError as (event: Event) => void)(e);
|
|
106
|
+
};
|
|
107
|
+
</script>
|
|
108
|
+
|
|
109
|
+
{#if priority}
|
|
110
|
+
<svelte:head>
|
|
111
|
+
<link
|
|
112
|
+
rel="preload"
|
|
113
|
+
as="image"
|
|
114
|
+
href={resolvedSrc}
|
|
115
|
+
imagesrcset={srcSet}
|
|
116
|
+
imagesizes={resolvedSizes}
|
|
117
|
+
crossorigin={crossOrigin}
|
|
118
|
+
/>
|
|
119
|
+
</svelte:head>
|
|
120
|
+
{/if}
|
|
121
|
+
|
|
122
|
+
{#if fill}
|
|
123
|
+
<span style="position:relative;overflow:hidden;display:block;width:100%;height:100%">
|
|
124
|
+
<img
|
|
125
|
+
{alt}
|
|
126
|
+
src={resolvedSrc}
|
|
127
|
+
srcset={srcSet}
|
|
128
|
+
sizes={resolvedSizes}
|
|
129
|
+
loading={resolvedLoading}
|
|
130
|
+
class={className}
|
|
131
|
+
style={imgStyle}
|
|
132
|
+
crossorigin={crossOrigin}
|
|
133
|
+
referrerpolicy={referrerPolicy}
|
|
134
|
+
fetchpriority={resolvedFetchPriority}
|
|
135
|
+
decoding="async"
|
|
136
|
+
onload={handleLoad}
|
|
137
|
+
onerror={handleError}
|
|
138
|
+
/>
|
|
139
|
+
</span>
|
|
140
|
+
{:else}
|
|
141
|
+
<img
|
|
142
|
+
{alt}
|
|
143
|
+
src={resolvedSrc}
|
|
144
|
+
srcset={srcSet}
|
|
145
|
+
sizes={resolvedSizes}
|
|
146
|
+
{width}
|
|
147
|
+
{height}
|
|
148
|
+
loading={resolvedLoading}
|
|
149
|
+
class={className}
|
|
150
|
+
style={imgStyle}
|
|
151
|
+
crossorigin={crossOrigin}
|
|
152
|
+
referrerpolicy={referrerPolicy}
|
|
153
|
+
fetchpriority={resolvedFetchPriority}
|
|
154
|
+
decoding="async"
|
|
155
|
+
onload={handleLoad}
|
|
156
|
+
onerror={handleError}
|
|
157
|
+
/>
|
|
158
|
+
{/if}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { JsonLdSchema, WithContext } from '../../../types/jsonLd';
|
|
3
|
+
|
|
4
|
+
let { schema }: { schema: JsonLdSchema | JsonLdSchema[] } = $props();
|
|
5
|
+
|
|
6
|
+
const data = $derived<
|
|
7
|
+
WithContext<JsonLdSchema> | WithContext<JsonLdSchema>[]
|
|
8
|
+
>(
|
|
9
|
+
Array.isArray(schema)
|
|
10
|
+
? schema.map((s) => ({
|
|
11
|
+
'@context': 'https://schema.org' as const,
|
|
12
|
+
...s
|
|
13
|
+
}))
|
|
14
|
+
: { '@context': 'https://schema.org' as const, ...schema }
|
|
15
|
+
);
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<svelte:head>
|
|
19
|
+
{@html `<script type="application/ld+json">${JSON.stringify(data)}</script>`}
|
|
20
|
+
</svelte:head>
|
package/package.json
CHANGED
|
@@ -78,13 +78,13 @@
|
|
|
78
78
|
"types": "./dist/src/svelte/index.d.ts"
|
|
79
79
|
},
|
|
80
80
|
"./svelte/components/Head.svelte": {
|
|
81
|
-
"import": "./
|
|
81
|
+
"import": "./dist/svelte/components/Head.svelte"
|
|
82
82
|
},
|
|
83
83
|
"./svelte/components/Image.svelte": {
|
|
84
|
-
"import": "./
|
|
84
|
+
"import": "./dist/svelte/components/Image.svelte"
|
|
85
85
|
},
|
|
86
86
|
"./svelte/components/JsonLd.svelte": {
|
|
87
|
-
"import": "./
|
|
87
|
+
"import": "./dist/svelte/components/JsonLd.svelte"
|
|
88
88
|
},
|
|
89
89
|
"./vue": {
|
|
90
90
|
"import": "./dist/vue/index.js",
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
"url": "git+https://github.com/absolutejs/absolutejs.git"
|
|
176
176
|
},
|
|
177
177
|
"scripts": {
|
|
178
|
-
"build": "rm -rf dist && bun build src/index.ts src/build.ts src/angular/index.ts src/angular/components/index.ts src/react/index.ts src/react/hooks/index.ts src/svelte/index.ts src/vue/index.ts src/vue/components/index.ts --outdir dist --sourcemap --target=bun --external react --external react-dom --external vue --external @vue/compiler-sfc --external vue/server-renderer --external svelte --external svelte/compiler --external svelte/server --external elysia --external @elysiajs/static --external @angular/compiler-cli --external @angular/core --external @angular/common --external @angular/platform-browser --external @angular/platform-server --external @angular/ssr --external zone.js --external debug --external sharp --external @absolutejs/native-linux-x64 --external @absolutejs/native-linux-arm64 --external @absolutejs/native-darwin-x64 --external @absolutejs/native-darwin-arm64 && bun build src/cli/index.ts --outfile dist/cli/index.js --target=bun && tsc --emitDeclarationOnly --project tsconfig.build.json && mkdir -p dist/dev && cp -r src/dev/client dist/dev/client",
|
|
178
|
+
"build": "rm -rf dist && bun build src/index.ts src/build.ts src/angular/index.ts src/angular/components/index.ts src/react/index.ts src/react/hooks/index.ts src/svelte/index.ts src/vue/index.ts src/vue/components/index.ts --outdir dist --sourcemap --target=bun --external react --external react-dom --external vue --external @vue/compiler-sfc --external vue/server-renderer --external svelte --external svelte/compiler --external svelte/server --external elysia --external @elysiajs/static --external @angular/compiler-cli --external @angular/core --external @angular/common --external @angular/platform-browser --external @angular/platform-server --external @angular/ssr --external zone.js --external debug --external sharp --external @absolutejs/native-linux-x64 --external @absolutejs/native-linux-arm64 --external @absolutejs/native-darwin-x64 --external @absolutejs/native-darwin-arm64 && bun build src/cli/index.ts --outfile dist/cli/index.js --target=bun && tsc --emitDeclarationOnly --project tsconfig.build.json && mkdir -p dist/dev && cp -r src/dev/client dist/dev/client && mkdir -p dist/svelte/components && cp src/svelte/components/*.svelte dist/svelte/components/",
|
|
179
179
|
"build:native": "./native/build.sh",
|
|
180
180
|
"db:push": "drizzle-kit push",
|
|
181
181
|
"db:studio": "drizzle-kit studio",
|
|
@@ -189,5 +189,5 @@
|
|
|
189
189
|
"typecheck": "bun run vue-tsc --noEmit"
|
|
190
190
|
},
|
|
191
191
|
"types": "./dist/src/index.d.ts",
|
|
192
|
-
"version": "0.19.0-beta.
|
|
192
|
+
"version": "0.19.0-beta.178"
|
|
193
193
|
}
|