@ignite-agent/agent 0.1.1 → 0.4.2
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/AI.txt +7 -0
- package/LICENSE +57 -4
- package/README.md +162 -5
- package/dist/cli/index.js +79 -22
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/project.d.ts +39 -0
- package/dist/cli/project.js +276 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/ignite.css +228 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/operator/blog.d.ts +11 -6
- package/dist/operator/blog.js +11 -6
- package/dist/operator/blog.js.map +1 -1
- package/dist/operator/card.d.ts +5 -0
- package/dist/operator/card.js +11 -0
- package/dist/operator/card.js.map +1 -0
- package/dist/operator/jsonld.d.ts +5 -0
- package/dist/operator/jsonld.js +6 -3
- package/dist/operator/jsonld.js.map +1 -1
- package/dist/operator/page.d.ts +10 -1
- package/dist/operator/page.js +20 -3
- package/dist/operator/page.js.map +1 -1
- package/dist/operator/prose.d.ts +19 -0
- package/dist/operator/prose.js +26 -0
- package/dist/operator/prose.js.map +1 -0
- package/dist/operator/sitemap-merge.d.ts +10 -0
- package/dist/operator/sitemap-merge.js +56 -0
- package/dist/operator/sitemap-merge.js.map +1 -0
- package/dist/operator/sitemap.d.ts +4 -1
- package/dist/operator/sitemap.js +27 -17
- package/dist/operator/sitemap.js.map +1 -1
- package/dist/operator/ui.d.ts +45 -0
- package/dist/operator/ui.js +486 -0
- package/dist/operator/ui.js.map +1 -0
- package/dist/operator/wiki.d.ts +11 -5
- package/dist/operator/wiki.js +24 -4
- package/dist/operator/wiki.js.map +1 -1
- package/dist/types.d.ts +28 -1
- package/onboarding/CLAUDE-CODE-SETUP.md +40 -24
- package/onboarding/CURSOR-SETUP.md +73 -0
- package/onboarding/LOVABLE-SETUP.md +76 -0
- package/onboarding/MIGRATE-EXISTING.md +94 -0
- package/onboarding/REPLIT-SETUP.md +76 -0
- package/package.json +9 -5
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export const ROUTE_SOURCES = {
|
|
4
|
+
robots: `export { default } from '@ignite-agent/agent/robots'\n`,
|
|
5
|
+
sitemap: `export { default } from '@ignite-agent/agent/sitemap'\n`,
|
|
6
|
+
wikiPage: `export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/wiki'\n`,
|
|
7
|
+
wikiIndex: `export { WikiIndex as default, revalidate } from '@ignite-agent/agent/wiki'\n`,
|
|
8
|
+
blogPage: `export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/blog'\n`,
|
|
9
|
+
blogIndex: `export { BlogIndex as default, revalidate } from '@ignite-agent/agent/blog'\n`,
|
|
10
|
+
middleware: `export { middleware, config } from '@ignite-agent/agent/proxy'\n`,
|
|
11
|
+
proxy: `export { proxy, config } from '@ignite-agent/agent/proxy'\n`,
|
|
12
|
+
};
|
|
13
|
+
export function resolveAppDir(cwd) {
|
|
14
|
+
if (existsSync(join(cwd, 'app')))
|
|
15
|
+
return join(cwd, 'app');
|
|
16
|
+
if (existsSync(join(cwd, 'src/app')))
|
|
17
|
+
return join(cwd, 'src/app');
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
export function detectDesignSystem(cwd) {
|
|
21
|
+
if (existsSync(join(cwd, 'components.json')))
|
|
22
|
+
return 'shadcn';
|
|
23
|
+
const tailwind = ['tailwind.config.ts', 'tailwind.config.js', 'tailwind.config.mjs', 'tailwind.config.cjs'];
|
|
24
|
+
if (tailwind.some((name) => existsSync(join(cwd, name))))
|
|
25
|
+
return 'tailwind';
|
|
26
|
+
return 'unknown';
|
|
27
|
+
}
|
|
28
|
+
export function findGlobalsCss(cwd, appDir) {
|
|
29
|
+
const candidates = [
|
|
30
|
+
join(appDir, 'globals.css'),
|
|
31
|
+
join(appDir, 'global.css'),
|
|
32
|
+
join(cwd, 'app/globals.css'),
|
|
33
|
+
join(cwd, 'src/app/globals.css'),
|
|
34
|
+
join(cwd, 'src/globals.css'),
|
|
35
|
+
];
|
|
36
|
+
return candidates.find((path) => existsSync(path)) ?? null;
|
|
37
|
+
}
|
|
38
|
+
export function loadEnvFile(path, env) {
|
|
39
|
+
if (!existsSync(path))
|
|
40
|
+
return;
|
|
41
|
+
const contents = readFileSync(path, 'utf8');
|
|
42
|
+
for (const raw of contents.split(/\r?\n/)) {
|
|
43
|
+
const line = raw.trim();
|
|
44
|
+
if (!line || line.startsWith('#'))
|
|
45
|
+
continue;
|
|
46
|
+
const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);
|
|
47
|
+
if (!match)
|
|
48
|
+
continue;
|
|
49
|
+
const key = match[1];
|
|
50
|
+
if (!key || env[key] !== undefined)
|
|
51
|
+
continue;
|
|
52
|
+
let value = match[2] ?? '';
|
|
53
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
54
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
55
|
+
value = value.slice(1, -1);
|
|
56
|
+
}
|
|
57
|
+
env[key] = value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function brandCssSnippet(globalsCss, design) {
|
|
61
|
+
const map = colorMapping(globalsCss, design);
|
|
62
|
+
return `/* Ignite pages inherit host brand via CSS variables. Safe to edit. */
|
|
63
|
+
:root {
|
|
64
|
+
--ignite-color-text: ${map.text};
|
|
65
|
+
--ignite-color-muted: ${map.muted};
|
|
66
|
+
--ignite-color-primary: ${map.primary};
|
|
67
|
+
--ignite-color-border: ${map.border};
|
|
68
|
+
--ignite-font-sans: ${map.fontSans};
|
|
69
|
+
--ignite-font-heading: ${map.fontHeading};
|
|
70
|
+
--ignite-radius: ${map.radius};
|
|
71
|
+
--ignite-prose-width: 65ch;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* Optional: load Ignite prose CSS from your bundle instead of the runtime <style> tag.
|
|
75
|
+
@import '@ignite-agent/agent/styles.css';
|
|
76
|
+
Then pass injectCss={false} to IgniteFrame / IgniteProse.
|
|
77
|
+
*/
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
export function inspectRouteFile(path) {
|
|
81
|
+
if (!existsSync(path))
|
|
82
|
+
return 'missing';
|
|
83
|
+
const contents = readFileSync(path, 'utf8');
|
|
84
|
+
if (contents.includes('@ignite-agent/agent/'))
|
|
85
|
+
return 'ignite';
|
|
86
|
+
return 'host';
|
|
87
|
+
}
|
|
88
|
+
export function migrateSitemapSnippet() {
|
|
89
|
+
return `import igniteSitemap, { mergeSitemap } from '@ignite-agent/agent/sitemap'
|
|
90
|
+
|
|
91
|
+
export default async function sitemap() {
|
|
92
|
+
const local = await localSitemap() // existing absolute URLs; do not drop these
|
|
93
|
+
return mergeSitemap(local, await igniteSitemap())
|
|
94
|
+
}
|
|
95
|
+
`;
|
|
96
|
+
}
|
|
97
|
+
export function hostOwnedContentRoutes(appDir) {
|
|
98
|
+
const checks = [
|
|
99
|
+
['blog/[slug]/page.tsx', 'blog'],
|
|
100
|
+
['blog/page.tsx', 'blog-index'],
|
|
101
|
+
['w/[slug]/page.tsx', 'wiki'],
|
|
102
|
+
['w/page.tsx', 'wiki-index'],
|
|
103
|
+
];
|
|
104
|
+
const found = [];
|
|
105
|
+
for (const [rel, kind] of checks) {
|
|
106
|
+
if (inspectRouteFile(join(appDir, rel)) === 'host')
|
|
107
|
+
found.push({ rel, kind });
|
|
108
|
+
}
|
|
109
|
+
return found;
|
|
110
|
+
}
|
|
111
|
+
export function migrateExistingSnippet(kind) {
|
|
112
|
+
const pkg = kind === 'blog' ? '@ignite-agent/agent/blog' : '@ignite-agent/agent/wiki';
|
|
113
|
+
const loadKind = kind === 'blog' ? 'article' : 'wiki';
|
|
114
|
+
return `import { notFound } from 'next/navigation'
|
|
115
|
+
import {
|
|
116
|
+
FeedArticle,
|
|
117
|
+
feedPageMetadata,
|
|
118
|
+
generateStaticParams as igniteParams,
|
|
119
|
+
revalidate,
|
|
120
|
+
tryLoadFeedPage,
|
|
121
|
+
mergeSlugs,
|
|
122
|
+
} from '${pkg}'
|
|
123
|
+
|
|
124
|
+
export { revalidate }
|
|
125
|
+
|
|
126
|
+
export async function generateStaticParams() {
|
|
127
|
+
const local = await localSlugs() // existing host posts; do not drop these
|
|
128
|
+
return mergeSlugs(local, await igniteParams())
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) {
|
|
132
|
+
const { slug } = await params
|
|
133
|
+
const local = await loadLocal(slug)
|
|
134
|
+
if (local) return localMetadata(local)
|
|
135
|
+
const page = await tryLoadFeedPage('${loadKind}', slug)
|
|
136
|
+
return page ? feedPageMetadata(page) : {}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
|
|
140
|
+
const { slug } = await params
|
|
141
|
+
const local = await loadLocal(slug)
|
|
142
|
+
if (local) return <ExistingPost post={local} />
|
|
143
|
+
const page = await tryLoadFeedPage('${loadKind}', slug)
|
|
144
|
+
if (!page) notFound()
|
|
145
|
+
return <FeedArticle page={page} />
|
|
146
|
+
}
|
|
147
|
+
`;
|
|
148
|
+
}
|
|
149
|
+
export function injectBrandCss(cssPath, snippet) {
|
|
150
|
+
const existing = readFileSync(cssPath, 'utf8');
|
|
151
|
+
if (existing.includes('--ignite-color-text'))
|
|
152
|
+
return 'skipped';
|
|
153
|
+
const prefix = existing.endsWith('\n') || existing === '' ? '' : '\n';
|
|
154
|
+
writeFileSync(cssPath, `${existing}${prefix}\n${snippet}`);
|
|
155
|
+
return 'wrote';
|
|
156
|
+
}
|
|
157
|
+
export function diagnoseProject(cwd, env) {
|
|
158
|
+
const findings = [];
|
|
159
|
+
const appDir = resolveAppDir(cwd);
|
|
160
|
+
const envLocal = join(cwd, '.env.local');
|
|
161
|
+
const merged = { ...env };
|
|
162
|
+
loadEnvFile(envLocal, merged);
|
|
163
|
+
if (merged.NEXT_PUBLIC_IGNITE_SITE_TOKEN || envHasKey(envLocal, 'NEXT_PUBLIC_IGNITE_SITE_TOKEN')) {
|
|
164
|
+
findings.push({
|
|
165
|
+
level: 'fail',
|
|
166
|
+
message: 'NEXT_PUBLIC_IGNITE_SITE_TOKEN is set. That ships the token to the browser. Remove it and use IGNITE_SITE_TOKEN only.',
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
if (!merged.IGNITE_SITE_ID?.trim() || !merged.IGNITE_SITE_TOKEN?.trim()) {
|
|
170
|
+
findings.push({
|
|
171
|
+
level: 'fail',
|
|
172
|
+
message: 'Missing IGNITE_SITE_ID or IGNITE_SITE_TOKEN. Run `ignite connect` or set them in .env.local.',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
findings.push({ level: 'ok', message: 'IGNITE_SITE_ID and IGNITE_SITE_TOKEN are set (server-side).' });
|
|
177
|
+
}
|
|
178
|
+
if (!appDir) {
|
|
179
|
+
findings.push({
|
|
180
|
+
level: 'fail',
|
|
181
|
+
message: 'No app/ or src/app/ directory. This package targets the Next.js App Router.',
|
|
182
|
+
});
|
|
183
|
+
return findings;
|
|
184
|
+
}
|
|
185
|
+
const robotsPath = join(appDir, 'robots.ts');
|
|
186
|
+
findings.push(existsSync(robotsPath)
|
|
187
|
+
? { level: 'ok', message: 'found robots route (robots.ts)' }
|
|
188
|
+
: { level: 'warn', message: 'missing robots route (robots.ts). Run `npx ignite init`.' });
|
|
189
|
+
const sitemapOwner = inspectRouteFile(join(appDir, 'sitemap.ts'));
|
|
190
|
+
if (sitemapOwner === 'ignite') {
|
|
191
|
+
findings.push({ level: 'ok', message: 'found Ignite sitemap route (sitemap.ts)' });
|
|
192
|
+
}
|
|
193
|
+
else if (sitemapOwner === 'host') {
|
|
194
|
+
findings.push({
|
|
195
|
+
level: 'warn',
|
|
196
|
+
message: 'existing sitemap.ts is host-owned. Do not replace it. Merge with igniteSitemap() + mergeSitemap so wiki/blog URLs are included. See onboarding/MIGRATE-EXISTING.md.',
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
findings.push({ level: 'warn', message: 'missing sitemap route (sitemap.ts). Run `npx ignite init`.' });
|
|
201
|
+
}
|
|
202
|
+
if (!merged.IGNITE_SITE_URL?.trim() && !merged.NEXT_PUBLIC_SITE_URL?.trim()) {
|
|
203
|
+
findings.push({
|
|
204
|
+
level: 'warn',
|
|
205
|
+
message: 'No IGNITE_SITE_URL (or NEXT_PUBLIC_SITE_URL). Wiki/blog sitemap locs and canonical tags stay relative until you set a public origin.',
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const content = [
|
|
209
|
+
['w/[slug]/page.tsx', 'wiki page route'],
|
|
210
|
+
['blog/[slug]/page.tsx', 'blog page route'],
|
|
211
|
+
];
|
|
212
|
+
for (const [rel, label] of content) {
|
|
213
|
+
const owner = inspectRouteFile(join(appDir, rel));
|
|
214
|
+
if (owner === 'ignite') {
|
|
215
|
+
findings.push({ level: 'ok', message: `found Ignite ${label} (${rel})` });
|
|
216
|
+
}
|
|
217
|
+
else if (owner === 'host') {
|
|
218
|
+
findings.push({
|
|
219
|
+
level: 'warn',
|
|
220
|
+
message: `existing ${label} (${rel}) is host-owned. Do not replace it. Wrap with tryLoadFeedPage + mergeSlugs so local slugs keep winning. See onboarding/MIGRATE-EXISTING.md.`,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
findings.push({ level: 'warn', message: `missing ${label} (${rel}). Run \`npx ignite init\`.` });
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const cssPath = findGlobalsCss(cwd, appDir);
|
|
228
|
+
if (cssPath && !readFileSync(cssPath, 'utf8').includes('--ignite-color-text')) {
|
|
229
|
+
findings.push({
|
|
230
|
+
level: 'warn',
|
|
231
|
+
message: `No --ignite-* variables in ${cssPath}. Pages still render with fallbacks; map host tokens for brand match.`,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return findings;
|
|
235
|
+
}
|
|
236
|
+
export function colorMapping(globalsCss, design) {
|
|
237
|
+
const fullColor = globalsCss !== null && /--foreground:\s*(oklch|oklab|#|rgb|hsl\(|var\()/i.test(globalsCss);
|
|
238
|
+
const useHslChannels = !fullColor && (design === 'shadcn' || Boolean(globalsCss?.includes('--foreground')));
|
|
239
|
+
if (fullColor) {
|
|
240
|
+
return {
|
|
241
|
+
text: 'var(--foreground, #111)',
|
|
242
|
+
muted: 'var(--muted-foreground, #666)',
|
|
243
|
+
primary: 'var(--primary, #2563eb)',
|
|
244
|
+
border: 'var(--border, #e5e5e5)',
|
|
245
|
+
fontSans: 'var(--font-body, var(--font-sans, system-ui, sans-serif))',
|
|
246
|
+
fontHeading: 'var(--font-heading, var(--ignite-font-sans))',
|
|
247
|
+
radius: 'var(--radius, 0.5rem)',
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
if (useHslChannels) {
|
|
251
|
+
return {
|
|
252
|
+
text: 'hsl(var(--foreground))',
|
|
253
|
+
muted: 'hsl(var(--muted-foreground))',
|
|
254
|
+
primary: 'hsl(var(--primary))',
|
|
255
|
+
border: 'hsl(var(--border))',
|
|
256
|
+
fontSans: 'var(--font-sans, system-ui, sans-serif)',
|
|
257
|
+
fontHeading: 'var(--font-heading, var(--ignite-font-sans))',
|
|
258
|
+
radius: 'var(--radius, 0.5rem)',
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
text: 'currentColor',
|
|
263
|
+
muted: '#666',
|
|
264
|
+
primary: '#2563eb',
|
|
265
|
+
border: '#e5e5e5',
|
|
266
|
+
fontSans: 'system-ui, sans-serif',
|
|
267
|
+
fontHeading: 'var(--ignite-font-sans)',
|
|
268
|
+
radius: '0.5rem',
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function envHasKey(path, key) {
|
|
272
|
+
if (!existsSync(path))
|
|
273
|
+
return false;
|
|
274
|
+
return new RegExp(`^${key}=`, 'm').test(readFileSync(path, 'utf8'));
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/cli/project.ts"],"names":[],"mappings":"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"}
|
package/dist/ignite.css
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
.ignite {
|
|
2
|
+
color-scheme: inherit;
|
|
3
|
+
--ignite-space: calc(1rem * var(--ignite-space-scale, 1));
|
|
4
|
+
color: var(--ignite-color-text, currentColor);
|
|
5
|
+
font-family: var(--ignite-font-sans, system-ui, -apple-system, sans-serif);
|
|
6
|
+
line-height: 1.7;
|
|
7
|
+
max-width: var(--ignite-prose-width, 65ch);
|
|
8
|
+
margin-inline: auto;
|
|
9
|
+
padding-inline: var(--ignite-space);
|
|
10
|
+
padding-block: calc(1.5 * var(--ignite-space));
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
.ignite *, .ignite *::before, .ignite *::after { box-sizing: border-box; }
|
|
14
|
+
.ignite a {
|
|
15
|
+
color: var(--ignite-color-primary, #2563eb);
|
|
16
|
+
text-decoration-thickness: 1px;
|
|
17
|
+
text-underline-offset: 0.18em;
|
|
18
|
+
}
|
|
19
|
+
.ignite a:hover { text-decoration: underline; }
|
|
20
|
+
.ignite-kicker {
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-wrap: wrap;
|
|
23
|
+
gap: 0.35em 0.7em;
|
|
24
|
+
font-size: 0.875rem;
|
|
25
|
+
margin: 0 0 calc(0.75 * var(--ignite-space));
|
|
26
|
+
color: var(--ignite-color-muted, #666);
|
|
27
|
+
}
|
|
28
|
+
.ignite-kicker a { color: inherit; }
|
|
29
|
+
.ignite-kicker a:hover { color: var(--ignite-color-primary, #2563eb); }
|
|
30
|
+
.ignite-hero {
|
|
31
|
+
margin: 0 0 calc(1.1 * var(--ignite-space));
|
|
32
|
+
}
|
|
33
|
+
.ignite-hero img {
|
|
34
|
+
width: 100%;
|
|
35
|
+
height: auto;
|
|
36
|
+
border-radius: var(--ignite-radius, 0.5rem);
|
|
37
|
+
display: block;
|
|
38
|
+
}
|
|
39
|
+
.ignite-hero figcaption {
|
|
40
|
+
margin-top: 0.4em;
|
|
41
|
+
font-size: 0.9em;
|
|
42
|
+
color: var(--ignite-color-muted, #666);
|
|
43
|
+
}
|
|
44
|
+
.ignite-avatar {
|
|
45
|
+
width: 1.35em;
|
|
46
|
+
height: 1.35em;
|
|
47
|
+
border-radius: 999px;
|
|
48
|
+
object-fit: cover;
|
|
49
|
+
vertical-align: -0.25em;
|
|
50
|
+
margin-right: 0.35em;
|
|
51
|
+
}
|
|
52
|
+
.ignite-title {
|
|
53
|
+
font-family: var(--ignite-font-heading, var(--ignite-font-sans, system-ui, sans-serif));
|
|
54
|
+
font-size: clamp(1.75rem, 1.2rem + 1.6vw, 2.5rem);
|
|
55
|
+
font-weight: 700;
|
|
56
|
+
line-height: 1.2;
|
|
57
|
+
text-wrap: balance;
|
|
58
|
+
margin: 0 0 calc(0.45 * var(--ignite-space));
|
|
59
|
+
color: var(--ignite-color-text, currentColor);
|
|
60
|
+
}
|
|
61
|
+
.ignite-meta {
|
|
62
|
+
margin: 0 0 calc(1.1 * var(--ignite-space));
|
|
63
|
+
color: var(--ignite-color-muted, #666);
|
|
64
|
+
font-size: 0.9375rem;
|
|
65
|
+
}
|
|
66
|
+
.ignite-prose {
|
|
67
|
+
font-size: 1.0625rem;
|
|
68
|
+
line-height: 1.7;
|
|
69
|
+
overflow-wrap: anywhere;
|
|
70
|
+
}
|
|
71
|
+
.ignite-prose > :first-child { margin-top: 0; }
|
|
72
|
+
.ignite-prose > :last-child { margin-bottom: 0; }
|
|
73
|
+
.ignite-prose :where(p, ul, ol, blockquote, pre, table, figure) { margin-block: 0.95em; }
|
|
74
|
+
.ignite-prose :where(h1, h2, h3, h4) {
|
|
75
|
+
font-family: var(--ignite-font-heading, var(--ignite-font-sans, system-ui, sans-serif));
|
|
76
|
+
line-height: 1.25;
|
|
77
|
+
text-wrap: balance;
|
|
78
|
+
margin-block: 1.45em 0.5em;
|
|
79
|
+
color: var(--ignite-color-text, currentColor);
|
|
80
|
+
}
|
|
81
|
+
.ignite-prose :where(h1) { font-size: 1.65em; }
|
|
82
|
+
.ignite-prose :where(h2) { font-size: 1.35em; }
|
|
83
|
+
.ignite-prose :where(h3) { font-size: 1.15em; }
|
|
84
|
+
.ignite-prose :where(h4) { font-size: 1em; }
|
|
85
|
+
.ignite-prose :where(ul, ol) { padding-inline-start: 1.35em; }
|
|
86
|
+
.ignite-prose :where(li + li) { margin-top: 0.35em; }
|
|
87
|
+
.ignite-prose :where(li > ul, li > ol) { margin-top: 0.35em; margin-bottom: 0; }
|
|
88
|
+
.ignite-prose :where(blockquote) {
|
|
89
|
+
margin-inline: 0;
|
|
90
|
+
padding: 0.15em 0 0.15em 1em;
|
|
91
|
+
border-inline-start: 3px solid var(--ignite-color-primary, #2563eb);
|
|
92
|
+
color: var(--ignite-color-muted, #666);
|
|
93
|
+
}
|
|
94
|
+
.ignite-prose :where(code, kbd) {
|
|
95
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
96
|
+
font-size: 0.9em;
|
|
97
|
+
background: color-mix(in srgb, currentColor 8%, transparent);
|
|
98
|
+
border-radius: calc(var(--ignite-radius, 0.5rem) * 0.45);
|
|
99
|
+
padding: 0.12em 0.35em;
|
|
100
|
+
}
|
|
101
|
+
.ignite-prose :where(pre) {
|
|
102
|
+
overflow-x: auto;
|
|
103
|
+
padding: 1em 1.1em;
|
|
104
|
+
line-height: 1.55;
|
|
105
|
+
background: color-mix(in srgb, currentColor 6%, transparent);
|
|
106
|
+
border: 1px solid var(--ignite-color-border, #e5e5e5);
|
|
107
|
+
border-radius: var(--ignite-radius, 0.5rem);
|
|
108
|
+
}
|
|
109
|
+
.ignite-prose :where(pre code) { background: none; padding: 0; font-size: 0.875em; }
|
|
110
|
+
.ignite-prose :where(table) { width: 100%; border-collapse: collapse; font-size: 0.95em; }
|
|
111
|
+
.ignite-prose :where(th, td) {
|
|
112
|
+
border: 1px solid var(--ignite-color-border, #e5e5e5);
|
|
113
|
+
padding: 0.5em 0.7em;
|
|
114
|
+
text-align: start;
|
|
115
|
+
vertical-align: top;
|
|
116
|
+
}
|
|
117
|
+
.ignite-prose :where(th) { font-weight: 600; }
|
|
118
|
+
.ignite-prose :where(img, video) {
|
|
119
|
+
max-width: 100%;
|
|
120
|
+
height: auto;
|
|
121
|
+
border-radius: var(--ignite-radius, 0.5rem);
|
|
122
|
+
}
|
|
123
|
+
.ignite-prose :where(hr) {
|
|
124
|
+
border: 0;
|
|
125
|
+
border-top: 1px solid var(--ignite-color-border, #e5e5e5);
|
|
126
|
+
margin-block: 1.8em;
|
|
127
|
+
}
|
|
128
|
+
.ignite-prose :where(figure) { margin-inline: 0; }
|
|
129
|
+
.ignite-prose :where(figcaption) {
|
|
130
|
+
margin-top: 0.4em;
|
|
131
|
+
font-size: 0.9em;
|
|
132
|
+
color: var(--ignite-color-muted, #666);
|
|
133
|
+
}
|
|
134
|
+
.ignite-index-title {
|
|
135
|
+
font-family: var(--ignite-font-heading, var(--ignite-font-sans, system-ui, sans-serif));
|
|
136
|
+
font-size: clamp(1.6rem, 1.1rem + 1.4vw, 2.1rem);
|
|
137
|
+
font-weight: 700;
|
|
138
|
+
line-height: 1.2;
|
|
139
|
+
margin: 0 0 calc(1.1 * var(--ignite-space));
|
|
140
|
+
}
|
|
141
|
+
.ignite-cards { display: grid; gap: calc(0.9 * var(--ignite-space)); }
|
|
142
|
+
.ignite-card {
|
|
143
|
+
display: block;
|
|
144
|
+
padding: calc(0.95 * var(--ignite-space)) calc(1.05 * var(--ignite-space));
|
|
145
|
+
border: 1px solid var(--ignite-color-border, #e5e5e5);
|
|
146
|
+
border-radius: var(--ignite-radius, 0.5rem);
|
|
147
|
+
text-decoration: none;
|
|
148
|
+
color: inherit;
|
|
149
|
+
}
|
|
150
|
+
.ignite-card:hover { border-color: var(--ignite-color-primary, #2563eb); }
|
|
151
|
+
.ignite-card-image {
|
|
152
|
+
width: 100%;
|
|
153
|
+
height: auto;
|
|
154
|
+
border-radius: calc(var(--ignite-radius, 0.5rem) * 0.6);
|
|
155
|
+
margin: 0 0 0.7em;
|
|
156
|
+
display: block;
|
|
157
|
+
}
|
|
158
|
+
.ignite-card-title {
|
|
159
|
+
font-family: var(--ignite-font-heading, var(--ignite-font-sans, system-ui, sans-serif));
|
|
160
|
+
font-size: 1.15rem;
|
|
161
|
+
font-weight: 650;
|
|
162
|
+
line-height: 1.3;
|
|
163
|
+
margin: 0 0 0.3em;
|
|
164
|
+
color: var(--ignite-color-text, currentColor);
|
|
165
|
+
}
|
|
166
|
+
.ignite-card-meta {
|
|
167
|
+
margin: 0 0 0.45em;
|
|
168
|
+
font-size: 0.875rem;
|
|
169
|
+
color: var(--ignite-color-muted, #666);
|
|
170
|
+
}
|
|
171
|
+
.ignite-card-excerpt {
|
|
172
|
+
margin: 0;
|
|
173
|
+
color: var(--ignite-color-muted, #666);
|
|
174
|
+
font-size: 0.98rem;
|
|
175
|
+
line-height: 1.55;
|
|
176
|
+
}
|
|
177
|
+
.ignite-tree { list-style: none; padding: 0; margin: 0; }
|
|
178
|
+
.ignite-tree .ignite-tree {
|
|
179
|
+
padding-inline-start: 1.15em;
|
|
180
|
+
margin-top: 0.4em;
|
|
181
|
+
border-inline-start: 1px solid var(--ignite-color-border, #e5e5e5);
|
|
182
|
+
}
|
|
183
|
+
.ignite-tree > li { margin: 0 0 0.55em; }
|
|
184
|
+
.ignite-tree a { color: inherit; text-decoration: none; }
|
|
185
|
+
.ignite-tree a:hover {
|
|
186
|
+
color: var(--ignite-color-primary, #2563eb);
|
|
187
|
+
text-decoration: underline;
|
|
188
|
+
}
|
|
189
|
+
.ignite-wiki-entry { margin-bottom: 0.35em; }
|
|
190
|
+
.ignite-wiki-link {
|
|
191
|
+
display: inline-flex;
|
|
192
|
+
align-items: center;
|
|
193
|
+
gap: 0.55em;
|
|
194
|
+
color: inherit;
|
|
195
|
+
text-decoration: none;
|
|
196
|
+
}
|
|
197
|
+
.ignite-wiki-link:hover {
|
|
198
|
+
color: var(--ignite-color-primary, #2563eb);
|
|
199
|
+
text-decoration: underline;
|
|
200
|
+
}
|
|
201
|
+
.ignite-wiki-thumb {
|
|
202
|
+
width: 1.6rem;
|
|
203
|
+
height: 1.6rem;
|
|
204
|
+
object-fit: cover;
|
|
205
|
+
border-radius: calc(var(--ignite-radius, 0.5rem) * 0.5);
|
|
206
|
+
flex-shrink: 0;
|
|
207
|
+
}
|
|
208
|
+
.ignite-wiki-title { font-weight: 550; }
|
|
209
|
+
.ignite-wiki-meta {
|
|
210
|
+
margin: 0.15em 0 0 2.15em;
|
|
211
|
+
font-size: 0.82rem;
|
|
212
|
+
color: var(--ignite-color-muted, #666);
|
|
213
|
+
}
|
|
214
|
+
.ignite-tree .ignite-tree .ignite-wiki-thumb {
|
|
215
|
+
width: 1.15rem;
|
|
216
|
+
height: 1.15rem;
|
|
217
|
+
}
|
|
218
|
+
.ignite-tree .ignite-tree .ignite-wiki-title { font-weight: 500; }
|
|
219
|
+
.ignite-tree .ignite-tree .ignite-wiki-meta {
|
|
220
|
+
margin-left: 1.7em;
|
|
221
|
+
font-size: 0.75rem;
|
|
222
|
+
}
|
|
223
|
+
@media (prefers-color-scheme: dark) {
|
|
224
|
+
.ignite {
|
|
225
|
+
--ignite-fallback-muted: #aaa;
|
|
226
|
+
--ignite-fallback-border: #333;
|
|
227
|
+
}
|
|
228
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,11 @@ export { IgniteClient, IgniteApiError, type ClientOptions, type CrawlEvent } fro
|
|
|
3
3
|
export { readConfig, requireConfig, IgniteConfigError, type IgniteConfig } from './env.js';
|
|
4
4
|
export type { AgentDirectives, RobotsDirective, SitemapEntry, MetadataDirective, FeedPage, FeedIndex, Measured, RateCI, } from './types.js';
|
|
5
5
|
export { default as robots } from './operator/robots.js';
|
|
6
|
-
export { default as sitemap } from './operator/sitemap.js';
|
|
7
|
-
export { IgniteJsonLd } from './operator/jsonld.js';
|
|
6
|
+
export { default as sitemap, igniteSitemap, mergeSitemap, feedPagesToSitemap } from './operator/sitemap.js';
|
|
7
|
+
export { IgniteJsonLd, FeedJsonLd } from './operator/jsonld.js';
|
|
8
8
|
export { igniteMetadata } from './operator/metadata.js';
|
|
9
|
+
export { FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind } from './operator/page.js';
|
|
10
|
+
export { BlogIndex } from './operator/blog.js';
|
|
11
|
+
export { WikiIndex } from './operator/wiki.js';
|
|
12
|
+
export { IgniteProse, IgniteTokensProvider, type IgniteTokens } from './operator/prose.js';
|
|
13
|
+
export { pageJsonLd, jsonLdBlocksForPage, feedMetadata, mergeSlugs } from './operator/ui.js';
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,12 @@ import 'server-only';
|
|
|
2
2
|
export { IgniteClient, IgniteApiError } from './client.js';
|
|
3
3
|
export { readConfig, requireConfig, IgniteConfigError } from './env.js';
|
|
4
4
|
export { default as robots } from './operator/robots.js';
|
|
5
|
-
export { default as sitemap } from './operator/sitemap.js';
|
|
6
|
-
export { IgniteJsonLd } from './operator/jsonld.js';
|
|
5
|
+
export { default as sitemap, igniteSitemap, mergeSitemap, feedPagesToSitemap } from './operator/sitemap.js';
|
|
6
|
+
export { IgniteJsonLd, FeedJsonLd } from './operator/jsonld.js';
|
|
7
7
|
export { igniteMetadata } from './operator/metadata.js';
|
|
8
|
+
export { FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind } from './operator/page.js';
|
|
9
|
+
export { BlogIndex } from './operator/blog.js';
|
|
10
|
+
export { WikiIndex } from './operator/wiki.js';
|
|
11
|
+
export { IgniteProse, IgniteTokensProvider } from './operator/prose.js';
|
|
12
|
+
export { pageJsonLd, jsonLdBlocksForPage, feedMetadata, mergeSlugs } from './operator/ui.js';
|
|
8
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAuC,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,UAAU,CAAC;AAY3F,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAuC,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,UAAU,CAAC;AAY3F,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAqB,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/operator/blog.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import 'server-only';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import type { Metadata } from 'next';
|
|
3
|
+
import { FeedArticle, feedPageMetadata, feedPagesOfKind, revalidate, tryLoadFeedPage } from './page.js';
|
|
4
|
+
import { type IgniteTokens } from './ui.js';
|
|
5
|
+
export { revalidate, FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind };
|
|
6
|
+
export { pageJsonLd, feedMetadata, mergeSlugs } from './ui.js';
|
|
7
|
+
export { FeedJsonLd } from './jsonld.js';
|
|
8
|
+
export { IgniteProse, IgniteTokensProvider, type IgniteTokens } from './prose.js';
|
|
4
9
|
type SlugParams = {
|
|
5
10
|
params: Promise<{
|
|
6
11
|
slug: string;
|
|
@@ -9,8 +14,8 @@ type SlugParams = {
|
|
|
9
14
|
export declare function generateStaticParams(): Promise<Array<{
|
|
10
15
|
slug: string;
|
|
11
16
|
}>>;
|
|
12
|
-
export declare function generateMetadata({ params }: SlugParams): Promise<
|
|
13
|
-
title?: string;
|
|
14
|
-
}>;
|
|
17
|
+
export declare function generateMetadata({ params }: SlugParams): Promise<Metadata>;
|
|
15
18
|
export default function BlogPage({ params }: SlugParams): Promise<import("react").JSX.Element>;
|
|
16
|
-
export declare function BlogIndex(
|
|
19
|
+
export declare function BlogIndex({ tokens }?: {
|
|
20
|
+
tokens?: IgniteTokens | undefined;
|
|
21
|
+
}): Promise<import("react").JSX.Element | null>;
|
package/dist/operator/blog.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import 'server-only';
|
|
3
3
|
import { notFound } from 'next/navigation';
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import { FeedCard } from './card.js';
|
|
5
|
+
import { FeedArticle, feedPageMetadata, feedPagesOfKind, revalidate, tryLoadFeedPage, } from './page.js';
|
|
6
|
+
import { IgniteFrame } from './prose.js';
|
|
7
|
+
export { revalidate, FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind };
|
|
8
|
+
export { pageJsonLd, feedMetadata, mergeSlugs } from './ui.js';
|
|
9
|
+
export { FeedJsonLd } from './jsonld.js';
|
|
10
|
+
export { IgniteProse, IgniteTokensProvider } from './prose.js';
|
|
6
11
|
export async function generateStaticParams() {
|
|
7
12
|
return (await feedPagesOfKind('article')).map((page) => ({ slug: page.slug }));
|
|
8
13
|
}
|
|
9
14
|
export async function generateMetadata({ params }) {
|
|
10
15
|
const { slug } = await params;
|
|
11
16
|
const page = await tryLoadFeedPage('article', slug);
|
|
12
|
-
return page ?
|
|
17
|
+
return page ? feedPageMetadata(page) : {};
|
|
13
18
|
}
|
|
14
19
|
export default async function BlogPage({ params }) {
|
|
15
20
|
const { slug } = await params;
|
|
@@ -18,10 +23,10 @@ export default async function BlogPage({ params }) {
|
|
|
18
23
|
notFound();
|
|
19
24
|
return _jsx(FeedArticle, { page: page });
|
|
20
25
|
}
|
|
21
|
-
export async function BlogIndex() {
|
|
26
|
+
export async function BlogIndex({ tokens } = {}) {
|
|
22
27
|
const pages = await feedPagesOfKind('article');
|
|
23
28
|
if (pages.length === 0)
|
|
24
29
|
return null;
|
|
25
|
-
return (
|
|
30
|
+
return (_jsxs(IgniteFrame, { tokens: tokens, children: [_jsx("h1", { className: "ignite-index-title", children: "Blog" }), _jsx("div", { className: "ignite-cards", children: pages.map((page) => (_jsx(FeedCard, { page: page }, page.slug))) })] }));
|
|
26
31
|
}
|
|
27
32
|
//# sourceMappingURL=blog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blog.js","sourceRoot":"","sources":["../../src/operator/blog.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"blog.js","sourceRoot":"","sources":["../../src/operator/blog.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI3C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAqB,MAAM,YAAY,CAAC;AAIlF,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,OAAO,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI;QAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,GAAI,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAE,MAAM,KAA4C,EAAE;IACpF,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,MAAC,WAAW,IAAC,MAAM,EAAE,MAAM,aACzB,aAAI,SAAS,EAAC,oBAAoB,qBAAU,EAC5C,cAAK,SAAS,EAAC,cAAc,YAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,IAAO,IAAI,CAAC,IAAI,CAAI,CACzC,CAAC,GACE,IACM,CACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import 'server-only';
|
|
3
|
+
import { formatFeedDate, pageHero, plainExcerpt, publicPublishedAt } from './ui.js';
|
|
4
|
+
export function FeedCard({ page }) {
|
|
5
|
+
const excerpt = page.excerpt?.trim() || plainExcerpt(page.html);
|
|
6
|
+
const date = formatFeedDate(publicPublishedAt(page) ?? page.updatedAt);
|
|
7
|
+
const author = page.author?.name;
|
|
8
|
+
const image = pageHero(page);
|
|
9
|
+
return (_jsxs("a", { className: "ignite-card", href: page.path, children: [image?.url ? (_jsx("img", { className: "ignite-card-image", src: image.url, alt: image.alt ?? page.title })) : null, _jsx("h2", { className: "ignite-card-title", children: page.title }), author || date ? (_jsxs("p", { className: "ignite-card-meta", children: [author, author && date ? ' · ' : null, date] })) : null, excerpt ? _jsx("p", { className: "ignite-card-excerpt", children: excerpt }) : null] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/operator/card.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpF,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAsB;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7B,OAAO,CACL,aAAG,SAAS,EAAC,aAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,aACvC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CACZ,cAAK,SAAS,EAAC,mBAAmB,EAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,GAAI,CACpF,CAAC,CAAC,CAAC,IAAI,EACR,aAAI,SAAS,EAAC,mBAAmB,YAAE,IAAI,CAAC,KAAK,GAAM,EAClD,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAChB,aAAG,SAAS,EAAC,kBAAkB,aAC5B,MAAM,EACN,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAC7B,IAAI,IACH,CACL,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,qBAAqB,YAAE,OAAO,GAAK,CAAC,CAAC,CAAC,IAAI,IAChE,CACL,CAAC;AACJ,CAAC"}
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
import 'server-only';
|
|
2
|
+
import type { FeedPage } from '../types.js';
|
|
3
|
+
import { type FeedUrlOptions } from './ui.js';
|
|
2
4
|
export declare function IgniteJsonLd(): Promise<React.JSX.Element | null>;
|
|
5
|
+
export declare function FeedJsonLd({ page, siteUrl }: {
|
|
6
|
+
page: FeedPage;
|
|
7
|
+
} & FeedUrlOptions): import("react").JSX.Element;
|