@jant/core 0.6.11 → 0.6.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/bin/commands/import-site.js +47 -30
- package/bin/commands/migrate-text-attachments.js +1 -3
- package/bin/commands/site/export.js +1 -3
- package/bin/commands/telegram/register-webhooks.js +9 -3
- package/bin/lib/site-snapshot.js +1 -5
- package/dist/app-CWJFPjuR.js +6 -0
- package/dist/{app-CpmficmQ.js → app-HnzmsaqU.js} +721 -473
- package/dist/client/.vite/manifest.json +3 -3
- package/dist/client/_assets/{client-Dd9U383b.js → client-3_OaxhTs.js} +1 -1
- package/dist/client/_assets/client-DCrcHVJl.css +2 -0
- package/dist/client/_assets/{client-auth-DkpSdIDz.js → client-auth-TsYq90xm.js} +625 -561
- package/dist/{export-Ba7NJImL.js → export-Dfbq9aot.js} +12 -15
- package/dist/{github-sync-Cb4_6_i7.js → github-sync--PSoE-Ne.js} +1 -1
- package/dist/{github-sync-BD4w2m8-.js → github-sync-BGTLx8Mf.js} +2 -2
- package/dist/index.js +3 -3
- package/dist/node.js +4 -4
- package/package.json +1 -1
- package/src/__tests__/export-service.test.ts +1 -2
- package/src/__tests__/helpers/app.ts +3 -0
- package/src/__tests__/helpers/export-fixtures.ts +0 -1
- package/src/__tests__/import-site-command.test.ts +76 -2
- package/src/__tests__/vite-dev-plugins.test.ts +34 -0
- package/src/client/__tests__/compose-launch.test.ts +50 -1
- package/src/client/__tests__/compose-shortcuts.test.ts +74 -18
- package/src/client/__tests__/site-header-nav.test.ts +36 -2
- package/src/client/components/__tests__/compose-title-from-heading.test.ts +57 -0
- package/src/client/components/__tests__/jant-command-palette.test.ts +63 -0
- package/src/client/components/__tests__/jant-compose-dialog.test.ts +33 -0
- package/src/client/components/__tests__/jant-compose-editor-rehost-notice.test.ts +20 -1
- package/src/client/components/__tests__/jant-compose-editor.test.ts +94 -2
- package/src/client/components/__tests__/jant-nav-manager.test.ts +181 -20
- package/src/client/components/__tests__/jant-settings-avatar.test.ts +6 -0
- package/src/client/components/__tests__/jant-settings-general.test.ts +72 -0
- package/src/client/components/compose-title-from-heading.ts +66 -0
- package/src/client/components/compose-types.ts +8 -0
- package/src/client/components/inline-image-issues.ts +17 -0
- package/src/client/components/jant-command-palette.ts +67 -2
- package/src/client/components/jant-compose-dialog.ts +10 -2
- package/src/client/components/jant-compose-editor.ts +78 -1
- package/src/client/components/jant-compose-fullscreen.ts +2 -0
- package/src/client/components/jant-nav-manager.ts +382 -152
- package/src/client/components/jant-settings-general.ts +56 -0
- package/src/client/components/nav-manager-types.ts +14 -10
- package/src/client/components/settings-types.ts +30 -0
- package/src/client/compose-launch.ts +30 -0
- package/src/client/compose-shortcuts.ts +46 -3
- package/src/client/site-header-nav.d.ts +1 -0
- package/src/client/site-header-nav.js +105 -47
- package/src/client/tiptap/__tests__/block-insertion.test.ts +35 -0
- package/src/client/tiptap/__tests__/image-input-rules.test.ts +117 -0
- package/src/client/tiptap/__tests__/rehost-images.test.ts +66 -13
- package/src/client/tiptap/create-editor.ts +7 -0
- package/src/client/tiptap/extensions.ts +7 -2
- package/src/client/tiptap/image-input-rules.ts +48 -0
- package/src/client/tiptap/image-node.ts +189 -7
- package/src/client/tiptap/rehost-images.ts +5 -1
- package/src/client-auth.ts +0 -1
- package/src/i18n/__tests__/fallback.test.ts +24 -0
- package/src/i18n/locales/public/en.po +20 -4
- package/src/i18n/locales/public/en.ts +1 -1
- package/src/i18n/locales/public/zh-Hans.po +22 -6
- package/src/i18n/locales/public/zh-Hans.ts +1 -1
- package/src/i18n/locales/public/zh-Hant.po +22 -6
- package/src/i18n/locales/public/zh-Hant.ts +1 -1
- package/src/i18n/locales/settings/en.po +77 -20
- package/src/i18n/locales/settings/en.ts +1 -1
- package/src/i18n/locales/settings/zh-Hans.po +85 -28
- package/src/i18n/locales/settings/zh-Hans.ts +1 -1
- package/src/i18n/locales/settings/zh-Hant.po +79 -22
- package/src/i18n/locales/settings/zh-Hant.ts +1 -1
- package/src/lib/__tests__/feed.test.ts +96 -10
- package/src/lib/__tests__/navigation.test.ts +4 -37
- package/src/lib/__tests__/resolve-config.test.ts +6 -1
- package/src/lib/__tests__/view.test.ts +6 -30
- package/src/lib/feed.ts +63 -3
- package/src/lib/github-sync-site-config.ts +0 -2
- package/src/lib/hugo-markdown.ts +1 -1
- package/src/lib/navigation.ts +5 -22
- package/src/lib/post-display.ts +14 -8
- package/src/lib/resolve-config.ts +9 -2
- package/src/lib/site-header-fragment.tsx +37 -0
- package/src/lib/view.ts +2 -7
- package/src/node/__tests__/cli-site-snapshot.test.ts +45 -45
- package/src/preset.css +60 -18
- package/src/routes/api/__tests__/nav-items.test.ts +26 -0
- package/src/routes/api/export.ts +0 -2
- package/src/routes/api/internal/__tests__/uploads.test.ts +9 -13
- package/src/routes/api/internal/sites.ts +5 -5
- package/src/routes/api/nav-items.ts +25 -4
- package/src/routes/dash/settings.tsx +48 -3
- package/src/routes/feed/__tests__/feed.test.ts +42 -0
- package/src/routes/feed/__tests__/sitemap.test.ts +2 -13
- package/src/routes/feed/feed.ts +1 -0
- package/src/routes/feed/sitemap.ts +2 -6
- package/src/routes/pages/__tests__/draft-about-edit.test.ts +65 -0
- package/src/routes/pages/archive.tsx +1 -0
- package/src/routes/pages/collection.tsx +1 -0
- package/src/routes/pages/featured.tsx +0 -4
- package/src/routes/pages/home.tsx +4 -51
- package/src/routes/pages/latest.tsx +2 -51
- package/src/routes/pages/page.tsx +44 -12
- package/src/services/__tests__/about-page.test.ts +116 -0
- package/src/services/__tests__/github-app-installations.test.ts +10 -10
- package/src/services/__tests__/navigation.test.ts +231 -1
- package/src/services/__tests__/post-timeline.test.ts +175 -2
- package/src/services/__tests__/post.test.ts +33 -0
- package/src/services/__tests__/settings.test.ts +5 -20
- package/src/services/about-page.ts +143 -0
- package/src/services/export-theme/assets/client-site.js +10 -10
- package/src/services/export-theme/layouts/_default/rss.xml +7 -16
- package/src/services/export-theme/layouts/index.html +26 -39
- package/src/services/export-theme/layouts/partials/feed-post-content.xml +25 -1
- package/src/services/export-theme/styles/main.css +46 -14
- package/src/services/export.ts +5 -10
- package/src/services/github-app-installations.ts +1 -3
- package/src/services/index.ts +27 -17
- package/src/services/navigation.ts +186 -1
- package/src/services/post.ts +103 -63
- package/src/services/settings.ts +0 -10
- package/src/services/site-admin.ts +0 -2
- package/src/services/upload-session.ts +4 -18
- package/src/styles/components.css +20 -0
- package/src/styles/tokens.css +28 -10
- package/src/styles/ui.css +349 -13
- package/src/types/bindings.ts +0 -1
- package/src/types/config.ts +3 -7
- package/src/types/views.ts +13 -0
- package/src/ui/compose/ComposeDialog.tsx +28 -0
- package/src/ui/dash/appearance/NavigationContent.tsx +58 -1
- package/src/ui/dash/appearance/__tests__/NavigationContent.test.tsx +19 -0
- package/src/ui/dash/settings/AccountMenuContent.tsx +2 -2
- package/src/ui/dash/settings/GeneralContent.tsx +44 -0
- package/src/ui/dash/settings/SettingsRootContent.tsx +3 -3
- package/src/ui/dash/settings/__tests__/GeneralContent.test.tsx +8 -0
- package/src/ui/feed/__tests__/timeline-cards.test.ts +162 -1
- package/src/ui/layouts/SiteLayout.tsx +249 -216
- package/dist/app-DqKkZenB.js +0 -6
- package/dist/client/_assets/client-BhHHVvSY.css +0 -2
- package/src/client/nav-manager-bridge.ts +0 -54
|
@@ -22,6 +22,7 @@ function renderNavigationContent(
|
|
|
22
22
|
NavigationContent({
|
|
23
23
|
navItems: [],
|
|
24
24
|
directoryData: { collections: [], items: [], directoryItems: [] },
|
|
25
|
+
suggestedLinks: [],
|
|
25
26
|
mainRssFeed: "latest",
|
|
26
27
|
siteName: "Test Site",
|
|
27
28
|
...props,
|
|
@@ -51,4 +52,22 @@ describe("NavigationContent", () => {
|
|
|
51
52
|
|
|
52
53
|
expect(html).toContain("Built-in links");
|
|
53
54
|
});
|
|
55
|
+
|
|
56
|
+
it("serializes suggested links with translated target labels", () => {
|
|
57
|
+
const html = renderNavigationContent({
|
|
58
|
+
suggestedLinks: [
|
|
59
|
+
{
|
|
60
|
+
key: "now",
|
|
61
|
+
label: "Now",
|
|
62
|
+
url: "/now",
|
|
63
|
+
targetType: "collection",
|
|
64
|
+
navItemType: "collection",
|
|
65
|
+
collectionId: "col_now",
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
expect(html).toContain("suggested-links=");
|
|
71
|
+
expect(html).toContain(""targetLabel":"Collection"");
|
|
72
|
+
});
|
|
54
73
|
});
|
|
@@ -66,7 +66,7 @@ export function AccountMenuContent({
|
|
|
66
66
|
: i18n._(
|
|
67
67
|
msg({
|
|
68
68
|
message:
|
|
69
|
-
"Manage sign-in security, exports, and irreversible actions.",
|
|
69
|
+
"Manage sign-in security, site exports, and irreversible actions.",
|
|
70
70
|
comment:
|
|
71
71
|
"@context: Intro text on the account settings menu page below the title",
|
|
72
72
|
}),
|
|
@@ -105,7 +105,7 @@ export function AccountMenuContent({
|
|
|
105
105
|
<h1 class="page-intro-title page-intro-title-compact">
|
|
106
106
|
{i18n._(
|
|
107
107
|
msg({
|
|
108
|
-
message: "Account",
|
|
108
|
+
message: "Account & Data",
|
|
109
109
|
comment: "@context: Page title for the account settings menu",
|
|
110
110
|
}),
|
|
111
111
|
)}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { msg } from "@lingui/core/macro";
|
|
11
11
|
import { useLingui } from "../../../i18n/context.js";
|
|
12
12
|
import type { TimezoneEntry } from "../../../lib/timezones.js";
|
|
13
|
+
import type { AboutPageStatus } from "../../../services/about-page.js";
|
|
13
14
|
|
|
14
15
|
export function GeneralContent({
|
|
15
16
|
siteName,
|
|
@@ -30,6 +31,9 @@ export function GeneralContent({
|
|
|
30
31
|
noindex,
|
|
31
32
|
demoMode,
|
|
32
33
|
timezones,
|
|
34
|
+
aboutPage,
|
|
35
|
+
aboutEditUrl,
|
|
36
|
+
aboutCreateUrl,
|
|
33
37
|
}: {
|
|
34
38
|
siteName: string;
|
|
35
39
|
siteDescription: string;
|
|
@@ -49,6 +53,9 @@ export function GeneralContent({
|
|
|
49
53
|
noindex: boolean;
|
|
50
54
|
demoMode: boolean;
|
|
51
55
|
timezones: TimezoneEntry[];
|
|
56
|
+
aboutPage: AboutPageStatus;
|
|
57
|
+
aboutEditUrl: string;
|
|
58
|
+
aboutCreateUrl: string;
|
|
52
59
|
}) {
|
|
53
60
|
const { i18n } = useLingui();
|
|
54
61
|
|
|
@@ -65,6 +72,38 @@ export function GeneralContent({
|
|
|
65
72
|
comment: "@context: Settings subsection heading for basic site fields",
|
|
66
73
|
}),
|
|
67
74
|
),
|
|
75
|
+
aboutPage: i18n._(
|
|
76
|
+
msg({
|
|
77
|
+
message: "About page",
|
|
78
|
+
comment: "@context: Link label for editing or creating the About page",
|
|
79
|
+
}),
|
|
80
|
+
),
|
|
81
|
+
aboutPagePrompt: i18n._(
|
|
82
|
+
msg({
|
|
83
|
+
message: "Want to write a fuller introduction?",
|
|
84
|
+
comment:
|
|
85
|
+
"@context: Prompt shown below the short site description, before the About page action",
|
|
86
|
+
}),
|
|
87
|
+
),
|
|
88
|
+
createAboutPage: i18n._(
|
|
89
|
+
msg({
|
|
90
|
+
message: "Create About page",
|
|
91
|
+
comment: "@context: Button to create the standard About page",
|
|
92
|
+
}),
|
|
93
|
+
),
|
|
94
|
+
editAboutPage: i18n._(
|
|
95
|
+
msg({
|
|
96
|
+
message: "Edit About page",
|
|
97
|
+
comment: "@context: Link to edit the standard About page",
|
|
98
|
+
}),
|
|
99
|
+
),
|
|
100
|
+
aboutPageConflict: i18n._(
|
|
101
|
+
msg({
|
|
102
|
+
message:
|
|
103
|
+
"/about is already used. Rename that item before creating an About page.",
|
|
104
|
+
comment: "@context: Compact conflict message when /about is occupied",
|
|
105
|
+
}),
|
|
106
|
+
),
|
|
68
107
|
languageAndTime: i18n._(
|
|
69
108
|
msg({
|
|
70
109
|
message: "Language & Time",
|
|
@@ -369,6 +408,8 @@ export function GeneralContent({
|
|
|
369
408
|
{ value: "ko", label: "\uD55C\uAD6D\uC5B4 (Korean)" },
|
|
370
409
|
]).replace(/</g, "\\u003c");
|
|
371
410
|
|
|
411
|
+
const aboutPageJson = JSON.stringify(aboutPage).replace(/</g, "\\u003c");
|
|
412
|
+
|
|
372
413
|
const initialData = JSON.stringify({
|
|
373
414
|
siteName,
|
|
374
415
|
siteDescription,
|
|
@@ -397,6 +438,9 @@ export function GeneralContent({
|
|
|
397
438
|
featured-feed-url={featuredFeedUrl}
|
|
398
439
|
archive-feed-url={archiveFeedUrl}
|
|
399
440
|
demo-mode={demoMode || undefined}
|
|
441
|
+
about-page={aboutPageJson}
|
|
442
|
+
about-edit-url={aboutEditUrl}
|
|
443
|
+
about-create-url={aboutCreateUrl}
|
|
400
444
|
>
|
|
401
445
|
{/* SSR fallback skeleton */}
|
|
402
446
|
<div>
|
|
@@ -51,7 +51,7 @@ export function SettingsRootContent({
|
|
|
51
51
|
)
|
|
52
52
|
: i18n._(
|
|
53
53
|
msg({
|
|
54
|
-
message: "
|
|
54
|
+
message: "Sign-in, export, and deletion",
|
|
55
55
|
comment:
|
|
56
56
|
"@context: Settings item description for account settings on the settings home page",
|
|
57
57
|
}),
|
|
@@ -171,7 +171,7 @@ export function SettingsRootContent({
|
|
|
171
171
|
)}
|
|
172
172
|
description={i18n._(
|
|
173
173
|
msg({
|
|
174
|
-
message: "Header links,
|
|
174
|
+
message: "Header links, built-in destinations, and overflow menu",
|
|
175
175
|
comment: "@context: Settings item description for navigation",
|
|
176
176
|
}),
|
|
177
177
|
)}
|
|
@@ -333,7 +333,7 @@ export function SettingsRootContent({
|
|
|
333
333
|
tone="subtle"
|
|
334
334
|
name={i18n._(
|
|
335
335
|
msg({
|
|
336
|
-
message: "Account",
|
|
336
|
+
message: "Account & Data",
|
|
337
337
|
comment: "@context: Settings item — account settings",
|
|
338
338
|
}),
|
|
339
339
|
)}
|
|
@@ -37,6 +37,8 @@ function createProps(
|
|
|
37
37
|
siteName: "My Blog",
|
|
38
38
|
siteDescription: "A test blog",
|
|
39
39
|
siteLanguage: "en",
|
|
40
|
+
dashboardLanguage: "en",
|
|
41
|
+
cjkSerifFont: "off",
|
|
40
42
|
siteNameFallback: "Fallback Name",
|
|
41
43
|
siteDescriptionFallback: "Fallback Description",
|
|
42
44
|
mainRssFeed: "featured" as const,
|
|
@@ -49,6 +51,12 @@ function createProps(
|
|
|
49
51
|
showJantBrandingOnHome: false,
|
|
50
52
|
noindex: false,
|
|
51
53
|
demoMode,
|
|
54
|
+
aboutPage: {
|
|
55
|
+
state: "missing" as const,
|
|
56
|
+
path: "/about" as const,
|
|
57
|
+
},
|
|
58
|
+
aboutEditUrl: "/about?edit=1",
|
|
59
|
+
aboutCreateUrl: "/settings/general/about-page",
|
|
52
60
|
timezones: [
|
|
53
61
|
{
|
|
54
62
|
value: "UTC",
|
|
@@ -104,13 +104,43 @@ describe("timeline cards", () => {
|
|
|
104
104
|
});
|
|
105
105
|
|
|
106
106
|
it("preserves authored line breaks in quote cards", () => {
|
|
107
|
+
const tokens = readFileSync(
|
|
108
|
+
new URL("../../../styles/tokens.css", import.meta.url),
|
|
109
|
+
"utf8",
|
|
110
|
+
);
|
|
107
111
|
const css = readFileSync(
|
|
108
112
|
new URL("../../../styles/ui.css", import.meta.url),
|
|
109
113
|
"utf8",
|
|
110
114
|
);
|
|
115
|
+
const exportCss = readFileSync(
|
|
116
|
+
new URL(
|
|
117
|
+
"../../../services/export-theme/styles/main.css",
|
|
118
|
+
import.meta.url,
|
|
119
|
+
),
|
|
120
|
+
"utf8",
|
|
121
|
+
);
|
|
111
122
|
|
|
123
|
+
expect(tokens).toMatch(
|
|
124
|
+
/--feed-note-title-size:\s*calc\(var\(--type-content-body\) \* 1\.36\);/,
|
|
125
|
+
);
|
|
126
|
+
expect(tokens).toMatch(
|
|
127
|
+
/--type-content-quote:\s*calc\(var\(--type-content-body\) \* 1\.16\);/,
|
|
128
|
+
);
|
|
129
|
+
expect(tokens).toMatch(/--type-content-quote-leading:\s*1\.4;/);
|
|
130
|
+
expect(css).toMatch(
|
|
131
|
+
/\.feed-note-title\s*\{[\s\S]*font-size:\s*var\(--feed-note-title-size\);/,
|
|
132
|
+
);
|
|
133
|
+
expect(css).toMatch(
|
|
134
|
+
/\.feed-link-title\s*\{[\s\S]*font-size:\s*var\(--feed-note-title-size\);/,
|
|
135
|
+
);
|
|
136
|
+
expect(exportCss).toMatch(
|
|
137
|
+
/\.post-card-title\s*\{[\s\S]*font-size:\s*var\(--feed-note-title-size\);/,
|
|
138
|
+
);
|
|
112
139
|
expect(css).toMatch(
|
|
113
|
-
/\.feed-quote-content\s*\{[\s\S]*white-space:\s*pre-line;/,
|
|
140
|
+
/\.feed-quote-content\s*\{[\s\S]*font-size:\s*var\(--type-content-quote\);[\s\S]*line-height:\s*var\(--type-content-quote-leading\);[\s\S]*white-space:\s*pre-line;/,
|
|
141
|
+
);
|
|
142
|
+
expect(exportCss).toMatch(
|
|
143
|
+
/\.post-card-quote-content\s*\{[\s\S]*font-size:\s*var\(--type-content-quote\);[\s\S]*line-height:\s*var\(--type-content-quote-leading\);[\s\S]*white-space:\s*pre-line;/,
|
|
114
144
|
);
|
|
115
145
|
});
|
|
116
146
|
|
|
@@ -136,6 +166,123 @@ describe("timeline cards", () => {
|
|
|
136
166
|
expect(css).toContain("margin-bottom: 0;");
|
|
137
167
|
});
|
|
138
168
|
|
|
169
|
+
it("keeps prose list rhythm compact in live and exported reading", () => {
|
|
170
|
+
const presetCss = readFileSync(
|
|
171
|
+
new URL("../../../preset.css", import.meta.url),
|
|
172
|
+
"utf8",
|
|
173
|
+
);
|
|
174
|
+
const exportCss = readFileSync(
|
|
175
|
+
new URL(
|
|
176
|
+
"../../../services/export-theme/styles/main.css",
|
|
177
|
+
import.meta.url,
|
|
178
|
+
),
|
|
179
|
+
"utf8",
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
expect(presetCss).toMatch(
|
|
183
|
+
/:where\(ul,\s*ol\)\s*\{[\s\S]*padding-left:\s*1\.4em;/,
|
|
184
|
+
);
|
|
185
|
+
expect(exportCss).toMatch(
|
|
186
|
+
/ul,\s*[\s\S]*ol\s*\{[\s\S]*padding-left:\s*1\.4em;/,
|
|
187
|
+
);
|
|
188
|
+
expect(presetCss).toMatch(
|
|
189
|
+
/:where\(li,\s*dt\)\s*\{[\s\S]*margin-top:\s*0\.65em;[\s\S]*margin-bottom:\s*0\.65em;/,
|
|
190
|
+
);
|
|
191
|
+
expect(exportCss).toMatch(
|
|
192
|
+
/li\s*\{[\s\S]*margin-top:\s*0\.65em;[\s\S]*margin-bottom:\s*0\.65em;/,
|
|
193
|
+
);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("uses dedicated markdown code surfaces in live and exported prose", () => {
|
|
197
|
+
const presetCss = readFileSync(
|
|
198
|
+
new URL("../../../preset.css", import.meta.url),
|
|
199
|
+
"utf8",
|
|
200
|
+
);
|
|
201
|
+
const tokenCss = readFileSync(
|
|
202
|
+
new URL("../../../styles/tokens.css", import.meta.url),
|
|
203
|
+
"utf8",
|
|
204
|
+
);
|
|
205
|
+
const exportCss = readFileSync(
|
|
206
|
+
new URL(
|
|
207
|
+
"../../../services/export-theme/styles/main.css",
|
|
208
|
+
import.meta.url,
|
|
209
|
+
),
|
|
210
|
+
"utf8",
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
expect(tokenCss).toContain("--site-code-bg:");
|
|
214
|
+
expect(tokenCss).toContain("--site-code-block-bg:");
|
|
215
|
+
expect(tokenCss).toContain(
|
|
216
|
+
"--type-code: calc(var(--type-body-size) * 0.94);",
|
|
217
|
+
);
|
|
218
|
+
expect(tokenCss).toContain(
|
|
219
|
+
"--type-code-block: calc(var(--type-body-size) * 0.9);",
|
|
220
|
+
);
|
|
221
|
+
expect(presetCss).toContain("background-color: var(--site-code-bg);");
|
|
222
|
+
expect(presetCss).toContain("background-color: var(--site-code-block-bg);");
|
|
223
|
+
expect(exportCss).toContain("background-color: var(--site-code-bg);");
|
|
224
|
+
expect(exportCss).toContain("background-color: var(--site-code-block-bg);");
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it("keeps markdown h2 and h3 headings upright across surfaces", () => {
|
|
228
|
+
const presetCss = readFileSync(
|
|
229
|
+
new URL("../../../preset.css", import.meta.url),
|
|
230
|
+
"utf8",
|
|
231
|
+
);
|
|
232
|
+
const uiCss = readFileSync(
|
|
233
|
+
new URL("../../../styles/ui.css", import.meta.url),
|
|
234
|
+
"utf8",
|
|
235
|
+
);
|
|
236
|
+
const exportCss = readFileSync(
|
|
237
|
+
new URL(
|
|
238
|
+
"../../../services/export-theme/styles/main.css",
|
|
239
|
+
import.meta.url,
|
|
240
|
+
),
|
|
241
|
+
"utf8",
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
expect(presetCss).not.toMatch(
|
|
245
|
+
/:where\(h[23]\)\s*\{[^}]*font-style:\s*italic;/,
|
|
246
|
+
);
|
|
247
|
+
expect(uiCss).not.toMatch(
|
|
248
|
+
/\.compose-tiptap-body\s+\.tiptap\s+h[23]\s*\{[^}]*font-style:\s*italic;/,
|
|
249
|
+
);
|
|
250
|
+
expect(exportCss).not.toMatch(/h[23]\s*\{[^}]*font-style:\s*italic;/);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it("compacts authored headings inside feed body prose", () => {
|
|
254
|
+
const presetCss = readFileSync(
|
|
255
|
+
new URL("../../../preset.css", import.meta.url),
|
|
256
|
+
"utf8",
|
|
257
|
+
);
|
|
258
|
+
const exportCss = readFileSync(
|
|
259
|
+
new URL(
|
|
260
|
+
"../../../services/export-theme/styles/main.css",
|
|
261
|
+
import.meta.url,
|
|
262
|
+
),
|
|
263
|
+
"utf8",
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
expect(presetCss).toContain(
|
|
267
|
+
'[data-post]:not([data-page="post"]) [data-post-body].prose',
|
|
268
|
+
);
|
|
269
|
+
expect(presetCss).toMatch(
|
|
270
|
+
/:where\(h1,\s*h2\)\s*\{[\s\S]*font-size:\s*calc\(var\(--type-content-body\) \* 1\.12\);/,
|
|
271
|
+
);
|
|
272
|
+
expect(presetCss).toMatch(
|
|
273
|
+
/:where\(h3,\s*h4\)\s*\{[\s\S]*font-size:\s*var\(--type-content-body\);/,
|
|
274
|
+
);
|
|
275
|
+
expect(presetCss).toMatch(
|
|
276
|
+
/:where\(h5,\s*h6\)\s*\{[\s\S]*font-size:\s*var\(--type-secondary\);/,
|
|
277
|
+
);
|
|
278
|
+
expect(exportCss).toMatch(
|
|
279
|
+
/\.post-card > \.post-card-summary :is\(h1,\s*h2\),/,
|
|
280
|
+
);
|
|
281
|
+
expect(exportCss).toMatch(
|
|
282
|
+
/\.post-card > \.post-card-summary :is\(h5,\s*h6\),/,
|
|
283
|
+
);
|
|
284
|
+
});
|
|
285
|
+
|
|
139
286
|
it("keeps quote footers on the shared card spacing baseline", () => {
|
|
140
287
|
const css = readFileSync(
|
|
141
288
|
new URL("../../../styles/ui.css", import.meta.url),
|
|
@@ -266,6 +413,20 @@ describe("timeline cards", () => {
|
|
|
266
413
|
);
|
|
267
414
|
});
|
|
268
415
|
|
|
416
|
+
it("keeps titled detail headers spaced as one reading group", () => {
|
|
417
|
+
const css = readFileSync(
|
|
418
|
+
new URL("../../../styles/ui.css", import.meta.url),
|
|
419
|
+
"utf8",
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
expect(css).toMatch(
|
|
423
|
+
/\.post-header-block\s*\{[\s\S]*margin-bottom:\s*1\.7rem;/,
|
|
424
|
+
);
|
|
425
|
+
expect(css).toMatch(
|
|
426
|
+
/\.post-header-block-detail\s*\{[\s\S]*gap:\s*0\.7rem;/,
|
|
427
|
+
);
|
|
428
|
+
});
|
|
429
|
+
|
|
269
430
|
it("renders titled note feed summaries as secondary prose without shrinking detail reading", () => {
|
|
270
431
|
const post = createPostView({
|
|
271
432
|
format: "note",
|