@ignite-agent/agent 0.1.1 → 0.4.1

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.
Files changed (46) hide show
  1. package/AI.txt +7 -0
  2. package/LICENSE +57 -4
  3. package/README.md +162 -5
  4. package/dist/cli/index.js +79 -22
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/project.d.ts +39 -0
  7. package/dist/cli/project.js +276 -0
  8. package/dist/cli/project.js.map +1 -0
  9. package/dist/ignite.css +228 -0
  10. package/dist/index.d.ts +7 -2
  11. package/dist/index.js +7 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/operator/blog.d.ts +11 -6
  14. package/dist/operator/blog.js +11 -6
  15. package/dist/operator/blog.js.map +1 -1
  16. package/dist/operator/card.d.ts +5 -0
  17. package/dist/operator/card.js +11 -0
  18. package/dist/operator/card.js.map +1 -0
  19. package/dist/operator/jsonld.d.ts +5 -0
  20. package/dist/operator/jsonld.js +5 -3
  21. package/dist/operator/jsonld.js.map +1 -1
  22. package/dist/operator/page.d.ts +10 -1
  23. package/dist/operator/page.js +20 -3
  24. package/dist/operator/page.js.map +1 -1
  25. package/dist/operator/prose.d.ts +19 -0
  26. package/dist/operator/prose.js +26 -0
  27. package/dist/operator/prose.js.map +1 -0
  28. package/dist/operator/sitemap-merge.d.ts +10 -0
  29. package/dist/operator/sitemap-merge.js +56 -0
  30. package/dist/operator/sitemap-merge.js.map +1 -0
  31. package/dist/operator/sitemap.d.ts +4 -1
  32. package/dist/operator/sitemap.js +27 -17
  33. package/dist/operator/sitemap.js.map +1 -1
  34. package/dist/operator/ui.d.ts +44 -0
  35. package/dist/operator/ui.js +477 -0
  36. package/dist/operator/ui.js.map +1 -0
  37. package/dist/operator/wiki.d.ts +11 -5
  38. package/dist/operator/wiki.js +24 -4
  39. package/dist/operator/wiki.js.map +1 -1
  40. package/dist/types.d.ts +26 -1
  41. package/onboarding/CLAUDE-CODE-SETUP.md +40 -24
  42. package/onboarding/CURSOR-SETUP.md +73 -0
  43. package/onboarding/LOVABLE-SETUP.md +76 -0
  44. package/onboarding/MIGRATE-EXISTING.md +94 -0
  45. package/onboarding/REPLIT-SETUP.md +76 -0
  46. 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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"}
@@ -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, 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, 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;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,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,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,6 +1,11 @@
1
1
  import 'server-only';
2
- import { revalidate } from './page.js';
3
- export { revalidate };
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(): Promise<import("react").JSX.Element | null>;
19
+ export declare function BlogIndex({ tokens }?: {
20
+ tokens?: IgniteTokens | undefined;
21
+ }): Promise<import("react").JSX.Element | null>;
@@ -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 { FeedArticle, feedPagesOfKind, revalidate, tryLoadFeedPage } from './page.js';
5
- export { revalidate };
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 ? { title: page.title } : {};
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 (_jsx("ul", { children: pages.map((page) => (_jsx("li", { children: _jsx("a", { href: page.path, children: page.title }) }, page.slug))) }));
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;AAE3C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEtF,OAAO,EAAE,UAAU,EAAE,CAAC;AAItB,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,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,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;IAC7B,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,uBACG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,uBACE,YAAG,IAAI,EAAE,IAAI,CAAC,IAAI,YAAG,IAAI,CAAC,KAAK,GAAK,IAD7B,IAAI,CAAC,IAAI,CAEb,CACN,CAAC,GACC,CACN,CAAC;AACJ,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,5 @@
1
+ import 'server-only';
2
+ import type { FeedPage } from '../types.js';
3
+ export declare function FeedCard({ page }: {
4
+ page: FeedPage;
5
+ }): import("react").JSX.Element;
@@ -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;