@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
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { _ as toPublicPath, a as getSitePathPrefix, b as __exportAll, c as normalizePath, d as sanitizeUrl, f as slugify, g as toPublicHref, h as toAbsoluteSiteUrl, i as getSiteOrigin, m as toAbsoluteAssetUrl, n as extractDisplayDomain, o as isFullUrl, p as stripSitePathPrefix, r as extractDomain, s as isSafeInternalRedirect, t as buildSiteUrl, u as normalizeSiteUrl, v as toSameSitePath } from "./url-BMYO-Zlt.js";
|
|
2
|
-
import { A as JANT_POSITIVE_LOGO_PNG_FILENAME, B as getJantLogoHref, C as toISOString, D as HOME_BRANDING_LINK_LABEL, E as getPublicUrlForProvider, F as getJantBundledAsset, G as base64ToUint8Array, H as JANT_LOGO_PATH_DATA, I as getJantIconFilename, L as getJantIconHref, M as getDefaultJantAppleTouchIconBytes, N as getDefaultJantFaviconIcoBytes, O as HOME_BRANDING_PREFIX, P as getJantBrandPackHref, R as getJantLogoFilename, T as getMediaUrl, U as JANT_LOGO_VIEW_BOX, V as getJantPositiveLogoPngHref, W as arrayBufferToBase64, _ as formatRelativeAge, b as formatYearMonth, d as extractSummaryHtml, f as renderTiptapDocument, g as formatDate, h as escapeHtml, i as tiptapJsonToMarkdown, j as JANT_REPO_URL, k as JANT_BRAND_PACK_FILENAME, l as extractBodyText, m as trimTiptapBody, o as render, p as renderTiptapJson, s as toPlainText, t as createExportService, u as extractSummary, v as formatRelativeTime, w as getImageUrl, x as now, y as formatTime, z as getJantLogoFills } from "./export-
|
|
1
|
+
import { _ as toPublicPath, a as getSitePathPrefix, b as __exportAll, c as normalizePath, d as sanitizeUrl, f as slugify, g as toPublicHref, h as toAbsoluteSiteUrl, i as getSiteOrigin, l as normalizeSitePathPrefix, m as toAbsoluteAssetUrl, n as extractDisplayDomain, o as isFullUrl, p as stripSitePathPrefix, r as extractDomain, s as isSafeInternalRedirect, t as buildSiteUrl, u as normalizeSiteUrl, v as toSameSitePath } from "./url-BMYO-Zlt.js";
|
|
2
|
+
import { A as JANT_POSITIVE_LOGO_PNG_FILENAME, B as getJantLogoHref, C as toISOString, D as HOME_BRANDING_LINK_LABEL, E as getPublicUrlForProvider, F as getJantBundledAsset, G as base64ToUint8Array, H as JANT_LOGO_PATH_DATA, I as getJantIconFilename, L as getJantIconHref, M as getDefaultJantAppleTouchIconBytes, N as getDefaultJantFaviconIcoBytes, O as HOME_BRANDING_PREFIX, P as getJantBrandPackHref, R as getJantLogoFilename, T as getMediaUrl, U as JANT_LOGO_VIEW_BOX, V as getJantPositiveLogoPngHref, W as arrayBufferToBase64, _ as formatRelativeAge, b as formatYearMonth, d as extractSummaryHtml, f as renderTiptapDocument, g as formatDate, h as escapeHtml, i as tiptapJsonToMarkdown, j as JANT_REPO_URL, k as JANT_BRAND_PACK_FILENAME, l as extractBodyText, m as trimTiptapBody, o as render, p as renderTiptapJson, s as toPlainText, t as createExportService, u as extractSummary, v as formatRelativeTime, w as getImageUrl, x as now, y as formatTime, z as getJantLogoFills } from "./export-Dfbq9aot.js";
|
|
3
3
|
import { S as getTelegramWebhookSecret, T as coalesceDisplayText, _ as getInternalAdminToken, a as getConfiguredSingleSiteUrl, b as getSiteResolutionMode, c as getDevApiToken, d as getHostedControlPlaneBaseUrl, f as getHostedControlPlaneDomainCheckSecret, g as getHostedControlPlaneSsoSecret, h as getHostedControlPlaneProviderLabel$1, i as getConfiguredSingleSitePathPrefix, l as getEnvString, m as getHostedControlPlaneInternalToken, n as getAuthSecret, o as getConfiguredStorageDriver, p as getHostedControlPlaneInternalBaseUrl, r as getConfiguredSingleSiteOrigin, s as getCorsOrigins, u as getGitHubAppConfig, v as getLocalStoragePath, w as shouldUseSecureCookies, x as getTelegramBotPool } from "./env-OHRKGcMj.js";
|
|
4
|
-
import { l as markdownToTiptapJson, o as createGitHubSyncService } from "./github-sync-
|
|
4
|
+
import { l as markdownToTiptapJson, o as createGitHubSyncService } from "./github-sync--PSoE-Ne.js";
|
|
5
5
|
import { a as listInstallationReposPage, n as getInstallation, o as searchInstallationRepos, t as buildInstallUrl } from "./github-app-BbklkFmU.js";
|
|
6
6
|
import { r as parseRepoSlug, t as createGitHubClient } from "./github-api-BgSiE71w.js";
|
|
7
7
|
import { I18n } from "@lingui/core";
|
|
@@ -1913,16 +1913,16 @@ var Hono = class extends Hono$1 {
|
|
|
1913
1913
|
}
|
|
1914
1914
|
//#endregion
|
|
1915
1915
|
//#region src/i18n/locales/public/en.ts
|
|
1916
|
-
var messages$3 = JSON.parse("{\"+4u2g6\":[\"A ready-made 1:1 PNG for decks, mockups, directories, and other square placements.\"],\"+DPYOZ\":[\"Add a link to your main RSS feed. Change what /feed returns in General.\"],\"+G8qqW\":[\"Collection saved.\"],\"+IJm1Z\":[\"Muted\"],\"+Irvp3\":[\"Everything on this page is ready to use for articles, launch posts, directories, and product coverage.\"],\"+Qaboy\":[\"Favicon\"],\"+fWu2O\":[\"A calmer, warmer accent makes the default theme feel quieter and more intentional.\"],\"+nHhRH\":[\"Use \",[\"brandColorName\"]],\"+siMqD\":[\"Journal\"],\"/DFKdU\":[\"Type the quote...\"],\"/PfPLc\":[\"Label (optional)\"],\"/PoNoq\":[\"Edit link\"],\"/Ui2OV\":[\"Use the reverse logo on dark backgrounds.\"],\"/Ybds4\":[\"Primary Jant logo for websites, docs, press coverage, and editorial layouts.\"],\"/rTz0M\":[\"Audio\"],\"0EcUWz\":[\"Discard changes?\"],\"0Lj7or\":[\"Save text attachment?\"],\"0XDp7X\":[\"Links should read clearly without glowing against the page.\"],\"0ieXE7\":[\"Highest rated\"],\"11h9eK\":[\"Includes\"],\"15++NM\":[\"Inline emphasis\"],\"1DBGsz\":[\"Notes\"],\"1NeeWI\":[\"Square assets for avatars, apps, browsers, and shared links\"],\"1THMr2\":[\"Brand pack\"],\"1njn7W\":[\"Light\"],\"2B7HLH\":[\"New post\"],\"2C7mSG\":[\"Collection link\"],\"2ETv7R\":[\"Tune color in a real reading context\"],\"2HbvFp\":[\"Real post components\"],\"2MXb5X\":[\"Field notes on quiet design\"],\"2koDOQ\":[\"Thread accents\"],\"2lKpcz\":[\"Write your first post to get started.\"],\"2q/Q7x\":[\"Visibility\"],\"2sCqzD\":[\"Use this for websites, docs, articles, and other light or neutral surfaces.\"],\"33DClx\":[\"Link to your latest posts. If it comes before Featured, the homepage opens here.\"],\"3Cw1AI\":[\"Add Collection\"],\"3lJk5u\":[\"Keep the artwork unchanged.\"],\"3mdteM\":[\"before deciding whether the accent is carrying too much product energy.\"],\"3neqtf\":[\"Thread accent\"],\"3qkggm\":[\"Fullscreen\"],\"3vMdv3\":[\"This link is reserved. Choose something else.\"],\"3wKq0C\":[\"Couldn't save. Try again in a moment.\"],\"3xi01/\":[\"Look at the footer metadata last, to make sure the accent is not fighting the typography.\"],\"47iMgt\":[\"Editorial interfaces worth borrowing from\"],\"4D09NB\":[\"Link to your collections page\"],\"4HLTdq\":[\"without media\"],\"4J/OYU\":[\"Collection created.\"],\"4eiXo+\":[\"Leave blank to generate one automatically.\"],\"4pV0kE\":[\"Avatar-ready\"],\"51EYZX\":[\"without title\"],\"5dcjwM\":[\"Choose today or an earlier date, or leave it blank to publish now.\"],\"5pAjd8\":[\"Accent should feel present, not loud.\"],\"5sEkBi\":[\"Open raw asset\"],\"6UTABI\":[\"Collection order updated.\"],\"6WAK+2\":[\"Use current date\"],\"6Y4BBO\":[\"An abstract editorial layout in warm paper colors\"],\"6cjUDB\":[\"Brand assets\"],\"6lGV3K\":[\"Show less\"],\"6p0JeQ\":[\"to make sure both still feel like they belong to the same product.\"],\"6sVyMq\":[\"Add a URL before posting this link.\"],\"6yCv8j\":[\"Save these changes to the text attachment, discard them, or keep editing.\"],\"74kJNs\":[\"View earlier notes in this thread\"],\"7DvUqV\":[\"Read the page from top to bottom without looking at the swatches.\"],\"7aris6\":[\"March 15\"],\"7d1a0d\":[\"Public\"],\"7hYXO0\":[\"Use this on dark backgrounds, image-backed surfaces, and any placement where the green logo would lose contrast.\"],\"7kMW54\":[\"Open raw SVG\"],\"7nGhhM\":[\"What's on your mind?\"],\"7vhWI8\":[\"New Password\"],\"87a/t/\":[\"Label\"],\"8Btgys\":[\"Draft deleted.\"],\"8WX0J+\":[\"Your thoughts (optional)\"],\"8ZsakT\":[\"Password\"],\"8bpHix\":[\"Couldn't create your account. Check the details and try again.\"],\"8eC78s\":[\"A calmer accent makes\"],\"8tM8+a\":[\"Save as draft\"],\"90IRF2\":[\"This article is here to answer a specific question: does the default accent still feel calm once it has to carry a full reading experience?\"],\"9SHZas\":[\"Shows 'Settings' when logged in, 'Sign in' when logged out\"],\"9aloPG\":[\"References\"],\"9dr9Nh\":[\"Open external link\"],\"9qWoxS\":[\"Feed\"],\"A1D8Yt\":[\"What the accent should do\"],\"A1taO8\":[\"Search\"],\"A2Vg/u\":[\"Navigation and reading states\"],\"AjHkcv\":[\"Default preview image for social shares and link unfurls.\"],\"AyHO4m\":[\"What's this collection about?\"],\"B1FFMj\":[\"Download Brand Pack\"],\"B495Gs\":[\"Archive\"],\"BdjLtf\":[\"thread\"],\"Bmaby2\":[\"All formats\"],\"C+9df9\":[\"Quoted or highlighted passages should feel like annotations, not warnings.\"],\"C0/57J\":[\"This is the last part of the collection link.\"],\"C4TjpG\":[\"Read less\"],\"CAh1km\":[\"collections\"],\"CH3bgf\":[\"RSS feed for this view\"],\"CT7H2e\":[\"Link to your featured posts. If it comes before Latest, the homepage opens here.\"],\"CmBCXY\":[\"Link updated.\"],\"D4em/+\":[\"Logos\"],\"DHhJ7s\":[\"Previous\"],\"DJLY+/\":[\" and try again.\"],\"DOx286\":[\"Draft restored.\"],\"DPfwMq\":[\"Done\"],\"DSJXZM\":[\"Enter a valid date.\"],\"DYlMYF\":[\"Built-in background\"],\"DoJzLz\":[\"Collections\"],\"Du2B9f\":[\"The default accent should support reading first. Start by comparing it against the\"],\"DxwUcG\":[\"Read the palette as content first\"],\"E3NcGH\":[\"Square logo PNG\"],\"EEYbdt\":[\"Publish\"],\"EGwzOK\":[\"Complete Setup\"],\"EHWwm1\":[\"The default accent should feel written, not branded.\"],\"EO3I6h\":[\"Upload didn't go through. Try again in a moment.\"],\"EQNPYo\":[\"Featured on \",[\"date\"],\" at \",[\"time\"]],\"EQtz4D\":[\"Open a few links and check whether they still feel native to the page.\"],\"EU3tBD\":[\"Link removed.\"],\"EetoJL\":[\"Guide the eye without taking over the layout.\"],\"Eiv3bO\":[\"Buttons can stay steady, but links, thread markers, and subtle emphasis should feel closer to ink on paper than dashboard chrome.\"],\"ElTnWL\":[\"Published on\"],\"EmQw8O\":[\"If this article still feels like a page you want to keep reading, the palette is probably close.\"],\"EsJdRp\":[\"Save theme\"],\"FESYvt\":[\"Describe this for people with visual impairments...\"],\"FEr96N\":[\"Theme\"],\"FGySZL\":[\"The default accent works best when it reads like a fountain-pen underline. Compare it against the\"],\"FM+KeU\":[\"No drafts yet. Save a draft to find it here.\"],\"Fdv5k7\":[\"What to look for while tuning it\"],\"FkMol5\":[\"Featured\"],\"FqCHF/\":[\"Threads\"],\"Fxf4jq\":[\"Description (optional)\"],\"G2u/aQ\":[\"Download official Jant logos, icons, and preview assets.\"],\"GBJzTZ\":[\"Archive\"],\"GX2VMa\":[\"Create your admin account.\"],\"GY/1J4\":[\"Jant fallback canary string\"],\"GbIOhd\":[\"Reply quietly\"],\"GiRWtR\":[\"Why the default accent should feel written, not branded\"],\"GkpIs2\":[\"Remove this link from Collections? The destination won't change.\"],\"GorKul\":[\"Welcome to Jant\"],\"GxkJXS\":[\"Uploading...\"],\"H29JXm\":[\"+ ALT\"],\"H4lgRd\":[\"Authentication isn't set up. Check your server config.\"],\"HFPGej\":[\"No threads match these filters. Try adjusting your selection or clear all filters.\"],\"HG79RB\":[\"Post as Private\"],\"HNEHJP\":[\"Demo credentials are pre-filled — hit Sign In to continue.\"],\"HbAIQc\":[\"A reference link for checking whether the accent feels editorial instead of promotional.\"],\"HrC0ab\":[\"All posts\"],\"Ht1V3q\":[\"For the same reason, inline code should stay neutral. Something like theme.siteAccent = soften(green, 12%) should not suddenly become the loudest thing on the page.\"],\"I22eN0\":[\"Shared links\"],\"I6zLrz\":[\"Use these when you need a transparent square logo, a shaped tile with a built-in background, a browser icon, or a default preview image.\"],\"ICsA6P\":[\"You have unsaved changes\"],\"IUX7p+\":[\"White logo on the Jant green rounded tile for app icon mockups, touch icons, directory listings, and other square placements that should feel softer.\"],\"IagCbF\":[\"URL\"],\"IjnQHI\":[\"with title\"],\"ImOQa9\":[\"Reply\"],\"IsI3kE\":[\"Nothing here yet. Add posts to one of these collections to fill this view.\"],\"J+2Rls\":[\"Leave blank to publish now. Use an earlier date when importing older posts.\"],\"J4tAHl\":[\"Headings should keep their hierarchy even when the accent gets softer.\"],\"JYj5R2\":[\"Browse files\"],\"JcD7qf\":[\"More actions\"],\"JqJ5Xv\":[\"Latest\"],\"JuN5GC\":[\"No file selected. Choose a file to upload.\"],\"JwLPQ/\":[\"This sign-in link has expired. Return to \"],\"KOqvXP\":[\"Do not recolor, stretch, rotate, outline, or add effects to the logo.\"],\"KbS2K9\":[\"Reset Password\"],\"KdSsVl\":[\"Author (optional)\"],\"Khu3PV\":[\"Publish settings\"],\"KiJn9B\":[\"Note\"],\"KlZ+t+\":[\"%name% + %count% more\"],\"KsvRin\":[\"Hide from Latest\"],\"KzmC5L\":[\"Controls\"],\"L7svJg\":[\"Reading\"],\"Lbkbwy\":[\"A quote card for judging accent color against softer, citation-heavy content.\"],\"LcvzvX\":[\"Tap to retry\"],\"LkA8jz\":[\"Add alt text\"],\"LxRg6f\":[\"live theme controls\"],\"M4tzVU\":[\"Latest posts\"],\"M8kJqa\":[\"Drafts\"],\"MHrjPM\":[\"Title\"],\"MILa7n\":[\"Square tile\"],\"MSc/Yq\":[\"Do you want to publish your changes or discard them?\"],\"Mc7+6G\":[\"Enter a valid URL starting with http://, https://, or mailto:.\"],\"MdMyne\":[\"Source link (optional)\"],\"MiMY3Q\":[\"Apple touch icon\"],\"MiyoI7\":[\"default note sample\"],\"MqghUt\":[\"Search posts...\"],\"Myqkib\":[\"Create a collection to get started.\"],\"N8UzTV\":[\"Replies\"],\"NAFbuE\":[\"Search snippet\"],\"NH9Z1R\":[\"Start here\"],\"NqsRbb\":[\"Jant logo\"],\"NvXuWk\":[\"Won't move the thread to the top of latest.\"],\"O1367B\":[\"All collections\"],\"O3oNi5\":[\"Email\"],\"OEdMhi\":[\"The best default color is the one you notice only after reading for a while.\"],\"OEt/to\":[\"Guidelines\"],\"OJxdgi\":[\"Keep this link under 200 characters.\"],\"OaoJcz\":[\"Social preview\"],\"OmfDbR\":[\"Site accent\"],\"Ovks1h\":[\"A softer blue feels more like ink than product chrome.\"],\"P/sHNL\":[\"Use this page to judge buttons, links, cards, forms, thread accents, and quiet surfaces before changing a theme globally.\"],\"Q/uoSA\":[\"Quiet here for now.\"],\"Q2mGA7\":[\"Clear filter\"],\"QBqVyM\":[\"Home screen icon for iPhone and iPad shortcuts.\"],\"QebAts\":[\"Link added.\"],\"Qgbxdw\":[\"Designing a calmer default accent for Jant\"],\"Qn9Ao8\":[\"Circle tile\"],\"Qoq+GP\":[\"Read more\"],\"QyDt3L\":[\"File uploaded.\"],\"R5CMuK\":[\"Jant looks best when the accent feels editorial. Buttons can stay sturdy, but inline emphasis should feel like a pen mark, not a dashboard highlight.\"],\"R8AthW\":[\"Divider\"],\"R9Khdg\":[\"Auto\"],\"RAv3u7\":[\"Compare it against the theme controls\"],\"ROa4Ti\":[\"Interfaces for reading should guide the eye, not keep asking for attention.\"],\"RZOWDv\":[\"Add a custom shortcut to any page or site.\"],\"RdmNnl\":[\"Browser tab\"],\"RfGczC\":[\"Square logo\"],\"Rj01Fz\":[\"Links\"],\"S37om9\":[\"Included assets\"],\"S8NCfs\":[\"Save to drafts to edit and post at a later time.\"],\"SJGVAw\":[\"Feel editorial and slightly quieter.\"],\"SJmfuf\":[\"Site Name\"],\"SaNhJE\":[\"feel deliberate instead of washed out.\"],\"SpTWH3\":[\"Download SVG\"],\"SvRuJt\":[\"Field Notes on Interface Tone\"],\"T/R+Qz\":[\"Primary\"],\"TNZKpI\":[\"Danger\"],\"TvaTxw\":[\"Doesn't appear in Latest. Still appears in collections you add it to.\"],\"UIMXHD\":[\"Remove Divider\"],\"UaZwcz\":[\"More options are available after you create it.\"],\"Uc5y7o\":[\"Choose the standard logo for websites, docs, directories, and editorial layouts.\"],\"V18SVO\":[\"Use the logo on light backgrounds.\"],\"V4WsyL\":[\"Add Link\"],\"VCA6B2\":[\"These are actual feed components with real footers, summaries, and inline links. Use this section to judge whether the theme still feels calm once it is applied to realistic content.\"],\"VNqFYa\":[\"Loading post...\"],\"WCOanD\":[\"This reference is useful because it treats links and citations as part of the reading rhythm. Keep that in mind while tuning the\"],\"WbIbzR\":[\"Checking link...\"],\"WcWS//\":[\"Download file\"],\"WhsN3P\":[\"A good default accent in Jant should feel like editorial structure, not product branding. That means links, emphasis, and thread cues can be visible without turning the page into UI chrome.\"],\"Wn+/rH\":[\"Transparent square\"],\"XU7b+L\":[\"Primary logo files\"],\"XV1mAn\":[\"Only visible when signed in.\"],\"XrnWzN\":[\"Published!\"],\"Y7WAtz\":[\"An image couldn't be saved to your library — its original link was kept.\"],\"YIix5Y\":[\"Search...\"],\"YUglt2\":[\"Generating a link...\"],\"YXiA6e\":[\"Primary button\"],\"Ygx3Yl\":[\"Small browser icon used in tabs and bookmarks.\"],\"Z6NwTi\":[\"Save as Draft\"],\"ZGs2so\":[\"Delete this collection permanently? Posts inside won't be removed.\"],\"ZV5ykW\":[\"Download PNG\"],\"ZhhOwV\":[\"Quote\"],\"ZmSeP+\":[\"Save to drafts?\"],\"ZxFuun\":[[\"count\",\"plural\",{\"one\":[\"Found \",\"#\",\" result\"],\"other\":[\"Found \",\"#\",\" results\"]}]],\"a5j82I\":[\"No collections match that search. Try a different name.\"],\"aHTB7P\":[\"Supplementary content attached to your post\"],\"aMEyv0\":[\"Stay sturdy and readable.\"],\"aN6wx0\":[\"Nothing in Featured yet. Mark a post as featured to show it here.\"],\"aYpXKS\":[\"and checking whether the accent is guiding attention or pulling too hard.\"],\"aaGV/9\":[\"New Link\"],\"af+9p6\":[\"Quiet metadata\"],\"an5hVd\":[\"Images\"],\"ao77hr\":[[\"count\",\"plural\",{\"one\":[\"#\",\" hidden post\"],\"other\":[\"#\",\" hidden posts\"]}]],\"auFlOr\":[\"Icons and previews\"],\"avuFKG\":[\"threads\"],\"bFpC86\":[\"Everything in one download\"],\"bGtMpA\":[\"Add a label and URL.\"],\"bHOiy1\":[\"Password changes are off in demo mode. Sign in with the shared demo credentials.\"],\"bbdNeX\":[\"Sign in\"],\"bfCbdi\":[\"Current post\"],\"bkBJmZ\":[\"This is useful as a color check because it puts the accent next to quotation styling, metadata, and a quieter explanatory paragraph. Compare it back to the\"],\"bzSI52\":[\"Discard\"],\"c2JRUS\":[\"Generate automatically\"],\"cIoW7X\":[\"Inline link\"],\"cTUByn\":[\"Newest first\"],\"cb7FR8\":[\"White logo on the Jant green square tile for platforms and layouts that expect a true edge-to-edge square.\"],\"cgmi4V\":[\"Delete Draft\"],\"cnGeoo\":[\"Delete\"],\"d+F4pf\":[\"The image should sit quietly inside the article instead of feeling like a card preview.\"],\"d/o/BH\":[\"Couldn't publish. Saved as draft.\"],\"dD7NPy\":[\"Outline\"],\"dEgA5A\":[\"Cancel\"],\"dHko2w\":[\"single posts\"],\"dUsGbd\":[\"The right accent should disappear into the writing until you need it.\"],\"dXoieq\":[\"Summary\"],\"dYKrp3\":[\"Hidden from Latest\"],\"dbUuAj\":[\"Appears in Latest.\"],\"df4a/r\":[\"Couldn't load this post. Try again.\"],\"ePK91l\":[\"Edit\"],\"eWLklq\":[\"Quotes\"],\"f4MAoA\":[\"Some uploads failed. Saved as draft.\"],\"f5s9EI\":[\"Press N to write\"],\"f6Hub0\":[\"Sort\"],\"f8fH8W\":[\"Design\"],\"fD+f7T\":[\"RSS feed\"],\"fKrDxS\":[\"Brand tile\"],\"fMPkxb\":[\"Show more\"],\"fqDzSu\":[\"Rate\"],\"fttd2R\":[\"My Collection\"],\"gCcxP/\":[\"Threads can include up to \",[\"count\"],\" posts.\"],\"gFdWl+\":[\"A long-form article sample for checking the default palette in a true reading context.\"],\"gNKz6Z\":[\"Collection deleted.\"],\"gXH9r/\":[\"Open raw PNG\"],\"gj52YE\":[\"This collection is empty. Add posts from the editor.\"],\"gpaPhA\":[\"Helps screen readers describe the image\"],\"h5RcXU\":[\"Post hidden\"],\"hLlWo5\":[\"A few simple rules.\"],\"hWpUeY\":[\"Auto link\"],\"hXzOVo\":[\"Next\"],\"heSQoS\":[\"Paste a URL...\"],\"hqeXKW\":[\"Single posts\"],\"hrkGms\":[\"Search\"],\"i0vDGK\":[\"Sort Order\"],\"i5+Y7d\":[\"Download the official Jant logo, icons, and preview files.\"],\"i6kro6\":[\"Edit custom link\"],\"i6nDCI\":[\"Choose a new password.\"],\"iG7KNr\":[\"Logo\"],\"iH8pgl\":[\"Back\"],\"ilSmIt\":[\"Hard edge\"],\"iu7tUI\":[\"Breadcrumb\"],\"jAXE5p\":[\"Reverse logo\"],\"jAqB/k\":[\"Post privately\"],\"jQflRT\":[\"This uses the real single-post detail rendering with a longer article, inline image, tables, lists, quotes, and code. The content column stays at the same width as the live site.\"],\"jd+8Mm\":[\"Social preview image\"],\"jdJOV1\":[\"Settings\"],\"ji7oVU\":[\"Edit post\"],\"jpctdh\":[\"View\"],\"jrsUoG\":[\"Type / for commands\"],\"jvyYZG\":[\"What's on your mind...\"],\"k3Iw35\":[\"Switch to the white logo when the standard green version would lose contrast.\"],\"kPMIr+\":[\"Give it a title...\"],\"kj6ppi\":[\"entry\"],\"kr39oD\":[\"No collections yet. Start one to organize posts by topic.\"],\"kzvWob\":[\"Link to the post archive\"],\"laT1IJ\":[\"iOS home screen\"],\"lb+Xwx\":[\"Custom link\"],\"m16xKo\":[\"Add\"],\"mKT7g0\":[\"Text attachment\"],\"mc/vLq\":[\"This link is already in use. Choose something else.\"],\"muKqfV\":[\"Featured\"],\"n1ekoW\":[\"Sign In\"],\"n3ReIn\":[\"Collections\"],\"n6QD94\":[\"Oldest first\"],\"nFukaP\":[\"Wrong email or password. Check your credentials and try again.\"],\"nJ4U1U\":[[\"count\"],\" images couldn't be saved to your library — their original links were kept.\"],\"nV6twc\":[\"Organize\"],\"nd8Puv\":[\"White logo on the Jant green circle for profile images, badges, and other round placements where you want a ready-made asset.\"],\"ndrEYW\":[\"When the accent is slightly warmer and less literal, the whole page feels more like a writing space and less like product UI.\"],\"o21Y+P\":[\"entries\"],\"oO0hKx\":[[\"count\",\"plural\",{\"one\":[\"#\",\" more post\"],\"other\":[\"#\",\" more posts\"]}]],\"oTu7Wt\":[\"Combined Collections\"],\"ode0+L\":[\"Theme sample\"],\"ogssnn\":[\"with media\"],\"ovBPCi\":[\"Default\"],\"p1Z67P\":[\"When primary is too rigid, the whole page starts reading like product UI instead of writing space.\"],\"p2/GCq\":[\"Confirm Password\"],\"pB0OKE\":[\"New Divider\"],\"pBHx39\":[\"Dark backgrounds\"],\"pVrU5x\":[\"If this page feels too branded, the first place to soften is the default theme’s site accent, not the border or body text.\"],\"pvnfJD\":[\"Dark\"],\"q+hNag\":[\"Collection\"],\"q5YRzz\":[\"Color check\"],\"q8RviX\":[\"Titled\"],\"qcawwg\":[\"Publish now\"],\"qiN9NB\":[\"Surface\"],\"qt89I8\":[\"Draft saved.\"],\"quvfGs\":[\"instead of judging it as an isolated swatch.\"],\"r7kcaA\":[\"Drag collections, links, and dividers into the order you want.\"],\"rA2TFI\":[\"Switch the palette and mode without opening settings or changing the active site theme.\"],\"rV8ZnP\":[\"Edit publish date\"],\"rdUucN\":[\"Preview\"],\"s8G5Or\":[\"This upload would exceed your shared hosted media limit. Remove files or upgrade storage to continue.\"],\"s9gHf5\":[\"your-post-link\"],\"sER+bs\":[\"Files\"],\"sQpDn6\":[\"Exit fullscreen\"],\"sgr2wQ\":[\"collection\"],\"slujBW\":[\"Use lowercase letters, numbers, and hyphens only.\"],\"syiAKf\":[\"note treatment\"],\"t42hIC\":[\"Everything most people need is in one ZIP.\"],\"tCctex\":[\"The brand pack includes SVG logos, a transparent square PNG, rounded, square, and circle tiles, plus favicon, Apple touch icon, and the default social preview image.\"],\"tKlWWY\":[\"Emoji\"],\"tSWVu5\":[\"Published on \",[\"date\"],\" at \",[\"time\"]],\"tfDRzk\":[\"Save\"],\"tg5MRw\":[\"Sign in to start writing.\"],\"tgSBSE\":[\"Remove Link\"],\"uowbPn\":[\"Remove attachment\"],\"v3E8iS\":[\"A practical checklist\"],\"vSJd18\":[\"Video\"],\"vSYKYI\":[\"Main feed\"],\"vXCC6J\":[\"Something doesn't look right. Check the form and try again.\"],\"vcpc5o\":[\"Close menu\"],\"vdFnYM\":[\"Reset link\"],\"vdvpU5\":[\"/archive?format=quote or https://example.com\"],\"vgpfCi\":[\"Save draft\"],\"vpSPA1\":[\"Auth secret is missing. Check your environment variables.\"],\"vzU4k9\":[\"New Collection\"],\"w0Emel\":[\"Suggested link\"],\"w6mlns\":[\"Article detail page\"],\"wJ+GRy\":[\"All visibility\"],\"wL3cK8\":[\"Latest\"],\"wja8aL\":[\"Untitled\"],\"wlnK1t\":[\"A single ZIP with the main logo, reverse logo, square PNG, rounded, square, and circle tiles, plus favicon, Apple touch icon, and social preview image.\"],\"wm3Zlr\":[\"All years\"],\"xCWek4\":[\"File storage isn't set up. Check your server config.\"],\"xVrkxi\":[\"quiet design\"],\"xVvw1i\":[\"This reset link is no longer valid. Request a new one to continue.\"],\"xYilR2\":[\"Media\"],\"xeiujy\":[\"Text\"],\"xhTx3y\":[\"Choose the standard logo for most placements and the reverse logo when you need more contrast.\"],\"xjHB3/\":[\"Continue →\"],\"y28hnO\":[\"Post\"],\"y2o/Y0\":[\"This Link Has Expired\"],\"yGZVl1\":[\"More\"],\"yQ2kGp\":[\"Load more\"],\"yUtAh2\":[\"New Thread\"],\"ycM1Xg\":[\"No results. Try different keywords.\"],\"ynMAhG\":[\"Default logo\"],\"yzF66j\":[\"Link\"],\"zBFr9G\":[\"Paste a long article, AI response, or any text...\\n\\nMarkdown formatting will be preserved.\"],\"zJDAbh\":[\"Don't save\"],\"zcDmsG\":[\"Featured posts\"],\"zoK+eO\":[\"Add a title before posting this link.\"],\"zucql+\":[\"Menu\"],\"zwBp5t\":[\"Private\"]}");
|
|
1916
|
+
var messages$3 = JSON.parse("{\"+4u2g6\":[\"A ready-made 1:1 PNG for decks, mockups, directories, and other square placements.\"],\"+DPYOZ\":[\"Add a link to your main RSS feed. Change what /feed returns in General.\"],\"+G8qqW\":[\"Collection saved.\"],\"+IJm1Z\":[\"Muted\"],\"+Irvp3\":[\"Everything on this page is ready to use for articles, launch posts, directories, and product coverage.\"],\"+Qaboy\":[\"Favicon\"],\"+fWu2O\":[\"A calmer, warmer accent makes the default theme feel quieter and more intentional.\"],\"+jw/c1\":[\"Delete image\"],\"+nHhRH\":[\"Use \",[\"brandColorName\"]],\"+siMqD\":[\"Journal\"],\"/DFKdU\":[\"Type the quote...\"],\"/PfPLc\":[\"Label (optional)\"],\"/PoNoq\":[\"Edit link\"],\"/Ui2OV\":[\"Use the reverse logo on dark backgrounds.\"],\"/Ybds4\":[\"Primary Jant logo for websites, docs, press coverage, and editorial layouts.\"],\"/rTz0M\":[\"Audio\"],\"0EcUWz\":[\"Discard changes?\"],\"0Lj7or\":[\"Save text attachment?\"],\"0XDp7X\":[\"Links should read clearly without glowing against the page.\"],\"0ieXE7\":[\"Highest rated\"],\"11h9eK\":[\"Includes\"],\"15++NM\":[\"Inline emphasis\"],\"1DBGsz\":[\"Notes\"],\"1NeeWI\":[\"Square assets for avatars, apps, browsers, and shared links\"],\"1THMr2\":[\"Brand pack\"],\"1njn7W\":[\"Light\"],\"2B7HLH\":[\"New post\"],\"2C7mSG\":[\"Collection link\"],\"2ETv7R\":[\"Tune color in a real reading context\"],\"2HbvFp\":[\"Real post components\"],\"2MXb5X\":[\"Field notes on quiet design\"],\"2koDOQ\":[\"Thread accents\"],\"2lKpcz\":[\"Write your first post to get started.\"],\"2q/Q7x\":[\"Visibility\"],\"2sCqzD\":[\"Use this for websites, docs, articles, and other light or neutral surfaces.\"],\"33DClx\":[\"Link to your latest posts. If it comes before Featured, the homepage opens here.\"],\"3Cw1AI\":[\"Add Collection\"],\"3lJk5u\":[\"Keep the artwork unchanged.\"],\"3mdteM\":[\"before deciding whether the accent is carrying too much product energy.\"],\"3neqtf\":[\"Thread accent\"],\"3qkggm\":[\"Fullscreen\"],\"3vMdv3\":[\"This link is reserved. Choose something else.\"],\"3wKq0C\":[\"Couldn't save. Try again in a moment.\"],\"3xi01/\":[\"Look at the footer metadata last, to make sure the accent is not fighting the typography.\"],\"47iMgt\":[\"Editorial interfaces worth borrowing from\"],\"4D09NB\":[\"Link to your collections page\"],\"4HLTdq\":[\"without media\"],\"4J/OYU\":[\"Collection created.\"],\"4eiXo+\":[\"Leave blank to generate one automatically.\"],\"4pV0kE\":[\"Avatar-ready\"],\"51EYZX\":[\"without title\"],\"5dcjwM\":[\"Choose today or an earlier date, or leave it blank to publish now.\"],\"5pAjd8\":[\"Accent should feel present, not loud.\"],\"5sEkBi\":[\"Open raw asset\"],\"6UTABI\":[\"Collection order updated.\"],\"6WAK+2\":[\"Use current date\"],\"6Y4BBO\":[\"An abstract editorial layout in warm paper colors\"],\"6cjUDB\":[\"Brand assets\"],\"6lGV3K\":[\"Show less\"],\"6p0JeQ\":[\"to make sure both still feel like they belong to the same product.\"],\"6sVyMq\":[\"Add a URL before posting this link.\"],\"6yCv8j\":[\"Save these changes to the text attachment, discard them, or keep editing.\"],\"74kJNs\":[\"View earlier notes in this thread\"],\"7DvUqV\":[\"Read the page from top to bottom without looking at the swatches.\"],\"7aris6\":[\"March 15\"],\"7d1a0d\":[\"Public\"],\"7hYXO0\":[\"Use this on dark backgrounds, image-backed surfaces, and any placement where the green logo would lose contrast.\"],\"7kMW54\":[\"Open raw SVG\"],\"7nGhhM\":[\"What's on your mind?\"],\"7vhWI8\":[\"New Password\"],\"87a/t/\":[\"Label\"],\"8Btgys\":[\"Draft deleted.\"],\"8WX0J+\":[\"Your thoughts (optional)\"],\"8ZsakT\":[\"Password\"],\"8bpHix\":[\"Couldn't create your account. Check the details and try again.\"],\"8eC78s\":[\"A calmer accent makes\"],\"8tM8+a\":[\"Save as draft\"],\"90IRF2\":[\"This article is here to answer a specific question: does the default accent still feel calm once it has to carry a full reading experience?\"],\"9SHZas\":[\"Shows 'Settings' when logged in, 'Sign in' when logged out\"],\"9aloPG\":[\"References\"],\"9dr9Nh\":[\"Open external link\"],\"9qWoxS\":[\"Feed\"],\"A1D8Yt\":[\"What the accent should do\"],\"A1taO8\":[\"Search\"],\"A2Vg/u\":[\"Navigation and reading states\"],\"AjHkcv\":[\"Default preview image for social shares and link unfurls.\"],\"AyHO4m\":[\"What's this collection about?\"],\"B1FFMj\":[\"Download Brand Pack\"],\"B495Gs\":[\"Archive\"],\"BdjLtf\":[\"thread\"],\"Bmaby2\":[\"All formats\"],\"C+9df9\":[\"Quoted or highlighted passages should feel like annotations, not warnings.\"],\"C0/57J\":[\"This is the last part of the collection link.\"],\"C4TjpG\":[\"Read less\"],\"CAh1km\":[\"collections\"],\"CH3bgf\":[\"RSS feed for this view\"],\"CT7H2e\":[\"Link to your featured posts. If it comes before Latest, the homepage opens here.\"],\"CmBCXY\":[\"Link updated.\"],\"D4em/+\":[\"Logos\"],\"DHhJ7s\":[\"Previous\"],\"DJLY+/\":[\" and try again.\"],\"DOx286\":[\"Draft restored.\"],\"DPfwMq\":[\"Done\"],\"DSJXZM\":[\"Enter a valid date.\"],\"DYlMYF\":[\"Built-in background\"],\"DoJzLz\":[\"Collections\"],\"Du2B9f\":[\"The default accent should support reading first. Start by comparing it against the\"],\"DxwUcG\":[\"Read the palette as content first\"],\"E3NcGH\":[\"Square logo PNG\"],\"EEYbdt\":[\"Publish\"],\"EGwzOK\":[\"Complete Setup\"],\"EHWwm1\":[\"The default accent should feel written, not branded.\"],\"EO3I6h\":[\"Upload didn't go through. Try again in a moment.\"],\"EQNPYo\":[\"Featured on \",[\"date\"],\" at \",[\"time\"]],\"EQtz4D\":[\"Open a few links and check whether they still feel native to the page.\"],\"EU3tBD\":[\"Link removed.\"],\"EetoJL\":[\"Guide the eye without taking over the layout.\"],\"Eiv3bO\":[\"Buttons can stay steady, but links, thread markers, and subtle emphasis should feel closer to ink on paper than dashboard chrome.\"],\"ElTnWL\":[\"Published on\"],\"EmQw8O\":[\"If this article still feels like a page you want to keep reading, the palette is probably close.\"],\"EsJdRp\":[\"Save theme\"],\"FESYvt\":[\"Describe this for people with visual impairments...\"],\"FEr96N\":[\"Theme\"],\"FGySZL\":[\"The default accent works best when it reads like a fountain-pen underline. Compare it against the\"],\"FM+KeU\":[\"No drafts yet. Save a draft to find it here.\"],\"Fdv5k7\":[\"What to look for while tuning it\"],\"FkMol5\":[\"Featured\"],\"FqCHF/\":[\"Threads\"],\"Fxf4jq\":[\"Description (optional)\"],\"G2u/aQ\":[\"Download official Jant logos, icons, and preview assets.\"],\"GBJzTZ\":[\"Archive\"],\"GX2VMa\":[\"Create your admin account.\"],\"GY/1J4\":[\"Jant fallback canary string\"],\"GbIOhd\":[\"Reply quietly\"],\"GiRWtR\":[\"Why the default accent should feel written, not branded\"],\"GkpIs2\":[\"Remove this link from Collections? The destination won't change.\"],\"GorKul\":[\"Welcome to Jant\"],\"GxkJXS\":[\"Uploading...\"],\"H29JXm\":[\"+ ALT\"],\"H4lgRd\":[\"Authentication isn't set up. Check your server config.\"],\"HFPGej\":[\"No threads match these filters. Try adjusting your selection or clear all filters.\"],\"HG79RB\":[\"Post as Private\"],\"HNEHJP\":[\"Demo credentials are pre-filled — hit Sign In to continue.\"],\"HbAIQc\":[\"A reference link for checking whether the accent feels editorial instead of promotional.\"],\"HrC0ab\":[\"All posts\"],\"Ht1V3q\":[\"For the same reason, inline code should stay neutral. Something like theme.siteAccent = soften(green, 12%) should not suddenly become the loudest thing on the page.\"],\"I22eN0\":[\"Shared links\"],\"I6zLrz\":[\"Use these when you need a transparent square logo, a shaped tile with a built-in background, a browser icon, or a default preview image.\"],\"ICsA6P\":[\"You have unsaved changes\"],\"IUX7p+\":[\"White logo on the Jant green rounded tile for app icon mockups, touch icons, directory listings, and other square placements that should feel softer.\"],\"IagCbF\":[\"URL\"],\"IjnQHI\":[\"with title\"],\"ImOQa9\":[\"Reply\"],\"IsI3kE\":[\"Nothing here yet. Add posts to one of these collections to fill this view.\"],\"J+2Rls\":[\"Leave blank to publish now. Use an earlier date when importing older posts.\"],\"J4tAHl\":[\"Headings should keep their hierarchy even when the accent gets softer.\"],\"JYj5R2\":[\"Browse files\"],\"JcD7qf\":[\"More actions\"],\"JqJ5Xv\":[\"Latest\"],\"JuN5GC\":[\"No file selected. Choose a file to upload.\"],\"JwLPQ/\":[\"This sign-in link has expired. Return to \"],\"KOqvXP\":[\"Do not recolor, stretch, rotate, outline, or add effects to the logo.\"],\"KbS2K9\":[\"Reset Password\"],\"KdSsVl\":[\"Author (optional)\"],\"Khu3PV\":[\"Publish settings\"],\"KiJn9B\":[\"Note\"],\"KlZ+t+\":[\"%name% + %count% more\"],\"KsvRin\":[\"Hide from Latest\"],\"KzmC5L\":[\"Controls\"],\"L7svJg\":[\"Reading\"],\"Lbkbwy\":[\"A quote card for judging accent color against softer, citation-heavy content.\"],\"LcvzvX\":[\"Tap to retry\"],\"LkA8jz\":[\"Add alt text\"],\"LxRg6f\":[\"live theme controls\"],\"M4tzVU\":[\"Latest posts\"],\"M8kJqa\":[\"Drafts\"],\"MHrjPM\":[\"Title\"],\"MILa7n\":[\"Square tile\"],\"MRYGql\":[\"Open image URL\"],\"MSc/Yq\":[\"Do you want to publish your changes or discard them?\"],\"MZTcRq\":[\"Image unavailable\"],\"Mc7+6G\":[\"Enter a valid URL starting with http://, https://, or mailto:.\"],\"MdMyne\":[\"Source link (optional)\"],\"MiMY3Q\":[\"Apple touch icon\"],\"MiyoI7\":[\"default note sample\"],\"MqghUt\":[\"Search posts...\"],\"Myqkib\":[\"Create a collection to get started.\"],\"N8UzTV\":[\"Replies\"],\"NAFbuE\":[\"Search snippet\"],\"NH9Z1R\":[\"Start here\"],\"NqsRbb\":[\"Jant logo\"],\"NvXuWk\":[\"Won't move the thread to the top of latest.\"],\"O1367B\":[\"All collections\"],\"O3oNi5\":[\"Email\"],\"OEdMhi\":[\"The best default color is the one you notice only after reading for a while.\"],\"OEt/to\":[\"Guidelines\"],\"OJxdgi\":[\"Keep this link under 200 characters.\"],\"OaoJcz\":[\"Social preview\"],\"OmfDbR\":[\"Site accent\"],\"Ovks1h\":[\"A softer blue feels more like ink than product chrome.\"],\"P/sHNL\":[\"Use this page to judge buttons, links, cards, forms, thread accents, and quiet surfaces before changing a theme globally.\"],\"Q/uoSA\":[\"Quiet here for now.\"],\"Q2mGA7\":[\"Clear filter\"],\"QBqVyM\":[\"Home screen icon for iPhone and iPad shortcuts.\"],\"QebAts\":[\"Link added.\"],\"Qgbxdw\":[\"Designing a calmer default accent for Jant\"],\"Qn9Ao8\":[\"Circle tile\"],\"Qoq+GP\":[\"Read more\"],\"QyDt3L\":[\"File uploaded.\"],\"R5CMuK\":[\"Jant looks best when the accent feels editorial. Buttons can stay sturdy, but inline emphasis should feel like a pen mark, not a dashboard highlight.\"],\"R8AthW\":[\"Divider\"],\"R9Khdg\":[\"Auto\"],\"RAv3u7\":[\"Compare it against the theme controls\"],\"ROa4Ti\":[\"Interfaces for reading should guide the eye, not keep asking for attention.\"],\"RZOWDv\":[\"Add a custom shortcut to any page or site.\"],\"RdmNnl\":[\"Browser tab\"],\"RfGczC\":[\"Square logo\"],\"Rj01Fz\":[\"Links\"],\"S37om9\":[\"Included assets\"],\"S8NCfs\":[\"Save to drafts to edit and post at a later time.\"],\"SJGVAw\":[\"Feel editorial and slightly quieter.\"],\"SJmfuf\":[\"Site Name\"],\"SaNhJE\":[\"feel deliberate instead of washed out.\"],\"SpTWH3\":[\"Download SVG\"],\"SvRuJt\":[\"Field Notes on Interface Tone\"],\"T/R+Qz\":[\"Primary\"],\"TNZKpI\":[\"Danger\"],\"TvaTxw\":[\"Doesn't appear in Latest. Still appears in collections you add it to.\"],\"UIMXHD\":[\"Remove Divider\"],\"UaZwcz\":[\"More options are available after you create it.\"],\"Uc5y7o\":[\"Choose the standard logo for websites, docs, directories, and editorial layouts.\"],\"V18SVO\":[\"Use the logo on light backgrounds.\"],\"V4WsyL\":[\"Add Link\"],\"VCA6B2\":[\"These are actual feed components with real footers, summaries, and inline links. Use this section to judge whether the theme still feels calm once it is applied to realistic content.\"],\"VNqFYa\":[\"Loading post...\"],\"WCOanD\":[\"This reference is useful because it treats links and citations as part of the reading rhythm. Keep that in mind while tuning the\"],\"WbIbzR\":[\"Checking link...\"],\"WcWS//\":[\"Download file\"],\"WhsN3P\":[\"A good default accent in Jant should feel like editorial structure, not product branding. That means links, emphasis, and thread cues can be visible without turning the page into UI chrome.\"],\"Wn+/rH\":[\"Transparent square\"],\"XU7b+L\":[\"Primary logo files\"],\"XV1mAn\":[\"Only visible when signed in.\"],\"XrnWzN\":[\"Published!\"],\"Y7WAtz\":[\"An image couldn't be saved to your library — its original link was kept.\"],\"YIix5Y\":[\"Search...\"],\"YOzD/a\":[\"Replace image\"],\"YUglt2\":[\"Generating a link...\"],\"YXiA6e\":[\"Primary button\"],\"Ygx3Yl\":[\"Small browser icon used in tabs and bookmarks.\"],\"Z6NwTi\":[\"Save as Draft\"],\"ZGs2so\":[\"Delete this collection permanently? Posts inside won't be removed.\"],\"ZV5ykW\":[\"Download PNG\"],\"ZhhOwV\":[\"Quote\"],\"ZmSeP+\":[\"Save to drafts?\"],\"ZxFuun\":[[\"count\",\"plural\",{\"one\":[\"Found \",\"#\",\" result\"],\"other\":[\"Found \",\"#\",\" results\"]}]],\"a5j82I\":[\"No collections match that search. Try a different name.\"],\"aHTB7P\":[\"Supplementary content attached to your post\"],\"aMEyv0\":[\"Stay sturdy and readable.\"],\"aN6wx0\":[\"Nothing in Featured yet. Mark a post as featured to show it here.\"],\"aYpXKS\":[\"and checking whether the accent is guiding attention or pulling too hard.\"],\"aaGV/9\":[\"New Link\"],\"af+9p6\":[\"Quiet metadata\"],\"an5hVd\":[\"Images\"],\"ao77hr\":[[\"count\",\"plural\",{\"one\":[\"#\",\" hidden post\"],\"other\":[\"#\",\" hidden posts\"]}]],\"auFlOr\":[\"Icons and previews\"],\"avuFKG\":[\"threads\"],\"bFpC86\":[\"Everything in one download\"],\"bGtMpA\":[\"Add a label and URL.\"],\"bHOiy1\":[\"Password changes are off in demo mode. Sign in with the shared demo credentials.\"],\"bbdNeX\":[\"Sign in\"],\"bfCbdi\":[\"Current post\"],\"bkBJmZ\":[\"This is useful as a color check because it puts the accent next to quotation styling, metadata, and a quieter explanatory paragraph. Compare it back to the\"],\"bzSI52\":[\"Discard\"],\"c2JRUS\":[\"Generate automatically\"],\"cIoW7X\":[\"Inline link\"],\"cTUByn\":[\"Newest first\"],\"cb7FR8\":[\"White logo on the Jant green square tile for platforms and layouts that expect a true edge-to-edge square.\"],\"cgmi4V\":[\"Delete Draft\"],\"cnGeoo\":[\"Delete\"],\"d+F4pf\":[\"The image should sit quietly inside the article instead of feeling like a card preview.\"],\"d/o/BH\":[\"Couldn't publish. Saved as draft.\"],\"dD7NPy\":[\"Outline\"],\"dEgA5A\":[\"Cancel\"],\"dHko2w\":[\"single posts\"],\"dUsGbd\":[\"The right accent should disappear into the writing until you need it.\"],\"dXoieq\":[\"Summary\"],\"dYKrp3\":[\"Hidden from Latest\"],\"dbUuAj\":[\"Appears in Latest.\"],\"df4a/r\":[\"Couldn't load this post. Try again.\"],\"ePK91l\":[\"Edit\"],\"eWLklq\":[\"Quotes\"],\"f4MAoA\":[\"Some uploads failed. Saved as draft.\"],\"f5s9EI\":[\"Press N to write\"],\"f6Hub0\":[\"Sort\"],\"f8fH8W\":[\"Design\"],\"fD+f7T\":[\"RSS feed\"],\"fKrDxS\":[\"Brand tile\"],\"fMPkxb\":[\"Show more\"],\"fqDzSu\":[\"Rate\"],\"fttd2R\":[\"My Collection\"],\"gCcxP/\":[\"Threads can include up to \",[\"count\"],\" posts.\"],\"gFdWl+\":[\"A long-form article sample for checking the default palette in a true reading context.\"],\"gNKz6Z\":[\"Collection deleted.\"],\"gXH9r/\":[\"Open raw PNG\"],\"gj52YE\":[\"This collection is empty. Add posts from the editor.\"],\"gpaPhA\":[\"Helps screen readers describe the image\"],\"h5RcXU\":[\"Post hidden\"],\"hLlWo5\":[\"A few simple rules.\"],\"hWpUeY\":[\"Auto link\"],\"hXzOVo\":[\"Next\"],\"heSQoS\":[\"Paste a URL...\"],\"hqeXKW\":[\"Single posts\"],\"hrkGms\":[\"Search\"],\"i0vDGK\":[\"Sort Order\"],\"i5+Y7d\":[\"Download the official Jant logo, icons, and preview files.\"],\"i6kro6\":[\"Edit custom link\"],\"i6nDCI\":[\"Choose a new password.\"],\"iG7KNr\":[\"Logo\"],\"iH8pgl\":[\"Back\"],\"ilSmIt\":[\"Hard edge\"],\"iu7tUI\":[\"Breadcrumb\"],\"jAXE5p\":[\"Reverse logo\"],\"jAqB/k\":[\"Post privately\"],\"jQflRT\":[\"This uses the real single-post detail rendering with a longer article, inline image, tables, lists, quotes, and code. The content column stays at the same width as the live site.\"],\"jd+8Mm\":[\"Social preview image\"],\"jdJOV1\":[\"Settings\"],\"ji7oVU\":[\"Edit post\"],\"jpctdh\":[\"View\"],\"jrsUoG\":[\"Type / for commands\"],\"jvyYZG\":[\"What's on your mind...\"],\"k3Iw35\":[\"Switch to the white logo when the standard green version would lose contrast.\"],\"kPMIr+\":[\"Give it a title...\"],\"kj6ppi\":[\"entry\"],\"kr39oD\":[\"No collections yet. Start one to organize posts by topic.\"],\"kzvWob\":[\"Link to the post archive\"],\"laT1IJ\":[\"iOS home screen\"],\"lb+Xwx\":[\"Custom link\"],\"m16xKo\":[\"Add\"],\"mKT7g0\":[\"Text attachment\"],\"mc/vLq\":[\"This link is already in use. Choose something else.\"],\"muKqfV\":[\"Featured\"],\"n1ekoW\":[\"Sign In\"],\"n3ReIn\":[\"Collections\"],\"n6QD94\":[\"Oldest first\"],\"nFukaP\":[\"Wrong email or password. Check your credentials and try again.\"],\"nJ4U1U\":[[\"count\"],\" images couldn't be saved to your library — their original links were kept.\"],\"nV6twc\":[\"Organize\"],\"nd8Puv\":[\"White logo on the Jant green circle for profile images, badges, and other round placements where you want a ready-made asset.\"],\"ndrEYW\":[\"When the accent is slightly warmer and less literal, the whole page feels more like a writing space and less like product UI.\"],\"o21Y+P\":[\"entries\"],\"oO0hKx\":[[\"count\",\"plural\",{\"one\":[\"#\",\" more post\"],\"other\":[\"#\",\" more posts\"]}]],\"oTu7Wt\":[\"Combined Collections\"],\"ode0+L\":[\"Theme sample\"],\"ogssnn\":[\"with media\"],\"ovBPCi\":[\"Default\"],\"p1Z67P\":[\"When primary is too rigid, the whole page starts reading like product UI instead of writing space.\"],\"p2/GCq\":[\"Confirm Password\"],\"pB0OKE\":[\"New Divider\"],\"pBHx39\":[\"Dark backgrounds\"],\"pVrU5x\":[\"If this page feels too branded, the first place to soften is the default theme’s site accent, not the border or body text.\"],\"pvnfJD\":[\"Dark\"],\"q+hNag\":[\"Collection\"],\"q5YRzz\":[\"Color check\"],\"q8RviX\":[\"Titled\"],\"qcawwg\":[\"Publish now\"],\"qiN9NB\":[\"Surface\"],\"qt89I8\":[\"Draft saved.\"],\"quvfGs\":[\"instead of judging it as an isolated swatch.\"],\"r7kcaA\":[\"Drag collections, links, and dividers into the order you want.\"],\"rA2TFI\":[\"Switch the palette and mode without opening settings or changing the active site theme.\"],\"rV8ZnP\":[\"Edit publish date\"],\"rdUucN\":[\"Preview\"],\"s8G5Or\":[\"This upload would exceed your shared hosted media limit. Remove files or upgrade storage to continue.\"],\"s9gHf5\":[\"your-post-link\"],\"sER+bs\":[\"Files\"],\"sQpDn6\":[\"Exit fullscreen\"],\"sgr2wQ\":[\"collection\"],\"slujBW\":[\"Use lowercase letters, numbers, and hyphens only.\"],\"syiAKf\":[\"note treatment\"],\"t42hIC\":[\"Everything most people need is in one ZIP.\"],\"tCctex\":[\"The brand pack includes SVG logos, a transparent square PNG, rounded, square, and circle tiles, plus favicon, Apple touch icon, and the default social preview image.\"],\"tKlWWY\":[\"Emoji\"],\"tSWVu5\":[\"Published on \",[\"date\"],\" at \",[\"time\"]],\"tfDRzk\":[\"Save\"],\"tg5MRw\":[\"Sign in to start writing.\"],\"tgSBSE\":[\"Remove Link\"],\"uowbPn\":[\"Remove attachment\"],\"v3E8iS\":[\"A practical checklist\"],\"vSJd18\":[\"Video\"],\"vSYKYI\":[\"Main feed\"],\"vXCC6J\":[\"Something doesn't look right. Check the form and try again.\"],\"vcpc5o\":[\"Close menu\"],\"vdFnYM\":[\"Reset link\"],\"vdvpU5\":[\"/archive?format=quote or https://example.com\"],\"vgpfCi\":[\"Save draft\"],\"vpSPA1\":[\"Auth secret is missing. Check your environment variables.\"],\"vzU4k9\":[\"New Collection\"],\"w0Emel\":[\"Suggested link\"],\"w6mlns\":[\"Article detail page\"],\"wJ+GRy\":[\"All visibility\"],\"wL3cK8\":[\"Latest\"],\"wja8aL\":[\"Untitled\"],\"wlnK1t\":[\"A single ZIP with the main logo, reverse logo, square PNG, rounded, square, and circle tiles, plus favicon, Apple touch icon, and social preview image.\"],\"wm3Zlr\":[\"All years\"],\"xCWek4\":[\"File storage isn't set up. Check your server config.\"],\"xVrkxi\":[\"quiet design\"],\"xVvw1i\":[\"This reset link is no longer valid. Request a new one to continue.\"],\"xYilR2\":[\"Media\"],\"xeiujy\":[\"Text\"],\"xhTx3y\":[\"Choose the standard logo for most placements and the reverse logo when you need more contrast.\"],\"xjHB3/\":[\"Continue →\"],\"y28hnO\":[\"Post\"],\"y2o/Y0\":[\"This Link Has Expired\"],\"yGZVl1\":[\"More\"],\"yQ2kGp\":[\"Load more\"],\"yUtAh2\":[\"New Thread\"],\"ycM1Xg\":[\"No results. Try different keywords.\"],\"ynMAhG\":[\"Default logo\"],\"yzF66j\":[\"Link\"],\"zBFr9G\":[\"Paste a long article, AI response, or any text...\\n\\nMarkdown formatting will be preserved.\"],\"zJDAbh\":[\"Don't save\"],\"zcDmsG\":[\"Featured posts\"],\"zoK+eO\":[\"Add a title before posting this link.\"],\"zucql+\":[\"Menu\"],\"zwBp5t\":[\"Private\"]}");
|
|
1917
1917
|
//#endregion
|
|
1918
1918
|
//#region src/i18n/locales/settings/en.ts
|
|
1919
|
-
var messages$2 = JSON.parse("{\"++YsxG\":[\"Readers and search engines see\"],\"+4Z6iP\":[\"Create the repository on GitHub first — it can be empty.\"],\"+9JI/F\":[\"Connecting will sync your site onto \",[\"repo\"],\"'s default branch on top of its existing history. Existing files outside Jant's managed paths are kept. This can't be undone.\"],\"+AXdXp\":[\"Label and URL are required\"],\"+K0AvT\":[\"Disconnect\"],\"+wgt7C\":[\"Muted red-brown background, earthy and warm.\"],\"+zy2Nq\":[\"Type\"],\"/3H2/s\":[\"This hosted site signs in through \",[\"providerLabel\"],\". Manage password and hosted access there.\"],\"/JnyjR\":[\"Toggle built-in navigation items. Their order controls what shows in the header and which feed the homepage opens first.\"],\"/PXXBT\":[\"Nearly white, with a touch of warmth.\"],\"/zOUxl\":[\"QR code linking to the Telegram bot\"],\"0OGSSc\":[\"Avatar display updated.\"],\"0UzCUX\":[\"Update the password you use to sign in\"],\"0bdA9b\":[\"Open Telegram to connect\"],\"0uIjy/\":[\"Light sage-green with a matching green accent.\"],\"10UtuM\":[\"CJK Font\"],\"1F6Mzc\":[\"No navigation items yet. Add links or enable system items below.\"],\"1H7gng\":[\"Dashboard language\"],\"1mbBbL\":[\"Connect manually\"],\"1njn7W\":[\"Light\"],\"1qGdnL\":[\"The default. Calm and easy for long reading.\"],\"2B7t+s\":[\"Sessions and password\"],\"2DoBvq\":[\"Feeds\"],\"2FYpfJ\":[\"More\"],\"2Ithfh\":[\"Message the bot any text and it's published as a note.\"],\"2PTjMB\":[\"I want to delete \",[\"siteName\"]],\"2cFU6q\":[\"Site Footer\"],\"2fPEPI\":[\"A calm, cool backdrop.\"],\"2lkk2l\":[\"Yellow-tinted paper with an olive-green accent.\"],\"2oWZo7\":[\"Last commit\"],\"2uuy4H\":[\"Connected via Personal Access Token\"],\"35x8eZ\":[\"Showing \",[\"shown\"],\" of \",[\"total\"]],\"39QGku\":[\"Open the bot and send the binding code, then anything you message it becomes a note.\"],\"3Cw1AI\":[\"Add Collection\"],\"3VrybB\":[\"Redirect\"],\"3Yvsaz\":[\"302 (Temporary)\"],\"3n0zbB\":[\"Session management is off in demo mode. Use the shared demo session instead.\"],\"3sYJi5\":[\"Download a Hugo-compatible archive — host it statically or move to another Jant.\"],\"3wKq0C\":[\"Couldn't save. Try again in a moment.\"],\"49Bsal\":[\"Feed settings updated.\"],\"4Jge8E\":[\"Active Sessions\"],\"4KIa+q\":[\"Export downloaded.\"],\"4cEClj\":[\"Sessions\"],\"4yyXWu\":[\"Pale bone-white with a muted green accent.\"],\"4zGJ5E\":[\"Delete Account Permanently\"],\"5QlUIt\":[\"Empty repository. Ready to connect.\"],\"5VQnR3\":[\"Use these when you want a feed URL that never changes.\"],\"5dpcN1\":[\"type to search all\"],\"5f1Wo9\":[\"Connected as \",[\"account\"]],\"5o8R81\":[\"Very light ivory with a faint tea-green accent.\"],\"6ArdBh\":[\"Uses featured posts for /feed.\"],\"6DjeBT\":[\"Demo sites always stay hidden from search engines.\"],\"6E3aK4\":[\"Manage Hosting\"],\"6FFB7q\":[\"Uses the latest public posts for /feed.\"],\"6K1Vef\":[\"Delete this blog permanently? This cannot be undone.\"],\"6NpNLc\":[\"This repository has existing content.\"],\"6V3Ea3\":[\"Copied\"],\"71WIgc\":[\"Get a new code\"],\"746NHh\":[\"this blog\"],\"7811AW\":[\"This repository is already backing up this site.\"],\"7FCZPo\":[\"Content language\"],\"7FaY4u\":[\"Usage\"],\"7G9YLi\":[\"Allow search engines to index my site\"],\"7GISOt\":[\"Save bot token\"],\"7MZxzw\":[\"Password changed.\"],\"7vhWI8\":[\"New Password\"],\"81nFIS\":[\"Passwords don't match. Make sure both fields are identical.\"],\"87a/t/\":[\"Label\"],\"89Upyo\":[\"That theme isn't available. Pick another one.\"],\"8BfEpW\":[\"Hosted account\"],\"8N/Mcp\":[\"Archive filter parameters (e.g. format=note&view=list)\"],\"8T46pB\":[\"Bot token\"],\"8U2Z7f\":[\"New Custom URL\"],\"8ZsakT\":[\"Password\"],\"8gEghq\":[\"Bright warm-white with a moss-green accent.\"],\"9+vGLh\":[\"Custom CSS\"],\"9As8Nu\":[\"Create one on GitHub\"],\"9EjI4j\":[\"Warm sand\"],\"9Lsvt5\":[\"Signed in \",[\"date\"]],\"9T7Cwm\":[\"Redirects, vanity paths, and URL control\"],\"9aUyym\":[\"See where you're signed in and revoke old sessions\"],\"A1taO8\":[\"Search\"],\"AeXO77\":[\"Account\"],\"AnY+O9\":[\"Show \\\"Build with Jant\\\" at the bottom of the home page\"],\"ApZDMk\":[\"This is used for your favicon and apple-touch-icon. For best results, upload a square PNG with a solid background at least 512x512 pixels.\"],\"B495Gs\":[\"Archive\"],\"B4ESok\":[\"API reference\"],\"BzEFor\":[\"or\"],\"CDAdlf\":[\"Remove bot\"],\"CTAEes\":[\"Select a repository\"],\"CjZZgz\":[\"This repository already has commits\"],\"D8k2s6\":[\"Connect Telegram\"],\"DCKkhU\":[\"Current Password\"],\"DKKKeF\":[\"Manage password and hosted access in \",[\"providerLabel\"]],\"DVFXa6\":[\"The cleanest, most neutral option.\"],\"EO3I6h\":[\"Upload didn't go through. Try again in a moment.\"],\"Eax/et\":[\"Accent\"],\"Enslfm\":[\"Destination\"],\"F53UDu\":[\"Cool white\"],\"F7FKwe\":[\"Anything you paste here has full access to your visitors' browsers. Only use code from sources you trust.\"],\"F8SNqr\":[\"Warm orange\"],\"Fk3SSD\":[\"Calm and natural, easy on the eyes.\"],\"FkMol5\":[\"Featured\"],\"G/1oP+\":[\"Remove the webhook and stop syncing. Your repository content will not be deleted.\"],\"G0qJsQ\":[\"Security token missing. Refresh the page and try again.\"],\"G39wnK\":[\"Back up and sync content with a GitHub repository\"],\"GMMWcy\":[\"Name, metadata, language, and search defaults\"],\"GXsAby\":[\"Revoke\"],\"GxkJXS\":[\"Uploading...\"],\"GzKzUa\":[\"Demo limits\"],\"H4x7Sk\":[\"The language this admin dashboard shows in. Available in English, 简体中文, and 繁體中文.\"],\"HCNlq3\":[\"Clean and high-contrast, close to white.\"],\"HHDyGw\":[\"Soft green\"],\"HKH+W+\":[\"Data\"],\"Hp1l6f\":[\"Current\"],\"HxlY7t\":[\"Changing this updates what subscribers get from /feed.\"],\"HxuOlm\":[\"Site Header\"],\"I4HRxU\":[\"Every published post, including ones hidden from Latest.\"],\"I6gXOa\":[\"Path\"],\"I76CzF\":[\"Neutral gray\"],\"ID38tA\":[\"Account deletion is off in demo mode. The shared demo resets separately.\"],\"IF9tPu\":[\"When to use site export, database backups, and recovery drills.\"],\"IW5PBo\":[\"Copy Token\"],\"IagCbF\":[\"URL\"],\"IfB3m6\":[\"The language your posts are written in. Announced to readers and search engines through HTML lang and your RSS feed. Any BCP 47 tag works.\"],\"IreQBq\":[\"Repository\"],\"J6bLeg\":[\"Add a custom link to any URL\"],\"JL7LF5\":[\"available CSS variables, data attributes, and examples.\"],\"JTviaO\":[\"Manage sign-in security, exports, and irreversible actions.\"],\"JcD7qf\":[\"More actions\"],\"JjX0OO\":[\"Copy your token now — it won't be shown again.\"],\"JrFTcr\":[\"Connecting…\"],\"JuN5GC\":[\"No file selected. Choose a file to upload.\"],\"KDw4GX\":[\"Try again\"],\"KSgo21\":[\"Pick a repository\"],\"KVVYBh\":[\"Add collection to navigation\"],\"KiJn9B\":[\"Note\"],\"KwOLJF\":[\"The original Jant palette, and a solid everyday pick.\"],\"L3DEwT\":[\"Remove this avatar? Your favicon and header icon will go back to the default.\"],\"L4t4/q\":[\"March 14\"],\"LdyooL\":[\"link\"],\"M/D8PK\":[\"+ Install on another account\"],\"M/haSd\":[\"Always show the light version of the theme.\"],\"M2kIWU\":[\"Font theme\"],\"M6CbAU\":[\"Toggle edit panel\"],\"MaYYE6\":[\"Post notes by messaging a Telegram bot\"],\"Me5t5H\":[\"Connect a GitHub repository to automatically back up your posts as Markdown files. Edits on GitHub sync back to your site.\"],\"Mr4QPw\":[\"Disconnect Telegram? You can reconnect any time with a new binding code.\"],\"MtENL9\":[\"Tune how your site looks, reads, and runs.\"],\"N/8NPV\":[\"Before deleting, download a site export. You won't be able to recover this account after deletion.\"],\"N7UNHY\":[\"Featured feed\"],\"NHnUHF\":[\"Favicon and the profile mark in your header\"],\"NU2Fqi\":[\"Save CSS\"],\"NVjhde\":[\"Warm parchment\"],\"Nldjdr\":[\"No custom URLs yet. Create one to add redirects or custom paths for posts.\"],\"O7rgs6\":[\"Header RSS points to your \",[\"feed\"],\" feed (/feed). Change what /feed returns in General.\"],\"OSJXFg\":[\"Applies to your entire site, including admin pages. Pick a palette, then choose whether it follows the system or stays fixed.\"],\"Ox3+3h\":[\"No matches.\"],\"PEUV5I\":[\"Code injection updated.\"],\"PHh52z\":[\"Warm and rich, with strong brown tones.\"],\"PXj9lw\":[\"Stop accepting posts from Telegram. Your existing notes stay published.\"],\"PZ7HJ8\":[\"Blog Avatar\"],\"Pwqkdw\":[\"Loading…\"],\"PxJ9W6\":[\"Generate Token\"],\"Q/6Y+2\":[\"Needs Contents (read/write) and Webhooks (read/write) on the target repository.\"],\"Q30z/l\":[\"Remove this collection from navigation? The collection itself won't be deleted.\"],\"Q99OtV\":[\"Pin a collection to your navigation bar. An asterisk (*) appears next to collections updated in the last 48 hours.\"],\"QCwsv1\":[\"Warm off-white\"],\"QKvrmL\":[\"Warm-neutral and easy for long reading.\"],\"QZmz0H\":[\"Built-in links\"],\"Qnrzvb\":[\"Active Tokens\"],\"R6Z4LE\":[\"Download failed. Please try again.\"],\"R9Khdg\":[\"Auto\"],\"RcdDOS\":[\"Create a bot by messaging @BotFather on Telegram, then paste the token it gives you.\"],\"RdVIcf\":[\"Cream and coffee brown\"],\"RxsRD6\":[\"Time Zone\"],\"SJmfuf\":[\"Site Name\"],\"SKZhW9\":[\"Token name\"],\"SVQQPe\":[\"Couldn't connect. Check the error and try again.\"],\"SchpMp\":[\"Telegram\"],\"SrGs4T\":[\"Light blue-gray background, cool and even.\"],\"TpF3v+\":[\"Injected before </head>. Use for analytics, custom meta tags, and styles that must load early.\"],\"Tz0i8g\":[\"Settings\"],\"UFK415\":[\"Site-wide HTML for analytics and widgets\"],\"UTvFQq\":[\"Open \",[\"linkOpen\"],\"@\",[\"botUsername\"],[\"linkClose\"],\" and send:\"],\"Uj/btJ\":[\"Display avatar in my site header\"],\"UsODUn\":[\"Select an account\"],\"UxKoFf\":[\"Navigation\"],\"V+bhUy\":[\"Install GitHub App\"],\"V4WsyL\":[\"Add Link\"],\"V5pZwT\":[\"Search settings updated.\"],\"VXUPla\":[\"Connect with GitHub App\"],\"VhMDMg\":[\"Change Password\"],\"Vn3jYy\":[\"Navigation items\"],\"VoZYGU\":[\"This will permanently delete all your data — posts, media, collections, settings, and your account. Your blog will be reset to its initial setup state. This cannot be undone.\"],\"WUnFK2\":[\"Pale cool-white with deep indigo text. High contrast.\"],\"Wa9q4P\":[\"Pure white\"],\"Weq9zb\":[\"General\"],\"Wi9i06\":[\"Follow each visitor's system preference.\"],\"Wx1M8N\":[\"Install the GitHub App to grant access without managing personal tokens. Permissions are scoped per repository and revocable from GitHub.\"],\"X+8FMk\":[\"Current password doesn't match. Try again.\"],\"X1G9eY\":[\"Navigation Preview\"],\"X2Cbc2\":[\"Archive feed\"],\"X9Hujr\":[\"Manual Push\"],\"XtBJV8\":[\"Checking repository…\"],\"Xtc16w\":[\"Refresh repository list\"],\"Y/F35r\":[\"Create a post with curl:\"],\"Y/N5N7\":[\"Soft cream background with a muted green accent.\"],\"YF6zHf\":[\"Site settings updated.\"],\"YdG2RF\":[\"Export Site\"],\"YkgZi7\":[\"Connect a Telegram bot, then anything you message it gets published as a note.\"],\"YwhjRx\":[\"Manage Account\"],\"Yxp859\":[\"Warm cream\"],\"ZDY7Fy\":[\"Syncing…\"],\"ZQKLI1\":[\"Danger Zone\"],\"ZS/CBL\":[\"Delete this navigation link? Visitors won't see it in your site header anymore.\"],\"ZgZX+d\":[\"Pure white with neutral grays. No color tint.\"],\"ZhhOwV\":[\"Quote\"],\"ZiooJI\":[\"API Tokens\"],\"Zm7Qb0\":[\"Backup & Restore Guide\"],\"ZmUkwN\":[\"Add custom link to navigation\"],\"a14mj8\":[\"Unknown device\"],\"a1iEgy\":[\"Warm cream background with deep coffee-brown accents.\"],\"a3LDKx\":[\"Security\"],\"aAIQg2\":[\"Appearance\"],\"aFkzVF\":[\"The slug of the target post or collection\"],\"alKG0+\":[\"Font Theme\"],\"anibOb\":[\"About this blog\"],\"any7NR\":[\"Theming guide\"],\"b+/jO6\":[\"301 (Permanent)\"],\"bHOiy1\":[\"Password changes are off in demo mode. Sign in with the shared demo credentials.\"],\"bHYIks\":[\"Sign Out\"],\"bV2vng\":[\"Warm terracotta\"],\"bbR5vW\":[\"This palette\"],\"bmrL08\":[\"Demo mode hides sessions, password changes, and account deletion. Export still works.\"],\"bviiKV\":[\"Headings, body text, and links in this theme.\"],\"c3MN2z\":[\"all available endpoints and request formats.\"],\"cS7/bk\":[\"Remove the saved bot token? Its webhook is deleted and any connected account is disconnected.\"],\"cSDy01\":[\"Custom CSS updated.\"],\"clzoNp\":[\"Always show the dark version of the theme.\"],\"cnGeoo\":[\"Delete\"],\"d3FRkY\":[\"Could not copy. Try again.\"],\"d5oGUo\":[\"Create a new repository on GitHub\"],\"dEgA5A\":[\"Cancel\"],\"dTXUY+\":[\"Confirm account deletion\"],\"dYKrp3\":[\"Hidden from Latest\"],\"dk7TCH\":[\"Permanently delete all data and reset the blog\"],\"drodVV\":[\"No collections yet. Create one first, then add it to your navigation.\"],\"dsWkIw\":[\"Disconnect from GitHub? The webhook will be removed. Your repository content will not be deleted.\"],\"e/tSI5\":[\"Navigation order updated.\"],\"eOL7vn\":[\"Minimal color, low distraction.\"],\"ePK91l\":[\"Edit\"],\"ebQKK7\":[\"Site\"],\"egK+Yy\":[\"Bearer tokens for scripts and automation\"],\"ehj/zN\":[\"Redirect Type\"],\"eneWvv\":[\"Draft\"],\"erTMh7\":[\"Last synced\"],\"f+m8jj\":[\"Feed URL copied.\"],\"f8fH8W\":[\"Design\"],\"fKRAwQ\":[\"Sandy background with a green accent.\"],\"fWYqkz\":[\"Code Injection\"],\"fYXQnC\":[\"Cozy and bold among the warm tones.\"],\"gOWiTY\":[\"Load a serif font optimized for Chinese, Japanese, or Korean content.\"],\"gZ5owP\":[\"Search repositories\"],\"gbqbh6\":[\"Safe to leave this page — syncing continues in the background.\"],\"gkFvVN\":[\"Injected before </body>. Use for chat widgets and scripts that should not block page load.\"],\"gtQsRO\":[\"Create Custom URL\"],\"hBO/y4\":[\"Security token expired. Refresh the page and try again.\"],\"hGmyDl\":[\"Tokens let you access the API from scripts, shortcuts, and other tools without signing in.\"],\"hIHkRy\":[\"Connected via GitHub App\"],\"hdSi1b\":[\"Type \",[\"repo\"],\" to confirm\"],\"he3ygx\":[\"Copy\"],\"i0qMbr\":[\"Home\"],\"iEUzMn\":[\"system\"],\"iSLIjg\":[\"Connect\"],\"iVOMRi\":[\"Home settings updated.\"],\"icB4Cv\":[\"Drag links here to show them under the More menu\"],\"id3vuh\":[\"Telegram is set up, but the bot couldn't be reached. Check the bot token and try again.\"],\"ihn4zD\":[\"Search…\"],\"iiDXZc\":[\"Displayed at the bottom of all posts and pages.\"],\"itS31B\":[\"A warmer look, like slightly aged paper.\"],\"iwQZvS\":[\"Cool blue-gray\"],\"j4VrG6\":[\"Download Export ZIP\"],\"j5nQL2\":[\"e.g. iOS Shortcuts\"],\"jUV7CU\":[\"Upload Avatar\"],\"jVUmOK\":[\"Markdown supported\"],\"jdVYS8\":[\"Pick the one that fits your writing.\"],\"jgBjXJ\":[\"Revoke this token? Any scripts using it will stop working.\"],\"jpctdh\":[\"View\"],\"k1ifdL\":[\"Processing...\"],\"kLw03Y\":[\"Bright paper white\"],\"kMXclu\":[\"Download a site export\"],\"kNiQp6\":[\"Pinned\"],\"kRhzWq\":[\"GitHub Sync\"],\"kVQs7s\":[\"Fine-grained styling overrides\"],\"ke1gWS\":[\"Custom URLs\"],\"kfcRb0\":[\"Avatar\"],\"kxDZ2i\":[\"This code runs on every page of your site.\"],\"l2Op2p\":[\"Query Parameters\"],\"lLW3vJ\":[\"Target Slug\"],\"lV04bQ\":[\"Warm and earthy, but still light.\"],\"lYHJih\":[\"Revoke this session? That device will need to sign in again.\"],\"mLOk1i\":[\"Push all posts to GitHub right now instead of waiting for the next automatic sync.\"],\"mSNmrX\":[\"List posts:\"],\"nG2qTk\":[\"Example link\"],\"nK07ni\":[\"Choose a typographic direction for your site. Each theme changes both the font pairing and the reading rhythm.\"],\"nbfdhU\":[\"Integrations\"],\"ntJYyh\":[\"Domains, plan, and billing in \",[\"providerLabel\"]],\"o/vNDE\":[\"lets you override any theme variable.\"],\"oGC9uP\":[\"owner/repo\"],\"oH2JHg\":[\"We'll prefill the name \",[\"name\"],\". The list refreshes on return.\"],\"oKOOsY\":[\"Color Theme\"],\"oL535e\":[\"Not synced yet\"],\"oNA4If\":[\"All collections are already in your navigation.\"],\"oUn9Z7\":[\"Near-neutral light gray with a steel-blue accent.\"],\"ofdy2l\":[\"Orange-tinted background. The warmest palette.\"],\"pZq3aX\":[\"Upload failed. Please try again.\"],\"pgTIrt\":[\"Choose the GitHub account and repository to sync with this site.\"],\"psoxDF\":[\"That font theme isn't available. Pick another one.\"],\"pvnfJD\":[\"Dark\"],\"q+hNag\":[\"Collection\"],\"qdcESc\":[\"Create a new repository\"],\"r5EW6f\":[\"This repository is already backing up another Jant site (\",[\"host\"],\"). Pick a different repository.\"],\"rEspiY\":[\"Navigation placement updated.\"],\"rFmBG3\":[\"Color theme\"],\"rlonmB\":[\"Couldn't delete. Try again in a moment.\"],\"satWc6\":[\"Main RSS feed\"],\"sgr2wQ\":[\"collection\"],\"soRdOu\":[\"Off-white paper with a deep forest-green accent.\"],\"sqxcaY\":[\"Created \",[\"date\"]],\"sxkWRg\":[\"Advanced\"],\"t/YqKh\":[\"Remove\"],\"t3hvHq\":[\"Sync Now\"],\"tJ4H0O\":[\"your Telegram account\"],\"tfDRzk\":[\"Save\"],\"tvgAq5\":[\"No accounts authorized yet\"],\"u1VTd3\":[\"Palette, surface tone, and overall mood\"],\"u3wRF+\":[\"Published\"],\"u6KOjV\":[\"Want more control?\"],\"udPwLB\":[\"Header\"],\"ui6aMF\":[\"These devices are currently signed in to your account. Revoke any session you don't recognize.\"],\"vBEKwo\":[\"Manage this site's active sessions here. Password and hosted access are managed through \",[\"providerLabel\"],\".\"],\"vRldcl\":[\"Typography choices and reading texture\"],\"vSYKYI\":[\"Main feed\"],\"vTuib7\":[\"This controls what /feed returns.\"],\"vmQmHx\":[\"Add custom CSS to override any styles. Use data attributes like [data-page], [data-post], [data-format] to target specific elements.\"],\"vzX5FB\":[\"Delete Account\"],\"w8Rv8T\":[\"Label is required\"],\"wL3cK8\":[\"Latest\"],\"wW6NCp\":[\"Last error\"],\"wc+17X\":[\"/* Your custom CSS here */\"],\"wuLtXn\":[\"No active sessions right now. Signed-in devices show up here.\"],\"xCWek4\":[\"File storage isn't set up. Check your server config.\"],\"xHt036\":[\"Personal Access Token\"],\"xKeZ0l\":[\"An earthier, warmer tone.\"],\"xYbozN\":[\"Soft ivory\"],\"xqViCq\":[\"Warm ivory\"],\"xxaahd\":[\"When you want a cooler, sharper look.\"],\"y28hnO\":[\"Post\"],\"y8Md/V\":[\"Language and time updated.\"],\"yNCqOt\":[\"Latest feed\"],\"yQ3kNF\":[\"Type the following phrase to confirm:\"],\"ydq1k2\":[\"Pick an account first\"],\"yjjCV8\":[\"Fixed feed URLs\"],\"yjkELF\":[\"Confirm New Password\"],\"yzF66j\":[\"Link\"],\"z6wakA\":[\"A short intro shown on your home page.\"],\"zEizrk\":[\"Last used \",[\"date\"]],\"zSURJW\":[\"No repositories match.\"],\"zXH2jX\":[\"Language & Time\"],\"zlcDd2\":[\"Delete this custom URL? Visitors using it won't be redirected anymore.\"],\"zwBp5t\":[\"Private\"],\"zxRN6H\":[\"Header links, home feed, and overflow menu\"]}");
|
|
1919
|
+
var messages$2 = JSON.parse("{\"++YsxG\":[\"Readers and search engines see\"],\"+4Z6iP\":[\"Create the repository on GitHub first — it can be empty.\"],\"+9JI/F\":[\"Connecting will sync your site onto \",[\"repo\"],\"'s default branch on top of its existing history. Existing files outside Jant's managed paths are kept. This can't be undone.\"],\"+AXdXp\":[\"Label and URL are required\"],\"+K0AvT\":[\"Disconnect\"],\"+wgt7C\":[\"Muted red-brown background, earthy and warm.\"],\"+zy2Nq\":[\"Type\"],\"/3H2/s\":[\"This hosted site signs in through \",[\"providerLabel\"],\". Manage password and hosted access there.\"],\"/PXXBT\":[\"Nearly white, with a touch of warmth.\"],\"/zOUxl\":[\"QR code linking to the Telegram bot\"],\"0OGSSc\":[\"Avatar display updated.\"],\"0UzCUX\":[\"Update the password you use to sign in\"],\"0bdA9b\":[\"Open Telegram to connect\"],\"0gECZD\":[\"Want to write a fuller introduction?\"],\"0uIjy/\":[\"Light sage-green with a matching green accent.\"],\"10UtuM\":[\"CJK Font\"],\"1F6Mzc\":[\"No navigation items yet. Add links or enable system items below.\"],\"1H7gng\":[\"Dashboard language\"],\"1mbBbL\":[\"Connect manually\"],\"1njn7W\":[\"Light\"],\"1qGdnL\":[\"The default. Calm and easy for long reading.\"],\"2DoBvq\":[\"Feeds\"],\"2FYpfJ\":[\"More\"],\"2Ithfh\":[\"Message the bot any text and it's published as a note.\"],\"2PTjMB\":[\"I want to delete \",[\"siteName\"]],\"2cFU6q\":[\"Site Footer\"],\"2fPEPI\":[\"A calm, cool backdrop.\"],\"2lkk2l\":[\"Yellow-tinted paper with an olive-green accent.\"],\"2oWZo7\":[\"Last commit\"],\"2uuy4H\":[\"Connected via Personal Access Token\"],\"2wK4BX\":[\"Edit About page\"],\"35x8eZ\":[\"Showing \",[\"shown\"],\" of \",[\"total\"]],\"39QGku\":[\"Open the bot and send the binding code, then anything you message it becomes a note.\"],\"3Cw1AI\":[\"Add Collection\"],\"3VrybB\":[\"Redirect\"],\"3Yvsaz\":[\"302 (Temporary)\"],\"3n0zbB\":[\"Session management is off in demo mode. Use the shared demo session instead.\"],\"3sYJi5\":[\"Download a Hugo-compatible archive — host it statically or move to another Jant.\"],\"3wKq0C\":[\"Couldn't save. Try again in a moment.\"],\"49Bsal\":[\"Feed settings updated.\"],\"4Jge8E\":[\"Active Sessions\"],\"4KIa+q\":[\"Export downloaded.\"],\"4cEClj\":[\"Sessions\"],\"4yyXWu\":[\"Pale bone-white with a muted green accent.\"],\"4zGJ5E\":[\"Delete Account Permanently\"],\"5QlUIt\":[\"Empty repository. Ready to connect.\"],\"5VQnR3\":[\"Use these when you want a feed URL that never changes.\"],\"5dpcN1\":[\"type to search all\"],\"5f1Wo9\":[\"Connected as \",[\"account\"]],\"5o8R81\":[\"Very light ivory with a faint tea-green accent.\"],\"6ArdBh\":[\"Uses featured posts for /feed.\"],\"6DjeBT\":[\"Demo sites always stay hidden from search engines.\"],\"6E3aK4\":[\"Manage Hosting\"],\"6FFB7q\":[\"Uses the latest public posts for /feed.\"],\"6K1Vef\":[\"Delete this blog permanently? This cannot be undone.\"],\"6NpNLc\":[\"This repository has existing content.\"],\"6V3Ea3\":[\"Copied\"],\"6WdDG7\":[\"Page\"],\"71WIgc\":[\"Get a new code\"],\"746NHh\":[\"this blog\"],\"7811AW\":[\"This repository is already backing up this site.\"],\"7FCZPo\":[\"Content language\"],\"7FaY4u\":[\"Usage\"],\"7G9YLi\":[\"Allow search engines to index my site\"],\"7GISOt\":[\"Save bot token\"],\"7MZxzw\":[\"Password changed.\"],\"7vhWI8\":[\"New Password\"],\"81nFIS\":[\"Passwords don't match. Make sure both fields are identical.\"],\"87a/t/\":[\"Label\"],\"89Upyo\":[\"That theme isn't available. Pick another one.\"],\"8BfEpW\":[\"Hosted account\"],\"8N/Mcp\":[\"Archive filter parameters (e.g. format=note&view=list)\"],\"8T46pB\":[\"Bot token\"],\"8U2Z7f\":[\"New Custom URL\"],\"8ZsakT\":[\"Password\"],\"8gEghq\":[\"Bright warm-white with a moss-green accent.\"],\"9+vGLh\":[\"Custom CSS\"],\"9As8Nu\":[\"Create one on GitHub\"],\"9EjI4j\":[\"Warm sand\"],\"9J6wUO\":[\"Suggested links\"],\"9Lsvt5\":[\"Signed in \",[\"date\"]],\"9T7Cwm\":[\"Redirects, vanity paths, and URL control\"],\"9aUyym\":[\"See where you're signed in and revoke old sessions\"],\"A1taO8\":[\"Search\"],\"AeXO77\":[\"Account\"],\"AnY+O9\":[\"Show \\\"Build with Jant\\\" at the bottom of the home page\"],\"ApZDMk\":[\"This is used for your favicon and apple-touch-icon. For best results, upload a square PNG with a solid background at least 512x512 pixels.\"],\"B495Gs\":[\"Archive\"],\"B4ESok\":[\"API reference\"],\"BTYdze\":[\"Link added to navigation.\"],\"BzEFor\":[\"or\"],\"CDAdlf\":[\"Remove bot\"],\"CTAEes\":[\"Select a repository\"],\"CjZZgz\":[\"This repository already has commits\"],\"D8k2s6\":[\"Connect Telegram\"],\"DCKkhU\":[\"Current Password\"],\"DKKKeF\":[\"Manage password and hosted access in \",[\"providerLabel\"]],\"DVFXa6\":[\"The cleanest, most neutral option.\"],\"EO3I6h\":[\"Upload didn't go through. Try again in a moment.\"],\"Eax/et\":[\"Accent\"],\"Enslfm\":[\"Destination\"],\"F53UDu\":[\"Cool white\"],\"F7FKwe\":[\"Anything you paste here has full access to your visitors' browsers. Only use code from sources you trust.\"],\"F8SNqr\":[\"Warm orange\"],\"FMUJSP\":[\"Account & Data\"],\"Fk3SSD\":[\"Calm and natural, easy on the eyes.\"],\"FkMol5\":[\"Featured\"],\"G/1oP+\":[\"Remove the webhook and stop syncing. Your repository content will not be deleted.\"],\"G0qJsQ\":[\"Security token missing. Refresh the page and try again.\"],\"G39wnK\":[\"Back up and sync content with a GitHub repository\"],\"GMMWcy\":[\"Name, metadata, language, and search defaults\"],\"GXsAby\":[\"Revoke\"],\"GxkJXS\":[\"Uploading...\"],\"GzKzUa\":[\"Demo limits\"],\"H4x7Sk\":[\"The language this admin dashboard shows in. Available in English, 简体中文, and 繁體中文.\"],\"HCNlq3\":[\"Clean and high-contrast, close to white.\"],\"HHDyGw\":[\"Soft green\"],\"HKH+W+\":[\"Data\"],\"Hp1l6f\":[\"Current\"],\"HxlY7t\":[\"Changing this updates what subscribers get from /feed.\"],\"HxuOlm\":[\"Site Header\"],\"I4HRxU\":[\"Every published post, including ones hidden from Latest.\"],\"I6gXOa\":[\"Path\"],\"I76CzF\":[\"Neutral gray\"],\"ID38tA\":[\"Account deletion is off in demo mode. The shared demo resets separately.\"],\"IF9tPu\":[\"When to use site export, database backups, and recovery drills.\"],\"IW5PBo\":[\"Copy Token\"],\"IagCbF\":[\"URL\"],\"IfB3m6\":[\"The language your posts are written in. Announced to readers and search engines through HTML lang and your RSS feed. Any BCP 47 tag works.\"],\"IreQBq\":[\"Repository\"],\"J6bLeg\":[\"Add a custom link to any URL\"],\"JL7LF5\":[\"available CSS variables, data attributes, and examples.\"],\"JcD7qf\":[\"More actions\"],\"JjX0OO\":[\"Copy your token now — it won't be shown again.\"],\"JrFTcr\":[\"Connecting…\"],\"JuN5GC\":[\"No file selected. Choose a file to upload.\"],\"KDw4GX\":[\"Try again\"],\"KSgo21\":[\"Pick a repository\"],\"KVVYBh\":[\"Add collection to navigation\"],\"KiJn9B\":[\"Note\"],\"KwOLJF\":[\"The original Jant palette, and a solid everyday pick.\"],\"L3DEwT\":[\"Remove this avatar? Your favicon and header icon will go back to the default.\"],\"L4t4/q\":[\"March 14\"],\"LdyooL\":[\"link\"],\"LjwaJ/\":[\"Sign-in, export, and deletion\"],\"M/D8PK\":[\"+ Install on another account\"],\"M/haSd\":[\"Always show the light version of the theme.\"],\"M2kIWU\":[\"Font theme\"],\"M6CbAU\":[\"Toggle edit panel\"],\"MaYYE6\":[\"Post notes by messaging a Telegram bot\"],\"Me5t5H\":[\"Connect a GitHub repository to automatically back up your posts as Markdown files. Edits on GitHub sync back to your site.\"],\"Mr4QPw\":[\"Disconnect Telegram? You can reconnect any time with a new binding code.\"],\"MtENL9\":[\"Tune how your site looks, reads, and runs.\"],\"N/8NPV\":[\"Before deleting, download a site export. You won't be able to recover this account after deletion.\"],\"N7UNHY\":[\"Featured feed\"],\"NHnUHF\":[\"Favicon and the profile mark in your header\"],\"NU2Fqi\":[\"Save CSS\"],\"NVjhde\":[\"Warm parchment\"],\"Nldjdr\":[\"No custom URLs yet. Create one to add redirects or custom paths for posts.\"],\"O7rgs6\":[\"Header RSS points to your \",[\"feed\"],\" feed (/feed). Change what /feed returns in General.\"],\"OSJXFg\":[\"Applies to your entire site, including admin pages. Pick a palette, then choose whether it follows the system or stays fixed.\"],\"Ox3+3h\":[\"No matches.\"],\"PEUV5I\":[\"Code injection updated.\"],\"PHh52z\":[\"Warm and rich, with strong brown tones.\"],\"PXj9lw\":[\"Stop accepting posts from Telegram. Your existing notes stay published.\"],\"PZ7HJ8\":[\"Blog Avatar\"],\"Pwqkdw\":[\"Loading…\"],\"PxJ9W6\":[\"Generate Token\"],\"Q/6Y+2\":[\"Needs Contents (read/write) and Webhooks (read/write) on the target repository.\"],\"Q30z/l\":[\"Remove this collection from navigation? The collection itself won't be deleted.\"],\"Q99OtV\":[\"Pin a collection to your navigation bar. An asterisk (*) appears next to collections updated in the last 48 hours.\"],\"QCwsv1\":[\"Warm off-white\"],\"QKvrmL\":[\"Warm-neutral and easy for long reading.\"],\"QZmz0H\":[\"Built-in links\"],\"Qnrzvb\":[\"Active Tokens\"],\"R6Z4LE\":[\"Download failed. Please try again.\"],\"R9Khdg\":[\"Auto\"],\"RcdDOS\":[\"Create a bot by messaging @BotFather on Telegram, then paste the token it gives you.\"],\"RdVIcf\":[\"Cream and coffee brown\"],\"RxsRD6\":[\"Time Zone\"],\"SJmfuf\":[\"Site Name\"],\"SKZhW9\":[\"Token name\"],\"SVQQPe\":[\"Couldn't connect. Check the error and try again.\"],\"SchpMp\":[\"Telegram\"],\"SrGs4T\":[\"Light blue-gray background, cool and even.\"],\"TpF3v+\":[\"Injected before </head>. Use for analytics, custom meta tags, and styles that must load early.\"],\"Tu6bMZ\":[\"Create About page\"],\"Tz0i8g\":[\"Settings\"],\"UFK415\":[\"Site-wide HTML for analytics and widgets\"],\"UTvFQq\":[\"Open \",[\"linkOpen\"],\"@\",[\"botUsername\"],[\"linkClose\"],\" and send:\"],\"Uj/btJ\":[\"Display avatar in my site header\"],\"UsODUn\":[\"Select an account\"],\"UxKoFf\":[\"Navigation\"],\"V+bhUy\":[\"Install GitHub App\"],\"V4WsyL\":[\"Add Link\"],\"V5pZwT\":[\"Search settings updated.\"],\"VXUPla\":[\"Connect with GitHub App\"],\"VhMDMg\":[\"Change Password\"],\"Vn3jYy\":[\"Navigation items\"],\"VoZYGU\":[\"This will permanently delete all your data — posts, media, collections, settings, and your account. Your blog will be reset to its initial setup state. This cannot be undone.\"],\"WUnFK2\":[\"Pale cool-white with deep indigo text. High contrast.\"],\"Wa9q4P\":[\"Pure white\"],\"Wb7EHo\":[\"About page\"],\"Weq9zb\":[\"General\"],\"Wi9i06\":[\"Follow each visitor's system preference.\"],\"Wx1M8N\":[\"Install the GitHub App to grant access without managing personal tokens. Permissions are scoped per repository and revocable from GitHub.\"],\"X+8FMk\":[\"Current password doesn't match. Try again.\"],\"X1G9eY\":[\"Navigation Preview\"],\"X2Cbc2\":[\"Archive feed\"],\"X9Hujr\":[\"Manual Push\"],\"XtBJV8\":[\"Checking repository…\"],\"Xtc16w\":[\"Refresh repository list\"],\"Y/F35r\":[\"Create a post with curl:\"],\"Y/N5N7\":[\"Soft cream background with a muted green accent.\"],\"YF6zHf\":[\"Site settings updated.\"],\"YdG2RF\":[\"Export Site\"],\"YkgZi7\":[\"Connect a Telegram bot, then anything you message it gets published as a note.\"],\"YwhjRx\":[\"Manage Account\"],\"Yxp859\":[\"Warm cream\"],\"ZDY7Fy\":[\"Syncing…\"],\"ZQKLI1\":[\"Danger Zone\"],\"ZS/CBL\":[\"Delete this navigation link? Visitors won't see it in your site header anymore.\"],\"ZgZX+d\":[\"Pure white with neutral grays. No color tint.\"],\"ZhhOwV\":[\"Quote\"],\"ZiooJI\":[\"API Tokens\"],\"Zm7Qb0\":[\"Backup & Restore Guide\"],\"ZmUkwN\":[\"Add custom link to navigation\"],\"a14mj8\":[\"Unknown device\"],\"a1iEgy\":[\"Warm cream background with deep coffee-brown accents.\"],\"a3LDKx\":[\"Security\"],\"aAIQg2\":[\"Appearance\"],\"aFkzVF\":[\"The slug of the target post or collection\"],\"alKG0+\":[\"Font Theme\"],\"anibOb\":[\"About this blog\"],\"any7NR\":[\"Theming guide\"],\"b+/jO6\":[\"301 (Permanent)\"],\"bHOiy1\":[\"Password changes are off in demo mode. Sign in with the shared demo credentials.\"],\"bHYIks\":[\"Sign Out\"],\"bV2vng\":[\"Warm terracotta\"],\"bbR5vW\":[\"This palette\"],\"bbzY7X\":[\"Manage sign-in security, site exports, and irreversible actions.\"],\"bmrL08\":[\"Demo mode hides sessions, password changes, and account deletion. Export still works.\"],\"bviiKV\":[\"Headings, body text, and links in this theme.\"],\"c3MN2z\":[\"all available endpoints and request formats.\"],\"cS7/bk\":[\"Remove the saved bot token? Its webhook is deleted and any connected account is disconnected.\"],\"cSDy01\":[\"Custom CSS updated.\"],\"clzoNp\":[\"Always show the dark version of the theme.\"],\"cnGeoo\":[\"Delete\"],\"d3FRkY\":[\"Could not copy. Try again.\"],\"d5oGUo\":[\"Create a new repository on GitHub\"],\"dEgA5A\":[\"Cancel\"],\"dTXUY+\":[\"Confirm account deletion\"],\"dYKrp3\":[\"Hidden from Latest\"],\"dk7TCH\":[\"Permanently delete all data and reset the blog\"],\"drodVV\":[\"No collections yet. Create one first, then add it to your navigation.\"],\"dsWkIw\":[\"Disconnect from GitHub? The webhook will be removed. Your repository content will not be deleted.\"],\"e/tSI5\":[\"Navigation order updated.\"],\"eOL7vn\":[\"Minimal color, low distraction.\"],\"ePK91l\":[\"Edit\"],\"ebQKK7\":[\"Site\"],\"egK+Yy\":[\"Bearer tokens for scripts and automation\"],\"ehj/zN\":[\"Redirect Type\"],\"eneWvv\":[\"Draft\"],\"erTMh7\":[\"Last synced\"],\"f+m8jj\":[\"Feed URL copied.\"],\"f8fH8W\":[\"Design\"],\"fKRAwQ\":[\"Sandy background with a green accent.\"],\"fWYqkz\":[\"Code Injection\"],\"fYXQnC\":[\"Cozy and bold among the warm tones.\"],\"gOWiTY\":[\"Load a serif font optimized for Chinese, Japanese, or Korean content.\"],\"gZ5owP\":[\"Search repositories\"],\"gbqbh6\":[\"Safe to leave this page — syncing continues in the background.\"],\"gkFvVN\":[\"Injected before </body>. Use for chat widgets and scripts that should not block page load.\"],\"gtQsRO\":[\"Create Custom URL\"],\"hBO/y4\":[\"Security token expired. Refresh the page and try again.\"],\"hGmyDl\":[\"Tokens let you access the API from scripts, shortcuts, and other tools without signing in.\"],\"hIHkRy\":[\"Connected via GitHub App\"],\"hdSi1b\":[\"Type \",[\"repo\"],\" to confirm\"],\"he3ygx\":[\"Copy\"],\"i0qMbr\":[\"Home\"],\"iEUzMn\":[\"system\"],\"iSLIjg\":[\"Connect\"],\"iVOMRi\":[\"Home settings updated.\"],\"icB4Cv\":[\"Drag links here to show them under the More menu\"],\"id3vuh\":[\"Telegram is set up, but the bot couldn't be reached. Check the bot token and try again.\"],\"ihn4zD\":[\"Search…\"],\"iiDXZc\":[\"Displayed at the bottom of all posts and pages.\"],\"itS31B\":[\"A warmer look, like slightly aged paper.\"],\"iwQZvS\":[\"Cool blue-gray\"],\"j4VrG6\":[\"Download Export ZIP\"],\"j5nQL2\":[\"e.g. iOS Shortcuts\"],\"jUV7CU\":[\"Upload Avatar\"],\"jVUmOK\":[\"Markdown supported\"],\"jdVYS8\":[\"Pick the one that fits your writing.\"],\"jgBjXJ\":[\"Revoke this token? Any scripts using it will stop working.\"],\"jpctdh\":[\"View\"],\"k1ifdL\":[\"Processing...\"],\"kLw03Y\":[\"Bright paper white\"],\"kMXclu\":[\"Download a site export\"],\"kNiQp6\":[\"Pinned\"],\"kRhzWq\":[\"GitHub Sync\"],\"kVQs7s\":[\"Fine-grained styling overrides\"],\"ke1gWS\":[\"Custom URLs\"],\"kfcRb0\":[\"Avatar\"],\"kxDZ2i\":[\"This code runs on every page of your site.\"],\"l2Op2p\":[\"Query Parameters\"],\"lLW3vJ\":[\"Target Slug\"],\"lV04bQ\":[\"Warm and earthy, but still light.\"],\"lYHJih\":[\"Revoke this session? That device will need to sign in again.\"],\"m16xKo\":[\"Add\"],\"mLOk1i\":[\"Push all posts to GitHub right now instead of waiting for the next automatic sync.\"],\"mSNmrX\":[\"List posts:\"],\"n8+EXe\":[\"Add common destinations that already exist on your site.\"],\"nG2qTk\":[\"Example link\"],\"nK07ni\":[\"Choose a typographic direction for your site. Each theme changes both the font pairing and the reading rhythm.\"],\"nbfdhU\":[\"Integrations\"],\"ntJYyh\":[\"Domains, plan, and billing in \",[\"providerLabel\"]],\"o/vNDE\":[\"lets you override any theme variable.\"],\"oGC9uP\":[\"owner/repo\"],\"oH2JHg\":[\"We'll prefill the name \",[\"name\"],\". The list refreshes on return.\"],\"oKOOsY\":[\"Color Theme\"],\"oL535e\":[\"Not synced yet\"],\"oNA4If\":[\"All collections are already in your navigation.\"],\"oUn9Z7\":[\"Near-neutral light gray with a steel-blue accent.\"],\"ofdy2l\":[\"Orange-tinted background. The warmest palette.\"],\"pZq3aX\":[\"Upload failed. Please try again.\"],\"pgTIrt\":[\"Choose the GitHub account and repository to sync with this site.\"],\"psoxDF\":[\"That font theme isn't available. Pick another one.\"],\"pt4OhQ\":[\"/about is already used. Rename that item before creating an About page.\"],\"pvnfJD\":[\"Dark\"],\"q+hNag\":[\"Collection\"],\"qdcESc\":[\"Create a new repository\"],\"r5EW6f\":[\"This repository is already backing up another Jant site (\",[\"host\"],\"). Pick a different repository.\"],\"rEspiY\":[\"Navigation placement updated.\"],\"rFmBG3\":[\"Color theme\"],\"rlonmB\":[\"Couldn't delete. Try again in a moment.\"],\"satWc6\":[\"Main RSS feed\"],\"sgr2wQ\":[\"collection\"],\"soRdOu\":[\"Off-white paper with a deep forest-green accent.\"],\"sqxcaY\":[\"Created \",[\"date\"]],\"sxkWRg\":[\"Advanced\"],\"t/YqKh\":[\"Remove\"],\"t3hvHq\":[\"Sync Now\"],\"tJ4H0O\":[\"your Telegram account\"],\"tfDRzk\":[\"Save\"],\"tvgAq5\":[\"No accounts authorized yet\"],\"u1VTd3\":[\"Palette, surface tone, and overall mood\"],\"u3wRF+\":[\"Published\"],\"u6KOjV\":[\"Want more control?\"],\"udPwLB\":[\"Header\"],\"ui6aMF\":[\"These devices are currently signed in to your account. Revoke any session you don't recognize.\"],\"vBEKwo\":[\"Manage this site's active sessions here. Password and hosted access are managed through \",[\"providerLabel\"],\".\"],\"vOnuOa\":[\"Show or hide built-in destinations in the header and More menu.\"],\"vRldcl\":[\"Typography choices and reading texture\"],\"vSYKYI\":[\"Main feed\"],\"vTuib7\":[\"This controls what /feed returns.\"],\"vmQmHx\":[\"Add custom CSS to override any styles. Use data attributes like [data-page], [data-post], [data-format] to target specific elements.\"],\"vzX5FB\":[\"Delete Account\"],\"w8Rv8T\":[\"Label is required\"],\"wL3cK8\":[\"Latest\"],\"wW6NCp\":[\"Last error\"],\"wc+17X\":[\"/* Your custom CSS here */\"],\"wuLtXn\":[\"No active sessions right now. Signed-in devices show up here.\"],\"xCWek4\":[\"File storage isn't set up. Check your server config.\"],\"xHt036\":[\"Personal Access Token\"],\"xKeZ0l\":[\"An earthier, warmer tone.\"],\"xYbozN\":[\"Soft ivory\"],\"xqViCq\":[\"Warm ivory\"],\"xxaahd\":[\"When you want a cooler, sharper look.\"],\"y/awtV\":[\"Header links, built-in destinations, and overflow menu\"],\"y28hnO\":[\"Post\"],\"y8Md/V\":[\"Language and time updated.\"],\"yNCqOt\":[\"Latest feed\"],\"yQ3kNF\":[\"Type the following phrase to confirm:\"],\"ydq1k2\":[\"Pick an account first\"],\"yjjCV8\":[\"Fixed feed URLs\"],\"yjkELF\":[\"Confirm New Password\"],\"yzF66j\":[\"Link\"],\"z6wakA\":[\"A short intro shown on your home page.\"],\"zEizrk\":[\"Last used \",[\"date\"]],\"zSURJW\":[\"No repositories match.\"],\"zXH2jX\":[\"Language & Time\"],\"zlcDd2\":[\"Delete this custom URL? Visitors using it won't be redirected anymore.\"],\"zwBp5t\":[\"Private\"]}");
|
|
1920
1920
|
//#endregion
|
|
1921
1921
|
//#region src/i18n/locales/settings/zh-Hans.ts
|
|
1922
|
-
var messages$1 = JSON.parse("{\"++YsxG\":[\"读者和搜索引擎看到的是\"],\"+4Z6iP\":[\"请先在 GitHub 上创建仓库 — 可以为空。\"],\"+9JI/F\":[\"连接后会将你的网站同步到 \",[\"repo\"],\" 的默认分支,并追加到其现有历史之上。Jant 管理路径之外的现有文件会被保留。此操作无法撤销。\"],\"+AXdXp\":[\"标签和 URL 为必填项\"],\"+K0AvT\":[\"断开连接\"],\"+wgt7C\":[\"低饱和的红棕底,温暖、有泥土感。\"],\"+zy2Nq\":[\"类型\"],\"/3H2/s\":[\"此托管站点通过 \",[\"providerLabel\"],\" 登录。请在那里管理密码和托管访问权限。\"],\"/JnyjR\":[\"切换内置导航项。它们的顺序决定页眉显示的内容以及首页显示哪个视图。\"],\"/PXXBT\":[\"近乎纯白,带一点暖意。\"],\"/zOUxl\":[\"链接到 Telegram 机器人的二维码\"],\"0OGSSc\":[\"头像显示已更新.\"],\"0UzCUX\":[\"更新您用于登录的密码\"],\"0bdA9b\":[\"打开 Telegram 以连接\"],\"0uIjy/\":[\"浅鼠尾草绿底,配同色系的绿。\"],\"10UtuM\":[\"CJK 字体\"],\"1F6Mzc\":[\"当前还没有导航项目。添加链接或在下方启用系统项目。\"],\"1H7gng\":[\"后台语言\"],\"1mbBbL\":[\"手动绑定\"],\"1njn7W\":[\"浅色\"],\"1qGdnL\":[\"默认主题。沉静,适合长时间阅读。\"],\"2B7t+s\":[\"会话与密码\"],\"2DoBvq\":[\"订阅源\"],\"2FYpfJ\":[\"更多\"],\"2Ithfh\":[\"向机器人发送任意文本,它会作为笔记已发布。\"],\"2PTjMB\":[\"我想删除 \",[\"siteName\"]],\"2cFU6q\":[\"网站页脚\"],\"2fPEPI\":[\"沉静、偏冷的底色。\"],\"2lkk2l\":[\"微黄的纸底,配橄榄绿。\"],\"2oWZo7\":[\"最近一次提交\"],\"2uuy4H\":[\"通过个人访问令牌连接\"],\"35x8eZ\":[\"显示 \",[\"shown\"],\" 共 \",[\"total\"]],\"39QGku\":[\"打开机器人并发送绑定码, 然后你发送给它的任何消息都会变成一条笔记。\"],\"3Cw1AI\":[\"添加合集\"],\"3VrybB\":[\"重定向\"],\"3Yvsaz\":[\"302 (临时)\"],\"3n0zbB\":[\"会话管理在演示模式下已关闭。请使用共享的演示会话。\"],\"3sYJi5\":[\"下载一个与 Hugo 兼容的归档 — 将其静态托管或迁移到另一个 Jant。\"],\"3wKq0C\":[\"保存失败。请稍后再试。\"],\"49Bsal\":[\"订阅源设置已更新。\"],\"4Jge8E\":[\"活动会话\"],\"4KIa+q\":[\"导出文件已下载.\"],\"4cEClj\":[\"会话\"],\"4yyXWu\":[\"浅骨白底,配低饱和的绿。\"],\"4zGJ5E\":[\"永久删除账号\"],\"5QlUIt\":[\"仓库为空。准备连接。\"],\"5VQnR3\":[\"当你想要一个永远不变的订阅源 URL 时使用它们。\"],\"5dpcN1\":[\"输入以搜索全部\"],\"5f1Wo9\":[\"已连接为 \",[\"account\"]],\"5o8R81\":[\"极浅的象牙底,配淡淡的茶绿。\"],\"6ArdBh\":[\"将精选文章用于 /feed。\"],\"6DjeBT\":[\"演示站点始终对搜索引擎隐藏。\"],\"6E3aK4\":[\"管理托管\"],\"6FFB7q\":[\"为 /feed 使用最新的公开帖子。\"],\"6K1Vef\":[\"永久删除此博客?此操作不可撤销。\"],\"6NpNLc\":[\"此仓库已有内容。\"],\"6V3Ea3\":[\"已复制\"],\"71WIgc\":[\"获取新绑定码\"],\"746NHh\":[\"此博客\"],\"7811AW\":[\"此仓库已在备份此站点。\"],\"7FCZPo\":[\"内容语言\"],\"7FaY4u\":[\"用法\"],\"7G9YLi\":[\"允许搜索引擎索引我的网站\"],\"7GISOt\":[\"保存机器人令牌\"],\"7MZxzw\":[\"密码已更改.\"],\"7vhWI8\":[\"新密码\"],\"81nFIS\":[\"密码不匹配。请确保两个字段相同。\"],\"87a/t/\":[\"标签\"],\"89Upyo\":[\"该主题不可用。请选择其他主题。\"],\"8BfEpW\":[\"托管账户\"],\"8N/Mcp\":[\"归档 筛选参数 (例如 format=笔记&view=list)\"],\"8T46pB\":[\"机器人令牌\"],\"8U2Z7f\":[\"新建自定义 URL\"],\"8ZsakT\":[\"密码\"],\"8gEghq\":[\"明亮的暖白底,配苔绿点缀。\"],\"9+vGLh\":[\"自定义 CSS\"],\"9As8Nu\":[\"在 GitHub 上创建一个\"],\"9EjI4j\":[\"暖沙色\"],\"9Lsvt5\":[\"于 \",[\"date\"],\" 登录\"],\"9T7Cwm\":[\"重定向、个性化路径和 URL 控制\"],\"9aUyym\":[\"查看你的登录位置并撤销旧会话\"],\"A1taO8\":[\"搜索\"],\"AeXO77\":[\"账户\"],\"AnY+O9\":[\"在主页底部显示 \\\"Build with Jant\\\"\"],\"ApZDMk\":[\"此图用于您的 favicon 和 apple-touch-icon。为获得最佳效果,请上传至少 512×512 像素、纯色背景的方形 PNG。\"],\"B495Gs\":[\"归档\"],\"B4ESok\":[\"API 参考\"],\"BzEFor\":[\"或\"],\"CDAdlf\":[\"移除机器人\"],\"CTAEes\":[\"选择仓库\"],\"CjZZgz\":[\"该仓库已有提交\"],\"D8k2s6\":[\"连接 Telegram\"],\"DCKkhU\":[\"当前密码\"],\"DKKKeF\":[\"在 \",[\"providerLabel\"],\" 管理密码和托管访问\"],\"DVFXa6\":[\"最干净、最中性的一档。\"],\"EO3I6h\":[\"上传未成功。请稍后再试。\"],\"Eax/et\":[\"强调色\"],\"Enslfm\":[\"目标地址\"],\"F53UDu\":[\"冷白\"],\"F7FKwe\":[\"你在此处粘贴的任何内容都将完全访问访客的浏览器。仅使用来自你信任的来源的代码。\"],\"F8SNqr\":[\"暖橘\"],\"Fk3SSD\":[\"平静自然,看着舒服。\"],\"FkMol5\":[\"精选\"],\"G/1oP+\":[\"移除 webhook 并停止同步。您的仓库内容不会被删除。\"],\"G0qJsQ\":[\"缺少安全令牌。刷新页面后重试。\"],\"G39wnK\":[\"将内容备份并与 GitHub 仓库同步\"],\"GMMWcy\":[\"名称、元数据、语言和搜索默认设置\"],\"GXsAby\":[\"撤销\"],\"GxkJXS\":[\"正在上传...\"],\"GzKzUa\":[\"演示限制\"],\"H4x7Sk\":[\"后台界面显示的语言。可选 English、简体中文 和 繁體中文。\"],\"HCNlq3\":[\"干净、高对比,接近纯白。\"],\"HHDyGw\":[\"柔绿\"],\"HKH+W+\":[\"数据\"],\"Hp1l6f\":[\"当前\"],\"HxlY7t\":[\"更改此项会更新订阅者从 /feed 获取的内容。\"],\"HxuOlm\":[\"网站头部\"],\"I4HRxU\":[\"已发布的全部帖子,包括从 Latest 中隐藏的那些。\"],\"I6gXOa\":[\"路径\"],\"I76CzF\":[\"中性灰\"],\"ID38tA\":[\"演示模式下已禁用账号删除。共享演示会单独重置。\"],\"IF9tPu\":[\"何时使用站点导出、数据库备份和恢复演练。\"],\"IW5PBo\":[\"复制令牌\"],\"IagCbF\":[\"网址\"],\"IfB3m6\":[\"你撰写内容所用的语言。通过 HTML lang 和 RSS 向读者与搜索引擎声明。支持任意 BCP 47 标签。\"],\"IreQBq\":[\"仓库\"],\"J6bLeg\":[\"向任意 URL 添加自定义链接\"],\"JL7LF5\":[\"可用的 CSS 变量, 数据属性, 和 示例.\"],\"JTviaO\":[\"管理登录安全、导出和不可逆操作.\"],\"JcD7qf\":[\"更多操作\"],\"JjX0OO\":[\"现在复制您的令牌 — 它不会再次显示。\"],\"JrFTcr\":[\"连接中…\"],\"JuN5GC\":[\"未选择文件。请选择要上传的文件。\"],\"KDw4GX\":[\"重试\"],\"KSgo21\":[\"选择仓库\"],\"KVVYBh\":[\"向导航添加合集\"],\"KiJn9B\":[\"笔记\"],\"KwOLJF\":[\"Jant 最初的配色,日常稳妥之选。\"],\"L3DEwT\":[\"移除此头像?您的网站图标和页眉图标将恢复为默认设置。\"],\"L4t4/q\":[\"3月14日\"],\"LdyooL\":[\"链接\"],\"M/D8PK\":[\"+ 在其他帐户上安装\"],\"M/haSd\":[\"始终显示浅色主题。\"],\"M2kIWU\":[\"字体主题\"],\"M6CbAU\":[\"切换编辑面板\"],\"MaYYE6\":[\"通过向 Telegram 机器人发送消息来发布笔记\"],\"Me5t5H\":[\"将 GitHub 仓库连接以自动将您的文章备份为 Markdown 文件。您在 GitHub 上的编辑会同步回您的网站。\"],\"Mr4QPw\":[\"断开 Telegram?您可以随时使用新的绑定码重新连接。\"],\"MtENL9\":[\"调整你的网站的外观、阅读体验和运行方式。\"],\"N/8NPV\":[\"在删除之前,请下载站点导出。删除后将无法恢复此账户。\"],\"N7UNHY\":[\"精选订阅源\"],\"NHnUHF\":[\"Favicon 和页眉中的个人标识\"],\"NU2Fqi\":[\"保存 CSS\"],\"NVjhde\":[\"暖羊皮纸\"],\"Nldjdr\":[\"尚无自定义 URL。创建一个以便为文章添加重定向或自定义路径。\"],\"O7rgs6\":[\"页眉 RSS 指向你的 \",[\"feed\"],\" 源 (/feed)。在 常规 中更改 /feed 返回的内容。\"],\"OSJXFg\":[\"应用于整个站点,包括管理页面。选择一个调色板,然后选择它是随系统变化还是保持固定。\"],\"Ox3+3h\":[\"无匹配结果。\"],\"PEUV5I\":[\"代码注入已更新。\"],\"PHh52z\":[\"暖而厚重,棕调明显。\"],\"PXj9lw\":[\"停止接受来自 Telegram 的帖子。您的现有笔记将保持已发布。\"],\"PZ7HJ8\":[\"博客头像\"],\"Pwqkdw\":[\"正在加载…\"],\"PxJ9W6\":[\"生成令牌\"],\"Q/6Y+2\":[\"需要对目标仓库的 Contents(读/写)和 Webhooks(读/写)。\"],\"Q30z/l\":[\"要从导航中移除此合集吗?合集本身不会被删除。\"],\"Q99OtV\":[\"将合集固定到导航栏。在过去 48 小时内更新的合集旁会出现一个 * 号。\"],\"QCwsv1\":[\"暖白\"],\"QKvrmL\":[\"暖中性,适合长读。\"],\"QZmz0H\":[\"内置链接\"],\"Qnrzvb\":[\"活动令牌\"],\"R6Z4LE\":[\"下载失败。请重试。\"],\"R9Khdg\":[\"自动\"],\"RcdDOS\":[\"在 Telegram 上给 @BotFather 发送消息创建一个机器人,然后粘贴它提供的令牌。\"],\"RdVIcf\":[\"奶油配深咖\"],\"RxsRD6\":[\"时区\"],\"SJmfuf\":[\"站点名称\"],\"SKZhW9\":[\"令牌名称\"],\"SVQQPe\":[\"无法连接。检查错误并重试。\"],\"SchpMp\":[\"Telegram\"],\"SrGs4T\":[\"浅蓝灰底,冷静而均匀。\"],\"TpF3v+\":[\"注入到 </head> 之前。用于分析、自定义元标签以及必须尽早加载的样式。\"],\"Tz0i8g\":[\"设置\"],\"UFK415\":[\"用于分析和小部件的全站 HTML\"],\"UTvFQq\":[\"打开 \",[\"linkOpen\"],\"@\",[\"botUsername\"],[\"linkClose\"],\" 并发送:\"],\"Uj/btJ\":[\"在我的站点页眉显示头像\"],\"UsODUn\":[\"选择账户\"],\"UxKoFf\":[\"导航\"],\"V+bhUy\":[\"安装 GitHub App\"],\"V4WsyL\":[\"添加链接\"],\"V5pZwT\":[\"搜索设置已更新。\"],\"VXUPla\":[\"使用 GitHub 应用连接\"],\"VhMDMg\":[\"更改密码\"],\"Vn3jYy\":[\"导航项\"],\"VoZYGU\":[\"这将永久删除您所有的数据 — 帖子、媒体、合集、设置和您的账户。您的博客将重置为初始设置状态。此操作不可撤销。\"],\"WUnFK2\":[\"偏冷的浅白底,配深靛蓝文字。高对比。\"],\"Wa9q4P\":[\"纯白\"],\"Weq9zb\":[\"常规\"],\"Wi9i06\":[\"遵循每位访客的系统偏好。\"],\"Wx1M8N\":[\"安装 GitHub App 以在无需管理个人令牌的情况下授予访问权限。权限按仓库范围授予,可在 GitHub 上撤销。\"],\"X+8FMk\":[\"当前密码不正确。请重试。\"],\"X1G9eY\":[\"导航预览\"],\"X2Cbc2\":[\"归档订阅源\"],\"X9Hujr\":[\"手动推送\"],\"XtBJV8\":[\"正在检查仓库…\"],\"Xtc16w\":[\"刷新仓库列表\"],\"Y/F35r\":[\"使用 curl 创建帖子:\"],\"Y/N5N7\":[\"柔和的奶油底,配低饱和的绿。\"],\"YF6zHf\":[\"站点设置已更新.\"],\"YdG2RF\":[\"导出站点\"],\"YkgZi7\":[\"连接一个 Telegram 机器人,然后你发送给它的任何消息都会作为笔记已发布。\"],\"YwhjRx\":[\"管理账户\"],\"Yxp859\":[\"暖奶油色\"],\"ZDY7Fy\":[\"正在同步…\"],\"ZQKLI1\":[\"危险操作\"],\"ZS/CBL\":[\"删除此导航链接? 访客将不再在您网站的页眉中看到它。\"],\"ZgZX+d\":[\"纯白底配中性灰。不带任何色偏。\"],\"ZhhOwV\":[\"引用 (Jant 的帖子格式之一。)\"],\"ZiooJI\":[\"API 令牌\"],\"Zm7Qb0\":[\"备份与恢复指南\"],\"ZmUkwN\":[\"向导航添加自定义链接\"],\"a14mj8\":[\"未知设备\"],\"a1iEgy\":[\"暖奶油底,配深咖啡棕点缀。\"],\"a3LDKx\":[\"安全\"],\"aAIQg2\":[\"外观\"],\"aFkzVF\":[\"目标文章或合集的 slug\"],\"alKG0+\":[\"字体主题\"],\"anibOb\":[\"关于本博客\"],\"any7NR\":[\"主题指南\"],\"b+/jO6\":[\"301 (永久)\"],\"bHOiy1\":[\"演示模式下已禁用密码更改。请使用共享的演示凭证登录。\"],\"bHYIks\":[\"退出登录\"],\"bV2vng\":[\"暖陶土色\"],\"bbR5vW\":[\"这套配色\"],\"bmrL08\":[\"演示模式会隐藏会话、密码更改和账号删除。导出仍然可用.\"],\"bviiKV\":[\"这个主题下的标题、正文和链接。\"],\"c3MN2z\":[\"所有可用的端点和请求格式。\"],\"cS7/bk\":[\"删除保存的机器人令牌?其 webhook 会被删除,任何已连接的账号将被断开连接。\"],\"cSDy01\":[\"自定义 CSS 已更新.\"],\"clzoNp\":[\"始终显示暗色主题.\"],\"cnGeoo\":[\"删除\"],\"d3FRkY\":[\"无法复制。请再试一次。\"],\"d5oGUo\":[\"在 GitHub 上创建新仓库\"],\"dEgA5A\":[\"取消\"],\"dTXUY+\":[\"确认删除账户\"],\"dYKrp3\":[\"从最新中隐藏 (不出现在 Latest 中,但仍可通过固定链接和集合访问的状态。)\"],\"dk7TCH\":[\"永久删除所有数据并重置博客\"],\"drodVV\":[\"还没有合集。请先创建一个,然后将其添加到你的导航中。\"],\"dsWkIw\":[\"要与 GitHub 断开连接吗?该 webhook 将被移除。您的仓库内容不会被删除。\"],\"e/tSI5\":[\"导航顺序已更新。\"],\"eOL7vn\":[\"色彩极少,干扰最小。\"],\"ePK91l\":[\"编辑\"],\"ebQKK7\":[\"站点\"],\"egK+Yy\":[\"用于脚本和自动化的 Bearer 令牌\"],\"ehj/zN\":[\"重定向类型\"],\"eneWvv\":[\"草稿\"],\"erTMh7\":[\"上次同步\"],\"f+m8jj\":[\"订阅源 URL 已复制。\"],\"f8fH8W\":[\"设计\"],\"fKRAwQ\":[\"沙色底,配绿色点缀。\"],\"fWYqkz\":[\"代码注入\"],\"fYXQnC\":[\"暖色里最浓的一档,温馨。\"],\"gOWiTY\":[\"加载针对中文、日文或韩文内容优化的衬线字体。\"],\"gZ5owP\":[\"搜索仓库\"],\"gbqbh6\":[\"放心离开此页面 — 同步会在后台继续进行。\"],\"gkFvVN\":[\"注入到 </body> 之前。用于聊天小部件和不应阻塞页面加载的脚本。\"],\"gtQsRO\":[\"创建自定义 URL\"],\"hBO/y4\":[\"安全令牌已过期。刷新页面后重试。\"],\"hGmyDl\":[\"令牌让您无需登录即可从脚本、快捷方式和其他工具访问 API。\"],\"hIHkRy\":[\"已通过 GitHub App 连接\"],\"hdSi1b\":[\"输入 \",[\"repo\"],\" 以确认\"],\"he3ygx\":[\"复制\"],\"i0qMbr\":[\"首页\"],\"iEUzMn\":[\"系统\"],\"iSLIjg\":[\"连接\"],\"iVOMRi\":[\"主页设置已更新.\"],\"icB4Cv\":[\"将链接拖到此处以在更多菜单下显示它们\"],\"id3vuh\":[\"Telegram 已设置,但无法连接到机器人。请检查机器人令牌并重试。\"],\"ihn4zD\":[\"搜索…\"],\"iiDXZc\":[\"显示在所有文章和页面的底部。\"],\"itS31B\":[\"更暖一些,像略旧的纸。\"],\"iwQZvS\":[\"冷蓝灰\"],\"j4VrG6\":[\"下载导出 ZIP\"],\"j5nQL2\":[\"例如 iOS Shortcuts\"],\"jUV7CU\":[\"上传头像\"],\"jVUmOK\":[\"支持 Markdown\"],\"jdVYS8\":[\"选一个适合你文字的。\"],\"jgBjXJ\":[\"撤销此令牌?任何使用它的脚本将停止工作。\"],\"jpctdh\":[\"查看\"],\"k1ifdL\":[\"处理中...\"],\"kLw03Y\":[\"亮纸白\"],\"kMXclu\":[\"下载网站导出\"],\"kNiQp6\":[\"已置顶\"],\"kRhzWq\":[\"GitHub 同步\"],\"kVQs7s\":[\"细粒度样式覆盖\"],\"ke1gWS\":[\"自定义 URL\"],\"kfcRb0\":[\"头像\"],\"kxDZ2i\":[\"此代码将在您网站的每个页面上运行。\"],\"l2Op2p\":[\"查询参数\"],\"lLW3vJ\":[\"目标 slug\"],\"lV04bQ\":[\"温暖、有泥土感,但不显暗。\"],\"lYHJih\":[\"撤销此会话? 该设备需要重新登录.\"],\"mLOk1i\":[\"立即将所有文章推送到 GitHub,而不是等待下一次自动同步。\"],\"mSNmrX\":[\"列出帖子:\"],\"nG2qTk\":[\"示例链接\"],\"nK07ni\":[\"为您的网站选择一种排版方向。每个主题都会同时改变字体搭配和阅读节奏。\"],\"nbfdhU\":[\"集成\"],\"ntJYyh\":[\"在 \",[\"providerLabel\"],\" 管理域名、套餐和计费\"],\"o/vNDE\":[\"允许您覆盖任何主题变量.\"],\"oGC9uP\":[\"owner/repo\"],\"oH2JHg\":[\"我们会预先填充名称 \",[\"name\"],\"。返回时列表会刷新。\"],\"oKOOsY\":[\"颜色主题\"],\"oL535e\":[\"尚未同步\"],\"oNA4If\":[\"所有合集已在您的导航中。\"],\"oUn9Z7\":[\"近中性的浅灰,配钢蓝点缀。\"],\"ofdy2l\":[\"带橘调的底色。最暖的一套。\"],\"pZq3aX\":[\"上传失败。请重试。\"],\"pgTIrt\":[\"选择要与此站点同步的 GitHub 账户和仓库。\"],\"psoxDF\":[\"该字体主题不可用。请选择另一个。\"],\"pvnfJD\":[\"深色\"],\"q+hNag\":[\"合集\"],\"qdcESc\":[\"创建新仓库\"],\"r5EW6f\":[\"此仓库已在为另一个 Jant 站点 (\",[\"host\"],\") 进行备份。请选择其他仓库。\"],\"rEspiY\":[\"导航位置已更新.\"],\"rFmBG3\":[\"配色主题\"],\"rlonmB\":[\"删除失败。请稍后再试。\"],\"satWc6\":[\"主 RSS 源\"],\"sgr2wQ\":[\"合集\"],\"soRdOu\":[\"米白纸底,配深森绿。\"],\"sqxcaY\":[\"创建于 \",[\"date\"]],\"sxkWRg\":[\"高级\"],\"t/YqKh\":[\"移除\"],\"t3hvHq\":[\"立即同步\"],\"tJ4H0O\":[\"你的 Telegram 账号\"],\"tfDRzk\":[\"保存\"],\"tvgAq5\":[\"尚未授权任何账户\"],\"u1VTd3\":[\"调色板、表面色调与整体氛围\"],\"u3wRF+\":[\"已发布\"],\"u6KOjV\":[\"想要更多控制?\"],\"udPwLB\":[\"页眉\"],\"ui6aMF\":[\"以下设备当前已登录到您的帐户。撤销任何您不认识的会话。\"],\"vBEKwo\":[\"在此管理本站点的活动会话。密码和托管访问通过 \",[\"providerLabel\"],\" 管理。\"],\"vRldcl\":[\"排版选项与阅读质感\"],\"vSYKYI\":[\"主订阅源\"],\"vTuib7\":[\"这将控制 /feed 返回的内容。\"],\"vmQmHx\":[\"添加自定义 CSS 以覆盖任何样式. 使用数据属性如 [data-page], [data-post], [data-format] 来定位特定元素.\"],\"vzX5FB\":[\"删除账号\"],\"w8Rv8T\":[\"标签为必填项\"],\"wL3cK8\":[\"最新\"],\"wW6NCp\":[\"上次错误\"],\"wc+17X\":[\"/* 在此填写您的自定义 CSS */\"],\"wuLtXn\":[\"当前没有活动会话。 已登录的设备会显示在此处。\"],\"xCWek4\":[\"文件存储尚未设置。请检查服务器配置。\"],\"xHt036\":[\"个人访问令牌\"],\"xKeZ0l\":[\"更偏暖、偏土的色调。\"],\"xYbozN\":[\"柔象牙白\"],\"xqViCq\":[\"暖象牙白\"],\"xxaahd\":[\"想要更冷、更利落的观感时。\"],\"y28hnO\":[\"文章\"],\"y8Md/V\":[\"语言和时间已更新。\"],\"yNCqOt\":[\"最新订阅源\"],\"yQ3kNF\":[\"输入以下短语以确认:\"],\"ydq1k2\":[\"请先选择一个账号\"],\"yjjCV8\":[\"固定订阅源 URL\"],\"yjkELF\":[\"确认新密码\"],\"yzF66j\":[\"链接\"],\"z6wakA\":[\"在您的主页上显示的简短介绍.\"],\"zEizrk\":[\"上次使用 \",[\"date\"]],\"zSURJW\":[\"没有匹配的仓库。\"],\"zXH2jX\":[\"语言与时间\"],\"zlcDd2\":[\"要删除此自定义 URL 吗?使用它的访问者将不再被重定向。\"],\"zwBp5t\":[\"私有\"],\"zxRN6H\":[\"页眉链接、首页信息流和溢出菜单\"]}");
|
|
1922
|
+
var messages$1 = JSON.parse("{\"++YsxG\":[\"读者和搜索引擎看到的是\"],\"+4Z6iP\":[\"请先在 GitHub 上创建仓库 — 可以为空。\"],\"+9JI/F\":[\"连接后会将你的网站同步到 \",[\"repo\"],\" 的默认分支,并追加到其现有历史之上。Jant 管理路径之外的现有文件会被保留。此操作无法撤销。\"],\"+AXdXp\":[\"标签和 URL 为必填项\"],\"+K0AvT\":[\"断开连接\"],\"+wgt7C\":[\"低饱和的红棕底,温暖、有泥土感。\"],\"+zy2Nq\":[\"类型\"],\"/3H2/s\":[\"此托管站点通过 \",[\"providerLabel\"],\" 登录。请在那里管理密码和托管访问权限。\"],\"/PXXBT\":[\"近乎纯白,带一点暖意。\"],\"/zOUxl\":[\"链接到 Telegram 机器人的二维码\"],\"0OGSSc\":[\"头像显示已更新.\"],\"0UzCUX\":[\"更新您用于登录的密码\"],\"0bdA9b\":[\"打开 Telegram 以连接\"],\"0gECZD\":[\"想写更完整的介绍?\"],\"0uIjy/\":[\"浅鼠尾草绿底,配同色系的绿。\"],\"10UtuM\":[\"CJK 字体\"],\"1F6Mzc\":[\"当前还没有导航项目。添加链接或在下方启用系统项目。\"],\"1H7gng\":[\"后台语言\"],\"1mbBbL\":[\"手动绑定\"],\"1njn7W\":[\"浅色\"],\"1qGdnL\":[\"默认主题。沉静,适合长时间阅读。\"],\"2DoBvq\":[\"订阅源\"],\"2FYpfJ\":[\"更多\"],\"2Ithfh\":[\"向机器人发送任意文本,它会作为笔记已发布。\"],\"2PTjMB\":[\"我想删除 \",[\"siteName\"]],\"2cFU6q\":[\"网站页脚\"],\"2fPEPI\":[\"沉静、偏冷的底色。\"],\"2lkk2l\":[\"微黄的纸底,配橄榄绿。\"],\"2oWZo7\":[\"最近一次提交\"],\"2uuy4H\":[\"通过个人访问令牌连接\"],\"2wK4BX\":[\"编辑 About 页面\"],\"35x8eZ\":[\"显示 \",[\"shown\"],\" 共 \",[\"total\"]],\"39QGku\":[\"打开机器人并发送绑定码, 然后你发送给它的任何消息都会变成一条笔记。\"],\"3Cw1AI\":[\"添加合集\"],\"3VrybB\":[\"重定向\"],\"3Yvsaz\":[\"302 (临时)\"],\"3n0zbB\":[\"会话管理在演示模式下已关闭。请使用共享的演示会话。\"],\"3sYJi5\":[\"下载一个与 Hugo 兼容的归档 — 将其静态托管或迁移到另一个 Jant。\"],\"3wKq0C\":[\"保存失败。请稍后再试。\"],\"49Bsal\":[\"订阅源设置已更新。\"],\"4Jge8E\":[\"活动会话\"],\"4KIa+q\":[\"导出文件已下载.\"],\"4cEClj\":[\"会话\"],\"4yyXWu\":[\"浅骨白底,配低饱和的绿。\"],\"4zGJ5E\":[\"永久删除账号\"],\"5QlUIt\":[\"仓库为空。准备连接。\"],\"5VQnR3\":[\"当你想要一个永远不变的订阅源 URL 时使用它们。\"],\"5dpcN1\":[\"输入以搜索全部\"],\"5f1Wo9\":[\"已连接为 \",[\"account\"]],\"5o8R81\":[\"极浅的象牙底,配淡淡的茶绿。\"],\"6ArdBh\":[\"将精选文章用于 /feed。\"],\"6DjeBT\":[\"演示站点始终对搜索引擎隐藏。\"],\"6E3aK4\":[\"管理托管\"],\"6FFB7q\":[\"为 /feed 使用最新的公开帖子。\"],\"6K1Vef\":[\"永久删除此博客?此操作不可撤销。\"],\"6NpNLc\":[\"此仓库已有内容。\"],\"6V3Ea3\":[\"已复制\"],\"6WdDG7\":[\"页面\"],\"71WIgc\":[\"获取新绑定码\"],\"746NHh\":[\"此博客\"],\"7811AW\":[\"此仓库已在备份此站点。\"],\"7FCZPo\":[\"内容语言\"],\"7FaY4u\":[\"用法\"],\"7G9YLi\":[\"允许搜索引擎索引我的网站\"],\"7GISOt\":[\"保存机器人令牌\"],\"7MZxzw\":[\"密码已更改.\"],\"7vhWI8\":[\"新密码\"],\"81nFIS\":[\"密码不匹配。请确保两个字段相同。\"],\"87a/t/\":[\"标签\"],\"89Upyo\":[\"该主题不可用。请选择其他主题。\"],\"8BfEpW\":[\"托管账户\"],\"8N/Mcp\":[\"归档 筛选参数 (例如 format=笔记&view=list)\"],\"8T46pB\":[\"机器人令牌\"],\"8U2Z7f\":[\"新建自定义 URL\"],\"8ZsakT\":[\"密码\"],\"8gEghq\":[\"明亮的暖白底,配苔绿点缀。\"],\"9+vGLh\":[\"自定义 CSS\"],\"9As8Nu\":[\"在 GitHub 上创建一个\"],\"9EjI4j\":[\"暖沙色\"],\"9J6wUO\":[\"建议添加的链接\"],\"9Lsvt5\":[\"于 \",[\"date\"],\" 登录\"],\"9T7Cwm\":[\"重定向、个性化路径和 URL 控制\"],\"9aUyym\":[\"查看你的登录位置并撤销旧会话\"],\"A1taO8\":[\"搜索\"],\"AeXO77\":[\"账户\"],\"AnY+O9\":[\"在主页底部显示 \\\"Build with Jant\\\"\"],\"ApZDMk\":[\"此图用于您的 favicon 和 apple-touch-icon。为获得最佳效果,请上传至少 512×512 像素、纯色背景的方形 PNG。\"],\"B495Gs\":[\"归档\"],\"B4ESok\":[\"API 参考\"],\"BTYdze\":[\"链接已添加到导航。\"],\"BzEFor\":[\"或\"],\"CDAdlf\":[\"移除机器人\"],\"CTAEes\":[\"选择仓库\"],\"CjZZgz\":[\"该仓库已有提交\"],\"D8k2s6\":[\"连接 Telegram\"],\"DCKkhU\":[\"当前密码\"],\"DKKKeF\":[\"在 \",[\"providerLabel\"],\" 管理密码和托管访问\"],\"DVFXa6\":[\"最干净、最中性的一档。\"],\"EO3I6h\":[\"上传未成功。请稍后再试。\"],\"Eax/et\":[\"强调色\"],\"Enslfm\":[\"目标地址\"],\"F53UDu\":[\"冷白\"],\"F7FKwe\":[\"你在此处粘贴的任何内容都将完全访问访客的浏览器。仅使用来自你信任的来源的代码。\"],\"F8SNqr\":[\"暖橘\"],\"FMUJSP\":[\"账户与数据\"],\"Fk3SSD\":[\"平静自然,看着舒服。\"],\"FkMol5\":[\"精选\"],\"G/1oP+\":[\"移除 webhook 并停止同步。您的仓库内容不会被删除。\"],\"G0qJsQ\":[\"缺少安全令牌。刷新页面后重试。\"],\"G39wnK\":[\"将内容备份并与 GitHub 仓库同步\"],\"GMMWcy\":[\"名称、元数据、语言和搜索默认设置\"],\"GXsAby\":[\"撤销\"],\"GxkJXS\":[\"正在上传...\"],\"GzKzUa\":[\"演示限制\"],\"H4x7Sk\":[\"后台界面显示的语言。可选 English、简体中文 和 繁體中文。\"],\"HCNlq3\":[\"干净、高对比,接近纯白。\"],\"HHDyGw\":[\"柔绿\"],\"HKH+W+\":[\"数据\"],\"Hp1l6f\":[\"当前\"],\"HxlY7t\":[\"更改此项会更新订阅者从 /feed 获取的内容。\"],\"HxuOlm\":[\"网站头部\"],\"I4HRxU\":[\"已发布的全部帖子,包括从 Latest 中隐藏的那些。\"],\"I6gXOa\":[\"路径\"],\"I76CzF\":[\"中性灰\"],\"ID38tA\":[\"演示模式下已禁用账号删除。共享演示会单独重置。\"],\"IF9tPu\":[\"何时使用站点导出、数据库备份和恢复演练。\"],\"IW5PBo\":[\"复制令牌\"],\"IagCbF\":[\"网址\"],\"IfB3m6\":[\"你撰写内容所用的语言。通过 HTML lang 和 RSS 向读者与搜索引擎声明。支持任意 BCP 47 标签。\"],\"IreQBq\":[\"仓库\"],\"J6bLeg\":[\"向任意 URL 添加自定义链接\"],\"JL7LF5\":[\"可用的 CSS 变量, 数据属性, 和 示例.\"],\"JcD7qf\":[\"更多操作\"],\"JjX0OO\":[\"现在复制您的令牌 — 它不会再次显示。\"],\"JrFTcr\":[\"连接中…\"],\"JuN5GC\":[\"未选择文件。请选择要上传的文件。\"],\"KDw4GX\":[\"重试\"],\"KSgo21\":[\"选择仓库\"],\"KVVYBh\":[\"向导航添加合集\"],\"KiJn9B\":[\"笔记\"],\"KwOLJF\":[\"Jant 最初的配色,日常稳妥之选。\"],\"L3DEwT\":[\"移除此头像?你的网站图标和站点顶部图标将恢复为默认设置。\"],\"L4t4/q\":[\"3月14日\"],\"LdyooL\":[\"链接\"],\"LjwaJ/\":[\"登录、导出和删除\"],\"M/D8PK\":[\"+ 在其他帐户上安装\"],\"M/haSd\":[\"始终显示浅色主题。\"],\"M2kIWU\":[\"字体主题\"],\"M6CbAU\":[\"切换编辑面板\"],\"MaYYE6\":[\"通过向 Telegram 机器人发送消息来发布笔记\"],\"Me5t5H\":[\"将 GitHub 仓库连接以自动将您的文章备份为 Markdown 文件。您在 GitHub 上的编辑会同步回您的网站。\"],\"Mr4QPw\":[\"断开 Telegram?您可以随时使用新的绑定码重新连接。\"],\"MtENL9\":[\"调整你的网站的外观、阅读体验和运行方式。\"],\"N/8NPV\":[\"在删除之前,请下载站点导出。删除后将无法恢复此账户。\"],\"N7UNHY\":[\"精选订阅源\"],\"NHnUHF\":[\"Favicon 和站点顶部的个人标识\"],\"NU2Fqi\":[\"保存 CSS\"],\"NVjhde\":[\"暖羊皮纸\"],\"Nldjdr\":[\"尚无自定义 URL。创建一个以便为文章添加重定向或自定义路径。\"],\"O7rgs6\":[\"导航栏 RSS 指向你的 \",[\"feed\"],\" 订阅源 (/feed)。在“常规”中更改 /feed 返回的内容。\"],\"OSJXFg\":[\"应用于整个站点,包括管理页面。选择一个调色板,然后选择它是随系统变化还是保持固定。\"],\"Ox3+3h\":[\"无匹配结果。\"],\"PEUV5I\":[\"代码注入已更新。\"],\"PHh52z\":[\"暖而厚重,棕调明显。\"],\"PXj9lw\":[\"停止接受来自 Telegram 的帖子。您的现有笔记将保持已发布。\"],\"PZ7HJ8\":[\"博客头像\"],\"Pwqkdw\":[\"正在加载…\"],\"PxJ9W6\":[\"生成令牌\"],\"Q/6Y+2\":[\"需要对目标仓库的 Contents(读/写)和 Webhooks(读/写)。\"],\"Q30z/l\":[\"要从导航中移除此合集吗?合集本身不会被删除。\"],\"Q99OtV\":[\"将合集固定到导航栏。在过去 48 小时内更新的合集旁会出现一个 * 号。\"],\"QCwsv1\":[\"暖白\"],\"QKvrmL\":[\"暖中性,适合长读。\"],\"QZmz0H\":[\"内置链接\"],\"Qnrzvb\":[\"活动令牌\"],\"R6Z4LE\":[\"下载失败。请重试。\"],\"R9Khdg\":[\"自动\"],\"RcdDOS\":[\"在 Telegram 上给 @BotFather 发送消息创建一个机器人,然后粘贴它提供的令牌。\"],\"RdVIcf\":[\"奶油配深咖\"],\"RxsRD6\":[\"时区\"],\"SJmfuf\":[\"站点名称\"],\"SKZhW9\":[\"令牌名称\"],\"SVQQPe\":[\"无法连接。检查错误并重试。\"],\"SchpMp\":[\"Telegram\"],\"SrGs4T\":[\"浅蓝灰底,冷静而均匀。\"],\"TpF3v+\":[\"注入到 </head> 之前。用于分析、自定义元标签以及必须尽早加载的样式。\"],\"Tu6bMZ\":[\"创建 About 页面\"],\"Tz0i8g\":[\"设置\"],\"UFK415\":[\"用于分析和小部件的全站 HTML\"],\"UTvFQq\":[\"打开 \",[\"linkOpen\"],\"@\",[\"botUsername\"],[\"linkClose\"],\" 并发送:\"],\"Uj/btJ\":[\"在我的站点顶部显示头像\"],\"UsODUn\":[\"选择账户\"],\"UxKoFf\":[\"站点导航\"],\"V+bhUy\":[\"安装 GitHub App\"],\"V4WsyL\":[\"添加链接\"],\"V5pZwT\":[\"搜索设置已更新。\"],\"VXUPla\":[\"使用 GitHub 应用连接\"],\"VhMDMg\":[\"更改密码\"],\"Vn3jYy\":[\"导航项\"],\"VoZYGU\":[\"这将永久删除您所有的数据 — 帖子、媒体、合集、设置和您的账户。您的博客将重置为初始设置状态。此操作不可撤销。\"],\"WUnFK2\":[\"偏冷的浅白底,配深靛蓝文字。高对比。\"],\"Wa9q4P\":[\"纯白\"],\"Wb7EHo\":[\"About 页面\"],\"Weq9zb\":[\"常规\"],\"Wi9i06\":[\"遵循每位访客的系统偏好。\"],\"Wx1M8N\":[\"安装 GitHub App 以在无需管理个人令牌的情况下授予访问权限。权限按仓库范围授予,可在 GitHub 上撤销。\"],\"X+8FMk\":[\"当前密码不正确。请重试。\"],\"X1G9eY\":[\"导航预览\"],\"X2Cbc2\":[\"归档订阅源\"],\"X9Hujr\":[\"手动推送\"],\"XtBJV8\":[\"正在检查仓库…\"],\"Xtc16w\":[\"刷新仓库列表\"],\"Y/F35r\":[\"使用 curl 创建帖子:\"],\"Y/N5N7\":[\"柔和的奶油底,配低饱和的绿。\"],\"YF6zHf\":[\"站点设置已更新.\"],\"YdG2RF\":[\"导出站点\"],\"YkgZi7\":[\"连接一个 Telegram 机器人,然后你发送给它的任何消息都会作为笔记已发布。\"],\"YwhjRx\":[\"管理账户\"],\"Yxp859\":[\"暖奶油色\"],\"ZDY7Fy\":[\"正在同步…\"],\"ZQKLI1\":[\"危险操作\"],\"ZS/CBL\":[\"删除此导航链接?访客将不再在你的网站导航栏中看到它。\"],\"ZgZX+d\":[\"纯白底配中性灰。不带任何色偏。\"],\"ZhhOwV\":[\"引用\"],\"ZiooJI\":[\"API 令牌\"],\"Zm7Qb0\":[\"备份与恢复指南\"],\"ZmUkwN\":[\"向导航添加自定义链接\"],\"a14mj8\":[\"未知设备\"],\"a1iEgy\":[\"暖奶油底,配深咖啡棕点缀。\"],\"a3LDKx\":[\"安全\"],\"aAIQg2\":[\"外观\"],\"aFkzVF\":[\"目标文章或合集的 slug\"],\"alKG0+\":[\"字体主题\"],\"anibOb\":[\"关于本博客\"],\"any7NR\":[\"主题指南\"],\"b+/jO6\":[\"301 (永久)\"],\"bHOiy1\":[\"演示模式下已禁用密码更改。请使用共享的演示凭证登录。\"],\"bHYIks\":[\"退出登录\"],\"bV2vng\":[\"暖陶土色\"],\"bbR5vW\":[\"这套配色\"],\"bbzY7X\":[\"管理登录安全、站点导出和不可恢复的操作。\"],\"bmrL08\":[\"演示模式会隐藏会话、密码更改和账号删除。导出仍然可用.\"],\"bviiKV\":[\"这个主题下的标题、正文和链接。\"],\"c3MN2z\":[\"所有可用的端点和请求格式。\"],\"cS7/bk\":[\"删除保存的机器人令牌?其 webhook 会被删除,任何已连接的账号将被断开连接。\"],\"cSDy01\":[\"自定义 CSS 已更新.\"],\"clzoNp\":[\"始终显示暗色主题.\"],\"cnGeoo\":[\"删除\"],\"d3FRkY\":[\"无法复制。请再试一次。\"],\"d5oGUo\":[\"在 GitHub 上创建新仓库\"],\"dEgA5A\":[\"取消\"],\"dTXUY+\":[\"确认删除账户\"],\"dYKrp3\":[\"从最新中隐藏 (不出现在 Latest 中,但仍可通过固定链接和集合访问的状态。)\"],\"dk7TCH\":[\"永久删除所有数据并重置博客\"],\"drodVV\":[\"还没有合集。请先创建一个,然后将其添加到你的导航中。\"],\"dsWkIw\":[\"要与 GitHub 断开连接吗?该 webhook 将被移除。您的仓库内容不会被删除。\"],\"e/tSI5\":[\"导航顺序已更新。\"],\"eOL7vn\":[\"色彩极少,干扰最小。\"],\"ePK91l\":[\"编辑\"],\"ebQKK7\":[\"站点\"],\"egK+Yy\":[\"用于脚本和自动化的 Bearer 令牌\"],\"ehj/zN\":[\"重定向类型\"],\"eneWvv\":[\"草稿\"],\"erTMh7\":[\"上次同步\"],\"f+m8jj\":[\"订阅源 URL 已复制。\"],\"f8fH8W\":[\"设计\"],\"fKRAwQ\":[\"沙色底,配绿色点缀。\"],\"fWYqkz\":[\"代码注入\"],\"fYXQnC\":[\"暖色里最浓的一档,温馨。\"],\"gOWiTY\":[\"加载针对中文、日文或韩文内容优化的衬线字体。\"],\"gZ5owP\":[\"搜索仓库\"],\"gbqbh6\":[\"放心离开此页面 — 同步会在后台继续进行。\"],\"gkFvVN\":[\"注入到 </body> 之前。用于聊天小部件和不应阻塞页面加载的脚本。\"],\"gtQsRO\":[\"创建自定义 URL\"],\"hBO/y4\":[\"安全令牌已过期。刷新页面后重试。\"],\"hGmyDl\":[\"令牌让您无需登录即可从脚本、快捷方式和其他工具访问 API。\"],\"hIHkRy\":[\"已通过 GitHub App 连接\"],\"hdSi1b\":[\"输入 \",[\"repo\"],\" 以确认\"],\"he3ygx\":[\"复制\"],\"i0qMbr\":[\"首页\"],\"iEUzMn\":[\"系统\"],\"iSLIjg\":[\"连接\"],\"iVOMRi\":[\"主页设置已更新.\"],\"icB4Cv\":[\"将链接拖到此处以在更多菜单下显示它们\"],\"id3vuh\":[\"Telegram 已设置,但无法连接到机器人。请检查机器人令牌并重试。\"],\"ihn4zD\":[\"搜索…\"],\"iiDXZc\":[\"显示在所有文章和页面的底部。\"],\"itS31B\":[\"更暖一些,像略旧的纸。\"],\"iwQZvS\":[\"冷蓝灰\"],\"j4VrG6\":[\"下载导出 ZIP\"],\"j5nQL2\":[\"例如 iOS Shortcuts\"],\"jUV7CU\":[\"上传头像\"],\"jVUmOK\":[\"支持 Markdown\"],\"jdVYS8\":[\"选一个适合你文字的。\"],\"jgBjXJ\":[\"撤销此令牌?任何使用它的脚本将停止工作。\"],\"jpctdh\":[\"查看\"],\"k1ifdL\":[\"处理中...\"],\"kLw03Y\":[\"亮纸白\"],\"kMXclu\":[\"下载网站导出\"],\"kNiQp6\":[\"已置顶\"],\"kRhzWq\":[\"GitHub 同步\"],\"kVQs7s\":[\"细粒度样式覆盖\"],\"ke1gWS\":[\"自定义 URL\"],\"kfcRb0\":[\"头像\"],\"kxDZ2i\":[\"此代码将在您网站的每个页面上运行。\"],\"l2Op2p\":[\"查询参数\"],\"lLW3vJ\":[\"目标 slug\"],\"lV04bQ\":[\"温暖、有泥土感,但不显暗。\"],\"lYHJih\":[\"撤销此会话? 该设备需要重新登录.\"],\"m16xKo\":[\"添加\"],\"mLOk1i\":[\"立即将所有文章推送到 GitHub,而不是等待下一次自动同步。\"],\"mSNmrX\":[\"列出帖子:\"],\"n8+EXe\":[\"添加站点中已经存在的常用入口。\"],\"nG2qTk\":[\"示例链接\"],\"nK07ni\":[\"为您的网站选择一种排版方向。每个主题都会同时改变字体搭配和阅读节奏。\"],\"nbfdhU\":[\"集成\"],\"ntJYyh\":[\"在 \",[\"providerLabel\"],\" 管理域名、套餐和计费\"],\"o/vNDE\":[\"允许您覆盖任何主题变量.\"],\"oGC9uP\":[\"owner/repo\"],\"oH2JHg\":[\"我们会预先填充名称 \",[\"name\"],\"。返回时列表会刷新。\"],\"oKOOsY\":[\"颜色主题\"],\"oL535e\":[\"尚未同步\"],\"oNA4If\":[\"所有合集已在您的导航中。\"],\"oUn9Z7\":[\"近中性的浅灰,配钢蓝点缀。\"],\"ofdy2l\":[\"带橘调的底色。最暖的一套。\"],\"pZq3aX\":[\"上传失败。请重试。\"],\"pgTIrt\":[\"选择要与此站点同步的 GitHub 账户和仓库。\"],\"psoxDF\":[\"该字体主题不可用。请选择另一个。\"],\"pt4OhQ\":[\"/about 已被占用。重命名该项目后再创建 About 页面。\"],\"pvnfJD\":[\"深色\"],\"q+hNag\":[\"合集\"],\"qdcESc\":[\"创建新仓库\"],\"r5EW6f\":[\"此仓库已在为另一个 Jant 站点 (\",[\"host\"],\") 进行备份。请选择其他仓库。\"],\"rEspiY\":[\"导航位置已更新.\"],\"rFmBG3\":[\"配色主题\"],\"rlonmB\":[\"删除失败。请稍后再试。\"],\"satWc6\":[\"主 RSS 源\"],\"sgr2wQ\":[\"合集\"],\"soRdOu\":[\"米白纸底,配深森绿。\"],\"sqxcaY\":[\"创建于 \",[\"date\"]],\"sxkWRg\":[\"高级\"],\"t/YqKh\":[\"移除\"],\"t3hvHq\":[\"立即同步\"],\"tJ4H0O\":[\"你的 Telegram 账号\"],\"tfDRzk\":[\"保存\"],\"tvgAq5\":[\"尚未授权任何账户\"],\"u1VTd3\":[\"调色板、表面色调与整体氛围\"],\"u3wRF+\":[\"已发布\"],\"u6KOjV\":[\"想要更多控制?\"],\"udPwLB\":[\"导航栏\"],\"ui6aMF\":[\"以下设备当前已登录到您的帐户。撤销任何您不认识的会话。\"],\"vBEKwo\":[\"在此管理本站点的活动会话。密码和托管访问通过 \",[\"providerLabel\"],\" 管理。\"],\"vOnuOa\":[\"在导航栏和更多菜单中显示或隐藏内置目标。\"],\"vRldcl\":[\"排版选项与阅读质感\"],\"vSYKYI\":[\"主订阅源\"],\"vTuib7\":[\"这将控制 /feed 返回的内容。\"],\"vmQmHx\":[\"添加自定义 CSS 以覆盖任何样式. 使用数据属性如 [data-page], [data-post], [data-format] 来定位特定元素.\"],\"vzX5FB\":[\"删除账号\"],\"w8Rv8T\":[\"标签为必填项\"],\"wL3cK8\":[\"最新\"],\"wW6NCp\":[\"上次错误\"],\"wc+17X\":[\"/* 在此填写您的自定义 CSS */\"],\"wuLtXn\":[\"当前没有活动会话。 已登录的设备会显示在此处。\"],\"xCWek4\":[\"文件存储尚未设置。请检查服务器配置。\"],\"xHt036\":[\"个人访问令牌\"],\"xKeZ0l\":[\"更偏暖、偏土的色调。\"],\"xYbozN\":[\"柔象牙白\"],\"xqViCq\":[\"暖象牙白\"],\"xxaahd\":[\"想要更冷、更利落的观感时。\"],\"y/awtV\":[\"导航链接、内置目标和更多菜单\"],\"y28hnO\":[\"文章\"],\"y8Md/V\":[\"语言和时间已更新。\"],\"yNCqOt\":[\"最新订阅源\"],\"yQ3kNF\":[\"输入以下短语以确认:\"],\"ydq1k2\":[\"请先选择一个账号\"],\"yjjCV8\":[\"固定订阅源 URL\"],\"yjkELF\":[\"确认新密码\"],\"yzF66j\":[\"链接\"],\"z6wakA\":[\"在您的主页上显示的简短介绍.\"],\"zEizrk\":[\"上次使用 \",[\"date\"]],\"zSURJW\":[\"没有匹配的仓库。\"],\"zXH2jX\":[\"语言与时间\"],\"zlcDd2\":[\"要删除此自定义 URL 吗?使用它的访问者将不再被重定向。\"],\"zwBp5t\":[\"私有\"]}");
|
|
1923
1923
|
//#endregion
|
|
1924
1924
|
//#region src/i18n/locales/settings/zh-Hant.ts
|
|
1925
|
-
var messages = JSON.parse("{\"++YsxG\":[\"讀者和搜尋引擎看到的是\"],\"+4Z6iP\":[\"先在 GitHub 上建立儲存庫 — 可以是空的。\"],\"+9JI/F\":[\"連線後會將您的網站同步到 \",[\"repo\"],\" 的預設分支,並疊加在其現有歷史之上。Jant 管理路徑外的既有檔案會保留。此操作無法復原。\"],\"+AXdXp\":[\"標籤與 URL 為必填\"],\"+K0AvT\":[\"解除連線\"],\"+wgt7C\":[\"低飽和的紅棕底,溫暖、有泥土感。\"],\"+zy2Nq\":[\"類型\"],\"/3H2/s\":[\"此託管網站透過 \",[\"providerLabel\"],\" 登入。請在該處管理密碼與託管存取權限。\"],\"/JnyjR\":[\"切換內建導覽項目。它們的順序決定頁首顯示哪些項目,以及首頁會先開啟哪一個 feed。\"],\"/PXXBT\":[\"近乎純白,帶一點暖意。\"],\"/zOUxl\":[\"連結至 Telegram 機器人的 QR 碼\"],\"0OGSSc\":[\"頭像顯示已更新.\"],\"0UzCUX\":[\"更新您用來登入的密碼\"],\"0bdA9b\":[\"開啟 Telegram 以連線\"],\"0uIjy/\":[\"淺鼠尾草綠底,配同色系的綠。\"],\"10UtuM\":[\"CJK 字體\"],\"1F6Mzc\":[\"目前尚無導覽項目。請新增連結或在下方啟用系統項目。\"],\"1H7gng\":[\"後台語言\"],\"1mbBbL\":[\"手動連接\"],\"1njn7W\":[\"淺色\"],\"1qGdnL\":[\"預設主題。沉靜,適合長時間閱讀。\"],\"2B7t+s\":[\"工作階段與密碼\"],\"2DoBvq\":[\"訂閱來源\"],\"2FYpfJ\":[\"更多\"],\"2Ithfh\":[\"傳送任何文字給機器人,該文字會作為筆記已發佈。\"],\"2PTjMB\":[\"我想刪除 \",[\"siteName\"]],\"2cFU6q\":[\"網站頁尾\"],\"2fPEPI\":[\"沉靜、偏冷的底色。\"],\"2lkk2l\":[\"微黃的紙底,配橄欖綠。\"],\"2oWZo7\":[\"最近一次提交\"],\"2uuy4H\":[\"已透過個人存取權杖連線\"],\"35x8eZ\":[\"顯示 \",[\"shown\"],\" 共 \",[\"total\"]],\"39QGku\":[\"開啟機器人並傳送綁定碼,之後你傳給它的任何訊息都會成為筆記。\"],\"3Cw1AI\":[\"新增選集\"],\"3VrybB\":[\"重新導向\"],\"3Yvsaz\":[\"302 (暫時)\"],\"3n0zbB\":[\"在示範模式中已停用工作階段管理。請改用共用示範工作階段。\"],\"3sYJi5\":[\"下載與 Hugo 相容的封存 — 以靜態方式託管或移轉到另一個 Jant\"],\"3wKq0C\":[\"無法儲存。請稍後再試。\"],\"49Bsal\":[\"Feed 設定已更新。\"],\"4Jge8E\":[\"目前的工作階段\"],\"4KIa+q\":[\"已下載匯出檔案。\"],\"4cEClj\":[\"工作階段\"],\"4yyXWu\":[\"淺骨白底,配低飽和的綠。\"],\"4zGJ5E\":[\"永久刪除帳戶\"],\"5QlUIt\":[\"倉庫為空。準備連線。\"],\"5VQnR3\":[\"當你想要一個永遠不會改變的 feed URL 時,請使用這些。\"],\"5dpcN1\":[\"輸入以搜尋全部\"],\"5f1Wo9\":[\"已以 \",[\"account\"],\" 連線\"],\"5o8R81\":[\"極淺的象牙底,配淡淡的茶綠。\"],\"6ArdBh\":[\"將精選文章用於 /feed.\"],\"6DjeBT\":[\"示範網站會始終對搜尋引擎保持隱藏。\"],\"6E3aK4\":[\"管理託管\"],\"6FFB7q\":[\"使用最新的公開貼文作為 /feed。\"],\"6K1Vef\":[\"確定要永久刪除此部落格嗎?此動作無法復原。\"],\"6NpNLc\":[\"此儲存庫已有內容。\"],\"6V3Ea3\":[\"已複製\"],\"71WIgc\":[\"取得新代碼\"],\"746NHh\":[\"此部落格\"],\"7811AW\":[\"此儲存庫已在備份本網站。\"],\"7FCZPo\":[\"內容語言\"],\"7FaY4u\":[\"用法\"],\"7G9YLi\":[\"允許搜尋引擎收錄我的網站\"],\"7GISOt\":[\"儲存機器人權杖\"],\"7MZxzw\":[\"密碼已變更.\"],\"7vhWI8\":[\"新密碼\"],\"81nFIS\":[\"密碼不符。請確認兩個欄位相同。\"],\"87a/t/\":[\"標籤\"],\"89Upyo\":[\"該主題目前不可用。請選擇其他主題。\"],\"8BfEpW\":[\"託管帳號\"],\"8N/Mcp\":[\"封存篩選參數 (例如 format=note&view=list)\"],\"8T46pB\":[\"機器人權杖\"],\"8U2Z7f\":[\"新增自訂 URL\"],\"8ZsakT\":[\"密碼\"],\"8gEghq\":[\"明亮的暖白底,配苔綠點綴。\"],\"9+vGLh\":[\"自訂 CSS\"],\"9As8Nu\":[\"在 GitHub 上建立一個\"],\"9EjI4j\":[\"暖沙色\"],\"9Lsvt5\":[\"已於 \",[\"date\"],\" 登入\"],\"9T7Cwm\":[\"重新導向、自訂路徑與網址控制\"],\"9aUyym\":[\"查看您在哪裡已登入,並撤銷舊的工作階段\"],\"A1taO8\":[\"搜尋\"],\"AeXO77\":[\"帳戶\"],\"AnY+O9\":[\"在首頁底部顯示「Build with Jant」\"],\"ApZDMk\":[\"此圖會用於您的 favicon 和 apple-touch-icon。為達最佳效果,請上傳至少 512x512 像素、背景為純色的正方形 PNG。\"],\"B495Gs\":[\"封存\"],\"B4ESok\":[\"API 參考\"],\"BzEFor\":[\"或\"],\"CDAdlf\":[\"移除機器人\"],\"CTAEes\":[\"選擇儲存庫\"],\"CjZZgz\":[\"此儲存庫已有提交紀錄\"],\"D8k2s6\":[\"連接 Telegram\"],\"DCKkhU\":[\"目前密碼\"],\"DKKKeF\":[\"在 \",[\"providerLabel\"],\" 管理密碼與託管存取\"],\"DVFXa6\":[\"最乾淨、最中性的一檔。\"],\"EO3I6h\":[\"上傳未成功. 請稍後再試.\"],\"Eax/et\":[\"強調色\"],\"Enslfm\":[\"目標網址\"],\"F53UDu\":[\"冷白\"],\"F7FKwe\":[\"你在此處貼上的任何內容都能完全存取訪客的瀏覽器。僅使用來自你信任來源的程式碼。\"],\"F8SNqr\":[\"暖橘\"],\"Fk3SSD\":[\"平靜自然,看著舒服。\"],\"FkMol5\":[\"精選\"],\"G/1oP+\":[\"移除 webhook 並停止同步。您的儲存庫內容不會被刪除。\"],\"G0qJsQ\":[\"找不到安全權杖。請重新整理頁面後再試一次。\"],\"G39wnK\":[\"將內容備份並與 GitHub 儲存庫同步\"],\"GMMWcy\":[\"名稱, 中繼資料, 語言, 和 搜尋預設值\"],\"GXsAby\":[\"撤銷\"],\"GxkJXS\":[\"上傳中...\"],\"GzKzUa\":[\"試用限制\"],\"H4x7Sk\":[\"後台介面顯示的語言。可選 English、简体中文 和 繁體中文。\"],\"HCNlq3\":[\"乾淨、高對比,接近純白。\"],\"HHDyGw\":[\"柔綠\"],\"HKH+W+\":[\"資料\"],\"Hp1l6f\":[\"目前\"],\"HxlY7t\":[\"變更此設定會更新訂閱者從 /feed 取得的內容。\"],\"HxuOlm\":[\"網站頁首\"],\"I4HRxU\":[\"已發布的全部貼文,包括從 Latest 中隱藏的那些。\"],\"I6gXOa\":[\"路徑\"],\"I76CzF\":[\"中性灰\"],\"ID38tA\":[\"示範模式下帳號刪除已停用。共用示範會另行重置。\"],\"IF9tPu\":[\"何時使用網站匯出、資料庫備份與復原演練。\"],\"IW5PBo\":[\"複製權杖\"],\"IagCbF\":[\"URL\"],\"IfB3m6\":[\"你撰寫內容所用的語言。透過 HTML lang 和 RSS 向讀者與搜尋引擎宣告。支援任意 BCP 47 標籤。\"],\"IreQBq\":[\"儲存庫\"],\"J6bLeg\":[\"新增自訂連結到任何 URL\"],\"JL7LF5\":[\"可用的 CSS 變數、data 屬性與範例.\"],\"JTviaO\":[\"管理登入安全、匯出,以及不可逆的操作。\"],\"JcD7qf\":[\"更多操作\"],\"JjX0OO\":[\"請立即複製您的權杖 — 它不會再顯示。\"],\"JrFTcr\":[\"連線中…\"],\"JuN5GC\":[\"未選取檔案。請選擇要上傳的檔案。\"],\"KDw4GX\":[\"重試\"],\"KSgo21\":[\"選擇一個儲存庫\"],\"KVVYBh\":[\"新增選集到導覽\"],\"KiJn9B\":[\"筆記\"],\"KwOLJF\":[\"Jant 最初的配色,日常穩妥之選。\"],\"L3DEwT\":[\"移除這個頭像?您的 favicon 與頁首圖示會回復為預設。\"],\"L4t4/q\":[\"3月14日\"],\"LdyooL\":[\"連結\"],\"M/D8PK\":[\"+ 安裝到其他帳戶\"],\"M/haSd\":[\"永遠顯示主題的淺色版本。\"],\"M2kIWU\":[\"字型主題\"],\"M6CbAU\":[\"切換編輯面板\"],\"MaYYE6\":[\"透過向 Telegram 機器人傳送訊息來發佈筆記\"],\"Me5t5H\":[\"連接 GitHub 倉庫,自動將你的文章備份為 Markdown 檔案。GitHub 上的編輯會同步回你的網站。\"],\"Mr4QPw\":[\"要斷開 Telegram?您可以隨時使用新的綁定代碼重新連接。\"],\"MtENL9\":[\"調整您的網站外觀、可讀性與執行效能。\"],\"N/8NPV\":[\"在刪除前,請先下載網站匯出檔案。刪除後無法恢復此帳號。\"],\"N7UNHY\":[\"精選 RSS 來源\"],\"NHnUHF\":[\"頁首上的網站圖示與個人標記\"],\"NU2Fqi\":[\"儲存 CSS\"],\"NVjhde\":[\"暖羊皮紙\"],\"Nldjdr\":[\"尚未有自訂 URL。建立一個自訂 URL 以為文章新增重新導向或自訂路徑。\"],\"O7rgs6\":[\"頁首 RSS 指向你的 \",[\"feed\"],\" 訂閱 (/feed)。在「一般」中變更 /feed 回傳的內容。\"],\"OSJXFg\":[\"套用於整個網站, 包括管理頁面. 選擇一個調色盤, 然後決定它是跟隨系統還是維持固定.\"],\"Ox3+3h\":[\"無相符結果。\"],\"PEUV5I\":[\"程式碼注入已更新。\"],\"PHh52z\":[\"暖而厚重,棕調明顯。\"],\"PXj9lw\":[\"停止接受來自 Telegram 的貼文。您現有的筆記會保持已發佈。\"],\"PZ7HJ8\":[\"部落格大頭貼\"],\"Pwqkdw\":[\"載入中…\"],\"PxJ9W6\":[\"產生權杖\"],\"Q/6Y+2\":[\"需要在目標儲存庫上擁有 Contents(讀/寫)和 Webhooks(讀/寫)權限。\"],\"Q30z/l\":[\"要從導覽移除這個選集嗎?選集本身不會被刪除。\"],\"Q99OtV\":[\"將選集釘選到導覽列。最近 48 小時內更新的選集旁會顯示一個 * 號。\"],\"QCwsv1\":[\"暖白\"],\"QKvrmL\":[\"暖中性,適合長讀。\"],\"QZmz0H\":[\"內建連結\"],\"Qnrzvb\":[\"已啟用的權杖\"],\"R6Z4LE\":[\"下載失敗。請再試一次。\"],\"R9Khdg\":[\"自動\"],\"RcdDOS\":[\"在 Telegram 上向 @BotFather 發送訊息以建立機器人,然後貼上它提供給你的權杖\"],\"RdVIcf\":[\"奶油配深咖\"],\"RxsRD6\":[\"時區\"],\"SJmfuf\":[\"網站名稱\"],\"SKZhW9\":[\"權杖名稱 (API 權杖名稱欄位。)\"],\"SVQQPe\":[\"無法連線。請檢查錯誤並再試一次。\"],\"SchpMp\":[\"Telegram\"],\"SrGs4T\":[\"淺藍灰底,冷靜而均勻。\"],\"TpF3v+\":[\"在 </head> 之前注入。用於分析、自訂 meta 標籤,以及必須提前載入的樣式。\"],\"Tz0i8g\":[\"設定\"],\"UFK415\":[\"用於分析與小工具的網站全域 HTML\"],\"UTvFQq\":[\"開啟 \",[\"linkOpen\"],\"@\",[\"botUsername\"],[\"linkClose\"],\" 並傳送:\"],\"Uj/btJ\":[\"在我的網站頁首顯示大頭貼\"],\"UsODUn\":[\"選擇一個帳戶\"],\"UxKoFf\":[\"導覽\"],\"V+bhUy\":[\"安裝 GitHub App\"],\"V4WsyL\":[\"新增連結\"],\"V5pZwT\":[\"搜尋設定已更新。\"],\"VXUPla\":[\"使用 GitHub App 連線\"],\"VhMDMg\":[\"變更密碼\"],\"Vn3jYy\":[\"導覽項目\"],\"VoZYGU\":[\"這會永久刪除您所有的資料 — 文章、媒體、選集、設定,以及您的帳戶。您的部落格將被重設為初始設定狀態。此操作無法復原。\"],\"WUnFK2\":[\"偏冷的淺白底,配深靛藍文字。高對比。\"],\"Wa9q4P\":[\"純白\"],\"Weq9zb\":[\"一般\"],\"Wi9i06\":[\"依照每位訪客的系統偏好。\"],\"Wx1M8N\":[\"安裝 GitHub App,以授予存取權而無需管理個人權杖。權限以每個儲存庫為範圍,並可在 GitHub 上撤銷。\"],\"X+8FMk\":[\"目前的密碼不符。請再試一次。\"],\"X1G9eY\":[\"導覽預覽\"],\"X2Cbc2\":[\"封存 RSS 來源\"],\"X9Hujr\":[\"手動推送\"],\"XtBJV8\":[\"正在檢查儲存庫…\"],\"Xtc16w\":[\"重新整理儲存庫清單\"],\"Y/F35r\":[\"使用 curl 建立貼文:\"],\"Y/N5N7\":[\"柔和的奶油底,配低飽和的綠。\"],\"YF6zHf\":[\"網站設定已更新.\"],\"YdG2RF\":[\"匯出網站\"],\"YkgZi7\":[\"連接一個 Telegram 機器人,之後你傳給它的任何訊息都會以筆記形式已發佈。\"],\"YwhjRx\":[\"管理帳戶\"],\"Yxp859\":[\"暖奶油色\"],\"ZDY7Fy\":[\"同步中…\"],\"ZQKLI1\":[\"危險區域\"],\"ZS/CBL\":[\"刪除此導覽連結?訪客將不再在您的網站頁首看到它。\"],\"ZgZX+d\":[\"純白底配中性灰。不帶任何色偏。\"],\"ZhhOwV\":[\"引用 (Jant 的貼文格式之一。)\"],\"ZiooJI\":[\"API 權杖\"],\"Zm7Qb0\":[\"備份與還原指南\"],\"ZmUkwN\":[\"新增自訂連結到導覽\"],\"a14mj8\":[\"未知裝置\"],\"a1iEgy\":[\"暖奶油底,配深咖啡棕點綴。\"],\"a3LDKx\":[\"安全性\"],\"aAIQg2\":[\"外觀\"],\"aFkzVF\":[\"目標文章或選集的 slug\"],\"alKG0+\":[\"字型主題\"],\"anibOb\":[\"關於本部落格\"],\"any7NR\":[\"主題指南\"],\"b+/jO6\":[\"301 (永久)\"],\"bHOiy1\":[\"示範模式已停用變更密碼功能。請使用共用示範帳號登入。\"],\"bHYIks\":[\"登出\"],\"bV2vng\":[\"暖陶土色\"],\"bbR5vW\":[\"這套配色\"],\"bmrL08\":[\"示範模式會隱藏會話、密碼更改與帳號刪除。匯出功能仍可使用。\"],\"bviiKV\":[\"這個主題下的標題、正文和連結。\"],\"c3MN2z\":[\"所有可用的端點與請求格式。\"],\"cS7/bk\":[\"移除已儲存的機器人權杖?其 webhook 會被刪除,任何已連接的帳號將會被斷線。\"],\"cSDy01\":[\"自訂 CSS 已更新.\"],\"clzoNp\":[\"始終顯示深色主題。\"],\"cnGeoo\":[\"刪除\"],\"d3FRkY\":[\"無法複製. 請再試一次.\"],\"d5oGUo\":[\"在 GitHub 建立新儲存庫\"],\"dEgA5A\":[\"取消\"],\"dTXUY+\":[\"確認刪除帳號\"],\"dYKrp3\":[\"從最新中隱藏 (不出現在 Latest 中,但仍可透過固定連結和集合存取的狀態。)\"],\"dk7TCH\":[\"永久刪除所有資料並重設部落格\"],\"drodVV\":[\"目前還沒有選集。請先建立一個,然後將它加入您的導覽。\"],\"dsWkIw\":[\"要與 GitHub 斷開連線嗎? webhook 將會被移除。您的儲存庫內容不會被刪除。\"],\"e/tSI5\":[\"導覽順序已更新。\"],\"eOL7vn\":[\"色彩極少,干擾最小。\"],\"ePK91l\":[\"編輯\"],\"ebQKK7\":[\"網站\"],\"egK+Yy\":[\"供腳本與自動化使用的 Bearer 權杖\"],\"ehj/zN\":[\"重新導向類型\"],\"eneWvv\":[\"草稿\"],\"erTMh7\":[\"上次同步\"],\"f+m8jj\":[\"已複製訂閱網址。\"],\"f8fH8W\":[\"設計\"],\"fKRAwQ\":[\"沙色底,配綠色點綴。\"],\"fWYqkz\":[\"程式碼注入\"],\"fYXQnC\":[\"暖色裡最濃的一檔,溫馨。\"],\"gOWiTY\":[\"載入為中文、日文或韓文內容最佳化的襯線字型。\"],\"gZ5owP\":[\"搜尋儲存庫\"],\"gbqbh6\":[\"可以放心離開此頁面 — 同步會在背景繼續進行。\"],\"gkFvVN\":[\"在 </body> 之前注入。用於聊天小工具和不應阻塞頁面載入的腳本。\"],\"gtQsRO\":[\"建立自訂網址\"],\"hBO/y4\":[\"安全權杖已過期。請重新整理頁面並再試一次。\"],\"hGmyDl\":[\"權杖讓您從腳本, 捷徑和其他工具存取 API 無需登入\"],\"hIHkRy\":[\"已透過 GitHub 應用程式連線\"],\"hdSi1b\":[\"輸入 \",[\"repo\"],\" 以確認\"],\"he3ygx\":[\"複製\"],\"i0qMbr\":[\"首頁\"],\"iEUzMn\":[\"系統\"],\"iSLIjg\":[\"連接\"],\"iVOMRi\":[\"首頁設定已更新。\"],\"icB4Cv\":[\"將連結拖到此處以顯示於「更多」選單下方\"],\"id3vuh\":[\"已設定 Telegram,但無法連線到機器人。請檢查機器人權杖並再試一次。\"],\"ihn4zD\":[\"搜尋…\"],\"iiDXZc\":[\"顯示於所有文章與頁面的底部。\"],\"itS31B\":[\"更暖一些,像略舊的紙。\"],\"iwQZvS\":[\"冷藍灰\"],\"j4VrG6\":[\"下載匯出 ZIP\"],\"j5nQL2\":[\"例如 iOS 捷徑\"],\"jUV7CU\":[\"上傳大頭貼\"],\"jVUmOK\":[\"支援 Markdown\"],\"jdVYS8\":[\"選一個適合你文字的。\"],\"jgBjXJ\":[\"要撤銷這個權杖嗎?任何使用它的腳本都會停止運作。\"],\"jpctdh\":[\"檢視\"],\"k1ifdL\":[\"處理中...\"],\"kLw03Y\":[\"亮紙白\"],\"kMXclu\":[\"下載網站匯出檔案\"],\"kNiQp6\":[\"已釘選\"],\"kRhzWq\":[\"GitHub 同步\"],\"kVQs7s\":[\"細緻的樣式覆寫\"],\"ke1gWS\":[\"自訂 URL\"],\"kfcRb0\":[\"頭像\"],\"kxDZ2i\":[\"此程式碼會在您網站的每個頁面上執行。\"],\"l2Op2p\":[\"查詢參數\"],\"lLW3vJ\":[\"目標 slug\"],\"lV04bQ\":[\"溫暖、有泥土感,但不顯暗。\"],\"lYHJih\":[\"撤銷此工作階段?該裝置將需要重新登入。\"],\"mLOk1i\":[\"立即將所有文章推送到 GitHub,而不是等待下一次自動同步。\"],\"mSNmrX\":[\"列出貼文:\"],\"nG2qTk\":[\"示例連結\"],\"nK07ni\":[\"為您的網站選擇一種排版風格。每個主題會同時改變字體配對與閱讀節奏。\"],\"nbfdhU\":[\"第三方整合\"],\"ntJYyh\":[\"在 \",[\"providerLabel\"],\" 管理網域、方案和計費\"],\"o/vNDE\":[\"讓您覆寫任何主題變數。\"],\"oGC9uP\":[\"owner/repo\"],\"oH2JHg\":[\"我們會預先填入名稱 \",[\"name\"],\"。返回時清單會重新整理。\"],\"oKOOsY\":[\"色彩主題\"],\"oL535e\":[\"尚未同步\"],\"oNA4If\":[\"所有選集已經在您的導覽中。\"],\"oUn9Z7\":[\"近中性的淺灰,配鋼藍點綴。\"],\"ofdy2l\":[\"帶橘調的底色。最暖的一套。\"],\"pZq3aX\":[\"上傳失敗。請再試一次。\"],\"pgTIrt\":[\"選擇要與此網站同步的 GitHub 帳號和儲存庫.\"],\"psoxDF\":[\"該字型主題無法使用. 請選擇其他主題.\"],\"pvnfJD\":[\"深色\"],\"q+hNag\":[\"選集\"],\"qdcESc\":[\"建立新儲存庫\"],\"r5EW6f\":[\"此儲存庫已在備份另一個 Jant 網站 (\",[\"host\"],\"). 請選擇其他儲存庫.\"],\"rEspiY\":[\"導覽位置已更新。\"],\"rFmBG3\":[\"色彩主題\"],\"rlonmB\":[\"無法刪除。請稍後再試。\"],\"satWc6\":[\"主要 RSS 訂閱\"],\"sgr2wQ\":[\"選集\"],\"soRdOu\":[\"米白紙底,配深森綠。\"],\"sqxcaY\":[\"建立於 \",[\"date\"]],\"sxkWRg\":[\"進階\"],\"t/YqKh\":[\"移除\"],\"t3hvHq\":[\"立即同步\"],\"tJ4H0O\":[\"您的 Telegram 帳號\"],\"tfDRzk\":[\"儲存\"],\"tvgAq5\":[\"尚未授權任何帳戶\"],\"u1VTd3\":[\"調色盤、表面色調與整體氛圍\"],\"u3wRF+\":[\"已發佈\"],\"u6KOjV\":[\"想要更細緻的控制?\"],\"udPwLB\":[\"頁首\"],\"ui6aMF\":[\"這些裝置目前已登入您的帳號。撤銷任何您不認識的工作階段。\"],\"vBEKwo\":[\"在此管理本網站的活動工作階段。密碼與託管存取由 \",[\"providerLabel\"],\" 管理。\"],\"vRldcl\":[\"字體選擇與閱讀質感\"],\"vSYKYI\":[\"主要訂閱來源\"],\"vTuib7\":[\"這會控制 /feed 回傳的內容。\"],\"vmQmHx\":[\"新增自訂 CSS 以覆寫任何樣式。使用像 [data-page]、[data-post]、[data-format] 這類資料屬性來選取特定元素。\"],\"vzX5FB\":[\"刪除帳號\"],\"w8Rv8T\":[\"標籤為必填\"],\"wL3cK8\":[\"最新\"],\"wW6NCp\":[\"上次錯誤\"],\"wc+17X\":[\"/* 在此放入您的自訂 CSS */\"],\"wuLtXn\":[\"目前沒有任何活動中的工作階段。已登入的裝置會顯示在此處。\"],\"xCWek4\":[\"檔案儲存尚未設定。請檢查您的伺服器設定。\"],\"xHt036\":[\"個人存取權杖\"],\"xKeZ0l\":[\"更偏暖、偏土的色調。\"],\"xYbozN\":[\"柔象牙白\"],\"xqViCq\":[\"暖象牙白\"],\"xxaahd\":[\"想要更冷、更利落的觀感時。\"],\"y28hnO\":[\"文章\"],\"y8Md/V\":[\"語言與時間已更新。\"],\"yNCqOt\":[\"最新 RSS 來源\"],\"yQ3kNF\":[\"請輸入以下短語以確認:\"],\"ydq1k2\":[\"請先選擇一個帳戶\"],\"yjjCV8\":[\"固定的 RSS 檔案網址\"],\"yjkELF\":[\"確認新密碼\"],\"yzF66j\":[\"連結 (Jant 的貼文格式之一。)\"],\"z6wakA\":[\"顯示在您的主頁上的簡短介紹。\"],\"zEizrk\":[\"最後使用於 \",[\"date\"]],\"zSURJW\":[\"沒有符合的儲存庫.\"],\"zXH2jX\":[\"語言與時區\"],\"zlcDd2\":[\"刪除此自訂 URL?使用該 URL 的訪客將不會再被重新導向。\"],\"zwBp5t\":[\"私有\"],\"zxRN6H\":[\"頁首連結、首頁動態與更多選單\"]}");
|
|
1925
|
+
var messages = JSON.parse("{\"++YsxG\":[\"讀者和搜尋引擎看到的是\"],\"+4Z6iP\":[\"先在 GitHub 上建立儲存庫 — 可以是空的。\"],\"+9JI/F\":[\"連線後會將您的網站同步到 \",[\"repo\"],\" 的預設分支,並疊加在其現有歷史之上。Jant 管理路徑外的既有檔案會保留。此操作無法復原。\"],\"+AXdXp\":[\"標籤與 URL 為必填\"],\"+K0AvT\":[\"解除連線\"],\"+wgt7C\":[\"低飽和的紅棕底,溫暖、有泥土感。\"],\"+zy2Nq\":[\"類型\"],\"/3H2/s\":[\"此託管網站透過 \",[\"providerLabel\"],\" 登入。請在該處管理密碼與託管存取權限。\"],\"/PXXBT\":[\"近乎純白,帶一點暖意。\"],\"/zOUxl\":[\"連結至 Telegram 機器人的 QR 碼\"],\"0OGSSc\":[\"頭像顯示已更新.\"],\"0UzCUX\":[\"更新您用來登入的密碼\"],\"0bdA9b\":[\"開啟 Telegram 以連線\"],\"0gECZD\":[\"想寫更完整的介紹?\"],\"0uIjy/\":[\"淺鼠尾草綠底,配同色系的綠。\"],\"10UtuM\":[\"CJK 字體\"],\"1F6Mzc\":[\"目前尚無導覽項目。請新增連結或在下方啟用系統項目。\"],\"1H7gng\":[\"後台語言\"],\"1mbBbL\":[\"手動連接\"],\"1njn7W\":[\"淺色\"],\"1qGdnL\":[\"預設主題。沉靜,適合長時間閱讀。\"],\"2DoBvq\":[\"訂閱來源\"],\"2FYpfJ\":[\"更多\"],\"2Ithfh\":[\"傳送任何文字給機器人,該文字會作為筆記已發佈。\"],\"2PTjMB\":[\"我想刪除 \",[\"siteName\"]],\"2cFU6q\":[\"網站頁尾\"],\"2fPEPI\":[\"沉靜、偏冷的底色。\"],\"2lkk2l\":[\"微黃的紙底,配橄欖綠。\"],\"2oWZo7\":[\"最近一次提交\"],\"2uuy4H\":[\"已透過個人存取權杖連線\"],\"2wK4BX\":[\"編輯 About 頁面\"],\"35x8eZ\":[\"顯示 \",[\"shown\"],\" 共 \",[\"total\"]],\"39QGku\":[\"開啟機器人並傳送綁定碼,之後你傳給它的任何訊息都會成為筆記。\"],\"3Cw1AI\":[\"新增選集\"],\"3VrybB\":[\"重新導向\"],\"3Yvsaz\":[\"302 (暫時)\"],\"3n0zbB\":[\"在示範模式中已停用工作階段管理。請改用共用示範工作階段。\"],\"3sYJi5\":[\"下載與 Hugo 相容的封存 — 以靜態方式託管或移轉到另一個 Jant\"],\"3wKq0C\":[\"無法儲存。請稍後再試。\"],\"49Bsal\":[\"Feed 設定已更新。\"],\"4Jge8E\":[\"目前的工作階段\"],\"4KIa+q\":[\"已下載匯出檔案。\"],\"4cEClj\":[\"工作階段\"],\"4yyXWu\":[\"淺骨白底,配低飽和的綠。\"],\"4zGJ5E\":[\"永久刪除帳戶\"],\"5QlUIt\":[\"倉庫為空。準備連線。\"],\"5VQnR3\":[\"當你想要一個永遠不會改變的 feed URL 時,請使用這些。\"],\"5dpcN1\":[\"輸入以搜尋全部\"],\"5f1Wo9\":[\"已以 \",[\"account\"],\" 連線\"],\"5o8R81\":[\"極淺的象牙底,配淡淡的茶綠。\"],\"6ArdBh\":[\"將精選文章用於 /feed.\"],\"6DjeBT\":[\"示範網站會始終對搜尋引擎保持隱藏。\"],\"6E3aK4\":[\"管理託管\"],\"6FFB7q\":[\"使用最新的公開貼文作為 /feed。\"],\"6K1Vef\":[\"確定要永久刪除此部落格嗎?此動作無法復原。\"],\"6NpNLc\":[\"此儲存庫已有內容。\"],\"6V3Ea3\":[\"已複製\"],\"6WdDG7\":[\"頁面\"],\"71WIgc\":[\"取得新代碼\"],\"746NHh\":[\"此部落格\"],\"7811AW\":[\"此儲存庫已在備份本網站。\"],\"7FCZPo\":[\"內容語言\"],\"7FaY4u\":[\"用法\"],\"7G9YLi\":[\"允許搜尋引擎收錄我的網站\"],\"7GISOt\":[\"儲存機器人權杖\"],\"7MZxzw\":[\"密碼已變更.\"],\"7vhWI8\":[\"新密碼\"],\"81nFIS\":[\"密碼不符。請確認兩個欄位相同。\"],\"87a/t/\":[\"標籤\"],\"89Upyo\":[\"該主題目前不可用。請選擇其他主題。\"],\"8BfEpW\":[\"託管帳號\"],\"8N/Mcp\":[\"封存篩選參數 (例如 format=note&view=list)\"],\"8T46pB\":[\"機器人權杖\"],\"8U2Z7f\":[\"新增自訂 URL\"],\"8ZsakT\":[\"密碼\"],\"8gEghq\":[\"明亮的暖白底,配苔綠點綴。\"],\"9+vGLh\":[\"自訂 CSS\"],\"9As8Nu\":[\"在 GitHub 上建立一個\"],\"9EjI4j\":[\"暖沙色\"],\"9J6wUO\":[\"建議新增的連結\"],\"9Lsvt5\":[\"已於 \",[\"date\"],\" 登入\"],\"9T7Cwm\":[\"重新導向、自訂路徑與網址控制\"],\"9aUyym\":[\"查看您在哪裡已登入,並撤銷舊的工作階段\"],\"A1taO8\":[\"搜尋\"],\"AeXO77\":[\"帳戶\"],\"AnY+O9\":[\"在首頁底部顯示「Build with Jant」\"],\"ApZDMk\":[\"此圖會用於您的 favicon 和 apple-touch-icon。為達最佳效果,請上傳至少 512x512 像素、背景為純色的正方形 PNG。\"],\"B495Gs\":[\"封存\"],\"B4ESok\":[\"API 參考\"],\"BTYdze\":[\"連結已新增到導覽。\"],\"BzEFor\":[\"或\"],\"CDAdlf\":[\"移除機器人\"],\"CTAEes\":[\"選擇儲存庫\"],\"CjZZgz\":[\"此儲存庫已有提交紀錄\"],\"D8k2s6\":[\"連接 Telegram\"],\"DCKkhU\":[\"目前密碼\"],\"DKKKeF\":[\"在 \",[\"providerLabel\"],\" 管理密碼與託管存取\"],\"DVFXa6\":[\"最乾淨、最中性的一檔。\"],\"EO3I6h\":[\"上傳未成功. 請稍後再試.\"],\"Eax/et\":[\"強調色\"],\"Enslfm\":[\"目標網址\"],\"F53UDu\":[\"冷白\"],\"F7FKwe\":[\"你在此處貼上的任何內容都能完全存取訪客的瀏覽器。僅使用來自你信任來源的程式碼。\"],\"F8SNqr\":[\"暖橘\"],\"FMUJSP\":[\"帳戶與資料\"],\"Fk3SSD\":[\"平靜自然,看著舒服。\"],\"FkMol5\":[\"精選\"],\"G/1oP+\":[\"移除 webhook 並停止同步。您的儲存庫內容不會被刪除。\"],\"G0qJsQ\":[\"找不到安全權杖。請重新整理頁面後再試一次。\"],\"G39wnK\":[\"將內容備份並與 GitHub 儲存庫同步\"],\"GMMWcy\":[\"名稱, 中繼資料, 語言, 和 搜尋預設值\"],\"GXsAby\":[\"撤銷\"],\"GxkJXS\":[\"上傳中...\"],\"GzKzUa\":[\"試用限制\"],\"H4x7Sk\":[\"後台介面顯示的語言。可選 English、简体中文 和 繁體中文。\"],\"HCNlq3\":[\"乾淨、高對比,接近純白。\"],\"HHDyGw\":[\"柔綠\"],\"HKH+W+\":[\"資料\"],\"Hp1l6f\":[\"目前\"],\"HxlY7t\":[\"變更此設定會更新訂閱者從 /feed 取得的內容。\"],\"HxuOlm\":[\"網站頁首\"],\"I4HRxU\":[\"已發布的全部貼文,包括從 Latest 中隱藏的那些。\"],\"I6gXOa\":[\"路徑\"],\"I76CzF\":[\"中性灰\"],\"ID38tA\":[\"示範模式下帳號刪除已停用。共用示範會另行重置。\"],\"IF9tPu\":[\"何時使用網站匯出、資料庫備份與復原演練。\"],\"IW5PBo\":[\"複製權杖\"],\"IagCbF\":[\"URL\"],\"IfB3m6\":[\"你撰寫內容所用的語言。透過 HTML lang 和 RSS 向讀者與搜尋引擎宣告。支援任意 BCP 47 標籤。\"],\"IreQBq\":[\"儲存庫\"],\"J6bLeg\":[\"新增自訂連結到任何 URL\"],\"JL7LF5\":[\"可用的 CSS 變數、data 屬性與範例.\"],\"JcD7qf\":[\"更多操作\"],\"JjX0OO\":[\"請立即複製您的權杖 — 它不會再顯示。\"],\"JrFTcr\":[\"連線中…\"],\"JuN5GC\":[\"未選取檔案。請選擇要上傳的檔案。\"],\"KDw4GX\":[\"重試\"],\"KSgo21\":[\"選擇一個儲存庫\"],\"KVVYBh\":[\"新增選集到導覽\"],\"KiJn9B\":[\"筆記\"],\"KwOLJF\":[\"Jant 最初的配色,日常穩妥之選。\"],\"L3DEwT\":[\"移除這個頭像?您的 favicon 與頁首圖示會回復為預設。\"],\"L4t4/q\":[\"3月14日\"],\"LdyooL\":[\"連結\"],\"LjwaJ/\":[\"登入、匯出和刪除\"],\"M/D8PK\":[\"+ 安裝到其他帳戶\"],\"M/haSd\":[\"永遠顯示主題的淺色版本。\"],\"M2kIWU\":[\"字型主題\"],\"M6CbAU\":[\"切換編輯面板\"],\"MaYYE6\":[\"透過向 Telegram 機器人傳送訊息來發佈筆記\"],\"Me5t5H\":[\"連接 GitHub 倉庫,自動將你的文章備份為 Markdown 檔案。GitHub 上的編輯會同步回你的網站。\"],\"Mr4QPw\":[\"要斷開 Telegram?您可以隨時使用新的綁定代碼重新連接。\"],\"MtENL9\":[\"調整您的網站外觀、可讀性與執行效能。\"],\"N/8NPV\":[\"在刪除前,請先下載網站匯出檔案。刪除後無法恢復此帳號。\"],\"N7UNHY\":[\"精選 RSS 來源\"],\"NHnUHF\":[\"頁首上的網站圖示與個人標記\"],\"NU2Fqi\":[\"儲存 CSS\"],\"NVjhde\":[\"暖羊皮紙\"],\"Nldjdr\":[\"尚未有自訂 URL。建立一個自訂 URL 以為文章新增重新導向或自訂路徑。\"],\"O7rgs6\":[\"頁首 RSS 指向你的 \",[\"feed\"],\" 訂閱 (/feed)。在「一般」中變更 /feed 回傳的內容。\"],\"OSJXFg\":[\"套用於整個網站, 包括管理頁面. 選擇一個調色盤, 然後決定它是跟隨系統還是維持固定.\"],\"Ox3+3h\":[\"無相符結果。\"],\"PEUV5I\":[\"程式碼注入已更新。\"],\"PHh52z\":[\"暖而厚重,棕調明顯。\"],\"PXj9lw\":[\"停止接受來自 Telegram 的貼文。您現有的筆記會保持已發佈。\"],\"PZ7HJ8\":[\"部落格大頭貼\"],\"Pwqkdw\":[\"載入中…\"],\"PxJ9W6\":[\"產生權杖\"],\"Q/6Y+2\":[\"需要在目標儲存庫上擁有 Contents(讀/寫)和 Webhooks(讀/寫)權限。\"],\"Q30z/l\":[\"要從導覽移除這個選集嗎?選集本身不會被刪除。\"],\"Q99OtV\":[\"將選集釘選到導覽列。最近 48 小時內更新的選集旁會顯示一個 * 號。\"],\"QCwsv1\":[\"暖白\"],\"QKvrmL\":[\"暖中性,適合長讀。\"],\"QZmz0H\":[\"內建連結\"],\"Qnrzvb\":[\"已啟用的權杖\"],\"R6Z4LE\":[\"下載失敗。請再試一次。\"],\"R9Khdg\":[\"自動\"],\"RcdDOS\":[\"在 Telegram 上向 @BotFather 發送訊息以建立機器人,然後貼上它提供給你的權杖\"],\"RdVIcf\":[\"奶油配深咖\"],\"RxsRD6\":[\"時區\"],\"SJmfuf\":[\"網站名稱\"],\"SKZhW9\":[\"權杖名稱 (API 權杖名稱欄位。)\"],\"SVQQPe\":[\"無法連線。請檢查錯誤並再試一次。\"],\"SchpMp\":[\"Telegram\"],\"SrGs4T\":[\"淺藍灰底,冷靜而均勻。\"],\"TpF3v+\":[\"在 </head> 之前注入。用於分析、自訂 meta 標籤,以及必須提前載入的樣式。\"],\"Tu6bMZ\":[\"建立 About 頁面\"],\"Tz0i8g\":[\"設定\"],\"UFK415\":[\"用於分析與小工具的網站全域 HTML\"],\"UTvFQq\":[\"開啟 \",[\"linkOpen\"],\"@\",[\"botUsername\"],[\"linkClose\"],\" 並傳送:\"],\"Uj/btJ\":[\"在我的網站頁首顯示大頭貼\"],\"UsODUn\":[\"選擇一個帳戶\"],\"UxKoFf\":[\"導覽\"],\"V+bhUy\":[\"安裝 GitHub App\"],\"V4WsyL\":[\"新增連結\"],\"V5pZwT\":[\"搜尋設定已更新。\"],\"VXUPla\":[\"使用 GitHub App 連線\"],\"VhMDMg\":[\"變更密碼\"],\"Vn3jYy\":[\"導覽項目\"],\"VoZYGU\":[\"這會永久刪除您所有的資料 — 文章、媒體、選集、設定,以及您的帳戶。您的部落格將被重設為初始設定狀態。此操作無法復原。\"],\"WUnFK2\":[\"偏冷的淺白底,配深靛藍文字。高對比。\"],\"Wa9q4P\":[\"純白\"],\"Wb7EHo\":[\"About 頁面\"],\"Weq9zb\":[\"一般\"],\"Wi9i06\":[\"依照每位訪客的系統偏好。\"],\"Wx1M8N\":[\"安裝 GitHub App,以授予存取權而無需管理個人權杖。權限以每個儲存庫為範圍,並可在 GitHub 上撤銷。\"],\"X+8FMk\":[\"目前的密碼不符。請再試一次。\"],\"X1G9eY\":[\"導覽預覽\"],\"X2Cbc2\":[\"封存 RSS 來源\"],\"X9Hujr\":[\"手動推送\"],\"XtBJV8\":[\"正在檢查儲存庫…\"],\"Xtc16w\":[\"重新整理儲存庫清單\"],\"Y/F35r\":[\"使用 curl 建立貼文:\"],\"Y/N5N7\":[\"柔和的奶油底,配低飽和的綠。\"],\"YF6zHf\":[\"網站設定已更新.\"],\"YdG2RF\":[\"匯出網站\"],\"YkgZi7\":[\"連接一個 Telegram 機器人,之後你傳給它的任何訊息都會以筆記形式已發佈。\"],\"YwhjRx\":[\"管理帳戶\"],\"Yxp859\":[\"暖奶油色\"],\"ZDY7Fy\":[\"同步中…\"],\"ZQKLI1\":[\"危險區域\"],\"ZS/CBL\":[\"刪除此導覽連結?訪客將不再在您的網站頁首看到它。\"],\"ZgZX+d\":[\"純白底配中性灰。不帶任何色偏。\"],\"ZhhOwV\":[\"引用\"],\"ZiooJI\":[\"API 權杖\"],\"Zm7Qb0\":[\"備份與還原指南\"],\"ZmUkwN\":[\"新增自訂連結到導覽\"],\"a14mj8\":[\"未知裝置\"],\"a1iEgy\":[\"暖奶油底,配深咖啡棕點綴。\"],\"a3LDKx\":[\"安全性\"],\"aAIQg2\":[\"外觀\"],\"aFkzVF\":[\"目標文章或選集的 slug\"],\"alKG0+\":[\"字型主題\"],\"anibOb\":[\"關於本部落格\"],\"any7NR\":[\"主題指南\"],\"b+/jO6\":[\"301 (永久)\"],\"bHOiy1\":[\"示範模式已停用變更密碼功能。請使用共用示範帳號登入。\"],\"bHYIks\":[\"登出\"],\"bV2vng\":[\"暖陶土色\"],\"bbR5vW\":[\"這套配色\"],\"bbzY7X\":[\"管理登入安全、站點匯出和無法復原的操作。\"],\"bmrL08\":[\"示範模式會隱藏會話、密碼更改與帳號刪除。匯出功能仍可使用。\"],\"bviiKV\":[\"這個主題下的標題、正文和連結。\"],\"c3MN2z\":[\"所有可用的端點與請求格式。\"],\"cS7/bk\":[\"移除已儲存的機器人權杖?其 webhook 會被刪除,任何已連接的帳號將會被斷線。\"],\"cSDy01\":[\"自訂 CSS 已更新.\"],\"clzoNp\":[\"始終顯示深色主題。\"],\"cnGeoo\":[\"刪除\"],\"d3FRkY\":[\"無法複製. 請再試一次.\"],\"d5oGUo\":[\"在 GitHub 建立新儲存庫\"],\"dEgA5A\":[\"取消\"],\"dTXUY+\":[\"確認刪除帳號\"],\"dYKrp3\":[\"從最新中隱藏 (不出現在 Latest 中,但仍可透過固定連結和集合存取的狀態。)\"],\"dk7TCH\":[\"永久刪除所有資料並重設部落格\"],\"drodVV\":[\"目前還沒有選集。請先建立一個,然後將它加入您的導覽。\"],\"dsWkIw\":[\"要與 GitHub 斷開連線嗎? webhook 將會被移除。您的儲存庫內容不會被刪除。\"],\"e/tSI5\":[\"導覽順序已更新。\"],\"eOL7vn\":[\"色彩極少,干擾最小。\"],\"ePK91l\":[\"編輯\"],\"ebQKK7\":[\"網站\"],\"egK+Yy\":[\"供腳本與自動化使用的 Bearer 權杖\"],\"ehj/zN\":[\"重新導向類型\"],\"eneWvv\":[\"草稿\"],\"erTMh7\":[\"上次同步\"],\"f+m8jj\":[\"已複製訂閱網址。\"],\"f8fH8W\":[\"設計\"],\"fKRAwQ\":[\"沙色底,配綠色點綴。\"],\"fWYqkz\":[\"程式碼注入\"],\"fYXQnC\":[\"暖色裡最濃的一檔,溫馨。\"],\"gOWiTY\":[\"載入為中文、日文或韓文內容最佳化的襯線字型。\"],\"gZ5owP\":[\"搜尋儲存庫\"],\"gbqbh6\":[\"可以放心離開此頁面 — 同步會在背景繼續進行。\"],\"gkFvVN\":[\"在 </body> 之前注入。用於聊天小工具和不應阻塞頁面載入的腳本。\"],\"gtQsRO\":[\"建立自訂網址\"],\"hBO/y4\":[\"安全權杖已過期。請重新整理頁面並再試一次。\"],\"hGmyDl\":[\"權杖讓您從腳本, 捷徑和其他工具存取 API 無需登入\"],\"hIHkRy\":[\"已透過 GitHub 應用程式連線\"],\"hdSi1b\":[\"輸入 \",[\"repo\"],\" 以確認\"],\"he3ygx\":[\"複製\"],\"i0qMbr\":[\"首頁\"],\"iEUzMn\":[\"系統\"],\"iSLIjg\":[\"連接\"],\"iVOMRi\":[\"首頁設定已更新。\"],\"icB4Cv\":[\"將連結拖到此處以顯示於「更多」選單下方\"],\"id3vuh\":[\"已設定 Telegram,但無法連線到機器人。請檢查機器人權杖並再試一次。\"],\"ihn4zD\":[\"搜尋…\"],\"iiDXZc\":[\"顯示於所有文章與頁面的底部。\"],\"itS31B\":[\"更暖一些,像略舊的紙。\"],\"iwQZvS\":[\"冷藍灰\"],\"j4VrG6\":[\"下載匯出 ZIP\"],\"j5nQL2\":[\"例如 iOS 捷徑\"],\"jUV7CU\":[\"上傳大頭貼\"],\"jVUmOK\":[\"支援 Markdown\"],\"jdVYS8\":[\"選一個適合你文字的。\"],\"jgBjXJ\":[\"要撤銷這個權杖嗎?任何使用它的腳本都會停止運作。\"],\"jpctdh\":[\"檢視\"],\"k1ifdL\":[\"處理中...\"],\"kLw03Y\":[\"亮紙白\"],\"kMXclu\":[\"下載網站匯出檔案\"],\"kNiQp6\":[\"已釘選\"],\"kRhzWq\":[\"GitHub 同步\"],\"kVQs7s\":[\"細緻的樣式覆寫\"],\"ke1gWS\":[\"自訂 URL\"],\"kfcRb0\":[\"頭像\"],\"kxDZ2i\":[\"此程式碼會在您網站的每個頁面上執行。\"],\"l2Op2p\":[\"查詢參數\"],\"lLW3vJ\":[\"目標 slug\"],\"lV04bQ\":[\"溫暖、有泥土感,但不顯暗。\"],\"lYHJih\":[\"撤銷此工作階段?該裝置將需要重新登入。\"],\"m16xKo\":[\"新增\"],\"mLOk1i\":[\"立即將所有文章推送到 GitHub,而不是等待下一次自動同步。\"],\"mSNmrX\":[\"列出貼文:\"],\"n8+EXe\":[\"新增網站中已經存在的常用入口。\"],\"nG2qTk\":[\"示例連結\"],\"nK07ni\":[\"為您的網站選擇一種排版風格。每個主題會同時改變字體配對與閱讀節奏。\"],\"nbfdhU\":[\"第三方整合\"],\"ntJYyh\":[\"在 \",[\"providerLabel\"],\" 管理網域、方案和計費\"],\"o/vNDE\":[\"讓您覆寫任何主題變數。\"],\"oGC9uP\":[\"owner/repo\"],\"oH2JHg\":[\"我們會預先填入名稱 \",[\"name\"],\"。返回時清單會重新整理。\"],\"oKOOsY\":[\"色彩主題\"],\"oL535e\":[\"尚未同步\"],\"oNA4If\":[\"所有選集已經在您的導覽中。\"],\"oUn9Z7\":[\"近中性的淺灰,配鋼藍點綴。\"],\"ofdy2l\":[\"帶橘調的底色。最暖的一套。\"],\"pZq3aX\":[\"上傳失敗。請再試一次。\"],\"pgTIrt\":[\"選擇要與此網站同步的 GitHub 帳號和儲存庫.\"],\"psoxDF\":[\"該字型主題無法使用. 請選擇其他主題.\"],\"pt4OhQ\":[\"/about 已被佔用。重新命名該項目後再建立 About 頁面。\"],\"pvnfJD\":[\"深色\"],\"q+hNag\":[\"選集\"],\"qdcESc\":[\"建立新儲存庫\"],\"r5EW6f\":[\"此儲存庫已在備份另一個 Jant 網站 (\",[\"host\"],\"). 請選擇其他儲存庫.\"],\"rEspiY\":[\"導覽位置已更新。\"],\"rFmBG3\":[\"色彩主題\"],\"rlonmB\":[\"無法刪除。請稍後再試。\"],\"satWc6\":[\"主要 RSS 訂閱\"],\"sgr2wQ\":[\"選集\"],\"soRdOu\":[\"米白紙底,配深森綠。\"],\"sqxcaY\":[\"建立於 \",[\"date\"]],\"sxkWRg\":[\"進階\"],\"t/YqKh\":[\"移除\"],\"t3hvHq\":[\"立即同步\"],\"tJ4H0O\":[\"您的 Telegram 帳號\"],\"tfDRzk\":[\"儲存\"],\"tvgAq5\":[\"尚未授權任何帳戶\"],\"u1VTd3\":[\"調色盤、表面色調與整體氛圍\"],\"u3wRF+\":[\"已發佈\"],\"u6KOjV\":[\"想要更細緻的控制?\"],\"udPwLB\":[\"頁首\"],\"ui6aMF\":[\"這些裝置目前已登入您的帳號。撤銷任何您不認識的工作階段。\"],\"vBEKwo\":[\"在此管理本網站的活動工作階段。密碼與託管存取由 \",[\"providerLabel\"],\" 管理。\"],\"vOnuOa\":[\"在頁首和更多選單中顯示或隱藏內建目的地。\"],\"vRldcl\":[\"字體選擇與閱讀質感\"],\"vSYKYI\":[\"主要訂閱來源\"],\"vTuib7\":[\"這會控制 /feed 回傳的內容。\"],\"vmQmHx\":[\"新增自訂 CSS 以覆寫任何樣式。使用像 [data-page]、[data-post]、[data-format] 這類資料屬性來選取特定元素。\"],\"vzX5FB\":[\"刪除帳號\"],\"w8Rv8T\":[\"標籤為必填\"],\"wL3cK8\":[\"最新\"],\"wW6NCp\":[\"上次錯誤\"],\"wc+17X\":[\"/* 在此放入您的自訂 CSS */\"],\"wuLtXn\":[\"目前沒有任何活動中的工作階段。已登入的裝置會顯示在此處。\"],\"xCWek4\":[\"檔案儲存尚未設定。請檢查您的伺服器設定。\"],\"xHt036\":[\"個人存取權杖\"],\"xKeZ0l\":[\"更偏暖、偏土的色調。\"],\"xYbozN\":[\"柔象牙白\"],\"xqViCq\":[\"暖象牙白\"],\"xxaahd\":[\"想要更冷、更利落的觀感時。\"],\"y/awtV\":[\"頁首連結、內建目的地與更多選單\"],\"y28hnO\":[\"文章\"],\"y8Md/V\":[\"語言與時間已更新。\"],\"yNCqOt\":[\"最新 RSS 來源\"],\"yQ3kNF\":[\"請輸入以下短語以確認:\"],\"ydq1k2\":[\"請先選擇一個帳戶\"],\"yjjCV8\":[\"固定的 RSS 檔案網址\"],\"yjkELF\":[\"確認新密碼\"],\"yzF66j\":[\"連結\"],\"z6wakA\":[\"顯示在您的主頁上的簡短介紹。\"],\"zEizrk\":[\"最後使用於 \",[\"date\"]],\"zSURJW\":[\"沒有符合的儲存庫.\"],\"zXH2jX\":[\"語言與時區\"],\"zlcDd2\":[\"刪除此自訂 URL?使用該 URL 的訪客將不會再被重新導向。\"],\"zwBp5t\":[\"私有\"]}");
|
|
1926
1926
|
//#endregion
|
|
1927
1927
|
//#region src/i18n/i18n.ts
|
|
1928
1928
|
/**
|
|
@@ -3452,10 +3452,10 @@ function normalizeThemeColorForMeta(color) {
|
|
|
3452
3452
|
* internal paths (e.g. `/_assets/client-HASH.js`) embedded by the Worker build
|
|
3453
3453
|
* from the Vite client manifest. Used only in production (IS_VITE_DEV=false).
|
|
3454
3454
|
*/ var IS_VITE_DEV = typeof __JANT_DEV__ !== "undefined" && __JANT_DEV__ === true;
|
|
3455
|
-
var CORE_VERSION = "0.6.
|
|
3456
|
-
var CLIENT_JS_FILE = "/_assets/client-
|
|
3457
|
-
var CLIENT_AUTH_JS_FILE = "/_assets/client-auth-
|
|
3458
|
-
var CLIENT_CSS_FILE = "/_assets/client-
|
|
3455
|
+
var CORE_VERSION = "0.6.13-aaa5a490f3013f33";
|
|
3456
|
+
var CLIENT_JS_FILE = "/_assets/client-3_OaxhTs.js";
|
|
3457
|
+
var CLIENT_AUTH_JS_FILE = "/_assets/client-auth-TsYq90xm.js";
|
|
3458
|
+
var CLIENT_CSS_FILE = "/_assets/client-DCrcHVJl.css";
|
|
3459
3459
|
var CLIENT_CJK_CSS_FILE = "/_assets/client-cjk-B7Z0snDu.css";
|
|
3460
3460
|
var CLIENT_CJK_TC_CSS_FILE = "/_assets/client-cjk-tc-BesJYrb2.css";
|
|
3461
3461
|
var CLIENT_CJK_JP_CSS_FILE = "/_assets/client-cjk-jp-DZwrTzQC.css";
|
|
@@ -3774,7 +3774,7 @@ var IconSprite = () => {
|
|
|
3774
3774
|
const cjkSerifFont = appConfig?.cjkSerifFont ?? "off";
|
|
3775
3775
|
const cjkStylesheetPath = cjkSerifFont === "zh-Hans" ? IS_VITE_DEV ? assetPath("/src/style-cjk.css") : toPublicAssetPath(CLIENT_CJK_CSS_FILE, assetBasePath) : cjkSerifFont === "zh-Hant" ? IS_VITE_DEV ? assetPath("/src/style-cjk-tc.css") : toPublicAssetPath(CLIENT_CJK_TC_CSS_FILE, assetBasePath) : cjkSerifFont === "ja" ? IS_VITE_DEV ? assetPath("/src/style-cjk-jp.css") : toPublicAssetPath(CLIENT_CJK_JP_CSS_FILE, assetBasePath) : cjkSerifFont === "ko" ? IS_VITE_DEV ? assetPath("/src/style-cjk-kr.css") : toPublicAssetPath(CLIENT_CJK_KR_CSS_FILE, assetBasePath) : null;
|
|
3776
3776
|
const clientScriptPath = IS_VITE_DEV ? resolvedClientBundle === "full" ? assetPath("/src/client-auth.ts") : assetPath("/src/client.ts") : toPublicAssetPath(resolvedClientBundle === "full" ? CLIENT_AUTH_JS_FILE : CLIENT_JS_FILE, assetBasePath);
|
|
3777
|
-
const faviconAssetVersion = resolvedFaviconVersion || "0.6.
|
|
3777
|
+
const faviconAssetVersion = resolvedFaviconVersion || "0.6.13-aaa5a490f3013f33";
|
|
3778
3778
|
const resolvedFaviconHref = faviconHref ?? (faviconAssetVersion ? toPublicPath(`/favicon.ico?v=${faviconAssetVersion}`, sitePathPrefix) : toPublicPath("/favicon.ico", sitePathPrefix));
|
|
3779
3779
|
const resolvedAppleTouchHref = appleTouchHref ?? (faviconAssetVersion ? toPublicPath(`/apple-touch-icon.png?v=${faviconAssetVersion}`, sitePathPrefix) : toPublicPath("/apple-touch-icon.png", sitePathPrefix));
|
|
3780
3780
|
const socialImageHref = resolvedSocialImagePath ? toAbsoluteAssetUrl(resolvedSocialImagePath, appConfig?.siteUrl || "", sitePathPrefix) : "";
|
|
@@ -4245,15 +4245,6 @@ var STORAGE_DRIVERS = [
|
|
|
4245
4245
|
* Configuration System
|
|
4246
4246
|
*
|
|
4247
4247
|
* Single Source of Truth for all configuration fields.
|
|
4248
|
-
*/ /**
|
|
4249
|
-
* Configuration Registry - Single Source of Truth
|
|
4250
|
-
*
|
|
4251
|
-
* All available configuration fields with their metadata.
|
|
4252
|
-
* Add new fields here, and they'll automatically work everywhere.
|
|
4253
|
-
*
|
|
4254
|
-
* Priority logic:
|
|
4255
|
-
* - envOnly: false -> User-configurable (DB > ENV > Default)
|
|
4256
|
-
* - envOnly: true -> Environment-only (ENV > Default)
|
|
4257
4248
|
*/ var CONFIG_FIELDS = {
|
|
4258
4249
|
SITE_NAME: {
|
|
4259
4250
|
defaultValue: "Jant",
|
|
@@ -4280,11 +4271,6 @@ var STORAGE_DRIVERS = [
|
|
|
4280
4271
|
envOnly: false,
|
|
4281
4272
|
envKeys: ["CJK_SERIF_FONT"]
|
|
4282
4273
|
},
|
|
4283
|
-
HOME_DEFAULT_VIEW: {
|
|
4284
|
-
defaultValue: "latest",
|
|
4285
|
-
envOnly: false,
|
|
4286
|
-
envKeys: ["HOME_DEFAULT_VIEW"]
|
|
4287
|
-
},
|
|
4288
4274
|
MAIN_RSS_FEED: {
|
|
4289
4275
|
defaultValue: "featured",
|
|
4290
4276
|
envOnly: false,
|
|
@@ -6920,14 +6906,14 @@ function clipPreviewText(text, maxChars) {
|
|
|
6920
6906
|
* @param item - Raw nav item from database
|
|
6921
6907
|
* @param currentPath - Current URL path for active state
|
|
6922
6908
|
* @param isAuthenticated - Whether the user is logged in (affects system settings item)
|
|
6923
|
-
*/ function toNavItemView(item, currentPath,
|
|
6909
|
+
*/ function toNavItemView(item, currentPath, isAuthenticated = false, sitePathPrefix = "", collectionFreshness, siteOrigin = "") {
|
|
6924
6910
|
let url = item.url;
|
|
6925
6911
|
let label = item.label;
|
|
6926
6912
|
if (item.type === "system" && item.systemKey) {
|
|
6927
6913
|
const config = SYSTEM_NAV_KEYS$2[item.systemKey];
|
|
6928
6914
|
if (config) url = config.url;
|
|
6929
|
-
if (item.systemKey === "latest") url =
|
|
6930
|
-
if (item.systemKey === "featured") url =
|
|
6915
|
+
if (item.systemKey === "latest") url = "/";
|
|
6916
|
+
if (item.systemKey === "featured") url = "/featured";
|
|
6931
6917
|
if (item.systemKey === "settings") {
|
|
6932
6918
|
url = isAuthenticated ? "/settings" : "/signin";
|
|
6933
6919
|
if (!isAuthenticated) label = "Sign in";
|
|
@@ -6961,8 +6947,8 @@ function clipPreviewText(text, maxChars) {
|
|
|
6961
6947
|
* @param items - Raw nav items from database
|
|
6962
6948
|
* @param currentPath - Current URL path for active state
|
|
6963
6949
|
* @param isAuthenticated - Whether the user is logged in
|
|
6964
|
-
*/ function toNavItemViews(items, currentPath,
|
|
6965
|
-
return items.map((item) => toNavItemView(item, currentPath,
|
|
6950
|
+
*/ function toNavItemViews(items, currentPath, isAuthenticated = false, sitePathPrefix = "", collectionFreshness, siteOrigin = "") {
|
|
6951
|
+
return items.map((item) => toNavItemView(item, currentPath, isAuthenticated, sitePathPrefix, collectionFreshness, siteOrigin));
|
|
6966
6952
|
}
|
|
6967
6953
|
/**
|
|
6968
6954
|
* Converts a SearchResult to a SearchResultView with PostView.
|
|
@@ -7046,9 +7032,7 @@ function clipPreviewText(text, maxChars) {
|
|
|
7046
7032
|
* Navigation Helper
|
|
7047
7033
|
*
|
|
7048
7034
|
* Provides shared data fetching for public page navigation.
|
|
7049
|
-
*/
|
|
7050
|
-
return items.find((item) => item.type === "system" && (item.systemKey === "latest" || item.systemKey === "featured"))?.systemKey === "featured" ? "featured" : "latest";
|
|
7051
|
-
}
|
|
7035
|
+
*/
|
|
7052
7036
|
/**
|
|
7053
7037
|
* Fetch navigation data for public pages.
|
|
7054
7038
|
*
|
|
@@ -7072,7 +7056,6 @@ function clipPreviewText(text, maxChars) {
|
|
|
7072
7056
|
const currentPath = c.var.publicPath;
|
|
7073
7057
|
const appConfig = c.var.appConfig;
|
|
7074
7058
|
const siteName = appConfig.siteName;
|
|
7075
|
-
const homeDefaultView = getHomeDefaultViewFromNavItems(items);
|
|
7076
7059
|
const siteFooter = appConfig.siteFooter;
|
|
7077
7060
|
const rawDescription = appConfig.siteDescriptionExplicit ? appConfig.siteDescription : "";
|
|
7078
7061
|
const siteDescription = rawDescription ? toPlainText(rawDescription) : "";
|
|
@@ -7085,8 +7068,8 @@ function clipPreviewText(text, maxChars) {
|
|
|
7085
7068
|
const collectionNavIds = [];
|
|
7086
7069
|
for (const item of items) if (item.type === "collection" && item.collectionId) collectionNavIds.push(item.collectionId);
|
|
7087
7070
|
const collectionFreshness = collectionNavIds.length > 0 ? await c.var.services.navItems.getCollectionFreshness(collectionNavIds) : void 0;
|
|
7088
|
-
const links = toNavItemViews(items, currentPath,
|
|
7089
|
-
if (isAuthenticated) collections = await c.var.services.collections.listByRecentActivity();
|
|
7071
|
+
const links = toNavItemViews(items, currentPath, isAuthenticated, appConfig.sitePathPrefix, collectionFreshness, appConfig.siteOrigin);
|
|
7072
|
+
if (isAuthenticated && options?.includeCollections !== false) collections = await c.var.services.collections.listByRecentActivity();
|
|
7090
7073
|
return {
|
|
7091
7074
|
links,
|
|
7092
7075
|
currentPath,
|
|
@@ -7096,7 +7079,6 @@ function clipPreviewText(text, maxChars) {
|
|
|
7096
7079
|
siteDescriptionHtml,
|
|
7097
7080
|
isAuthenticated,
|
|
7098
7081
|
collections,
|
|
7099
|
-
homeDefaultView,
|
|
7100
7082
|
siteAvatarUrl,
|
|
7101
7083
|
showHeaderAvatar: showHeaderAvatar && !!siteAvatarUrl,
|
|
7102
7084
|
siteFooterHtml
|
|
@@ -7272,6 +7254,10 @@ var getCollectionMutationLabels = (i18n) => ({
|
|
|
7272
7254
|
cancel: i18n._({ id: "dEgA5A" }),
|
|
7273
7255
|
imageNotRehosted: i18n._({ id: "Y7WAtz" }),
|
|
7274
7256
|
imagesNotRehosted: i18n._({ id: "nJ4U1U" }),
|
|
7257
|
+
brokenImageUnavailable: i18n._({ id: "MZTcRq" }),
|
|
7258
|
+
brokenImageDelete: i18n._({ id: "+jw/c1" }),
|
|
7259
|
+
brokenImageReplace: i18n._({ id: "YOzD/a" }),
|
|
7260
|
+
brokenImageOpen: i18n._({ id: "MRYGql" }),
|
|
7275
7261
|
note: i18n._({ id: "KiJn9B" }),
|
|
7276
7262
|
link: i18n._({ id: "yzF66j" }),
|
|
7277
7263
|
quote: i18n._({ id: "ZhhOwV" }),
|
|
@@ -7642,7 +7628,18 @@ function HeaderLink({ link, label, className = "" }) {
|
|
|
7642
7628
|
children: [label, link.isExternal && /* @__PURE__ */ jsxDEV$1(ExternalLinkIcon$1, {})]
|
|
7643
7629
|
});
|
|
7644
7630
|
}
|
|
7645
|
-
|
|
7631
|
+
function linkCollapseTier(idx) {
|
|
7632
|
+
if (idx < 2) return "";
|
|
7633
|
+
if (idx === 2) return "site-header-link-collapse-sm";
|
|
7634
|
+
if (idx === 3) return "site-header-link-collapse-md";
|
|
7635
|
+
return "site-header-link-collapse-lg";
|
|
7636
|
+
}
|
|
7637
|
+
function moreLinkRevealTier(idx) {
|
|
7638
|
+
if (idx === 2) return "site-header-more-link-show-sm";
|
|
7639
|
+
if (idx === 3) return "site-header-more-link-show-md";
|
|
7640
|
+
return "site-header-more-link-show-lg";
|
|
7641
|
+
}
|
|
7642
|
+
var SiteHeader = ({ siteName, links, currentPath, sitePathPrefix = "", siteAvatarUrl, showHeaderAvatar }) => {
|
|
7646
7643
|
const { i18n } = useLingui();
|
|
7647
7644
|
const linksWithLabels = links.map((link) => ({
|
|
7648
7645
|
...link,
|
|
@@ -7651,21 +7648,10 @@ var SiteLayout = ({ siteName, links, currentPath, sitePathPrefix = "", isAuthent
|
|
|
7651
7648
|
const searchLabel = i18n._({ id: "hrkGms" });
|
|
7652
7649
|
const searchHref = toPublicPath("/search", sitePathPrefix);
|
|
7653
7650
|
const menuLabel = i18n._({ id: "zucql+" });
|
|
7651
|
+
const closeMenuLabel = i18n._({ id: "vcpc5o" });
|
|
7654
7652
|
const moreLabel = i18n._(NAV_MORE_LABEL);
|
|
7655
|
-
const newPostLabel = i18n._({ id: "2B7HLH" });
|
|
7656
7653
|
const headerLinks = linksWithLabels.filter((l) => l.placement === "header" || !l.placement);
|
|
7657
7654
|
const moreLinks = linksWithLabels.filter((l) => l.placement === "more");
|
|
7658
|
-
function linkCollapseTier(idx) {
|
|
7659
|
-
if (idx < 2) return "";
|
|
7660
|
-
if (idx === 2) return "site-header-link-collapse-sm";
|
|
7661
|
-
if (idx === 3) return "site-header-link-collapse-md";
|
|
7662
|
-
return "site-header-link-collapse-lg";
|
|
7663
|
-
}
|
|
7664
|
-
function moreLinkRevealTier(idx) {
|
|
7665
|
-
if (idx === 2) return "site-header-more-link-show-sm";
|
|
7666
|
-
if (idx === 3) return "site-header-more-link-show-md";
|
|
7667
|
-
return "site-header-more-link-show-lg";
|
|
7668
|
-
}
|
|
7669
7655
|
const hasResponsiveOverflow = headerLinks.length > 2;
|
|
7670
7656
|
const hasSupplementalMoreLinks = moreLinks.length > 0;
|
|
7671
7657
|
const showMoreMenu = hasResponsiveOverflow || hasSupplementalMoreLinks;
|
|
@@ -7679,236 +7665,254 @@ var SiteLayout = ({ siteName, links, currentPath, sitePathPrefix = "", isAuthent
|
|
|
7679
7665
|
responsiveTierClass
|
|
7680
7666
|
].filter(Boolean).join(" ");
|
|
7681
7667
|
const isHomePage = currentPath === toPublicPath("/", sitePathPrefix) || currentPath === toPublicPath("/featured", sitePathPrefix) || currentPath === toPublicPath("/latest", sitePathPrefix);
|
|
7682
|
-
|
|
7683
|
-
|
|
7684
|
-
|
|
7685
|
-
|
|
7686
|
-
|
|
7687
|
-
|
|
7688
|
-
].filter(Boolean).join(" ");
|
|
7689
|
-
return /* @__PURE__ */ jsxDEV$1("div", {
|
|
7690
|
-
class: "site-page",
|
|
7691
|
-
children: [
|
|
7692
|
-
showHeader && /* @__PURE__ */ jsxDEV$1("header", {
|
|
7693
|
-
class: "site-header",
|
|
7668
|
+
return /* @__PURE__ */ jsxDEV$1(Fragment$1, { children: [
|
|
7669
|
+
/* @__PURE__ */ jsxDEV$1("header", {
|
|
7670
|
+
class: "site-header",
|
|
7671
|
+
"data-site-header-fragment": "header",
|
|
7672
|
+
children: /* @__PURE__ */ jsxDEV$1("div", {
|
|
7673
|
+
class: "site-header-inner",
|
|
7694
7674
|
children: /* @__PURE__ */ jsxDEV$1("div", {
|
|
7695
|
-
class: "site-header-
|
|
7696
|
-
children:
|
|
7697
|
-
|
|
7698
|
-
|
|
7699
|
-
|
|
7700
|
-
|
|
7701
|
-
|
|
7702
|
-
|
|
7703
|
-
|
|
7704
|
-
|
|
7705
|
-
|
|
7706
|
-
|
|
7707
|
-
|
|
7708
|
-
|
|
7709
|
-
|
|
7710
|
-
|
|
7711
|
-
|
|
7712
|
-
|
|
7713
|
-
|
|
7714
|
-
|
|
7715
|
-
|
|
7716
|
-
|
|
7717
|
-
|
|
7718
|
-
|
|
7719
|
-
|
|
7720
|
-
|
|
7721
|
-
|
|
7722
|
-
|
|
7723
|
-
|
|
7724
|
-
|
|
7725
|
-
|
|
7726
|
-
|
|
7727
|
-
|
|
7728
|
-
|
|
7729
|
-
|
|
7730
|
-
|
|
7731
|
-
"stroke-linecap": "round",
|
|
7732
|
-
"stroke-linejoin": "round",
|
|
7733
|
-
"aria-hidden": "true",
|
|
7734
|
-
children: /* @__PURE__ */ jsxDEV$1("path", { d: "m6 9 6 6 6-6" })
|
|
7735
|
-
})]
|
|
7736
|
-
}), /* @__PURE__ */ jsxDEV$1("div", {
|
|
7737
|
-
id: "site-nav-more-popover",
|
|
7738
|
-
class: "site-header-more-popover",
|
|
7739
|
-
"data-popover": true,
|
|
7740
|
-
"data-align": "start",
|
|
7675
|
+
class: `site-header-top site-header-top-bordered${isHomePage ? " site-header-top-home" : ""}`,
|
|
7676
|
+
children: [
|
|
7677
|
+
/* @__PURE__ */ jsxDEV$1("a", {
|
|
7678
|
+
href: toPublicPath("/", sitePathPrefix),
|
|
7679
|
+
class: "site-logo",
|
|
7680
|
+
children: [showHeaderAvatar && siteAvatarUrl && /* @__PURE__ */ jsxDEV$1("img", {
|
|
7681
|
+
src: siteAvatarUrl,
|
|
7682
|
+
class: "site-logo-avatar",
|
|
7683
|
+
alt: ""
|
|
7684
|
+
}), siteName]
|
|
7685
|
+
}),
|
|
7686
|
+
/* @__PURE__ */ jsxDEV$1("nav", {
|
|
7687
|
+
class: "site-header-nav",
|
|
7688
|
+
"aria-label": "Primary",
|
|
7689
|
+
children: [headerLinks.map((link, idx) => /* @__PURE__ */ jsxDEV$1(HeaderLink, {
|
|
7690
|
+
link,
|
|
7691
|
+
label: link.displayLabel,
|
|
7692
|
+
className: [idx < 2 ? "site-header-link-primary" : "site-header-link-overflow", linkCollapseTier(idx)].filter(Boolean).join(" ")
|
|
7693
|
+
}, link.id)), showMoreMenu && /* @__PURE__ */ jsxDEV$1("div", {
|
|
7694
|
+
class: moreMenuClass,
|
|
7695
|
+
children: [/* @__PURE__ */ jsxDEV$1("button", {
|
|
7696
|
+
type: "button",
|
|
7697
|
+
class: "site-header-more-btn",
|
|
7698
|
+
id: "site-nav-more-trigger",
|
|
7699
|
+
"aria-haspopup": "menu",
|
|
7700
|
+
"aria-expanded": "false",
|
|
7701
|
+
children: [moreLabel, /* @__PURE__ */ jsxDEV$1("svg", {
|
|
7702
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
7703
|
+
width: "12",
|
|
7704
|
+
height: "12",
|
|
7705
|
+
viewBox: "0 0 24 24",
|
|
7706
|
+
fill: "none",
|
|
7707
|
+
stroke: "currentColor",
|
|
7708
|
+
"stroke-width": "2.5",
|
|
7709
|
+
"stroke-linecap": "round",
|
|
7710
|
+
"stroke-linejoin": "round",
|
|
7741
7711
|
"aria-hidden": "true",
|
|
7742
|
-
children:
|
|
7743
|
-
|
|
7744
|
-
|
|
7745
|
-
|
|
7746
|
-
|
|
7747
|
-
|
|
7748
|
-
|
|
7749
|
-
|
|
7750
|
-
|
|
7751
|
-
|
|
7752
|
-
|
|
7753
|
-
|
|
7754
|
-
|
|
7755
|
-
|
|
7756
|
-
|
|
7757
|
-
|
|
7758
|
-
|
|
7759
|
-
}, link.id);
|
|
7760
|
-
}),
|
|
7761
|
-
hasResponsiveOverflow && hasSupplementalMoreLinks && /* @__PURE__ */ jsxDEV$1("div", { class: "site-header-more-divider site-header-more-divider-responsive" }),
|
|
7762
|
-
moreLinks.map((link) => /* @__PURE__ */ jsxDEV$1("a", {
|
|
7712
|
+
children: /* @__PURE__ */ jsxDEV$1("path", { d: "m6 9 6 6 6-6" })
|
|
7713
|
+
})]
|
|
7714
|
+
}), /* @__PURE__ */ jsxDEV$1("div", {
|
|
7715
|
+
id: "site-nav-more-popover",
|
|
7716
|
+
class: "site-header-more-popover",
|
|
7717
|
+
"data-popover": true,
|
|
7718
|
+
"data-align": "start",
|
|
7719
|
+
"aria-hidden": "true",
|
|
7720
|
+
children: [
|
|
7721
|
+
headerLinks.slice(2).map((link, i) => {
|
|
7722
|
+
const classes = [
|
|
7723
|
+
"site-header-more-link",
|
|
7724
|
+
"site-header-more-link-responsive",
|
|
7725
|
+
moreLinkRevealTier(i + 2),
|
|
7726
|
+
link.isActive ? "site-header-more-link-active" : ""
|
|
7727
|
+
].filter(Boolean).join(" ");
|
|
7728
|
+
return /* @__PURE__ */ jsxDEV$1("a", {
|
|
7763
7729
|
href: link.url,
|
|
7764
|
-
class:
|
|
7730
|
+
class: classes,
|
|
7765
7731
|
...link.isExternal ? {
|
|
7766
7732
|
target: "_blank",
|
|
7767
7733
|
rel: "noopener noreferrer"
|
|
7768
7734
|
} : {},
|
|
7769
7735
|
...link.freshAt ? { "data-fresh-at": link.freshAt } : {},
|
|
7770
7736
|
children: [link.displayLabel, link.isExternal && /* @__PURE__ */ jsxDEV$1(ExternalLinkIcon$1, {})]
|
|
7771
|
-
}, link.id)
|
|
7772
|
-
|
|
7773
|
-
|
|
7737
|
+
}, link.id);
|
|
7738
|
+
}),
|
|
7739
|
+
hasResponsiveOverflow && hasSupplementalMoreLinks && /* @__PURE__ */ jsxDEV$1("div", { class: "site-header-more-divider site-header-more-divider-responsive" }),
|
|
7740
|
+
moreLinks.map((link) => /* @__PURE__ */ jsxDEV$1("a", {
|
|
7741
|
+
href: link.url,
|
|
7742
|
+
class: `site-header-more-link site-header-more-link-supplemental ${link.isActive ? "site-header-more-link-active" : ""}`,
|
|
7743
|
+
...link.isExternal ? {
|
|
7744
|
+
target: "_blank",
|
|
7745
|
+
rel: "noopener noreferrer"
|
|
7746
|
+
} : {},
|
|
7747
|
+
...link.freshAt ? { "data-fresh-at": link.freshAt } : {},
|
|
7748
|
+
children: [link.displayLabel, link.isExternal && /* @__PURE__ */ jsxDEV$1(ExternalLinkIcon$1, {})]
|
|
7749
|
+
}, link.id))
|
|
7750
|
+
]
|
|
7774
7751
|
})]
|
|
7775
|
-
})
|
|
7776
|
-
|
|
7777
|
-
|
|
7778
|
-
|
|
7779
|
-
|
|
7780
|
-
|
|
7781
|
-
|
|
7782
|
-
|
|
7783
|
-
|
|
7784
|
-
|
|
7785
|
-
|
|
7786
|
-
|
|
7787
|
-
|
|
7788
|
-
enterkeyhint: "search"
|
|
7789
|
-
})]
|
|
7790
|
-
}), /* @__PURE__ */ jsxDEV$1("a", {
|
|
7791
|
-
href: searchHref,
|
|
7792
|
-
class: "site-header-search-link",
|
|
7752
|
+
})]
|
|
7753
|
+
}),
|
|
7754
|
+
/* @__PURE__ */ jsxDEV$1("div", {
|
|
7755
|
+
class: "site-header-search-slot",
|
|
7756
|
+
children: [/* @__PURE__ */ jsxDEV$1("form", {
|
|
7757
|
+
class: "site-header-search-form",
|
|
7758
|
+
action: searchHref,
|
|
7759
|
+
method: "get",
|
|
7760
|
+
children: [/* @__PURE__ */ jsxDEV$1(SearchIcon, { class: "site-header-search-icon" }), /* @__PURE__ */ jsxDEV$1("input", {
|
|
7761
|
+
type: "search",
|
|
7762
|
+
name: "q",
|
|
7763
|
+
class: "site-header-search-input",
|
|
7764
|
+
placeholder: searchLabel,
|
|
7793
7765
|
"aria-label": searchLabel,
|
|
7794
|
-
|
|
7795
|
-
children: /* @__PURE__ */ jsxDEV$1(SearchIcon, { class: "site-header-search-link-icon" })
|
|
7766
|
+
enterkeyhint: "search"
|
|
7796
7767
|
})]
|
|
7797
|
-
}),
|
|
7798
|
-
|
|
7799
|
-
class: "site-header-
|
|
7800
|
-
|
|
7801
|
-
|
|
7802
|
-
|
|
7803
|
-
|
|
7804
|
-
|
|
7805
|
-
|
|
7806
|
-
|
|
7807
|
-
|
|
7808
|
-
|
|
7809
|
-
|
|
7810
|
-
|
|
7811
|
-
|
|
7812
|
-
|
|
7813
|
-
|
|
7814
|
-
|
|
7815
|
-
|
|
7816
|
-
|
|
7817
|
-
|
|
7818
|
-
|
|
7819
|
-
|
|
7820
|
-
|
|
7821
|
-
|
|
7822
|
-
|
|
7823
|
-
|
|
7824
|
-
|
|
7825
|
-
|
|
7826
|
-
|
|
7827
|
-
|
|
7828
|
-
|
|
7829
|
-
|
|
7830
|
-
|
|
7831
|
-
|
|
7832
|
-
|
|
7833
|
-
|
|
7834
|
-
|
|
7835
|
-
|
|
7836
|
-
|
|
7768
|
+
}), /* @__PURE__ */ jsxDEV$1("a", {
|
|
7769
|
+
href: searchHref,
|
|
7770
|
+
class: "site-header-search-link",
|
|
7771
|
+
"aria-label": searchLabel,
|
|
7772
|
+
title: searchLabel,
|
|
7773
|
+
children: /* @__PURE__ */ jsxDEV$1(SearchIcon, { class: "site-header-search-link-icon" })
|
|
7774
|
+
})]
|
|
7775
|
+
}),
|
|
7776
|
+
/* @__PURE__ */ jsxDEV$1("div", {
|
|
7777
|
+
class: "site-header-right",
|
|
7778
|
+
children: /* @__PURE__ */ jsxDEV$1("button", {
|
|
7779
|
+
type: "button",
|
|
7780
|
+
class: "site-header-hamburger",
|
|
7781
|
+
"aria-controls": "site-nav-drawer",
|
|
7782
|
+
"aria-expanded": "false",
|
|
7783
|
+
"aria-label": menuLabel,
|
|
7784
|
+
children: /* @__PURE__ */ jsxDEV$1("svg", {
|
|
7785
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
7786
|
+
width: "20",
|
|
7787
|
+
height: "20",
|
|
7788
|
+
viewBox: "0 0 24 24",
|
|
7789
|
+
fill: "none",
|
|
7790
|
+
stroke: "currentColor",
|
|
7791
|
+
"stroke-width": "2",
|
|
7792
|
+
"stroke-linecap": "round",
|
|
7793
|
+
"stroke-linejoin": "round",
|
|
7794
|
+
children: [
|
|
7795
|
+
/* @__PURE__ */ jsxDEV$1("line", {
|
|
7796
|
+
x1: "4",
|
|
7797
|
+
x2: "20",
|
|
7798
|
+
y1: "12",
|
|
7799
|
+
y2: "12"
|
|
7800
|
+
}),
|
|
7801
|
+
/* @__PURE__ */ jsxDEV$1("line", {
|
|
7802
|
+
x1: "4",
|
|
7803
|
+
x2: "20",
|
|
7804
|
+
y1: "6",
|
|
7805
|
+
y2: "6"
|
|
7806
|
+
}),
|
|
7807
|
+
/* @__PURE__ */ jsxDEV$1("line", {
|
|
7808
|
+
x1: "4",
|
|
7809
|
+
x2: "20",
|
|
7810
|
+
y1: "18",
|
|
7811
|
+
y2: "18"
|
|
7812
|
+
})
|
|
7813
|
+
]
|
|
7837
7814
|
})
|
|
7838
7815
|
})
|
|
7839
|
-
]
|
|
7840
|
-
})
|
|
7841
|
-
})
|
|
7842
|
-
}),
|
|
7843
|
-
/* @__PURE__ */ jsxDEV$1("div", {
|
|
7844
|
-
class: "site-nav-drawer-backdrop",
|
|
7845
|
-
"aria-hidden": "true"
|
|
7846
|
-
}),
|
|
7847
|
-
/* @__PURE__ */ jsxDEV$1("div", {
|
|
7848
|
-
id: "site-nav-drawer",
|
|
7849
|
-
class: "site-nav-drawer",
|
|
7850
|
-
role: "dialog",
|
|
7851
|
-
"aria-modal": "true",
|
|
7852
|
-
"aria-label": menuLabel,
|
|
7853
|
-
"aria-hidden": "true",
|
|
7854
|
-
inert: true,
|
|
7855
|
-
children: [/* @__PURE__ */ jsxDEV$1("div", {
|
|
7856
|
-
class: "site-nav-drawer-header",
|
|
7857
|
-
children: [/* @__PURE__ */ jsxDEV$1("a", {
|
|
7858
|
-
href: toPublicPath("/", sitePathPrefix),
|
|
7859
|
-
class: "site-nav-drawer-brand",
|
|
7860
|
-
children: [showHeaderAvatar && siteAvatarUrl && /* @__PURE__ */ jsxDEV$1("img", {
|
|
7861
|
-
src: siteAvatarUrl,
|
|
7862
|
-
class: "site-nav-drawer-brand-avatar",
|
|
7863
|
-
alt: ""
|
|
7864
|
-
}), siteName]
|
|
7865
|
-
}), /* @__PURE__ */ jsxDEV$1("button", {
|
|
7866
|
-
type: "button",
|
|
7867
|
-
class: "site-nav-drawer-close",
|
|
7868
|
-
"aria-label": i18n._({ id: "vcpc5o" }),
|
|
7869
|
-
children: /* @__PURE__ */ jsxDEV$1("svg", {
|
|
7870
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
7871
|
-
width: "20",
|
|
7872
|
-
height: "20",
|
|
7873
|
-
viewBox: "0 0 24 24",
|
|
7874
|
-
fill: "none",
|
|
7875
|
-
stroke: "currentColor",
|
|
7876
|
-
"stroke-width": "2",
|
|
7877
|
-
"stroke-linecap": "round",
|
|
7878
|
-
"stroke-linejoin": "round",
|
|
7879
|
-
children: [/* @__PURE__ */ jsxDEV$1("path", { d: "M18 6 6 18" }), /* @__PURE__ */ jsxDEV$1("path", { d: "m6 6 12 12" })]
|
|
7880
7816
|
})
|
|
7881
|
-
|
|
7882
|
-
})
|
|
7883
|
-
|
|
7884
|
-
|
|
7885
|
-
|
|
7817
|
+
]
|
|
7818
|
+
})
|
|
7819
|
+
})
|
|
7820
|
+
}),
|
|
7821
|
+
/* @__PURE__ */ jsxDEV$1("div", {
|
|
7822
|
+
class: "site-nav-drawer-backdrop",
|
|
7823
|
+
"data-site-header-fragment": "drawer-backdrop",
|
|
7824
|
+
"aria-hidden": "true"
|
|
7825
|
+
}),
|
|
7826
|
+
/* @__PURE__ */ jsxDEV$1("div", {
|
|
7827
|
+
id: "site-nav-drawer",
|
|
7828
|
+
class: "site-nav-drawer",
|
|
7829
|
+
"data-site-header-fragment": "drawer",
|
|
7830
|
+
role: "dialog",
|
|
7831
|
+
"aria-modal": "true",
|
|
7832
|
+
"aria-label": menuLabel,
|
|
7833
|
+
"aria-hidden": "true",
|
|
7834
|
+
inert: true,
|
|
7835
|
+
children: [/* @__PURE__ */ jsxDEV$1("div", {
|
|
7836
|
+
class: "site-nav-drawer-header",
|
|
7837
|
+
children: [/* @__PURE__ */ jsxDEV$1("a", {
|
|
7838
|
+
href: toPublicPath("/", sitePathPrefix),
|
|
7839
|
+
class: "site-nav-drawer-brand",
|
|
7840
|
+
children: [showHeaderAvatar && siteAvatarUrl && /* @__PURE__ */ jsxDEV$1("img", {
|
|
7841
|
+
src: siteAvatarUrl,
|
|
7842
|
+
class: "site-nav-drawer-brand-avatar",
|
|
7843
|
+
alt: ""
|
|
7844
|
+
}), siteName]
|
|
7845
|
+
}), /* @__PURE__ */ jsxDEV$1("button", {
|
|
7846
|
+
type: "button",
|
|
7847
|
+
class: "site-nav-drawer-close",
|
|
7848
|
+
"aria-label": closeMenuLabel,
|
|
7849
|
+
children: /* @__PURE__ */ jsxDEV$1("svg", {
|
|
7850
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
7851
|
+
width: "20",
|
|
7852
|
+
height: "20",
|
|
7853
|
+
viewBox: "0 0 24 24",
|
|
7854
|
+
fill: "none",
|
|
7855
|
+
stroke: "currentColor",
|
|
7856
|
+
"stroke-width": "2",
|
|
7857
|
+
"stroke-linecap": "round",
|
|
7858
|
+
"stroke-linejoin": "round",
|
|
7859
|
+
children: [/* @__PURE__ */ jsxDEV$1("path", { d: "M18 6 6 18" }), /* @__PURE__ */ jsxDEV$1("path", { d: "m6 6 12 12" })]
|
|
7860
|
+
})
|
|
7861
|
+
})]
|
|
7862
|
+
}), /* @__PURE__ */ jsxDEV$1("nav", {
|
|
7863
|
+
class: "site-nav-drawer-nav",
|
|
7864
|
+
"aria-label": "Primary",
|
|
7865
|
+
children: [headerLinks.map((link) => /* @__PURE__ */ jsxDEV$1("a", {
|
|
7866
|
+
href: link.url,
|
|
7867
|
+
class: `site-nav-drawer-link ${link.isActive ? "site-nav-drawer-link-active" : ""}`,
|
|
7868
|
+
...link.isExternal ? {
|
|
7869
|
+
target: "_blank",
|
|
7870
|
+
rel: "noopener noreferrer"
|
|
7871
|
+
} : {},
|
|
7872
|
+
...link.freshAt ? { "data-fresh-at": link.freshAt } : {},
|
|
7873
|
+
children: [link.displayLabel, link.isExternal && /* @__PURE__ */ jsxDEV$1(ExternalLinkIcon$1, {})]
|
|
7874
|
+
}, link.id)), moreLinks.length > 0 && /* @__PURE__ */ jsxDEV$1(Fragment$1, { children: [
|
|
7875
|
+
/* @__PURE__ */ jsxDEV$1("div", { class: "site-nav-drawer-divider" }),
|
|
7876
|
+
/* @__PURE__ */ jsxDEV$1("span", {
|
|
7877
|
+
class: "site-nav-drawer-section-label",
|
|
7878
|
+
children: moreLabel
|
|
7879
|
+
}),
|
|
7880
|
+
moreLinks.map((link) => /* @__PURE__ */ jsxDEV$1("a", {
|
|
7886
7881
|
href: link.url,
|
|
7887
|
-
class: `site-nav-drawer-link ${link.isActive ? "site-nav-drawer-link-active" : ""}`,
|
|
7882
|
+
class: `site-nav-drawer-link site-nav-drawer-link-secondary ${link.isActive ? "site-nav-drawer-link-active" : ""}`,
|
|
7888
7883
|
...link.isExternal ? {
|
|
7889
7884
|
target: "_blank",
|
|
7890
7885
|
rel: "noopener noreferrer"
|
|
7891
7886
|
} : {},
|
|
7892
7887
|
...link.freshAt ? { "data-fresh-at": link.freshAt } : {},
|
|
7893
7888
|
children: [link.displayLabel, link.isExternal && /* @__PURE__ */ jsxDEV$1(ExternalLinkIcon$1, {})]
|
|
7894
|
-
}, link.id))
|
|
7895
|
-
|
|
7896
|
-
|
|
7897
|
-
|
|
7898
|
-
|
|
7899
|
-
|
|
7900
|
-
|
|
7901
|
-
|
|
7902
|
-
|
|
7903
|
-
|
|
7904
|
-
|
|
7905
|
-
|
|
7906
|
-
|
|
7907
|
-
|
|
7908
|
-
|
|
7909
|
-
|
|
7910
|
-
|
|
7911
|
-
|
|
7889
|
+
}, link.id))
|
|
7890
|
+
] })]
|
|
7891
|
+
})]
|
|
7892
|
+
})
|
|
7893
|
+
] });
|
|
7894
|
+
};
|
|
7895
|
+
var SiteLayout = ({ siteName, links, currentPath, sitePathPrefix = "", isAuthenticated, collections, siteAvatarUrl, showHeaderAvatar, siteDescriptionHtml, siteFooterHtml, showHomeBranding = false, sidebar, uploadMaxFileSize, showComposeDialog = true, showHeader = true, composeOpenShortcutDiscovered = false, slashCommandDiscovered = false, composeCollectionId, children }) => {
|
|
7896
|
+
const { i18n } = useLingui();
|
|
7897
|
+
const newPostLabel = i18n._({ id: "2B7HLH" });
|
|
7898
|
+
const isHomePage = currentPath === toPublicPath("/", sitePathPrefix) || currentPath === toPublicPath("/featured", sitePathPrefix) || currentPath === toPublicPath("/latest", sitePathPrefix);
|
|
7899
|
+
const showMobileComposeFab = Boolean((isHomePage || composeCollectionId) && isAuthenticated && showComposeDialog);
|
|
7900
|
+
const mobileComposeFabClick = composeCollectionId ? `document.getElementById('compose-dialog')?.querySelector('jant-compose-dialog')?.openNew(${JSON.stringify({ collectionId: composeCollectionId })})` : "document.getElementById('compose-dialog')?.querySelector('jant-compose-dialog')?.openNew()";
|
|
7901
|
+
const contentClass = [
|
|
7902
|
+
"site-content",
|
|
7903
|
+
isHomePage ? "site-content-home" : "",
|
|
7904
|
+
showMobileComposeFab ? "site-content-mobile-compose-enabled" : ""
|
|
7905
|
+
].filter(Boolean).join(" ");
|
|
7906
|
+
return /* @__PURE__ */ jsxDEV$1("div", {
|
|
7907
|
+
class: "site-page",
|
|
7908
|
+
children: [
|
|
7909
|
+
showHeader && /* @__PURE__ */ jsxDEV$1(SiteHeader, {
|
|
7910
|
+
siteName,
|
|
7911
|
+
links,
|
|
7912
|
+
currentPath,
|
|
7913
|
+
sitePathPrefix,
|
|
7914
|
+
siteAvatarUrl,
|
|
7915
|
+
showHeaderAvatar
|
|
7912
7916
|
}),
|
|
7913
7917
|
/* @__PURE__ */ jsxDEV$1("main", {
|
|
7914
7918
|
class: "site-main",
|
|
@@ -10669,58 +10673,23 @@ var PaginatedPageHeader = ({ title, currentPage = 1, totalPages, description, ic
|
|
|
10669
10673
|
});
|
|
10670
10674
|
};
|
|
10671
10675
|
//#endregion
|
|
10672
|
-
//#region src/ui/pages/FeaturedPage.tsx
|
|
10673
|
-
/**
|
|
10674
|
-
* Featured Page
|
|
10675
|
-
*
|
|
10676
|
-
* Shows featured posts as a timeline feed.
|
|
10677
|
-
*/ var FeaturedPage = ({ items, currentPage, totalPages, baseUrl }) => {
|
|
10678
|
-
const { i18n } = useLingui();
|
|
10679
|
-
return /* @__PURE__ */ jsxDEV$1("div", {
|
|
10680
|
-
"data-page": "featured",
|
|
10681
|
-
children: [/* @__PURE__ */ jsxDEV$1(PaginatedPageHeader, {
|
|
10682
|
-
title: i18n._({ id: "FkMol5" }),
|
|
10683
|
-
currentPage,
|
|
10684
|
-
totalPages,
|
|
10685
|
-
hideOnFirstPage: true,
|
|
10686
|
-
showTitle: false
|
|
10687
|
-
}), /* @__PURE__ */ jsxDEV$1("main", { children: items.length === 0 ? /* @__PURE__ */ jsxDEV$1("p", {
|
|
10688
|
-
class: "text-muted-foreground",
|
|
10689
|
-
children: i18n._({ id: "aN6wx0" })
|
|
10690
|
-
}) : /* @__PURE__ */ jsxDEV$1(TimelineFeed, {
|
|
10691
|
-
items,
|
|
10692
|
-
baseUrl,
|
|
10693
|
-
currentPage,
|
|
10694
|
-
totalPages
|
|
10695
|
-
}) })]
|
|
10696
|
-
});
|
|
10697
|
-
};
|
|
10698
|
-
//#endregion
|
|
10699
10676
|
//#region src/routes/pages/home.tsx
|
|
10700
10677
|
/**
|
|
10701
10678
|
* Home Page Route
|
|
10702
10679
|
*
|
|
10703
10680
|
* Timeline feed with per-type card components and thread previews.
|
|
10704
10681
|
* Uses page-based pagination.
|
|
10705
|
-
*
|
|
10706
|
-
* The homepage shows whichever built-in feed comes first between
|
|
10707
|
-
* Latest and Featured in navigation. The explicit feed routes still work.
|
|
10708
10682
|
*/ var homeRoutes = new Hono();
|
|
10709
10683
|
homeRoutes.get("/", async (c) => {
|
|
10710
10684
|
const i18n = getI18n(c);
|
|
10711
10685
|
const page = parsePageNumber(c.req.query("page"));
|
|
10712
10686
|
const paginatedPageTitle = formatPageLabel(page);
|
|
10713
10687
|
const isAuthenticated = c.var.isAuthenticated;
|
|
10714
|
-
const
|
|
10715
|
-
const homeDefaultView = getHomeDefaultViewFromNavItems(navItems);
|
|
10716
|
-
const timelinePromise = homeDefaultView === "featured" ? assembleFeaturedTimeline(c, {
|
|
10717
|
-
page,
|
|
10718
|
-
isAuthenticated
|
|
10719
|
-
}) : assembleTimeline(c, {
|
|
10688
|
+
const timelinePromise = assembleTimeline(c, {
|
|
10720
10689
|
page,
|
|
10721
10690
|
isAuthenticated
|
|
10722
10691
|
});
|
|
10723
|
-
const [navData, timeline] = await Promise.all([getNavigationData(c
|
|
10692
|
+
const [navData, timeline] = await Promise.all([getNavigationData(c), timelinePromise]);
|
|
10724
10693
|
const { items, currentPage, totalPages } = timeline;
|
|
10725
10694
|
const { siteUrl } = c.var.appConfig;
|
|
10726
10695
|
const websiteJsonLd = page === 1 && siteUrl ? buildWebSiteJsonLd({
|
|
@@ -10728,21 +10697,6 @@ homeRoutes.get("/", async (c) => {
|
|
|
10728
10697
|
url: toAbsoluteSiteUrl("/", siteUrl, navData.sitePathPrefix),
|
|
10729
10698
|
searchUrlTemplate: `${toAbsoluteSiteUrl("/search", siteUrl, navData.sitePathPrefix)}?q={search_term_string}`
|
|
10730
10699
|
}) : void 0;
|
|
10731
|
-
if (homeDefaultView === "featured") {
|
|
10732
|
-
const featuredTitle = i18n._({ id: "FkMol5" });
|
|
10733
|
-
return renderPublicPage(c, {
|
|
10734
|
-
title: page > 1 ? buildPageTitle(featuredTitle, paginatedPageTitle, navData.siteName) : navData.siteName,
|
|
10735
|
-
jsonLd: websiteJsonLd,
|
|
10736
|
-
navData,
|
|
10737
|
-
showHomeBranding: c.var.appConfig.showJantBrandingOnHome && currentPage === 1,
|
|
10738
|
-
content: /* @__PURE__ */ jsxDEV$1(FeaturedPage, {
|
|
10739
|
-
items,
|
|
10740
|
-
currentPage,
|
|
10741
|
-
totalPages,
|
|
10742
|
-
baseUrl: toPublicPath("/", navData.sitePathPrefix)
|
|
10743
|
-
})
|
|
10744
|
-
});
|
|
10745
|
-
}
|
|
10746
10700
|
const latestTitle = i18n._({ id: "wL3cK8" });
|
|
10747
10701
|
return renderPublicPage(c, {
|
|
10748
10702
|
title: page > 1 ? buildPageTitle(latestTitle, paginatedPageTitle, navData.siteName) : navData.siteName,
|
|
@@ -10930,8 +10884,9 @@ function resolvePostSocialImage(postView, threadPostViews) {
|
|
|
10930
10884
|
if (found) return found;
|
|
10931
10885
|
}
|
|
10932
10886
|
}
|
|
10933
|
-
function canViewPost(post,
|
|
10934
|
-
|
|
10887
|
+
function canViewPost(post, options = {}) {
|
|
10888
|
+
const isAuthenticated = options.isAuthenticated ?? false;
|
|
10889
|
+
if (post.status !== "published") return Boolean(post.status === "draft" && isAuthenticated && options.allowDraft);
|
|
10935
10890
|
if (post.visibility === "private" && !isAuthenticated) return false;
|
|
10936
10891
|
return true;
|
|
10937
10892
|
}
|
|
@@ -10944,8 +10899,7 @@ function canViewPost(post, isAuthenticated) {
|
|
|
10944
10899
|
* @returns Render-ready post card view, or null when it should not be shown
|
|
10945
10900
|
*/ async function assemblePostCardView(c, postId, options) {
|
|
10946
10901
|
const post = await c.var.services.posts.getById(postId);
|
|
10947
|
-
|
|
10948
|
-
if (!post || !canViewPost(post, isAuthenticated)) return null;
|
|
10902
|
+
if (!post || !canViewPost(post, options)) return null;
|
|
10949
10903
|
const mediaCtx = createMediaContext(c.var.appConfig);
|
|
10950
10904
|
const [rawMediaMap, collectionsMap, lastPostMap, aliasesMap] = await Promise.all([
|
|
10951
10905
|
c.var.services.media.getByPostIds([post.id]),
|
|
@@ -10968,8 +10922,7 @@ function canViewPost(post, isAuthenticated) {
|
|
|
10968
10922
|
* @returns Render-ready permalink view data, or null when it should not be shown
|
|
10969
10923
|
*/ async function assemblePostPageDisplay(c, postOrId, options) {
|
|
10970
10924
|
const post = typeof postOrId === "string" ? await c.var.services.posts.getById(postOrId) : postOrId;
|
|
10971
|
-
|
|
10972
|
-
if (!post || !canViewPost(post, isAuthenticated)) return null;
|
|
10925
|
+
if (!post || !canViewPost(post, options)) return null;
|
|
10973
10926
|
const mediaCtx = createMediaContext(c.var.appConfig);
|
|
10974
10927
|
const threadPosts = (await c.var.services.posts.getThread(post.threadId)).filter((threadPost) => threadPost.status === "published");
|
|
10975
10928
|
const allPostIds = threadPosts.length > 1 ? threadPosts.map((p) => p.id) : [post.id];
|
|
@@ -11000,6 +10953,90 @@ function canViewPost(post, isAuthenticated) {
|
|
|
11000
10953
|
};
|
|
11001
10954
|
}
|
|
11002
10955
|
//#endregion
|
|
10956
|
+
//#region src/services/about-page.ts
|
|
10957
|
+
/**
|
|
10958
|
+
* About Page Service
|
|
10959
|
+
*
|
|
10960
|
+
* Treats `/about` as the standard site About page. The page itself remains a
|
|
10961
|
+
* normal post; this service reads that convention and can create the page when
|
|
10962
|
+
* the author follows the settings prompt.
|
|
10963
|
+
*/ var ABOUT_PAGE_PATH = "/about";
|
|
10964
|
+
var ABOUT_PAGE_SLUG = "about";
|
|
10965
|
+
function createAboutPageService(deps) {
|
|
10966
|
+
async function readStatus() {
|
|
10967
|
+
const resolved = await deps.paths.resolve(ABOUT_PAGE_SLUG);
|
|
10968
|
+
const base = { path: ABOUT_PAGE_PATH };
|
|
10969
|
+
if (!resolved) return {
|
|
10970
|
+
...base,
|
|
10971
|
+
state: "missing"
|
|
10972
|
+
};
|
|
10973
|
+
if (resolved.targetType === "post" && resolved.postId) {
|
|
10974
|
+
const post = await deps.posts.getById(resolved.postId);
|
|
10975
|
+
if (!post) return {
|
|
10976
|
+
...base,
|
|
10977
|
+
state: "conflict",
|
|
10978
|
+
conflict: {
|
|
10979
|
+
targetType: "post",
|
|
10980
|
+
id: resolved.postId,
|
|
10981
|
+
title: null
|
|
10982
|
+
}
|
|
10983
|
+
};
|
|
10984
|
+
return {
|
|
10985
|
+
...base,
|
|
10986
|
+
state: "ready",
|
|
10987
|
+
post: {
|
|
10988
|
+
id: post.id,
|
|
10989
|
+
title: post.title,
|
|
10990
|
+
status: post.status,
|
|
10991
|
+
visibility: post.visibility
|
|
10992
|
+
}
|
|
10993
|
+
};
|
|
10994
|
+
}
|
|
10995
|
+
if (resolved.targetType === "collection" && resolved.collectionId) {
|
|
10996
|
+
const collection = await deps.collections.getById(resolved.collectionId);
|
|
10997
|
+
return {
|
|
10998
|
+
...base,
|
|
10999
|
+
state: "conflict",
|
|
11000
|
+
conflict: {
|
|
11001
|
+
targetType: "collection",
|
|
11002
|
+
id: resolved.collectionId,
|
|
11003
|
+
title: collection?.title ?? null
|
|
11004
|
+
}
|
|
11005
|
+
};
|
|
11006
|
+
}
|
|
11007
|
+
return {
|
|
11008
|
+
...base,
|
|
11009
|
+
state: "conflict",
|
|
11010
|
+
conflict: {
|
|
11011
|
+
targetType: resolved.targetType,
|
|
11012
|
+
id: null,
|
|
11013
|
+
title: null
|
|
11014
|
+
}
|
|
11015
|
+
};
|
|
11016
|
+
}
|
|
11017
|
+
return {
|
|
11018
|
+
getStatus: readStatus,
|
|
11019
|
+
async ensurePage() {
|
|
11020
|
+
const status = await readStatus();
|
|
11021
|
+
if (status.state === "ready") return status.post;
|
|
11022
|
+
if (status.state === "conflict") throw new ValidationError("/about is already used. Rename that item before creating an About page.");
|
|
11023
|
+
const post = await deps.posts.create({
|
|
11024
|
+
format: "note",
|
|
11025
|
+
title: "About",
|
|
11026
|
+
slug: ABOUT_PAGE_SLUG,
|
|
11027
|
+
status: "published",
|
|
11028
|
+
visibility: "latest_hidden"
|
|
11029
|
+
});
|
|
11030
|
+
return {
|
|
11031
|
+
id: post.id,
|
|
11032
|
+
title: post.title,
|
|
11033
|
+
status: post.status,
|
|
11034
|
+
visibility: post.visibility
|
|
11035
|
+
};
|
|
11036
|
+
}
|
|
11037
|
+
};
|
|
11038
|
+
}
|
|
11039
|
+
//#endregion
|
|
11003
11040
|
//#region src/db/schema.ts
|
|
11004
11041
|
/**
|
|
11005
11042
|
* Drizzle Schema
|
|
@@ -14489,6 +14526,23 @@ function getAtomTitle(post) {
|
|
|
14489
14526
|
if (post.format === "quote") return "";
|
|
14490
14527
|
return post.title || "";
|
|
14491
14528
|
}
|
|
14529
|
+
function renderLinkedText(text, href) {
|
|
14530
|
+
const label = escapeXml(text);
|
|
14531
|
+
return href ? `<a href="${escapeXml(href)}">${label}</a>` : label;
|
|
14532
|
+
}
|
|
14533
|
+
function renderInlinePostHeader(post, permalinkUrl) {
|
|
14534
|
+
if (post.format === "quote") return [];
|
|
14535
|
+
const parts = [];
|
|
14536
|
+
if (post.format === "link") {
|
|
14537
|
+
const linkUrl = post.url || "";
|
|
14538
|
+
const domain = linkUrl ? extractDisplayDomain(linkUrl) || linkUrl : "";
|
|
14539
|
+
if (domain) parts.push(`<p>${renderLinkedText(domain, linkUrl)}</p>`);
|
|
14540
|
+
if (post.title) parts.push(`<h2>${renderLinkedText(post.title, linkUrl || permalinkUrl)}</h2>`);
|
|
14541
|
+
return parts;
|
|
14542
|
+
}
|
|
14543
|
+
if (post.title) parts.push(`<h2>${renderLinkedText(post.title, permalinkUrl)}</h2>`);
|
|
14544
|
+
return parts;
|
|
14545
|
+
}
|
|
14492
14546
|
/**
|
|
14493
14547
|
* Render a star rating as HTML for feed content.
|
|
14494
14548
|
*/ function renderRatingHtml(rating) {
|
|
@@ -14578,8 +14632,10 @@ function getMediaMeta(item) {
|
|
|
14578
14632
|
*
|
|
14579
14633
|
* @param post - Post view data
|
|
14580
14634
|
* @param permalinkUrl - Absolute permalink URL back to the blog post
|
|
14581
|
-
|
|
14635
|
+
* @param options - Rendering options for top-level versus inline posts
|
|
14636
|
+
*/ function buildSinglePostContent(post, permalinkUrl, options = {}) {
|
|
14582
14637
|
const parts = [];
|
|
14638
|
+
if (options.inline) parts.push(...renderInlinePostHeader(post, permalinkUrl));
|
|
14583
14639
|
if (post.format === "quote" && post.quoteText) {
|
|
14584
14640
|
const sourceName = post.title || "";
|
|
14585
14641
|
const sourceUrl = post.url || "";
|
|
@@ -14614,10 +14670,15 @@ function getMediaMeta(item) {
|
|
|
14614
14670
|
const replyPermalink = new URL(reply.permalink, siteUrl).toString();
|
|
14615
14671
|
parts.push("<hr/>");
|
|
14616
14672
|
parts.push(`<p><small><time datetime="${escapeXml(reply.publishedAt)}">${escapeXml(reply.publishedAtFormatted)}</time></small></p>`);
|
|
14617
|
-
parts.push(buildSinglePostContent(reply, replyPermalink));
|
|
14673
|
+
parts.push(buildSinglePostContent(reply, replyPermalink, { inline: true }));
|
|
14618
14674
|
}
|
|
14619
14675
|
return parts.join("\n");
|
|
14620
14676
|
}
|
|
14677
|
+
function getEntryMedia(post) {
|
|
14678
|
+
const media = [...post.media];
|
|
14679
|
+
for (const reply of post.threadReplies ?? []) media.push(...reply.media);
|
|
14680
|
+
return media;
|
|
14681
|
+
}
|
|
14621
14682
|
/**
|
|
14622
14683
|
* Default Atom feed renderer.
|
|
14623
14684
|
*
|
|
@@ -14636,7 +14697,7 @@ function getMediaMeta(item) {
|
|
|
14636
14697
|
const publishedAt = post.feedPublishedAt ?? post.publishedAt;
|
|
14637
14698
|
const updatedAt = post.feedUpdatedAt ?? post.updatedAt;
|
|
14638
14699
|
const relatedLink = alternateUrl ? `\n <link href="${escapedPermalink}" rel="related"/>` : "";
|
|
14639
|
-
const enclosureLinks = post.
|
|
14700
|
+
const enclosureLinks = getEntryMedia(post).map((m) => {
|
|
14640
14701
|
const lengthAttr = m.size != null && m.size > 0 ? ` length="${m.size}"` : "";
|
|
14641
14702
|
const titleAttr = m.originalName ? ` title="${escapeXml(m.originalName)}"` : "";
|
|
14642
14703
|
return `\n <link rel="enclosure" type="${escapeXml(m.mimeType)}" href="${escapeXml(m.url)}"${lengthAttr}${titleAttr}/>`;
|
|
@@ -14995,6 +15056,7 @@ async function buildArchiveFeedData(c, selfPath) {
|
|
|
14995
15056
|
hasMedia: params.hasMedia,
|
|
14996
15057
|
hasTitle: params.hasTitle,
|
|
14997
15058
|
hasReplies: params.hasReplies,
|
|
15059
|
+
ignorePinnedSort: true,
|
|
14998
15060
|
...params.validYear ? {
|
|
14999
15061
|
publishedAfter: Date.UTC(params.validYear, 0, 1) / 1e3,
|
|
15000
15062
|
publishedBefore: Date.UTC(params.validYear + 1, 0, 1) / 1e3
|
|
@@ -15689,6 +15751,7 @@ async function renderCollectionFeed(c, slugExpression, feedPathOverride) {
|
|
|
15689
15751
|
const entries = await c.var.services.posts.listCollectionFeedEntriesForCollections(selection.collections.map((collection) => collection.id), {
|
|
15690
15752
|
status: "published",
|
|
15691
15753
|
excludePrivate: true,
|
|
15754
|
+
ignoreCollectionPinnedSort: true,
|
|
15692
15755
|
limit: feedLimit
|
|
15693
15756
|
});
|
|
15694
15757
|
const posts = entries.map((entry) => entry.post);
|
|
@@ -15873,9 +15936,15 @@ async function renderPostWithTextPreview(c, post, autoOpen) {
|
|
|
15873
15936
|
] })
|
|
15874
15937
|
});
|
|
15875
15938
|
}
|
|
15876
|
-
|
|
15939
|
+
function canRenderDraftAboutEditor(c, fullPath, post) {
|
|
15940
|
+
return post.status === "draft" && fullPath === "about" && c.req.query("edit") === "1" && c.var.isAuthenticated;
|
|
15941
|
+
}
|
|
15942
|
+
async function renderPost(c, post, options = {}) {
|
|
15877
15943
|
const navDataPromise = getNavigationData(c);
|
|
15878
|
-
const display = await assemblePostPageDisplay(c, post, {
|
|
15944
|
+
const display = await assemblePostPageDisplay(c, post, {
|
|
15945
|
+
isAuthenticated: true,
|
|
15946
|
+
allowDraft: options.allowDraft
|
|
15947
|
+
});
|
|
15879
15948
|
if (!display) return c.notFound();
|
|
15880
15949
|
const navData = await navDataPromise;
|
|
15881
15950
|
const meta = buildPostMeta(post, navData.siteName);
|
|
@@ -15883,15 +15952,17 @@ async function renderPost(c, post) {
|
|
|
15883
15952
|
return renderPublicPage(c, {
|
|
15884
15953
|
title: buildPageTitle(meta.title, navData.siteName),
|
|
15885
15954
|
description: meta.description,
|
|
15886
|
-
|
|
15887
|
-
|
|
15888
|
-
|
|
15889
|
-
|
|
15890
|
-
|
|
15891
|
-
|
|
15892
|
-
|
|
15893
|
-
|
|
15894
|
-
|
|
15955
|
+
...post.status === "published" ? {
|
|
15956
|
+
canonicalHref,
|
|
15957
|
+
socialImageUrl: display.socialImage?.url,
|
|
15958
|
+
socialImageAlt: display.socialImage?.alt,
|
|
15959
|
+
socialImageWidth: display.socialImage?.width,
|
|
15960
|
+
socialImageHeight: display.socialImage?.height,
|
|
15961
|
+
ogType: "article",
|
|
15962
|
+
articlePublishedTime: display.articlePublishedTime,
|
|
15963
|
+
articleModifiedTime: display.articleModifiedTime,
|
|
15964
|
+
jsonLd: buildPostJsonLd(c, display, meta, canonicalHref, navData.siteName)
|
|
15965
|
+
} : {},
|
|
15895
15966
|
navData,
|
|
15896
15967
|
content: /* @__PURE__ */ jsxDEV$1(PostPage, {
|
|
15897
15968
|
post: display.postView,
|
|
@@ -15954,7 +16025,9 @@ pageRoutes.get("/*", async (c) => {
|
|
|
15954
16025
|
if (resolved.kind === "archive" && resolved.archiveQuery) return renderArchivePage(c, Object.fromEntries(new URLSearchParams(resolved.archiveQuery)));
|
|
15955
16026
|
if (resolved.postId) {
|
|
15956
16027
|
const post = await c.var.services.posts.getById(resolved.postId);
|
|
15957
|
-
if (!post
|
|
16028
|
+
if (!post) return c.notFound();
|
|
16029
|
+
const allowDraft = canRenderDraftAboutEditor(c, fullPath, post);
|
|
16030
|
+
if (post.status === "draft" && !allowDraft) return c.notFound();
|
|
15958
16031
|
if (post.visibility === "private") {
|
|
15959
16032
|
if (!(await getNavigationData(c)).isAuthenticated) return c.notFound();
|
|
15960
16033
|
}
|
|
@@ -15962,7 +16035,7 @@ pageRoutes.get("/*", async (c) => {
|
|
|
15962
16035
|
const alias = await c.var.services.customUrls.getByTarget("post", post.id);
|
|
15963
16036
|
if (alias) return c.redirect(toPublicPath(`/${alias.path}`, sitePathPrefix), 301);
|
|
15964
16037
|
}
|
|
15965
|
-
return renderPost(c, post);
|
|
16038
|
+
return renderPost(c, post, { allowDraft });
|
|
15966
16039
|
}
|
|
15967
16040
|
if (resolved.collectionId) {
|
|
15968
16041
|
const collection = await c.var.services.collections.getById(resolved.collectionId);
|
|
@@ -16283,6 +16356,7 @@ searchRoutes.get("/", async (c) => {
|
|
|
16283
16356
|
excludeLatestHidden: true,
|
|
16284
16357
|
excludePrivate: true,
|
|
16285
16358
|
format,
|
|
16359
|
+
ignorePinnedSort: true,
|
|
16286
16360
|
limit: feedLimit
|
|
16287
16361
|
});
|
|
16288
16362
|
const rootIds = posts.filter((p) => p.threadId === p.id).map((p) => p.id);
|
|
@@ -16440,6 +16514,33 @@ feedRoutes.get("/all/atom.xml", (c) => {
|
|
|
16440
16514
|
return c.redirect(toPublicPath("/latest/feed", sitePathPrefix), 308);
|
|
16441
16515
|
});
|
|
16442
16516
|
//#endregion
|
|
16517
|
+
//#region src/ui/pages/FeaturedPage.tsx
|
|
16518
|
+
/**
|
|
16519
|
+
* Featured Page
|
|
16520
|
+
*
|
|
16521
|
+
* Shows featured posts as a timeline feed.
|
|
16522
|
+
*/ var FeaturedPage = ({ items, currentPage, totalPages, baseUrl }) => {
|
|
16523
|
+
const { i18n } = useLingui();
|
|
16524
|
+
return /* @__PURE__ */ jsxDEV$1("div", {
|
|
16525
|
+
"data-page": "featured",
|
|
16526
|
+
children: [/* @__PURE__ */ jsxDEV$1(PaginatedPageHeader, {
|
|
16527
|
+
title: i18n._({ id: "FkMol5" }),
|
|
16528
|
+
currentPage,
|
|
16529
|
+
totalPages,
|
|
16530
|
+
hideOnFirstPage: true,
|
|
16531
|
+
showTitle: false
|
|
16532
|
+
}), /* @__PURE__ */ jsxDEV$1("main", { children: items.length === 0 ? /* @__PURE__ */ jsxDEV$1("p", {
|
|
16533
|
+
class: "text-muted-foreground",
|
|
16534
|
+
children: i18n._({ id: "aN6wx0" })
|
|
16535
|
+
}) : /* @__PURE__ */ jsxDEV$1(TimelineFeed, {
|
|
16536
|
+
items,
|
|
16537
|
+
baseUrl,
|
|
16538
|
+
currentPage,
|
|
16539
|
+
totalPages
|
|
16540
|
+
}) })]
|
|
16541
|
+
});
|
|
16542
|
+
};
|
|
16543
|
+
//#endregion
|
|
16443
16544
|
//#region src/routes/pages/featured.tsx
|
|
16444
16545
|
/**
|
|
16445
16546
|
* Featured Page Route
|
|
@@ -16449,7 +16550,6 @@ feedRoutes.get("/all/atom.xml", (c) => {
|
|
|
16449
16550
|
featuredRoutes.get("/", async (c) => {
|
|
16450
16551
|
const navData = await getNavigationData(c);
|
|
16451
16552
|
const i18n = getI18n(c);
|
|
16452
|
-
if (navData.homeDefaultView === "featured") return c.redirect(toPublicPath("/", navData.sitePathPrefix), 302);
|
|
16453
16553
|
const page = parsePageNumber(c.req.query("page"));
|
|
16454
16554
|
const featuredTitle = i18n._({ id: "FkMol5" });
|
|
16455
16555
|
const paginatedPageTitle = formatPageLabel(page);
|
|
@@ -16483,34 +16583,10 @@ featuredRoutes.get("/feed/atom.xml", (c) => {
|
|
|
16483
16583
|
/**
|
|
16484
16584
|
* Latest Page Route
|
|
16485
16585
|
*
|
|
16486
|
-
*
|
|
16487
|
-
* When Latest is the homepage default, this redirects to / to avoid
|
|
16488
|
-
* duplicate content. When Featured comes first, this serves as the
|
|
16489
|
-
* explicit latest view.
|
|
16586
|
+
* The homepage is the canonical latest timeline, so /latest redirects to /.
|
|
16490
16587
|
*/ var latestRoutes = new Hono();
|
|
16491
16588
|
latestRoutes.get("/", async (c) => {
|
|
16492
|
-
|
|
16493
|
-
const i18n = getI18n(c);
|
|
16494
|
-
if (navData.homeDefaultView !== "featured") return c.redirect(toPublicPath("/", navData.sitePathPrefix), 302);
|
|
16495
|
-
const page = parsePageNumber(c.req.query("page"));
|
|
16496
|
-
const latestTitle = i18n._({ id: "wL3cK8" });
|
|
16497
|
-
const paginatedPageTitle = formatPageLabel(page);
|
|
16498
|
-
const { items, currentPage, totalPages } = await assembleTimeline(c, {
|
|
16499
|
-
page,
|
|
16500
|
-
isAuthenticated: navData.isAuthenticated
|
|
16501
|
-
});
|
|
16502
|
-
return renderPublicPage(c, {
|
|
16503
|
-
title: page > 1 ? buildPageTitle(latestTitle, paginatedPageTitle, navData.siteName) : buildPageTitle(latestTitle, navData.siteName),
|
|
16504
|
-
navData,
|
|
16505
|
-
content: /* @__PURE__ */ jsxDEV$1(HomePage, {
|
|
16506
|
-
items,
|
|
16507
|
-
baseUrl: toPublicPath("/latest", navData.sitePathPrefix),
|
|
16508
|
-
currentPage,
|
|
16509
|
-
totalPages,
|
|
16510
|
-
isAuthenticated: navData.isAuthenticated,
|
|
16511
|
-
signinUrl: `${toPublicPath("/signin", navData.sitePathPrefix)}?redirect=${encodeURIComponent(toPublicPath("/latest", navData.sitePathPrefix))}`
|
|
16512
|
-
})
|
|
16513
|
-
});
|
|
16589
|
+
return c.redirect(toPublicPath("/", c.var.appConfig.sitePathPrefix), 302);
|
|
16514
16590
|
});
|
|
16515
16591
|
latestRoutes.get("/feed", async (c) => {
|
|
16516
16592
|
return renderFeed(defaultFeedRenderer(await buildFeedData(c, {
|
|
@@ -19961,7 +20037,7 @@ function SettingsDirectoryLink({ href, icon, tone = "default", name, description
|
|
|
19961
20037
|
};
|
|
19962
20038
|
function SettingsRootContent({ sitePathPrefix = "", demoMode = false, hostedControlPlaneSiteSettingsUrl, hostedControlPlaneProviderLabel }) {
|
|
19963
20039
|
const { i18n } = useLingui();
|
|
19964
|
-
const accountDescription = demoMode ? i18n._({ id: "GzKzUa" }) : i18n._({ id: "
|
|
20040
|
+
const accountDescription = demoMode ? i18n._({ id: "GzKzUa" }) : i18n._({ id: "LjwaJ/" });
|
|
19965
20041
|
const hostingProviderLabel = hostedControlPlaneSiteSettingsUrl ? coalesceDisplayText(hostedControlPlaneProviderLabel, extractDomain(hostedControlPlaneSiteSettingsUrl)) ?? i18n._({ id: "8BfEpW" }) : null;
|
|
19966
20042
|
return /* @__PURE__ */ jsxDEV$1("div", {
|
|
19967
20043
|
class: "settings-root",
|
|
@@ -20005,7 +20081,7 @@ function SettingsRootContent({ sitePathPrefix = "", demoMode = false, hostedCont
|
|
|
20005
20081
|
href: toPublicPath("/settings/navigation", sitePathPrefix),
|
|
20006
20082
|
icon: ICONS$1.menu,
|
|
20007
20083
|
name: i18n._({ id: "UxKoFf" }),
|
|
20008
|
-
description: i18n._({ id: "
|
|
20084
|
+
description: i18n._({ id: "y/awtV" })
|
|
20009
20085
|
}),
|
|
20010
20086
|
/* @__PURE__ */ jsxDEV$1(SettingsDirectoryLink, {
|
|
20011
20087
|
href: toPublicPath("/settings/color-theme", sitePathPrefix),
|
|
@@ -20067,7 +20143,7 @@ function SettingsRootContent({ sitePathPrefix = "", demoMode = false, hostedCont
|
|
|
20067
20143
|
href: toPublicPath("/settings/account", sitePathPrefix),
|
|
20068
20144
|
icon: ICONS$1.shield,
|
|
20069
20145
|
tone: "subtle",
|
|
20070
|
-
name: i18n._({ id: "
|
|
20146
|
+
name: i18n._({ id: "FMUJSP" }),
|
|
20071
20147
|
description: accountDescription
|
|
20072
20148
|
}), hostedControlPlaneSiteSettingsUrl && hostingProviderLabel ? /* @__PURE__ */ jsxDEV$1(SettingsDirectoryLink, {
|
|
20073
20149
|
href: hostedControlPlaneSiteSettingsUrl,
|
|
@@ -20100,11 +20176,16 @@ function SettingsRootContent({ sitePathPrefix = "", demoMode = false, hostedCont
|
|
|
20100
20176
|
* component for site name, description, footer, homepage branding, language,
|
|
20101
20177
|
* timezone, and search settings.
|
|
20102
20178
|
* The settings-bridge.ts script handles server communication.
|
|
20103
|
-
*/ function GeneralContent({ siteName, siteDescription, siteLanguage, dashboardLanguage, cjkSerifFont, siteNameFallback, siteDescriptionFallback, mainRssFeed, mainFeedUrl, latestFeedUrl, featuredFeedUrl, archiveFeedUrl, timeZone, siteFooter, showJantBrandingOnHome, noindex, demoMode, timezones }) {
|
|
20179
|
+
*/ function GeneralContent({ siteName, siteDescription, siteLanguage, dashboardLanguage, cjkSerifFont, siteNameFallback, siteDescriptionFallback, mainRssFeed, mainFeedUrl, latestFeedUrl, featuredFeedUrl, archiveFeedUrl, timeZone, siteFooter, showJantBrandingOnHome, noindex, demoMode, timezones, aboutPage, aboutEditUrl, aboutCreateUrl }) {
|
|
20104
20180
|
const { i18n } = useLingui();
|
|
20105
20181
|
const labels = JSON.stringify({
|
|
20106
20182
|
general: i18n._({ id: "Weq9zb" }),
|
|
20107
20183
|
site: i18n._({ id: "ebQKK7" }),
|
|
20184
|
+
aboutPage: i18n._({ id: "Wb7EHo" }),
|
|
20185
|
+
aboutPagePrompt: i18n._({ id: "0gECZD" }),
|
|
20186
|
+
createAboutPage: i18n._({ id: "Tu6bMZ" }),
|
|
20187
|
+
editAboutPage: i18n._({ id: "2wK4BX" }),
|
|
20188
|
+
aboutPageConflict: i18n._({ id: "pt4OhQ" }),
|
|
20108
20189
|
languageAndTime: i18n._({ id: "zXH2jX" }),
|
|
20109
20190
|
home: i18n._({ id: "i0qMbr" }),
|
|
20110
20191
|
search: i18n._({ id: "A1taO8" }),
|
|
@@ -20188,6 +20269,7 @@ function SettingsRootContent({ sitePathPrefix = "", demoMode = false, hostedCont
|
|
|
20188
20269
|
label: "한국어 (Korean)"
|
|
20189
20270
|
}
|
|
20190
20271
|
]).replace(/</g, "\\u003c");
|
|
20272
|
+
const aboutPageJson = JSON.stringify(aboutPage).replace(/</g, "\\u003c");
|
|
20191
20273
|
const initialData = JSON.stringify({
|
|
20192
20274
|
siteName,
|
|
20193
20275
|
siteDescription,
|
|
@@ -20214,6 +20296,9 @@ function SettingsRootContent({ sitePathPrefix = "", demoMode = false, hostedCont
|
|
|
20214
20296
|
"featured-feed-url": featuredFeedUrl,
|
|
20215
20297
|
"archive-feed-url": archiveFeedUrl,
|
|
20216
20298
|
"demo-mode": demoMode || void 0,
|
|
20299
|
+
"about-page": aboutPageJson,
|
|
20300
|
+
"about-edit-url": aboutEditUrl,
|
|
20301
|
+
"about-create-url": aboutCreateUrl,
|
|
20217
20302
|
children: /* @__PURE__ */ jsxDEV$1("div", { children: [/* @__PURE__ */ jsxDEV$1("h2", { class: "skel-label" }), /* @__PURE__ */ jsxDEV$1("div", { class: "skel-section-lg" })] })
|
|
20218
20303
|
})
|
|
20219
20304
|
}), /* @__PURE__ */ jsxDEV$1("script", {
|
|
@@ -20271,7 +20356,7 @@ function AccountMenuContent({ sitePathPrefix = "", demoMode = false, hostedContr
|
|
|
20271
20356
|
const { i18n } = useLingui();
|
|
20272
20357
|
const isHosted = Boolean(hostedControlPlaneAccountUrl);
|
|
20273
20358
|
const providerLabel = coalesceDisplayText(hostedControlPlaneProviderLabel, hostedControlPlaneAccountUrl ? extractDomain(hostedControlPlaneAccountUrl) : void 0) ?? i18n._({ id: "8BfEpW" });
|
|
20274
|
-
const hostedIntroText = isHosted ? i18n._({ id: "vBEKwo" }, { providerLabel }) : i18n._({ id: "
|
|
20359
|
+
const hostedIntroText = isHosted ? i18n._({ id: "vBEKwo" }, { providerLabel }) : i18n._({ id: "bbzY7X" });
|
|
20275
20360
|
const hostedAlertText = isHosted && hostedControlPlaneAccountUrl ? i18n._({ id: "/3H2/s" }, { providerLabel }) : null;
|
|
20276
20361
|
const hostedManageDescription = isHosted && hostedControlPlaneAccountUrl ? i18n._({ id: "DKKKeF" }, { providerLabel }) : null;
|
|
20277
20362
|
return /* @__PURE__ */ jsxDEV$1("div", {
|
|
@@ -20281,7 +20366,7 @@ function AccountMenuContent({ sitePathPrefix = "", demoMode = false, hostedContr
|
|
|
20281
20366
|
class: "page-intro",
|
|
20282
20367
|
children: [/* @__PURE__ */ jsxDEV$1("h1", {
|
|
20283
20368
|
class: "page-intro-title page-intro-title-compact",
|
|
20284
|
-
children: i18n._({ id: "
|
|
20369
|
+
children: i18n._({ id: "FMUJSP" })
|
|
20285
20370
|
}), /* @__PURE__ */ jsxDEV$1("p", {
|
|
20286
20371
|
class: "page-intro-description",
|
|
20287
20372
|
children: hostedIntroText
|
|
@@ -20598,12 +20683,17 @@ function SessionsContent({ sessions, sitePathPrefix = "" }) {
|
|
|
20598
20683
|
//#region src/ui/dash/appearance/NavigationContent.tsx
|
|
20599
20684
|
/**
|
|
20600
20685
|
* Navigation management: Lit-powered reorderable nav items, add area, system toggles
|
|
20601
|
-
*/ function NavigationContent({ navItems, directoryData, mainRssFeed, siteName, sitePathPrefix = "" }) {
|
|
20686
|
+
*/ function NavigationContent({ navItems, directoryData, suggestedLinks, mainRssFeed, siteName, sitePathPrefix = "" }) {
|
|
20602
20687
|
const { i18n } = useLingui();
|
|
20603
20688
|
const latestLabel = i18n._({ id: "wL3cK8" });
|
|
20604
20689
|
const featuredLabel = i18n._({ id: "FkMol5" });
|
|
20605
20690
|
const previewLabel = i18n._({ id: "X1G9eY" });
|
|
20606
20691
|
const moreLabel = i18n._(NAV_MORE_LABEL);
|
|
20692
|
+
const suggestedTargetLabels = {
|
|
20693
|
+
page: i18n._({ id: "6WdDG7" }),
|
|
20694
|
+
collection: i18n._({ id: "q+hNag" }),
|
|
20695
|
+
archive: i18n._({ id: "B495Gs" })
|
|
20696
|
+
};
|
|
20607
20697
|
const itemsData = navItems.map((item) => {
|
|
20608
20698
|
const url = item.type === "system" && item.systemKey ? SYSTEM_NAV_KEYS$2[item.systemKey]?.url ?? item.url : item.url;
|
|
20609
20699
|
return {
|
|
@@ -20637,6 +20727,10 @@ function SessionsContent({ sessions, sitePathPrefix = "" }) {
|
|
|
20637
20727
|
});
|
|
20638
20728
|
return result;
|
|
20639
20729
|
})();
|
|
20730
|
+
const suggestedLinksData = suggestedLinks.map((link) => ({
|
|
20731
|
+
...link,
|
|
20732
|
+
targetLabel: suggestedTargetLabels[link.targetType]
|
|
20733
|
+
}));
|
|
20640
20734
|
const systemNavData = Object.keys(SYSTEM_NAV_KEYS$2).map((key) => ({
|
|
20641
20735
|
key,
|
|
20642
20736
|
label: getSystemNavDisplayLabel(key, i18n),
|
|
@@ -20660,7 +20754,7 @@ function SessionsContent({ sessions, sitePathPrefix = "" }) {
|
|
|
20660
20754
|
saveFailed: i18n._({ id: "3wKq0C" }),
|
|
20661
20755
|
deleteFailed: i18n._({ id: "rlonmB" }),
|
|
20662
20756
|
systemLinks: i18n._({ id: "QZmz0H" }),
|
|
20663
|
-
systemLinksDescription: i18n._({ id: "
|
|
20757
|
+
systemLinksDescription: i18n._({ id: "vOnuOa" }),
|
|
20664
20758
|
addCustomLinkToNavigation: i18n._({ id: "ZmUkwN" }),
|
|
20665
20759
|
addLink: i18n._({ id: "V4WsyL" }),
|
|
20666
20760
|
addLinkDescription: i18n._({ id: "J6bLeg" }),
|
|
@@ -20671,6 +20765,10 @@ function SessionsContent({ sessions, sitePathPrefix = "" }) {
|
|
|
20671
20765
|
placementSaved: i18n._({ id: "rEspiY" }),
|
|
20672
20766
|
cancel: i18n._({ id: "dEgA5A" }),
|
|
20673
20767
|
labelAndUrlRequired: i18n._({ id: "+AXdXp" }),
|
|
20768
|
+
suggestedLinks: i18n._({ id: "9J6wUO" }),
|
|
20769
|
+
suggestedLinksDescription: i18n._({ id: "n8+EXe" }),
|
|
20770
|
+
addSuggestedLink: i18n._({ id: "m16xKo" }),
|
|
20771
|
+
suggestedLinkAdded: i18n._({ id: "BTYdze" }),
|
|
20674
20772
|
collection: i18n._({ id: "sgr2wQ" }),
|
|
20675
20773
|
addCollection: i18n._({ id: "3Cw1AI" }),
|
|
20676
20774
|
addCollectionToNavigation: i18n._({ id: "KVVYBh" }),
|
|
@@ -20687,6 +20785,7 @@ function SessionsContent({ sessions, sitePathPrefix = "" }) {
|
|
|
20687
20785
|
labels: escapeJson(labels),
|
|
20688
20786
|
"system-nav-items": escapeJson(systemNavData),
|
|
20689
20787
|
collections: escapeJson(collectionsData),
|
|
20788
|
+
"suggested-links": escapeJson(suggestedLinksData),
|
|
20690
20789
|
"site-name": siteName,
|
|
20691
20790
|
children: (() => {
|
|
20692
20791
|
const headerNavItems = navItems.filter((item) => item.placement !== "more");
|
|
@@ -22679,6 +22778,9 @@ function parseConfigInt(value, fallback) {
|
|
|
22679
22778
|
const parsed = Number.parseInt(value, 10);
|
|
22680
22779
|
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
22681
22780
|
}
|
|
22781
|
+
function parseFeedKind(value, fallback) {
|
|
22782
|
+
return value === "latest" || value === "featured" ? value : fallback;
|
|
22783
|
+
}
|
|
22682
22784
|
/**
|
|
22683
22785
|
* Build a complete AppConfig from environment bindings and DB settings.
|
|
22684
22786
|
*
|
|
@@ -22719,8 +22821,7 @@ function parseConfigInt(value, fallback) {
|
|
|
22719
22821
|
siteLanguage: resolve("SITE_LANGUAGE", allSettings, env),
|
|
22720
22822
|
dashboardLanguage: resolve("DASHBOARD_LANGUAGE", allSettings, env),
|
|
22721
22823
|
cjkSerifFont: resolve("CJK_SERIF_FONT", allSettings, env),
|
|
22722
|
-
|
|
22723
|
-
mainRssFeed: resolve("MAIN_RSS_FEED", allSettings, env),
|
|
22824
|
+
mainRssFeed: parseFeedKind(resolve("MAIN_RSS_FEED", allSettings, env), "featured"),
|
|
22724
22825
|
timeZone: normalizeTimeZone(resolve("TIME_ZONE", allSettings, env)),
|
|
22725
22826
|
siteFooter: resolve("SITE_FOOTER", allSettings, env),
|
|
22726
22827
|
showJantBrandingOnHome: resolve("SHOW_JANT_BRANDING_ON_HOME", allSettings, env) === "true",
|
|
@@ -22808,7 +22909,6 @@ async function syncHostedControlPlaneSiteAvatar(input) {
|
|
|
22808
22909
|
siteDescription: appConfig.siteDescription,
|
|
22809
22910
|
siteLanguage: appConfig.siteLanguage,
|
|
22810
22911
|
showJantBrandingOnHome: appConfig.showJantBrandingOnHome,
|
|
22811
|
-
homeDefaultView: getHomeDefaultViewFromNavItems(navItems),
|
|
22812
22912
|
mainRssFeed: appConfig.mainRssFeed,
|
|
22813
22913
|
siteFooter: appConfig.siteFooter,
|
|
22814
22914
|
showHeaderAvatar: appConfig.showHeaderAvatar,
|
|
@@ -22905,7 +23005,7 @@ async function syncHostedControlPlaneSiteAvatar(input) {
|
|
|
22905
23005
|
return;
|
|
22906
23006
|
}
|
|
22907
23007
|
await markSyncPending(settings);
|
|
22908
|
-
const { createGitHubSyncService } = await import("./github-sync-
|
|
23008
|
+
const { createGitHubSyncService } = await import("./github-sync-BGTLx8Mf.js");
|
|
22909
23009
|
const { getGitHubAppConfig } = await import("./env-OHRKGcMj.js").then((n) => n.t);
|
|
22910
23010
|
const run = runBackgroundSync(settings, createGitHubSyncService(c.var.services, c.var.currentSite.id, await buildSyncSiteConfig(c), {
|
|
22911
23011
|
storage: c.var.storage,
|
|
@@ -23070,6 +23170,9 @@ var UpdateSearchSettingsSchema = z.object({ allowIndexing: z.boolean() });
|
|
|
23070
23170
|
function publicPath(c, path) {
|
|
23071
23171
|
return toPublicPath(path, c.var.appConfig.sitePathPrefix);
|
|
23072
23172
|
}
|
|
23173
|
+
function aboutEditPath(c) {
|
|
23174
|
+
return `${publicPath(c, "/about")}?edit=1`;
|
|
23175
|
+
}
|
|
23073
23176
|
/**
|
|
23074
23177
|
* Breadcrumb labels for admin settings pages.
|
|
23075
23178
|
*
|
|
@@ -23089,7 +23192,7 @@ function publicPath(c, path) {
|
|
|
23089
23192
|
case "fontTheme": return i18n._({ id: "alKG0+" });
|
|
23090
23193
|
case "customCss": return i18n._({ id: "9+vGLh" });
|
|
23091
23194
|
case "codeInjection": return i18n._({ id: "fWYqkz" });
|
|
23092
|
-
case "account": return i18n._({ id: "
|
|
23195
|
+
case "account": return i18n._({ id: "FMUJSP" });
|
|
23093
23196
|
case "sessions": return i18n._({ id: "4cEClj" });
|
|
23094
23197
|
case "password": return i18n._({ id: "8ZsakT" });
|
|
23095
23198
|
case "deleteAccount": return i18n._({ id: "vzX5FB" });
|
|
@@ -23136,7 +23239,7 @@ settingsRoutes.get("/general", async (c) => {
|
|
|
23136
23239
|
const dbSiteName = allSettings["SITE_NAME"] ?? "";
|
|
23137
23240
|
const dbSiteDescription = allSettings["SITE_DESCRIPTION"] ?? "";
|
|
23138
23241
|
const saved = c.req.query("saved") !== void 0;
|
|
23139
|
-
const navData = await getNavigationData(c);
|
|
23242
|
+
const [navData, aboutPage] = await Promise.all([getNavigationData(c), c.var.services.aboutPage.getStatus()]);
|
|
23140
23243
|
const siteUrlForDisplay = appConfig.siteUrl || new URL(publicPath(c, "/"), c.req.url).toString();
|
|
23141
23244
|
return renderPublicPage(c, {
|
|
23142
23245
|
title: buildPageTitle("General", navData.siteName),
|
|
@@ -23164,7 +23267,10 @@ settingsRoutes.get("/general", async (c) => {
|
|
|
23164
23267
|
showJantBrandingOnHome: appConfig.showJantBrandingOnHome,
|
|
23165
23268
|
noindex: appConfig.noindex,
|
|
23166
23269
|
demoMode: appConfig.demoMode,
|
|
23167
|
-
timezones: TIMEZONES
|
|
23270
|
+
timezones: TIMEZONES,
|
|
23271
|
+
aboutPage,
|
|
23272
|
+
aboutEditUrl: aboutEditPath(c),
|
|
23273
|
+
aboutCreateUrl: publicPath(c, "/settings/general/about-page")
|
|
23168
23274
|
})] })
|
|
23169
23275
|
});
|
|
23170
23276
|
});
|
|
@@ -23259,6 +23365,26 @@ settingsRoutes.post("/general/search", async (c) => {
|
|
|
23259
23365
|
});
|
|
23260
23366
|
return dsToast(i18n._({ id: "V5pZwT" }));
|
|
23261
23367
|
});
|
|
23368
|
+
settingsRoutes.post("/general/about-page", async (c) => {
|
|
23369
|
+
try {
|
|
23370
|
+
await c.var.services.aboutPage.ensurePage();
|
|
23371
|
+
await triggerGitHubSyncInline(c);
|
|
23372
|
+
} catch (error) {
|
|
23373
|
+
if (error instanceof ValidationError) {
|
|
23374
|
+
if (c.req.header("accept")?.includes("application/json")) return c.json({
|
|
23375
|
+
error: error.message,
|
|
23376
|
+
code: error.code
|
|
23377
|
+
}, 400);
|
|
23378
|
+
return c.text(error.message, 400);
|
|
23379
|
+
}
|
|
23380
|
+
throw error;
|
|
23381
|
+
}
|
|
23382
|
+
if (c.req.header("accept")?.includes("application/json")) return c.json({
|
|
23383
|
+
status: "redirect",
|
|
23384
|
+
url: aboutEditPath(c)
|
|
23385
|
+
});
|
|
23386
|
+
return c.redirect(aboutEditPath(c));
|
|
23387
|
+
});
|
|
23262
23388
|
settingsRoutes.get("/avatar", async (c) => {
|
|
23263
23389
|
const saved = c.req.query("saved") !== void 0;
|
|
23264
23390
|
const navData = await getNavigationData(c);
|
|
@@ -23374,7 +23500,14 @@ settingsRoutes.post("/avatar/display", async (c) => {
|
|
|
23374
23500
|
});
|
|
23375
23501
|
});
|
|
23376
23502
|
settingsRoutes.get("/navigation", async (c) => {
|
|
23377
|
-
const [navItems, directoryData] = await Promise.all([
|
|
23503
|
+
const [navItems, directoryData, suggestedLinks] = await Promise.all([
|
|
23504
|
+
c.var.services.navItems.list(),
|
|
23505
|
+
c.var.services.collections.listDirectoryData(),
|
|
23506
|
+
c.var.services.navItems.listSuggestedLinks({
|
|
23507
|
+
siteOrigin: c.var.appConfig.siteOrigin,
|
|
23508
|
+
sitePathPrefix: c.var.appConfig.sitePathPrefix
|
|
23509
|
+
})
|
|
23510
|
+
]);
|
|
23378
23511
|
const navData = await getNavigationData(c);
|
|
23379
23512
|
return renderPublicPage(c, {
|
|
23380
23513
|
title: buildPageTitle("Navigation", navData.siteName),
|
|
@@ -23386,6 +23519,7 @@ settingsRoutes.get("/navigation", async (c) => {
|
|
|
23386
23519
|
}), /* @__PURE__ */ jsxDEV$1(NavigationContent, {
|
|
23387
23520
|
navItems,
|
|
23388
23521
|
directoryData,
|
|
23522
|
+
suggestedLinks,
|
|
23389
23523
|
mainRssFeed: c.var.appConfig.mainRssFeed,
|
|
23390
23524
|
siteName: navData.siteName,
|
|
23391
23525
|
sitePathPrefix: c.var.appConfig.sitePathPrefix
|
|
@@ -23703,7 +23837,7 @@ settingsRoutes.post("/github-sync/connect", async (c) => {
|
|
|
23703
23837
|
await c.var.services.settings.set("GITHUB_SYNC_AUTH_MODE", "pat");
|
|
23704
23838
|
await c.var.services.settings.set("GITHUB_SYNC_APP_INSTALLATION_ID", "");
|
|
23705
23839
|
await c.var.services.settings.set("GITHUB_SYNC_ENABLED", "true");
|
|
23706
|
-
const { createGitHubSyncService } = await import("./github-sync-
|
|
23840
|
+
const { createGitHubSyncService } = await import("./github-sync-BGTLx8Mf.js");
|
|
23707
23841
|
const syncService = createGitHubSyncService(c.var.services, c.var.currentSite.id, await buildSyncSiteConfig(c), {
|
|
23708
23842
|
storage: c.var.storage,
|
|
23709
23843
|
githubApp: getGitHubAppConfig(c.env)
|
|
@@ -23722,7 +23856,7 @@ settingsRoutes.post("/github-sync/connect", async (c) => {
|
|
|
23722
23856
|
return dsRedirect(publicPath(c, "/settings/github-sync"));
|
|
23723
23857
|
});
|
|
23724
23858
|
settingsRoutes.post("/github-sync/push", async (c) => {
|
|
23725
|
-
const { createGitHubSyncService } = await import("./github-sync-
|
|
23859
|
+
const { createGitHubSyncService } = await import("./github-sync-BGTLx8Mf.js");
|
|
23726
23860
|
const syncService = createGitHubSyncService(c.var.services, c.var.currentSite.id, await buildSyncSiteConfig(c), {
|
|
23727
23861
|
storage: c.var.storage,
|
|
23728
23862
|
githubApp: getGitHubAppConfig(c.env)
|
|
@@ -23742,7 +23876,7 @@ settingsRoutes.post("/github-sync/push", async (c) => {
|
|
|
23742
23876
|
});
|
|
23743
23877
|
});
|
|
23744
23878
|
settingsRoutes.post("/github-sync/disconnect", async (c) => {
|
|
23745
|
-
const { createGitHubSyncService } = await import("./github-sync-
|
|
23879
|
+
const { createGitHubSyncService } = await import("./github-sync-BGTLx8Mf.js");
|
|
23746
23880
|
await createGitHubSyncService(c.var.services, c.var.currentSite.id, await buildSyncSiteConfig(c), { githubApp: getGitHubAppConfig(c.env) }).teardownWebhook();
|
|
23747
23881
|
return dsRedirect(publicPath(c, "/settings/github-sync"));
|
|
23748
23882
|
});
|
|
@@ -23933,7 +24067,7 @@ function buildRepoPickerLabels(c) {
|
|
|
23933
24067
|
const { parseRepoSlug, createGitHubClient } = await import("./github-api-BgSiE71w.js").then((n) => n.n);
|
|
23934
24068
|
const parsed = parseRepoSlug(repo);
|
|
23935
24069
|
if (!parsed) return wantsJson ? c.json({ error: "Invalid repository format." }, 400) : c.text("Invalid repository format.", 400);
|
|
23936
|
-
const { classifyRepoForSync } = await import("./github-sync-
|
|
24070
|
+
const { classifyRepoForSync } = await import("./github-sync-BGTLx8Mf.js");
|
|
23937
24071
|
const ghClient = createGitHubClient(() => getInstallationTokenFromApp(app, installationId));
|
|
23938
24072
|
let classification;
|
|
23939
24073
|
try {
|
|
@@ -23963,7 +24097,7 @@ function buildRepoPickerLabels(c) {
|
|
|
23963
24097
|
await c.var.services.settings.set("GITHUB_SYNC_REPO", repo);
|
|
23964
24098
|
await c.var.services.settings.set("GITHUB_SYNC_TOKEN", "");
|
|
23965
24099
|
await c.var.services.settings.set("GITHUB_SYNC_ENABLED", "true");
|
|
23966
|
-
const { createGitHubSyncService } = await import("./github-sync-
|
|
24100
|
+
const { createGitHubSyncService } = await import("./github-sync-BGTLx8Mf.js");
|
|
23967
24101
|
const syncService = createGitHubSyncService(c.var.services, c.var.currentSite.id, await buildSyncSiteConfig(c), {
|
|
23968
24102
|
storage: c.var.storage,
|
|
23969
24103
|
githubApp: app
|
|
@@ -24079,7 +24213,7 @@ function requireGitHubApp(c) {
|
|
|
24079
24213
|
const { parseRepoSlug, createGitHubClient } = await import("./github-api-BgSiE71w.js").then((n) => n.n);
|
|
24080
24214
|
const parsed = parseRepoSlug(repo);
|
|
24081
24215
|
if (!parsed) return c.json({ error: "Invalid repository format." }, 400);
|
|
24082
|
-
const { classifyRepoForSync } = await import("./github-sync-
|
|
24216
|
+
const { classifyRepoForSync } = await import("./github-sync-BGTLx8Mf.js");
|
|
24083
24217
|
const client = createGitHubClient(() => getInstallationTokenFromApp(app, installationId));
|
|
24084
24218
|
try {
|
|
24085
24219
|
const classification = await classifyRepoForSync(client, parsed.owner, parsed.repo, c.var.currentSite.id);
|
|
@@ -24922,14 +25056,50 @@ attachmentsApiRoutes.get("/:id/content", requireAuthApi(), async (c) => {
|
|
|
24922
25056
|
return c.json(assertFound(content, "Attachment"));
|
|
24923
25057
|
});
|
|
24924
25058
|
//#endregion
|
|
25059
|
+
//#region src/lib/site-header-fragment.tsx
|
|
25060
|
+
/**
|
|
25061
|
+
* Render the current public site header as a replaceable HTML fragment.
|
|
25062
|
+
*
|
|
25063
|
+
* @param c - Current Hono request context
|
|
25064
|
+
* @returns Server-rendered header, drawer backdrop, and mobile drawer HTML
|
|
25065
|
+
*
|
|
25066
|
+
* @example
|
|
25067
|
+
* ```typescript
|
|
25068
|
+
* const headerHtml = await renderSiteHeaderHtml(c);
|
|
25069
|
+
* return c.json({ headerHtml });
|
|
25070
|
+
* ```
|
|
25071
|
+
*/ async function renderSiteHeaderHtml(c) {
|
|
25072
|
+
const navData = await getNavigationData(c, { includeCollections: false });
|
|
25073
|
+
return String(/* @__PURE__ */ jsxDEV$1(I18nProvider, {
|
|
25074
|
+
c,
|
|
25075
|
+
children: /* @__PURE__ */ jsxDEV$1(SiteHeader, {
|
|
25076
|
+
siteName: navData.siteName,
|
|
25077
|
+
links: navData.links,
|
|
25078
|
+
currentPath: navData.currentPath,
|
|
25079
|
+
sitePathPrefix: navData.sitePathPrefix,
|
|
25080
|
+
siteAvatarUrl: navData.siteAvatarUrl,
|
|
25081
|
+
showHeaderAvatar: navData.showHeaderAvatar
|
|
25082
|
+
})
|
|
25083
|
+
}));
|
|
25084
|
+
}
|
|
25085
|
+
//#endregion
|
|
24925
25086
|
//#region src/routes/api/nav-items.ts
|
|
24926
25087
|
/**
|
|
24927
25088
|
* Nav Items API Routes
|
|
24928
25089
|
*/ var navItemsApiRoutes = new Hono();
|
|
25090
|
+
var INCLUDE_SITE_HEADER_RESPONSE = "include";
|
|
25091
|
+
var SITE_HEADER_RESPONSE_HEADER = "x-jant-site-header";
|
|
24929
25092
|
var MoveSchema$1 = z.object({
|
|
24930
25093
|
after: NavItemIdSchema.nullable().optional(),
|
|
24931
25094
|
before: NavItemIdSchema.nullable().optional()
|
|
24932
25095
|
});
|
|
25096
|
+
async function withSiteHeaderHtml(c, body) {
|
|
25097
|
+
if (c.req.header(SITE_HEADER_RESPONSE_HEADER) !== INCLUDE_SITE_HEADER_RESPONSE) return body;
|
|
25098
|
+
return {
|
|
25099
|
+
...body,
|
|
25100
|
+
headerHtml: await renderSiteHeaderHtml(c)
|
|
25101
|
+
};
|
|
25102
|
+
}
|
|
24933
25103
|
navItemsApiRoutes.get("/", async (c) => {
|
|
24934
25104
|
const items = await c.var.services.navItems.list();
|
|
24935
25105
|
return c.json({ navItems: items });
|
|
@@ -24938,7 +25108,7 @@ navItemsApiRoutes.put("/:id/move", requireAuthApi(), async (c) => {
|
|
|
24938
25108
|
const id = parseIdParam(c.req.param("id"), ID_PREFIX.navItem);
|
|
24939
25109
|
const body = parseValidated(MoveSchema$1, await c.req.json());
|
|
24940
25110
|
const item = assertFound(await c.var.services.navItems.move(id, body.after ?? null, body.before ?? null), "Nav item");
|
|
24941
|
-
return c.json(item);
|
|
25111
|
+
return c.json(await withSiteHeaderHtml(c, item));
|
|
24942
25112
|
});
|
|
24943
25113
|
navItemsApiRoutes.post("/", requireAuthApi(), async (c) => {
|
|
24944
25114
|
const body = parseValidated(CreateNavItemSchema, await c.req.json());
|
|
@@ -24964,18 +25134,18 @@ navItemsApiRoutes.post("/", requireAuthApi(), async (c) => {
|
|
|
24964
25134
|
url: body.url,
|
|
24965
25135
|
placement: body.placement
|
|
24966
25136
|
});
|
|
24967
|
-
return c.json(item, 201);
|
|
25137
|
+
return c.json(await withSiteHeaderHtml(c, item), 201);
|
|
24968
25138
|
});
|
|
24969
25139
|
navItemsApiRoutes.put("/:id", requireAuthApi(), async (c) => {
|
|
24970
25140
|
const id = parseIdParam(c.req.param("id"), ID_PREFIX.navItem);
|
|
24971
25141
|
const body = parseValidated(UpdateNavItemSchema, await c.req.json());
|
|
24972
25142
|
const item = assertFound(await c.var.services.navItems.update(id, body), "Nav item");
|
|
24973
|
-
return c.json(item);
|
|
25143
|
+
return c.json(await withSiteHeaderHtml(c, item));
|
|
24974
25144
|
});
|
|
24975
25145
|
navItemsApiRoutes.delete("/:id", requireAuthApi(), async (c) => {
|
|
24976
25146
|
const id = parseIdParam(c.req.param("id"), ID_PREFIX.navItem);
|
|
24977
25147
|
if (!await c.var.services.navItems.delete(id)) throw new NotFoundError("Nav item");
|
|
24978
|
-
return c.json({ success: true });
|
|
25148
|
+
return c.json(await withSiteHeaderHtml(c, { success: true }));
|
|
24979
25149
|
});
|
|
24980
25150
|
//#endregion
|
|
24981
25151
|
//#region src/routes/api/collections.ts
|
|
@@ -26967,7 +27137,6 @@ exportApiRoutes.post("/hugo", requireAuthApi(), async (c) => {
|
|
|
26967
27137
|
siteDescription: appConfig.siteDescription,
|
|
26968
27138
|
siteLanguage: appConfig.siteLanguage,
|
|
26969
27139
|
showJantBrandingOnHome: appConfig.showJantBrandingOnHome,
|
|
26970
|
-
homeDefaultView: getHomeDefaultViewFromNavItems(navItems),
|
|
26971
27140
|
mainRssFeed: appConfig.mainRssFeed,
|
|
26972
27141
|
siteFooter: appConfig.siteFooter,
|
|
26973
27142
|
showHeaderAvatar: appConfig.showHeaderAvatar,
|
|
@@ -28627,7 +28796,7 @@ sitemapRoutes.get("/sitemap-collections.xml", async (c) => {
|
|
|
28627
28796
|
});
|
|
28628
28797
|
sitemapRoutes.get("/sitemap-pages.xml", async (c) => {
|
|
28629
28798
|
const { appConfig } = c.var;
|
|
28630
|
-
const { siteUrl, sitePathPrefix
|
|
28799
|
+
const { siteUrl, sitePathPrefix } = appConfig;
|
|
28631
28800
|
const urls = [{
|
|
28632
28801
|
loc: absoluteUrl("/", siteUrl, sitePathPrefix),
|
|
28633
28802
|
priority: "1.0",
|
|
@@ -28637,9 +28806,8 @@ sitemapRoutes.get("/sitemap-pages.xml", async (c) => {
|
|
|
28637
28806
|
priority: "0.5",
|
|
28638
28807
|
changefreq: "weekly"
|
|
28639
28808
|
}];
|
|
28640
|
-
const secondaryAggregate = homeDefaultView === "featured" ? "/latest" : "/featured";
|
|
28641
28809
|
urls.push({
|
|
28642
|
-
loc: absoluteUrl(
|
|
28810
|
+
loc: absoluteUrl("/featured", siteUrl, sitePathPrefix),
|
|
28643
28811
|
priority: "0.6",
|
|
28644
28812
|
changefreq: "daily"
|
|
28645
28813
|
});
|
|
@@ -30078,8 +30246,6 @@ function createHostedHandoffService(db, auth, options) {
|
|
|
30078
30246
|
oldLanguage: opts.oldLanguage,
|
|
30079
30247
|
oldCjkSerifFont: opts.oldCjkSerifFont
|
|
30080
30248
|
});
|
|
30081
|
-
if (data.homeDefaultView !== void 0) if (data.homeDefaultView === "featured") await this.set("HOME_DEFAULT_VIEW", data.homeDefaultView);
|
|
30082
|
-
else await this.remove("HOME_DEFAULT_VIEW");
|
|
30083
30249
|
await this.updateFeedSettings({ mainRssFeed: data.mainRssFeed });
|
|
30084
30250
|
return {
|
|
30085
30251
|
languageChanged,
|
|
@@ -30774,65 +30940,41 @@ function createPostService(db, config, siteId, paths, databaseSchema = sqliteSch
|
|
|
30774
30940
|
const cursorSortTimestamp = getCursorSortTimestamp(cursorPost);
|
|
30775
30941
|
const cursorRatingPresence = cursorPost.rating === null ? 0 : 1;
|
|
30776
30942
|
const cursorRating = cursorPost.rating ?? -1;
|
|
30943
|
+
const withPinnedSortKey = (keys) => filters.ignorePinnedSort ? keys : [{
|
|
30944
|
+
direction: "desc",
|
|
30945
|
+
expr: pinnedSortExpr,
|
|
30946
|
+
value: cursorPinnedAt
|
|
30947
|
+
}, ...keys];
|
|
30777
30948
|
if (filters.featured || filters.sortOrder === void 0) {
|
|
30778
|
-
if (filters.featured) return buildLexicographicCursorCondition([
|
|
30779
|
-
|
|
30780
|
-
|
|
30781
|
-
|
|
30782
|
-
|
|
30783
|
-
|
|
30784
|
-
|
|
30785
|
-
|
|
30786
|
-
|
|
30787
|
-
|
|
30788
|
-
},
|
|
30789
|
-
{
|
|
30790
|
-
direction: "desc",
|
|
30791
|
-
expr: posts.id,
|
|
30792
|
-
value: cursorPost.id
|
|
30793
|
-
}
|
|
30794
|
-
]);
|
|
30795
|
-
return buildLexicographicCursorCondition([
|
|
30796
|
-
{
|
|
30797
|
-
direction: "desc",
|
|
30798
|
-
expr: pinnedSortExpr,
|
|
30799
|
-
value: cursorPinnedAt
|
|
30800
|
-
},
|
|
30801
|
-
{
|
|
30802
|
-
direction: "desc",
|
|
30803
|
-
expr: sortTimestampSortExpr,
|
|
30804
|
-
value: cursorSortTimestamp
|
|
30805
|
-
},
|
|
30806
|
-
{
|
|
30807
|
-
direction: "desc",
|
|
30808
|
-
expr: posts.id,
|
|
30809
|
-
value: cursorPost.id
|
|
30810
|
-
}
|
|
30811
|
-
]);
|
|
30812
|
-
}
|
|
30813
|
-
if (filters.sortOrder === "oldest") return buildLexicographicCursorCondition([
|
|
30814
|
-
{
|
|
30949
|
+
if (filters.featured) return buildLexicographicCursorCondition(withPinnedSortKey([{
|
|
30950
|
+
direction: "desc",
|
|
30951
|
+
expr: featuredSortExpr,
|
|
30952
|
+
value: cursorFeaturedAt
|
|
30953
|
+
}, {
|
|
30954
|
+
direction: "desc",
|
|
30955
|
+
expr: posts.id,
|
|
30956
|
+
value: cursorPost.id
|
|
30957
|
+
}]));
|
|
30958
|
+
return buildLexicographicCursorCondition(withPinnedSortKey([{
|
|
30815
30959
|
direction: "desc",
|
|
30816
|
-
expr: pinnedSortExpr,
|
|
30817
|
-
value: cursorPinnedAt
|
|
30818
|
-
},
|
|
30819
|
-
{
|
|
30820
|
-
direction: "asc",
|
|
30821
30960
|
expr: sortTimestampSortExpr,
|
|
30822
30961
|
value: cursorSortTimestamp
|
|
30823
|
-
},
|
|
30824
|
-
|
|
30825
|
-
direction: "asc",
|
|
30962
|
+
}, {
|
|
30963
|
+
direction: "desc",
|
|
30826
30964
|
expr: posts.id,
|
|
30827
30965
|
value: cursorPost.id
|
|
30828
|
-
}
|
|
30829
|
-
|
|
30830
|
-
if (filters.sortOrder === "
|
|
30831
|
-
|
|
30832
|
-
|
|
30833
|
-
|
|
30834
|
-
|
|
30835
|
-
|
|
30966
|
+
}]));
|
|
30967
|
+
}
|
|
30968
|
+
if (filters.sortOrder === "oldest") return buildLexicographicCursorCondition(withPinnedSortKey([{
|
|
30969
|
+
direction: "asc",
|
|
30970
|
+
expr: sortTimestampSortExpr,
|
|
30971
|
+
value: cursorSortTimestamp
|
|
30972
|
+
}, {
|
|
30973
|
+
direction: "asc",
|
|
30974
|
+
expr: posts.id,
|
|
30975
|
+
value: cursorPost.id
|
|
30976
|
+
}]));
|
|
30977
|
+
if (filters.sortOrder === "rating_desc") return buildLexicographicCursorCondition(withPinnedSortKey([
|
|
30836
30978
|
{
|
|
30837
30979
|
direction: "desc",
|
|
30838
30980
|
expr: ratingPresenceExpr,
|
|
@@ -30853,13 +30995,8 @@ function createPostService(db, config, siteId, paths, databaseSchema = sqliteSch
|
|
|
30853
30995
|
expr: posts.id,
|
|
30854
30996
|
value: cursorPost.id
|
|
30855
30997
|
}
|
|
30856
|
-
]);
|
|
30857
|
-
return buildLexicographicCursorCondition([
|
|
30858
|
-
{
|
|
30859
|
-
direction: "desc",
|
|
30860
|
-
expr: pinnedSortExpr,
|
|
30861
|
-
value: cursorPinnedAt
|
|
30862
|
-
},
|
|
30998
|
+
]));
|
|
30999
|
+
return buildLexicographicCursorCondition(withPinnedSortKey([
|
|
30863
31000
|
{
|
|
30864
31001
|
direction: "desc",
|
|
30865
31002
|
expr: ratingPresenceExpr,
|
|
@@ -30880,7 +31017,7 @@ function createPostService(db, config, siteId, paths, databaseSchema = sqliteSch
|
|
|
30880
31017
|
expr: posts.id,
|
|
30881
31018
|
value: cursorPost.id
|
|
30882
31019
|
}
|
|
30883
|
-
]);
|
|
31020
|
+
]));
|
|
30884
31021
|
}
|
|
30885
31022
|
function toPost(row, slug, visibility) {
|
|
30886
31023
|
return {
|
|
@@ -30955,6 +31092,20 @@ function createPostService(db, config, siteId, paths, databaseSchema = sqliteSch
|
|
|
30955
31092
|
if (options?.excludePrivate) conditions.push(sql`${effectiveVisibilityExpr} != 'private'`);
|
|
30956
31093
|
return conditions;
|
|
30957
31094
|
}
|
|
31095
|
+
function buildCollectionThreadActivityExpr(alias) {
|
|
31096
|
+
return sql`MAX(
|
|
31097
|
+
COALESCE(
|
|
31098
|
+
(
|
|
31099
|
+
SELECT root.last_activity_at
|
|
31100
|
+
FROM post AS root
|
|
31101
|
+
WHERE root.site_id = ${siteId}
|
|
31102
|
+
AND root.id = ${posts.threadId}
|
|
31103
|
+
),
|
|
31104
|
+
${posts.publishedAt},
|
|
31105
|
+
${posts.updatedAt}
|
|
31106
|
+
)
|
|
31107
|
+
)`.as(alias);
|
|
31108
|
+
}
|
|
30958
31109
|
function isMediaAttachmentInput(attachment) {
|
|
30959
31110
|
return attachment.type === "media";
|
|
30960
31111
|
}
|
|
@@ -31073,8 +31224,9 @@ function createPostService(db, config, siteId, paths, databaseSchema = sqliteSch
|
|
|
31073
31224
|
const pinnedSortExpr = sql`coalesce(${posts.pinnedAt}, -1)`;
|
|
31074
31225
|
const featuredSortExpr = sql`coalesce(${posts.featuredAt}, -1)`;
|
|
31075
31226
|
const sortTimestampSortExpr = sql`coalesce(${sortTimestamp}, -1)`;
|
|
31227
|
+
const pinnedOrder = filters.ignorePinnedSort ? [] : [desc(pinnedSortExpr)];
|
|
31076
31228
|
const baseQuery = db.select().from(posts).where(conditions.length > 0 ? and(...conditions) : void 0).limit(filters.limit ?? 100);
|
|
31077
|
-
let query = filters.featured || filters.sortOrder === void 0 ? baseQuery.orderBy(
|
|
31229
|
+
let query = filters.featured || filters.sortOrder === void 0 ? baseQuery.orderBy(...pinnedOrder, filters.featured ? desc(featuredSortExpr) : desc(sortTimestampSortExpr), desc(posts.id)) : filters.sortOrder === "oldest" ? baseQuery.orderBy(...pinnedOrder, asc(sortTimestampSortExpr), asc(posts.id)) : filters.sortOrder === "rating_desc" ? baseQuery.orderBy(...pinnedOrder, desc(ratingPresence), desc(posts.rating), desc(sortTimestampSortExpr), desc(posts.id)) : baseQuery.orderBy(...pinnedOrder, desc(ratingPresence), asc(posts.rating), desc(sortTimestampSortExpr), desc(posts.id));
|
|
31078
31230
|
if (filters.offset !== void 0) query = query.offset(filters.offset);
|
|
31079
31231
|
return hydratePosts(await query);
|
|
31080
31232
|
},
|
|
@@ -31784,6 +31936,7 @@ function createPostService(db, config, siteId, paths, databaseSchema = sqliteSch
|
|
|
31784
31936
|
const conditions = [...buildThreadRootPageConditions(options), buildCollectionMembershipCondition(collectionIds)];
|
|
31785
31937
|
const sortOrder = options.sortOrder ?? "newest";
|
|
31786
31938
|
const publishedAt = sortOrder === "oldest" ? sql`MIN(${posts.publishedAt})`.as("published_at") : sql`MAX(${posts.publishedAt})`.as("published_at");
|
|
31939
|
+
const threadActivityAt = buildCollectionThreadActivityExpr("thread_activity_at");
|
|
31787
31940
|
const ratingPresence = sql`MAX(
|
|
31788
31941
|
CASE
|
|
31789
31942
|
WHEN ${posts.rating} IS NULL THEN 0
|
|
@@ -31795,11 +31948,12 @@ function createPostService(db, config, siteId, paths, databaseSchema = sqliteSch
|
|
|
31795
31948
|
const baseQuery = db.select({
|
|
31796
31949
|
threadId: posts.threadId,
|
|
31797
31950
|
publishedAt,
|
|
31951
|
+
threadActivityAt,
|
|
31798
31952
|
collectionPinnedAt,
|
|
31799
31953
|
ratingPresence,
|
|
31800
31954
|
ratingValue
|
|
31801
31955
|
}).from(posts).innerJoin(postCollections, and(eq(postCollections.siteId, siteId), eq(postCollections.postId, posts.id))).where(and(...conditions)).groupBy(posts.threadId);
|
|
31802
|
-
let query = sortOrder === "oldest" ? baseQuery.orderBy(desc(collectionPinnedAt), asc(publishedAt), asc(posts.threadId)) : sortOrder === "rating_desc" ? baseQuery.orderBy(desc(collectionPinnedAt), desc(ratingPresence), desc(ratingValue), desc(
|
|
31956
|
+
let query = sortOrder === "oldest" ? baseQuery.orderBy(desc(collectionPinnedAt), asc(publishedAt), asc(posts.threadId)) : sortOrder === "rating_desc" ? baseQuery.orderBy(desc(collectionPinnedAt), desc(ratingPresence), desc(ratingValue), desc(threadActivityAt), desc(posts.threadId)) : baseQuery.orderBy(desc(collectionPinnedAt), desc(threadActivityAt), desc(posts.threadId));
|
|
31803
31957
|
if (options.limit !== void 0) query = query.limit(options.limit);
|
|
31804
31958
|
if (options.offset !== void 0) query = query.offset(options.offset);
|
|
31805
31959
|
return (await query).map((row) => row.threadId);
|
|
@@ -31809,15 +31963,16 @@ function createPostService(db, config, siteId, paths, databaseSchema = sqliteSch
|
|
|
31809
31963
|
},
|
|
31810
31964
|
async listCollectionFeedEntriesForCollections(collectionIds, options = {}) {
|
|
31811
31965
|
const conditions = [...buildThreadRootPageConditions(options), buildCollectionMembershipCondition(collectionIds)];
|
|
31812
|
-
const
|
|
31966
|
+
const threadActivityAt = buildCollectionThreadActivityExpr("thread_activity_at");
|
|
31813
31967
|
const collectedAt = sql`MAX(${postCollections.createdAt})`.as("collected_at");
|
|
31814
31968
|
const collectionPinnedAt = sql`MAX(coalesce(${postCollections.pinnedAt}, -1))`.as("collection_pinned_at");
|
|
31969
|
+
const pinnedOrder = options.ignoreCollectionPinnedSort ? [] : [desc(collectionPinnedAt)];
|
|
31815
31970
|
let query = db.select({
|
|
31816
31971
|
threadId: posts.threadId,
|
|
31817
|
-
|
|
31972
|
+
threadActivityAt,
|
|
31818
31973
|
collectedAt,
|
|
31819
31974
|
collectionPinnedAt
|
|
31820
|
-
}).from(posts).innerJoin(postCollections, and(eq(postCollections.siteId, siteId), eq(postCollections.postId, posts.id))).where(and(...conditions)).groupBy(posts.threadId).orderBy(
|
|
31975
|
+
}).from(posts).innerJoin(postCollections, and(eq(postCollections.siteId, siteId), eq(postCollections.postId, posts.id))).where(and(...conditions)).groupBy(posts.threadId).orderBy(...pinnedOrder, desc(threadActivityAt), desc(posts.threadId));
|
|
31821
31976
|
if (options.limit !== void 0) query = query.limit(options.limit);
|
|
31822
31977
|
if (options.offset !== void 0) query = query.offset(options.offset);
|
|
31823
31978
|
const rows = await query;
|
|
@@ -32970,8 +33125,17 @@ function createSearchService(rawQuery, siteId, databaseDialect = "sqlite") {
|
|
|
32970
33125
|
* Manages navigation items (external links and system links)
|
|
32971
33126
|
* with fractional indexing for efficient reordering.
|
|
32972
33127
|
*/ var POSITION_RETRY_ATTEMPTS = 5;
|
|
33128
|
+
var SUGGESTED_NAV_LINK_CANDIDATES = [{
|
|
33129
|
+
key: "about",
|
|
33130
|
+
path: "/about",
|
|
33131
|
+
label: "About"
|
|
33132
|
+
}, {
|
|
33133
|
+
key: "now",
|
|
33134
|
+
path: "/now",
|
|
33135
|
+
label: "Now"
|
|
33136
|
+
}];
|
|
32973
33137
|
function createNavItemService(db, siteId, databaseSchema = sqliteSchemaBundle) {
|
|
32974
|
-
const { navItems, postCollections, posts } = databaseSchema;
|
|
33138
|
+
const { navItems, postCollections, posts, pathRegistry, collections } = databaseSchema;
|
|
32975
33139
|
const defaultSystemOrder = [
|
|
32976
33140
|
"latest",
|
|
32977
33141
|
"featured",
|
|
@@ -33028,6 +33192,34 @@ function createNavItemService(db, siteId, databaseSchema = sqliteSchemaBundle) {
|
|
|
33028
33192
|
position: data.position
|
|
33029
33193
|
};
|
|
33030
33194
|
}
|
|
33195
|
+
function withLeadingSlash(path) {
|
|
33196
|
+
const normalized = normalizePath(path);
|
|
33197
|
+
return normalized ? `/${normalized}` : "/";
|
|
33198
|
+
}
|
|
33199
|
+
function getComparableInternalPath(url, options = {}) {
|
|
33200
|
+
const value = url.trim();
|
|
33201
|
+
const sitePathPrefix = normalizeSitePathPrefix(options.sitePathPrefix ?? "");
|
|
33202
|
+
const sameSitePath = toSameSitePath(value, options.siteOrigin ?? "");
|
|
33203
|
+
if (sameSitePath !== null) try {
|
|
33204
|
+
const pathname = new URL(sameSitePath, "https://jant.invalid").pathname;
|
|
33205
|
+
const internalPath = stripSitePathPrefix(pathname, sitePathPrefix);
|
|
33206
|
+
return internalPath ? withLeadingSlash(internalPath) : null;
|
|
33207
|
+
} catch {
|
|
33208
|
+
return null;
|
|
33209
|
+
}
|
|
33210
|
+
if (value.startsWith("http://") || value.startsWith("https://") || value.startsWith("//") || value.startsWith("mailto:") || value.startsWith("tel:") || value.startsWith("#")) return null;
|
|
33211
|
+
try {
|
|
33212
|
+
const pathname = new URL(value, "https://jant.invalid").pathname;
|
|
33213
|
+
const internalPath = stripSitePathPrefix(pathname, sitePathPrefix);
|
|
33214
|
+
return internalPath ? withLeadingSlash(internalPath) : null;
|
|
33215
|
+
} catch {
|
|
33216
|
+
return null;
|
|
33217
|
+
}
|
|
33218
|
+
}
|
|
33219
|
+
function normalizeSuggestedLabel(label, fallback) {
|
|
33220
|
+
const trimmed = label?.trim();
|
|
33221
|
+
return trimmed && trimmed.length > 0 ? trimmed : fallback;
|
|
33222
|
+
}
|
|
33031
33223
|
async function getLastPosition() {
|
|
33032
33224
|
return (await db.select({ position: navItems.position }).from(navItems).where(eq(navItems.siteId, siteId)).orderBy(sql`${navItems.position} DESC`).limit(1))[0]?.position ?? null;
|
|
33033
33225
|
}
|
|
@@ -33151,6 +33343,62 @@ function createNavItemService(db, siteId, databaseSchema = sqliteSchemaBundle) {
|
|
|
33151
33343
|
}
|
|
33152
33344
|
throw new Error("Failed to assign a unique nav item position");
|
|
33153
33345
|
},
|
|
33346
|
+
async listSuggestedLinks(options = {}) {
|
|
33347
|
+
const existingRows = await db.select({
|
|
33348
|
+
url: navItems.url,
|
|
33349
|
+
collectionId: navItems.collectionId
|
|
33350
|
+
}).from(navItems).where(eq(navItems.siteId, siteId));
|
|
33351
|
+
const existingPaths = new Set(existingRows.flatMap((item) => {
|
|
33352
|
+
const path = getComparableInternalPath(item.url, options);
|
|
33353
|
+
return path ? [path] : [];
|
|
33354
|
+
}));
|
|
33355
|
+
const existingCollectionIds = new Set(existingRows.flatMap((item) => item.collectionId ? [item.collectionId] : []));
|
|
33356
|
+
const suggestions = [];
|
|
33357
|
+
for (const candidate of SUGGESTED_NAV_LINK_CANDIDATES) {
|
|
33358
|
+
const path = withLeadingSlash(candidate.path);
|
|
33359
|
+
if (existingPaths.has(path)) continue;
|
|
33360
|
+
const record = (await db.select().from(pathRegistry).where(and(eq(pathRegistry.siteId, siteId), eq(pathRegistry.path, normalizePath(candidate.path)))).limit(1))[0];
|
|
33361
|
+
if (!record || record.kind === "redirect") continue;
|
|
33362
|
+
if (record.postId) {
|
|
33363
|
+
const post = (await db.select({
|
|
33364
|
+
title: posts.title,
|
|
33365
|
+
status: posts.status,
|
|
33366
|
+
visibility: posts.visibility
|
|
33367
|
+
}).from(posts).where(and(eq(posts.siteId, siteId), eq(posts.id, record.postId))).limit(1))[0];
|
|
33368
|
+
if (!post || post.status !== "published" || post.visibility === "private") continue;
|
|
33369
|
+
suggestions.push({
|
|
33370
|
+
key: candidate.key,
|
|
33371
|
+
label: normalizeSuggestedLabel(post.title, candidate.label),
|
|
33372
|
+
url: path,
|
|
33373
|
+
targetType: "page",
|
|
33374
|
+
navItemType: "link"
|
|
33375
|
+
});
|
|
33376
|
+
continue;
|
|
33377
|
+
}
|
|
33378
|
+
if (record.collectionId) {
|
|
33379
|
+
if (existingCollectionIds.has(record.collectionId)) continue;
|
|
33380
|
+
const collection = (await db.select({ title: collections.title }).from(collections).where(and(eq(collections.siteId, siteId), eq(collections.id, record.collectionId))).limit(1))[0];
|
|
33381
|
+
if (!collection) continue;
|
|
33382
|
+
suggestions.push({
|
|
33383
|
+
key: candidate.key,
|
|
33384
|
+
label: normalizeSuggestedLabel(collection.title, candidate.label),
|
|
33385
|
+
url: path,
|
|
33386
|
+
targetType: "collection",
|
|
33387
|
+
navItemType: record.kind === "slug" ? "collection" : "link",
|
|
33388
|
+
...record.kind === "slug" && { collectionId: record.collectionId }
|
|
33389
|
+
});
|
|
33390
|
+
continue;
|
|
33391
|
+
}
|
|
33392
|
+
if (record.kind === "archive") suggestions.push({
|
|
33393
|
+
key: candidate.key,
|
|
33394
|
+
label: candidate.label,
|
|
33395
|
+
url: path,
|
|
33396
|
+
targetType: "archive",
|
|
33397
|
+
navItemType: "link"
|
|
33398
|
+
});
|
|
33399
|
+
}
|
|
33400
|
+
return suggestions;
|
|
33401
|
+
},
|
|
33154
33402
|
async getCollectionFreshness(collectionIds) {
|
|
33155
33403
|
if (collectionIds.length === 0) return /* @__PURE__ */ new Map();
|
|
33156
33404
|
const threshold = now() - COLLECTION_FRESHNESS_WINDOW_SECONDS;
|
|
@@ -33653,7 +33901,7 @@ function createSiteAdminService(db, databaseSchema = sqliteSchemaBundle, databas
|
|
|
33653
33901
|
const themeCss = buildThemeStyle(activeTheme, appConfig.themeMode, fontOverrides);
|
|
33654
33902
|
const navItemList = await navItems.list();
|
|
33655
33903
|
const appleTouchKey = allSettings[SETTINGS_KEYS.SITE_FAVICON_APPLE_TOUCH];
|
|
33656
|
-
const { createExportService } = await import("./export-
|
|
33904
|
+
const { createExportService } = await import("./export-Dfbq9aot.js").then((n) => n.n);
|
|
33657
33905
|
const exportService = createExportService({
|
|
33658
33906
|
collections,
|
|
33659
33907
|
media: mediaService,
|
|
@@ -33665,7 +33913,6 @@ function createSiteAdminService(db, databaseSchema = sqliteSchemaBundle, databas
|
|
|
33665
33913
|
siteDescription: appConfig.siteDescription,
|
|
33666
33914
|
siteLanguage: appConfig.siteLanguage,
|
|
33667
33915
|
showJantBrandingOnHome: appConfig.showJantBrandingOnHome,
|
|
33668
|
-
homeDefaultView: getHomeDefaultViewFromNavItems(navItemList),
|
|
33669
33916
|
mainRssFeed: appConfig.mainRssFeed,
|
|
33670
33917
|
siteFooter: appConfig.siteFooter,
|
|
33671
33918
|
showHeaderAvatar: appConfig.showHeaderAvatar,
|
|
@@ -33881,7 +34128,6 @@ var RELAY_MULTIPART_THRESHOLD = 95 * 1024 * 1024;
|
|
|
33881
34128
|
var RELAY_MULTIPART_PART_SIZE = 50 * 1024 * 1024;
|
|
33882
34129
|
var IMMUTABLE_CACHE_CONTROL = "public, max-age=31536000, immutable";
|
|
33883
34130
|
var DEFAULT_EXPIRED_UPLOAD_CLEANUP_LIMIT = 20;
|
|
33884
|
-
var ORPHAN_MEDIA_GRACE_SECONDS = 10080 * 60;
|
|
33885
34131
|
var CLEANUPABLE_UPLOAD_SESSION_STATES = [
|
|
33886
34132
|
"pending",
|
|
33887
34133
|
"uploaded",
|
|
@@ -34176,11 +34422,6 @@ function createUploadSessionService(db, siteId, media, databaseSchema = sqliteSc
|
|
|
34176
34422
|
await db.delete(uploadSessions).where(and(eq(uploadSessions.siteId, siteId), eq(uploadSessions.id, session.id)));
|
|
34177
34423
|
deletedSessions += 1;
|
|
34178
34424
|
}
|
|
34179
|
-
const orphanIds = await media.listOrphanedMediaIds({
|
|
34180
|
-
before: now() - ORPHAN_MEDIA_GRACE_SECONDS,
|
|
34181
|
-
limit
|
|
34182
|
-
});
|
|
34183
|
-
if (orphanIds.length > 0) await media.deleteByIds(orphanIds, deps.storage);
|
|
34184
34425
|
const purgedStorageObjects = await media.purgeDueStorageObjects({
|
|
34185
34426
|
before: now(),
|
|
34186
34427
|
limit,
|
|
@@ -34189,7 +34430,7 @@ function createUploadSessionService(db, siteId, media, databaseSchema = sqliteSc
|
|
|
34189
34430
|
return {
|
|
34190
34431
|
abortedMultipartUploads,
|
|
34191
34432
|
deletedSessions,
|
|
34192
|
-
deletedOrphanMedia:
|
|
34433
|
+
deletedOrphanMedia: 0,
|
|
34193
34434
|
purgedStorageObjects
|
|
34194
34435
|
};
|
|
34195
34436
|
}
|
|
@@ -34573,6 +34814,11 @@ function createTelegramService(db, siteId, databaseSchema = sqliteSchemaBundle)
|
|
|
34573
34814
|
const settings = createSettingsService(db, siteId, databaseSchema, dialect);
|
|
34574
34815
|
const paths = createPathService(db, siteId, databaseSchema);
|
|
34575
34816
|
const navItems = createNavItemService(db, siteId, databaseSchema);
|
|
34817
|
+
const posts = createPostService(db, {
|
|
34818
|
+
slugIdLength: config?.slugIdLength ?? 5,
|
|
34819
|
+
databaseDialect: dialect
|
|
34820
|
+
}, siteId, paths, databaseSchema);
|
|
34821
|
+
const collections = createCollectionService(db, siteId, paths, databaseSchema, dialect);
|
|
34576
34822
|
const media = createMediaService(db, siteId, databaseSchema, dialect, {
|
|
34577
34823
|
enforceHostedQuota: config?.enforceHostedMediaQuota ?? false,
|
|
34578
34824
|
hostedControlPlane: config?.hostedControlPlane ?? null
|
|
@@ -34581,14 +34827,11 @@ function createTelegramService(db, siteId, databaseSchema = sqliteSchemaBundle)
|
|
|
34581
34827
|
settings,
|
|
34582
34828
|
site,
|
|
34583
34829
|
paths,
|
|
34584
|
-
posts
|
|
34585
|
-
slugIdLength: config?.slugIdLength ?? 5,
|
|
34586
|
-
databaseDialect: dialect
|
|
34587
|
-
}, siteId, paths, databaseSchema),
|
|
34830
|
+
posts,
|
|
34588
34831
|
customUrls: createCustomUrlService(db, siteId, paths, databaseSchema),
|
|
34589
34832
|
media,
|
|
34590
34833
|
uploads: createUploadSessionService(db, siteId, media, databaseSchema),
|
|
34591
|
-
collections
|
|
34834
|
+
collections,
|
|
34592
34835
|
search: createSearchService(rawQuery, siteId, dialect),
|
|
34593
34836
|
navItems,
|
|
34594
34837
|
auth: createAuthService(db, settings, { databaseDialect: dialect }, databaseSchema),
|
|
@@ -34606,6 +34849,11 @@ function createTelegramService(db, siteId, databaseSchema = sqliteSchemaBundle)
|
|
|
34606
34849
|
process.stderr.write(`[Jant] Hosted control plane metadata sync failed: ${message}\n`);
|
|
34607
34850
|
}
|
|
34608
34851
|
}),
|
|
34852
|
+
aboutPage: createAboutPageService({
|
|
34853
|
+
paths,
|
|
34854
|
+
posts,
|
|
34855
|
+
collections
|
|
34856
|
+
}),
|
|
34609
34857
|
githubAppInstallations: createGitHubAppInstallationsService(db, databaseSchema),
|
|
34610
34858
|
telegram: createTelegramService(db, siteId, databaseSchema)
|
|
34611
34859
|
};
|