@jant/core 0.6.15 → 0.7.0
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/README.md +11 -11
- package/bin/commands/assets/upload.js +192 -15
- package/bin/commands/import-site.js +67 -4
- package/bin/commands/reset-password.js +21 -8
- package/bin/commands/site/snapshot/export.js +1 -1
- package/bin/commands/site/snapshot/import.js +1 -1
- package/bin/lib/d1-query.js +5 -16
- package/bin/lib/node-env.js +40 -4
- package/bin/lib/site-selection.js +85 -29
- package/bin/lib/wrangler-cli.js +28 -2
- package/bin/lib/wrangler-json.js +35 -0
- package/dist/{app-C-oi_t8W.js → app-K_Aa1MMn.js} +52623 -13193
- package/dist/client/.vite/manifest.json +255 -90
- package/dist/client/_assets/chunks/confirm-D7GrwsCN.js +45 -0
- package/dist/client/_assets/chunks/create-editor-CD3FhrOB.js +257 -0
- package/dist/client/_assets/chunks/{native-DpcrFAPh.js → emoji-mart-C4RpRKcU.js} +716 -1
- package/dist/client/_assets/chunks/footnote-rail-CmeoVtnU.js +1 -0
- package/dist/client/_assets/chunks/heic-to-CuP2Qlsw.js +1 -0
- package/dist/client/_assets/chunks/jant-locale-picker-DL6mIOT5.js +69 -0
- package/dist/client/_assets/chunks/lit-DW8VmJAT.js +2 -0
- package/dist/client/_assets/chunks/mediabunny-DRaCQ1r-.js +31 -0
- package/dist/client/_assets/chunks/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/client/_assets/chunks/settings-paths-BcdySNx6.js +84 -0
- package/dist/client/_assets/chunks/site-header-nav-DzXsFk05.js +1 -0
- package/dist/client/_assets/chunks/slug-format-CRXO1AL5.js +1 -0
- package/dist/client/_assets/chunks/slugify-373citbs.js +1 -0
- package/dist/client/_assets/chunks/sortable-list-CgaL2jCs.js +2 -0
- package/dist/client/_assets/chunks/types-D5iF3H1a.js +1 -0
- package/dist/client/_assets/chunks/unsafe-html-B5ZEXaxg.js +1 -0
- package/dist/client/_assets/chunks/unsafe-svg-0QCkP0vZ.js +2 -0
- package/dist/client/_assets/client-GiYENVw8.css +2 -0
- package/dist/client/_assets/client-VnFxJN7G.js +295 -0
- package/dist/client/_assets/client-auth-k8gJ6QJj.js +828 -0
- package/dist/client/_assets/client-author-DQ8R-8KR.css +2 -0
- package/dist/client/_assets/client-compose-B_kDtWkW.js +2004 -0
- package/dist/client/_assets/client-manage-M90aSTOk.js +2170 -0
- package/dist/client/_assets/client-settings-DfYs9n1F.js +1112 -0
- package/dist/{export-CsFx6F_M.js → github-sync-BPAvT999.js} +2343 -110
- package/dist/index.js +2 -5
- package/dist/node.js +5 -7
- package/package.json +3 -3
- package/src/__tests__/auth-session-freshness.test.ts +57 -0
- package/src/__tests__/basecoat-variants.test.ts +121 -0
- package/src/__tests__/bin/assets-upload.test.ts +68 -0
- package/src/__tests__/export-hugo-build.test.ts +260 -0
- package/src/__tests__/export-service.test.ts +231 -0
- package/src/__tests__/helpers/component-css.ts +91 -0
- package/src/__tests__/helpers/db.ts +33 -0
- package/src/__tests__/helpers/export-fixtures.ts +3 -0
- package/src/__tests__/mise-config.test.ts +22 -0
- package/src/__tests__/stylesheet-audience.test.ts +159 -0
- package/src/__tests__/stylesheet-breakpoints.test.ts +183 -0
- package/src/app.tsx +71 -16
- package/src/auth.ts +18 -1
- package/src/client/__tests__/collection-page-actions.test.ts +51 -2
- package/src/client/__tests__/compose-bridge-image-upload.test.ts +196 -0
- package/src/client/__tests__/compose-bridge-video-poster.test.ts +159 -0
- package/src/client/__tests__/compose-bridge.test.ts +524 -2
- package/src/client/__tests__/compose-launch.test.ts +62 -1
- package/src/client/__tests__/compose-shortcuts.test.ts +57 -8
- package/src/client/__tests__/compose-triggers.test.ts +90 -0
- package/src/client/__tests__/copy-field.test.ts +162 -0
- package/src/client/__tests__/custom-url-menu.test.ts +127 -6
- package/src/client/__tests__/image-processor.test.ts +324 -2
- package/src/client/__tests__/lazy-entries.test.ts +92 -0
- package/src/client/__tests__/media-scroll-hint.test.ts +155 -0
- package/src/client/__tests__/runtime-paths.test.ts +84 -0
- package/src/client/__tests__/smart-collection-page-actions.test.ts +158 -0
- package/src/client/__tests__/toast.test.ts +88 -1
- package/src/client/__tests__/video-processor-probe.test.ts +175 -0
- package/src/client/__tests__/video-processor.test.ts +181 -0
- package/src/client/audio-processor.ts +24 -15
- package/src/client/audio-waveform.ts +49 -0
- package/src/client/collection-dialog-host.ts +72 -0
- package/src/client/collection-navigation.ts +51 -16
- package/src/client/collection-page-actions.ts +26 -0
- package/src/client/components/__tests__/compose-format-convert.test.ts +0 -19
- package/src/client/components/__tests__/jant-collection-dialog.test.ts +329 -0
- package/src/client/components/__tests__/jant-collection-directory.test.ts +274 -10
- package/src/client/components/__tests__/jant-collection-form.test.ts +59 -178
- package/src/client/components/__tests__/jant-command-palette.test.ts +79 -0
- package/src/client/components/__tests__/jant-compose-dialog-draft-storage.test.ts +340 -0
- package/src/client/components/__tests__/jant-compose-dialog.test.ts +3283 -389
- package/src/client/components/__tests__/jant-compose-editor.test.ts +581 -86
- package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +34 -89
- package/src/client/components/__tests__/jant-locale-picker.test.ts +207 -0
- package/src/client/components/__tests__/jant-nav-manager.test.ts +234 -15
- package/src/client/components/__tests__/jant-post-menu.test.ts +413 -2
- package/src/client/components/__tests__/jant-post-picker.test.ts +197 -0
- package/src/client/components/__tests__/jant-settings-avatar.test.ts +15 -12
- package/src/client/components/__tests__/jant-settings-general.test.ts +541 -172
- package/src/client/components/__tests__/jant-settings-language.test.ts +851 -0
- package/src/client/components/__tests__/jant-smart-collection-dialog.test.ts +665 -0
- package/src/client/components/collection-dialog-types.ts +49 -0
- package/src/client/components/collection-manager-types.ts +32 -1
- package/src/client/components/collection-types.ts +1 -15
- package/src/client/components/compose-format-convert.ts +5 -1
- package/src/client/components/compose-types.ts +121 -3
- package/src/client/components/jant-collection-dialog.ts +722 -0
- package/src/client/components/jant-collection-directory.ts +567 -182
- package/src/client/components/jant-collection-form.ts +53 -232
- package/src/client/components/jant-command-palette.ts +106 -49
- package/src/client/components/jant-compose-dialog.ts +2757 -1194
- package/src/client/components/jant-compose-editor.ts +866 -397
- package/src/client/components/jant-compose-fullscreen.ts +53 -47
- package/src/client/components/jant-config-editor.ts +65 -53
- package/src/client/components/jant-confirm-dialog.ts +13 -11
- package/src/client/components/jant-locale-picker.ts +418 -0
- package/src/client/components/jant-media-lightbox.ts +146 -136
- package/src/client/components/jant-nav-manager.ts +690 -366
- package/src/client/components/jant-post-menu.ts +1142 -268
- package/src/client/components/jant-post-picker.ts +324 -0
- package/src/client/components/jant-repo-picker.ts +138 -106
- package/src/client/components/jant-settings-avatar.ts +31 -27
- package/src/client/components/jant-settings-general.ts +617 -543
- package/src/client/components/jant-settings-language.ts +1087 -0
- package/src/client/components/jant-smart-collection-dialog.ts +1021 -0
- package/src/client/components/jant-text-preview.ts +94 -86
- package/src/client/components/nav-manager-types.ts +62 -1
- package/src/client/components/settings-types.ts +14 -29
- package/src/client/components/smart-collection-conditions.ts +285 -0
- package/src/client/components/smart-collection-dialog-types.ts +68 -0
- package/src/client/compose-bridge.ts +336 -242
- package/src/client/compose-launch.ts +89 -2
- package/src/client/compose-shortcuts.ts +9 -7
- package/src/client/compose-triggers.ts +50 -0
- package/src/client/copy-field.ts +108 -0
- package/src/client/custom-url-menu.ts +60 -4
- package/src/client/icons.ts +14 -0
- package/src/client/image-plan.ts +165 -0
- package/src/client/image-processor.ts +195 -117
- package/src/client/image-worker-client.ts +45 -0
- package/src/client/image-worker.ts +135 -0
- package/src/client/lazy-entries.ts +95 -0
- package/src/client/lazy-slugify.ts +2 -2
- package/src/client/media-scroll-hint.ts +43 -2
- package/src/client/mediabunny.ts +29 -0
- package/src/client/post-picker.ts +41 -0
- package/src/client/post-refresh.ts +135 -0
- package/src/client/runtime-paths.ts +74 -1
- package/src/client/settings-bridge.ts +4 -10
- package/src/client/site-header-nav.js +18 -6
- package/src/client/smart-collection-dialog-host.ts +116 -0
- package/src/client/smart-collection-page-actions.ts +208 -0
- package/src/client/tiptap/__tests__/bubble-menu.test.ts +110 -0
- package/src/client/tiptap/__tests__/floating-position.test.ts +136 -1
- package/src/client/tiptap/__tests__/inline-image-upload.test.ts +37 -0
- package/src/client/tiptap/__tests__/link-input-rules.test.ts +121 -0
- package/src/client/tiptap/bubble-menu.ts +47 -16
- package/src/client/tiptap/floating-position.ts +216 -2
- package/src/client/tiptap/inline-image-upload.ts +7 -3
- package/src/client/tiptap/link-input-rules.ts +4 -4
- package/src/client/tiptap/link-toolbar.ts +22 -9
- package/src/client/toast.ts +143 -38
- package/src/client/types/vite-worker.d.ts +12 -0
- package/src/client/upload-with-metadata.ts +3 -13
- package/src/client/video-processor.ts +351 -107
- package/src/client-auth.ts +14 -31
- package/src/client-compose.ts +19 -0
- package/src/client-manage.ts +13 -0
- package/src/client-settings.ts +14 -0
- package/src/client-site.ts +10 -3
- package/src/client.ts +4 -0
- package/src/db/__tests__/backfill-nav-label-mirrors.test.ts +149 -0
- package/src/db/__tests__/backfill-thread-activity.test.ts +234 -0
- package/src/db/__tests__/schema-enum-sources.test.ts +33 -0
- package/src/db/__tests__/smart-collection-placement.test.ts +402 -0
- package/src/db/__tests__/thread-activity.test.ts +113 -0
- package/src/db/backfills/0005_split_thread_activity_from_quiet_replies.sql +68 -0
- package/src/db/backfills/0006_clear_mirrored_page_nav_labels.sql +31 -0
- package/src/db/migrations/0031_many_ego.sql +3 -0
- package/src/db/migrations/0032_married_tomas.sql +3 -0
- package/src/db/migrations/0033_busy_johnny_storm.sql +198 -0
- package/src/db/migrations/0034_cheerful_rumiko_fujikawa.sql +35 -0
- package/src/db/migrations/meta/0031_snapshot.json +2562 -0
- package/src/db/migrations/meta/0032_snapshot.json +2582 -0
- package/src/db/migrations/meta/0033_snapshot.json +2816 -0
- package/src/db/migrations/meta/0034_snapshot.json +2816 -0
- package/src/db/migrations/meta/_journal.json +28 -0
- package/src/db/migrations/pg/0029_rare_hairball.sql +3 -0
- package/src/db/migrations/pg/0030_abandoned_nighthawk.sql +3 -0
- package/src/db/migrations/pg/0031_strong_ultimatum.sql +128 -0
- package/src/db/migrations/pg/0032_furry_multiple_man.sql +6 -0
- package/src/db/migrations/pg/meta/0029_snapshot.json +3289 -0
- package/src/db/migrations/pg/meta/0030_snapshot.json +3329 -0
- package/src/db/migrations/pg/meta/0031_snapshot.json +3660 -0
- package/src/db/migrations/pg/meta/0032_snapshot.json +3660 -0
- package/src/db/migrations/pg/meta/_journal.json +28 -0
- package/src/db/pg/schema.ts +213 -27
- package/src/db/post-visibility.ts +117 -0
- package/src/db/schema.ts +242 -27
- package/src/db/thread-activity.ts +101 -0
- package/src/i18n/__tests__/detect.test.ts +26 -81
- package/src/i18n/__tests__/supported-locales.test.ts +83 -0
- package/src/i18n/context.tsx +12 -2
- package/src/i18n/detect.ts +7 -66
- package/src/i18n/locales/glossary.zh-Hans.yml +44 -4
- package/src/i18n/locales/glossary.zh-Hant.yml +44 -4
- package/src/i18n/locales/public/en.po +568 -168
- package/src/i18n/locales/public/en.ts +1 -1
- package/src/i18n/locales/public/zh-Hans.po +562 -162
- package/src/i18n/locales/public/zh-Hans.ts +1 -1
- package/src/i18n/locales/public/zh-Hant.po +562 -162
- package/src/i18n/locales/public/zh-Hant.ts +1 -1
- package/src/i18n/locales/settings/en.po +551 -69
- package/src/i18n/locales/settings/en.ts +1 -1
- package/src/i18n/locales/settings/zh-Hans.po +597 -115
- package/src/i18n/locales/settings/zh-Hans.ts +1 -1
- package/src/i18n/locales/settings/zh-Hant.po +610 -128
- package/src/i18n/locales/settings/zh-Hant.ts +1 -1
- package/src/i18n/locales.ts +94 -0
- package/src/i18n/middleware.ts +12 -2
- package/src/i18n/supported-locales.ts +80 -0
- package/src/lib/__tests__/api-settings.test.ts +11 -2
- package/src/lib/__tests__/asset-path.test.ts +92 -0
- package/src/lib/__tests__/deferred.test.ts +90 -0
- package/src/lib/__tests__/discover-ping.test.ts +89 -0
- package/src/lib/__tests__/discover.test.ts +410 -0
- package/src/lib/__tests__/feed-policy.test.ts +26 -0
- package/src/lib/__tests__/feed.test.ts +1691 -12
- package/src/lib/__tests__/filter-dimensions.test.ts +341 -0
- package/src/lib/__tests__/hosted-signin.test.ts +1 -1
- package/src/lib/__tests__/http-cache.test.ts +162 -0
- package/src/lib/__tests__/jant-docs-dev.test.ts +21 -0
- package/src/lib/__tests__/jant-docs.test.ts +23 -0
- package/src/lib/__tests__/lang-detect.test.ts +231 -0
- package/src/lib/__tests__/markdown.test.ts +16 -0
- package/src/lib/__tests__/media-helpers.test.ts +81 -0
- package/src/lib/__tests__/navigation.test.ts +135 -1
- package/src/lib/__tests__/resolve-config.test.ts +64 -3
- package/src/lib/__tests__/schemas.test.ts +42 -4
- package/src/lib/__tests__/site-unavailable-page.test.ts +25 -0
- package/src/lib/__tests__/slug.test.ts +88 -0
- package/src/lib/__tests__/slugify.test.ts +85 -0
- package/src/lib/__tests__/storage.test.ts +32 -0
- package/src/lib/__tests__/thread-fold.test.ts +113 -0
- package/src/lib/__tests__/translit.test.ts +87 -0
- package/src/lib/__tests__/upload-sideload.test.ts +14 -0
- package/src/lib/__tests__/url-fetch.test.ts +1 -2
- package/src/lib/__tests__/url.test.ts +93 -34
- package/src/lib/__tests__/view-language.test.ts +413 -0
- package/src/lib/__tests__/worker-response-cache.test.ts +90 -0
- package/src/lib/address.ts +57 -0
- package/src/lib/api-posts.ts +12 -0
- package/src/lib/asset-path.ts +98 -1
- package/src/lib/build-env.ts +16 -0
- package/src/lib/collection-groups.ts +5 -1
- package/src/lib/collection-paths.ts +3 -10
- package/src/lib/constants.ts +28 -3
- package/src/lib/copy-field.ts +36 -0
- package/src/lib/crypto.ts +40 -0
- package/src/lib/csp-builder.ts +2 -1
- package/src/lib/deferred.ts +79 -0
- package/src/lib/discover-ping.ts +141 -0
- package/src/lib/discover.ts +437 -0
- package/src/lib/env.ts +134 -0
- package/src/lib/errors.ts +33 -0
- package/src/lib/feed-policy.ts +236 -2
- package/src/lib/feed.ts +1021 -66
- package/src/lib/filter-dimensions.ts +1349 -0
- package/src/lib/github-sync-site-config.ts +3 -0
- package/src/lib/hosted-signin.ts +1 -1
- package/src/lib/http-cache.ts +148 -0
- package/src/lib/hugo-markdown.ts +21 -0
- package/src/lib/icons.ts +9 -2
- package/src/lib/ids.ts +3 -0
- package/src/lib/jant-docs.ts +42 -0
- package/src/lib/lang-detect.ts +308 -0
- package/src/lib/link-preview.ts +25 -0
- package/src/lib/markdown-manager.ts +6 -1
- package/src/lib/media-helpers.ts +13 -1
- package/src/lib/navigation.ts +78 -11
- package/src/lib/pagination.ts +28 -24
- package/src/lib/per-language-surfaces.ts +67 -0
- package/src/lib/post-display.ts +42 -9
- package/src/lib/post-meta.ts +19 -0
- package/src/lib/render.tsx +55 -7
- package/src/lib/resolve-config.ts +53 -5
- package/src/lib/schemas.ts +201 -10
- package/src/lib/site-header-fragment.tsx +2 -1
- package/src/lib/site-unavailable-page.ts +47 -0
- package/src/lib/slug.ts +51 -7
- package/src/lib/slugify.ts +113 -0
- package/src/lib/startup-config.ts +4 -6
- package/src/lib/storage.ts +7 -0
- package/src/lib/summary.ts +50 -0
- package/src/lib/thread-fold.ts +161 -0
- package/src/lib/time.ts +32 -0
- package/src/lib/timeline.ts +81 -10
- package/src/lib/tiptap-render.ts +5 -4
- package/src/lib/translit.ts +288 -0
- package/src/lib/upload.ts +16 -13
- package/src/lib/url.ts +188 -24
- package/src/lib/version.ts +10 -8
- package/src/lib/view-language.ts +436 -0
- package/src/lib/view.ts +79 -23
- package/src/lib/viewer-context.ts +62 -0
- package/src/middleware/__tests__/auth.test.ts +70 -2
- package/src/middleware/__tests__/cache-control.test.ts +71 -3
- package/src/middleware/__tests__/onboarding.test.ts +76 -5
- package/src/middleware/__tests__/secure-headers.test.ts +1 -1
- package/src/middleware/__tests__/session.test.ts +181 -33
- package/src/middleware/auth.ts +50 -31
- package/src/middleware/cache-control.ts +75 -10
- package/src/middleware/config.ts +6 -6
- package/src/middleware/error-handler.ts +12 -0
- package/src/middleware/onboarding.ts +32 -10
- package/src/middleware/secure-headers.ts +1 -1
- package/src/middleware/session.ts +96 -8
- package/src/node/__tests__/cli-migrate.test.ts +21 -19
- package/src/node/__tests__/cli-reset-password.test.ts +81 -8
- package/src/node/__tests__/cli-runtime-target.test.ts +48 -1
- package/src/node/__tests__/cli-site-selection.test.ts +128 -38
- package/src/node/__tests__/runtime.test.ts +37 -0
- package/src/node/index.ts +1 -0
- package/src/preset.css +76 -22
- package/src/routes/__tests__/feed-validator.test.ts +156 -0
- package/src/routes/api/__tests__/collections.test.ts +114 -0
- package/src/routes/api/__tests__/discover.test.ts +222 -0
- package/src/routes/api/__tests__/nav-items.test.ts +212 -2
- package/src/routes/api/__tests__/palette.test.ts +44 -0
- package/src/routes/api/__tests__/post-translations.test.ts +829 -0
- package/src/routes/api/__tests__/settings.test.ts +24 -3
- package/src/routes/api/__tests__/telegram.test.ts +6 -5
- package/src/routes/api/collections.ts +49 -6
- package/src/routes/api/custom-urls.ts +0 -1
- package/src/routes/api/discover.ts +95 -0
- package/src/routes/api/export.ts +3 -0
- package/src/routes/api/internal/__tests__/sites.test.ts +42 -2
- package/src/routes/api/nav-items.ts +55 -8
- package/src/routes/api/posts.ts +172 -9
- package/src/routes/api/public/__tests__/archive.test.ts +111 -0
- package/src/routes/api/public/__tests__/posts.test.ts +38 -0
- package/src/routes/api/public/archive.ts +77 -81
- package/src/routes/api/public/posts.ts +30 -6
- package/src/routes/api/smart-collections.ts +132 -0
- package/src/routes/api/telegram.ts +2 -40
- package/src/routes/api/uploads.ts +1 -2
- package/src/routes/auth/__tests__/setup-auth.test.ts +137 -0
- package/src/routes/auth/__tests__/setup-discover.test.ts +204 -0
- package/src/routes/auth/__tests__/setup-flow.test.ts +270 -0
- package/src/routes/auth/__tests__/setup-page.test.tsx +329 -0
- package/src/routes/auth/__tests__/setup-steps.test.ts +310 -0
- package/src/routes/auth/__tests__/setup.test.ts +278 -26
- package/src/routes/auth/__tests__/signin.test.ts +135 -0
- package/src/routes/auth/setup.tsx +934 -186
- package/src/routes/auth/signin.tsx +10 -8
- package/src/routes/compose.tsx +11 -2
- package/src/routes/dash/__tests__/custom-urls-archive.test.ts +44 -0
- package/src/routes/dash/__tests__/custom-urls-page.test.ts +49 -0
- package/src/routes/dash/__tests__/delete-account.test.ts +106 -0
- package/src/routes/dash/__tests__/settings-discover.test.ts +213 -0
- package/src/routes/dash/custom-urls.tsx +1 -37
- package/src/routes/dash/settings.tsx +502 -41
- package/src/routes/discover-announce.ts +96 -0
- package/src/routes/feed/__tests__/feed.test.ts +165 -2
- package/src/routes/feed/__tests__/sitemap.test.ts +68 -1
- package/src/routes/feed/feed.ts +69 -40
- package/src/routes/feed/sitemap.ts +95 -11
- package/src/routes/pages/__tests__/archive-indexing.test.ts +200 -0
- package/src/routes/pages/__tests__/archive-params.test.ts +657 -1
- package/src/routes/pages/__tests__/collection-routing.test.ts +16 -0
- package/src/routes/pages/__tests__/collections-feed-links.test.ts +72 -0
- package/src/routes/pages/__tests__/collections.test.ts +9 -3
- package/src/routes/pages/__tests__/custom-archive-url.test.ts +119 -0
- package/src/routes/pages/__tests__/featured.test.ts +6 -2
- package/src/routes/pages/__tests__/feed-autodiscovery.test.ts +148 -0
- package/src/routes/pages/__tests__/language-routing.test.ts +679 -0
- package/src/routes/pages/__tests__/post-preview-partial.test.ts +96 -0
- package/src/routes/pages/__tests__/preview.test.ts +3 -1
- package/src/routes/pages/__tests__/smart-collection.test.ts +298 -0
- package/src/routes/pages/__tests__/subscribe.test.ts +248 -0
- package/src/routes/pages/archive.tsx +507 -357
- package/src/routes/pages/collection.tsx +94 -96
- package/src/routes/pages/collections.tsx +38 -50
- package/src/routes/pages/featured.tsx +32 -13
- package/src/routes/pages/home.tsx +25 -6
- package/src/routes/pages/language.tsx +113 -0
- package/src/routes/pages/latest.tsx +26 -16
- package/src/routes/pages/new.tsx +3 -0
- package/src/routes/pages/page.tsx +183 -19
- package/src/routes/pages/partials.tsx +41 -0
- package/src/routes/pages/search.tsx +18 -3
- package/src/routes/pages/smart-collection.tsx +340 -0
- package/src/routes/pages/subscribe.tsx +182 -0
- package/src/runtime/__tests__/index.test.ts +19 -0
- package/src/runtime/__tests__/node.test.ts +129 -4
- package/src/runtime/cloudflare.ts +21 -2
- package/src/runtime/index.ts +27 -1
- package/src/runtime/node.ts +18 -1
- package/src/runtime/site.ts +95 -24
- package/src/services/__tests__/auth.test.ts +116 -7
- package/src/services/__tests__/collection.test.ts +139 -4
- package/src/services/__tests__/language.test.ts +495 -0
- package/src/services/__tests__/navigation.test.ts +213 -10
- package/src/services/__tests__/path.test.ts +180 -0
- package/src/services/__tests__/post-language.test.ts +830 -0
- package/src/services/__tests__/post-timeline.test.ts +142 -11
- package/src/services/__tests__/post.test.ts +323 -9
- package/src/services/__tests__/settings.test.ts +228 -17
- package/src/services/__tests__/site-admin.test.ts +5 -5
- package/src/services/__tests__/smart-collection.test.ts +651 -0
- package/src/services/about-page.ts +22 -1
- package/src/services/auth.ts +51 -49
- package/src/services/bootstrap.ts +188 -38
- package/src/services/collection-directory-position.ts +76 -0
- package/src/services/collection.ts +330 -47
- package/src/services/custom-url.ts +27 -22
- package/src/services/export-theme/assets/client-site.css +1 -1
- package/src/services/export-theme/assets/client-site.js +123 -123
- package/src/services/export-theme/layouts/_default/rss.xml +77 -1
- package/src/services/export-theme/layouts/partials/feed-post-content.xml +105 -2
- package/src/services/export-theme/layouts/partials/media-gallery.html +35 -21
- package/src/services/export-theme/layouts/partials/pagination.html +14 -13
- package/src/services/export-theme/layouts/partials/post-card.html +8 -4
- package/src/services/export-theme/layouts/partials/reply.html +2 -1
- package/src/services/export-theme/layouts/partials/thread-preview.html +40 -30
- package/src/services/export-theme/styles/main.css +13 -1
- package/src/services/export.ts +281 -24
- package/src/services/index.ts +34 -3
- package/src/services/language.ts +412 -0
- package/src/services/mcp.ts +3 -1
- package/src/services/media.ts +14 -6
- package/src/services/navigation.ts +429 -67
- package/src/services/path.ts +225 -7
- package/src/services/post.ts +1318 -252
- package/src/services/search.ts +48 -2
- package/src/services/settings.ts +238 -43
- package/src/services/site-admin.ts +24 -7
- package/src/services/site.ts +77 -1
- package/src/services/smart-collection.ts +636 -0
- package/src/services/telegram.ts +20 -22
- package/src/services/upload-session.ts +1 -3
- package/src/style-author.css +27 -0
- package/src/styles/components-author.css +1622 -0
- package/src/styles/components.css +24 -1585
- package/src/styles/site-media.css +20 -6
- package/src/styles/tokens.css +144 -13
- package/src/styles/ui-author.css +7602 -0
- package/src/styles/ui.css +1224 -7276
- package/src/types/app-context.ts +7 -0
- package/src/types/bindings.ts +3 -0
- package/src/types/config.ts +94 -15
- package/src/types/constants.ts +188 -16
- package/src/types/entities.ts +92 -1
- package/src/types/operations.ts +64 -2
- package/src/types/props.ts +168 -30
- package/src/types/views.ts +61 -1
- package/src/ui/__tests__/font-themes.test.ts +52 -12
- package/src/ui/compose/ComposeDialog.tsx +215 -21
- package/src/ui/compose/ComposePrompt.tsx +1 -5
- package/src/ui/compose/__tests__/ComposeDialog.test.tsx +125 -0
- package/src/ui/dash/appearance/AdvancedContent.tsx +2 -2
- package/src/ui/dash/appearance/CodeInjectionContent.tsx +12 -16
- package/src/ui/dash/appearance/NavigationContent.tsx +117 -16
- package/src/ui/dash/appearance/__tests__/NavigationContent.test.tsx +33 -11
- package/src/ui/dash/appearance/__tests__/system-nav-descriptions.test.ts +44 -0
- package/src/ui/dash/appearance/system-nav-descriptions.ts +75 -0
- package/src/ui/dash/settings/AccountMenuContent.tsx +2 -2
- package/src/ui/dash/settings/ApiTokensContent.tsx +2 -1
- package/src/ui/dash/settings/ConfigEditorContent.tsx +35 -16
- package/src/ui/dash/settings/GeneralContent.tsx +275 -113
- package/src/ui/dash/settings/LanguageContent.tsx +409 -0
- package/src/ui/dash/settings/SettingsRootContent.tsx +19 -1
- package/src/ui/dash/settings/__tests__/GeneralContent.test.tsx +324 -4
- package/src/ui/dash/settings/__tests__/LanguageContent.test.tsx +144 -0
- package/src/ui/dash/settings/__tests__/discover-copy.test.ts +66 -0
- package/src/ui/dash/settings/discover-copy.ts +116 -0
- package/src/ui/feed/LinkCard.tsx +55 -45
- package/src/ui/feed/LinkPreview.tsx +2 -7
- package/src/ui/feed/NoteCard.tsx +9 -4
- package/src/ui/feed/PostStatusBadges.tsx +103 -17
- package/src/ui/feed/QuoteCard.tsx +55 -30
- package/src/ui/feed/ThreadPreview.tsx +6 -2
- package/src/ui/feed/__tests__/thread-preview.test.ts +13 -16
- package/src/ui/feed/__tests__/timeline-cards.test.ts +314 -49
- package/src/ui/feed/thread-preview-state.ts +20 -6
- package/src/ui/font-themes.ts +39 -29
- package/src/ui/layouts/BaseLayout.tsx +155 -10
- package/src/ui/layouts/SiteLayout.tsx +192 -34
- package/src/ui/layouts/__tests__/BaseLayout.test.tsx +196 -17
- package/src/ui/layouts/__tests__/SiteLayout.test.tsx +109 -85
- package/src/ui/pages/ArchivePage.tsx +401 -301
- package/src/ui/pages/CollectionPage.tsx +86 -76
- package/src/ui/pages/CollectionsPage.tsx +5 -0
- package/src/ui/pages/ComposePage.tsx +8 -0
- package/src/ui/pages/PostPage.tsx +47 -0
- package/src/ui/pages/SearchPage.tsx +3 -3
- package/src/ui/pages/SmartCollectionPage.tsx +434 -0
- package/src/ui/pages/SubscribePage.tsx +236 -0
- package/src/ui/pages/__tests__/ArchivePage.test.tsx +122 -3
- package/src/ui/pages/__tests__/collections-directory-rows.test.tsx +92 -0
- package/src/ui/pages/__tests__/collections-view-links.test.tsx +81 -0
- package/src/ui/shared/CollectionDirectory.tsx +178 -3
- package/src/ui/shared/CollectionsManager.tsx +70 -17
- package/src/ui/shared/CopyField.tsx +127 -0
- package/src/ui/shared/DraftPreviewBar.tsx +25 -9
- package/src/ui/shared/EmptyPostContent.tsx +23 -0
- package/src/ui/shared/MediaGallery.tsx +125 -46
- package/src/ui/shared/Pagination.tsx +20 -5
- package/src/ui/shared/PostFooter.tsx +55 -23
- package/src/ui/shared/__tests__/archive-labels.test.ts +100 -0
- package/src/ui/shared/__tests__/media-gallery.test.ts +210 -2
- package/src/ui/shared/__tests__/navigation-labels.test.ts +16 -22
- package/src/ui/shared/__tests__/pagination.test.ts +38 -24
- package/src/ui/shared/__tests__/post-footer.test.ts +32 -0
- package/src/ui/shared/archive-labels.ts +98 -0
- package/src/ui/shared/collection-management-labels.ts +94 -16
- package/src/ui/shared/custom-icons.ts +5 -0
- package/src/ui/shared/navigation-labels.ts +45 -71
- package/src/ui/shared/post-article-attributes.ts +8 -0
- package/src/ui/shared/smart-collection-labels.ts +343 -0
- package/dist/app-BxCOR3Uc.js +0 -6
- package/dist/client/_assets/chunks/heic-to-DUUaO23q.js +0 -1
- package/dist/client/_assets/chunks/module-DcsAZQZ_.js +0 -716
- package/dist/client/_assets/chunks/url-pLre2DM_.js +0 -1
- package/dist/client/_assets/client-B_eGKN5p.css +0 -2
- package/dist/client/_assets/client-DxY5BFe8.js +0 -296
- package/dist/client/_assets/client-auth-CakPESv9.js +0 -5533
- package/dist/env-OHRKGcMj.js +0 -281
- package/dist/github-api-BgSiE71w.js +0 -176
- package/dist/github-app-BbklkFmU.js +0 -275
- package/dist/github-sync-Cq1pzzOI.js +0 -431
- package/dist/github-sync-ppWXN3jb.js +0 -4
- package/dist/url-BMYO-Zlt.js +0 -395
- package/src/client/__tests__/collection-created-notice.test.ts +0 -36
- package/src/client/__tests__/collection-form-bridge.test.ts +0 -216
- package/src/client/__tests__/post-form-bridge.test.ts +0 -82
- package/src/client/collection-created-notice.ts +0 -66
- package/src/client/collection-form-bridge.ts +0 -191
- package/src/client/components/__tests__/jant-post-form.test.ts +0 -193
- package/src/client/components/jant-post-form.ts +0 -422
- package/src/client/components/post-form-template.ts +0 -352
- package/src/client/components/post-form-types.ts +0 -96
- package/src/client/media-metadata.ts +0 -247
- package/src/client/post-form-bridge.ts +0 -193
- package/src/ui/pages/CollectionEditorPage.tsx +0 -175
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language settings page.
|
|
3
|
+
*
|
|
4
|
+
* Server-side template that renders the <jant-settings-language> Lit element
|
|
5
|
+
* with its labels and initial state. Every language-related setting lives here
|
|
6
|
+
* — the site's content language, the dashboard's UI language, and multilingual
|
|
7
|
+
* content — so there is one place to look rather than two.
|
|
8
|
+
*
|
|
9
|
+
* The page is called "Language" rather than "Multilingual" on purpose: it also
|
|
10
|
+
* holds settings a single-language author owns, and they should not have to
|
|
11
|
+
* recognize a feature name they never turned on to find their site's language.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { msg } from "@lingui/core/macro";
|
|
15
|
+
import { useLingui } from "../../../i18n/context.js";
|
|
16
|
+
import { getSupportedLocaleEntries } from "../../../i18n/supported-locales.js";
|
|
17
|
+
import type { Locale } from "../../../i18n/locales.js";
|
|
18
|
+
import { getJantDocsUrl } from "../../../lib/jant-docs.js";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A value that renders as its own placeholder.
|
|
22
|
+
*
|
|
23
|
+
* Lingui resolves an ICU message completely at `i18n._()` time, so a message
|
|
24
|
+
* whose value is only known in the browser cannot simply be shipped as a
|
|
25
|
+
* template — its plurals would be formatted against `undefined`. Passing the
|
|
26
|
+
* placeholder back as the value leaves that one slot intact for the component
|
|
27
|
+
* to fill, while everything else in the message is translated and formatted
|
|
28
|
+
* here as usual.
|
|
29
|
+
*
|
|
30
|
+
* @param name - Placeholder name in the message
|
|
31
|
+
* @returns The literal `{name}` text
|
|
32
|
+
* @example
|
|
33
|
+
* i18n._(msg({ message: "Remove {language}" }), {
|
|
34
|
+
* language: keepPlaceholder("language"),
|
|
35
|
+
* }); // => "Remove {language}"
|
|
36
|
+
*/
|
|
37
|
+
function keepPlaceholder(name: string): string {
|
|
38
|
+
return `{${name}}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface LanguageContentProps {
|
|
42
|
+
/** Site content language, and primary language when multilingual is on. */
|
|
43
|
+
contentLanguage: string;
|
|
44
|
+
/** Explicit dashboard catalog locale, or `""` when it follows the content. */
|
|
45
|
+
dashboardLanguage: Locale | "";
|
|
46
|
+
/** Whether per-language browsing views are being served. */
|
|
47
|
+
multilingualEnabled: boolean;
|
|
48
|
+
/** Additional languages in switcher order. */
|
|
49
|
+
additionalLanguages: string[];
|
|
50
|
+
/** Posts with no language yet — the number the enable dialog quotes. */
|
|
51
|
+
unmarkedPostCount: number;
|
|
52
|
+
sitePathPrefix: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function LanguageContent({
|
|
56
|
+
contentLanguage,
|
|
57
|
+
dashboardLanguage,
|
|
58
|
+
multilingualEnabled,
|
|
59
|
+
additionalLanguages,
|
|
60
|
+
unmarkedPostCount,
|
|
61
|
+
sitePathPrefix,
|
|
62
|
+
}: LanguageContentProps) {
|
|
63
|
+
const { i18n } = useLingui();
|
|
64
|
+
|
|
65
|
+
const labels = JSON.stringify({
|
|
66
|
+
siteSection: i18n._(
|
|
67
|
+
msg({
|
|
68
|
+
message: "Site",
|
|
69
|
+
comment:
|
|
70
|
+
"@context: Language settings section for reader-facing settings",
|
|
71
|
+
}),
|
|
72
|
+
),
|
|
73
|
+
dashboardSection: i18n._(
|
|
74
|
+
msg({
|
|
75
|
+
message: "Dashboard",
|
|
76
|
+
comment:
|
|
77
|
+
"@context: Language settings section for author-facing settings",
|
|
78
|
+
}),
|
|
79
|
+
),
|
|
80
|
+
contentLanguage: i18n._(
|
|
81
|
+
msg({
|
|
82
|
+
message: "Content language",
|
|
83
|
+
comment: "@context: Language settings field — the site's language",
|
|
84
|
+
}),
|
|
85
|
+
),
|
|
86
|
+
contentLanguageHelp: i18n._(
|
|
87
|
+
msg({
|
|
88
|
+
message: "The language you write in.",
|
|
89
|
+
comment: "@context: Help text for the content language field",
|
|
90
|
+
}),
|
|
91
|
+
),
|
|
92
|
+
primaryLanguage: i18n._(
|
|
93
|
+
msg({
|
|
94
|
+
message: "Primary language",
|
|
95
|
+
comment:
|
|
96
|
+
"@context: Label the content language field takes once multilingual is on",
|
|
97
|
+
}),
|
|
98
|
+
),
|
|
99
|
+
primaryLanguageHelp: i18n._(
|
|
100
|
+
msg({
|
|
101
|
+
message: "The root address (/, /feed) shows this language.",
|
|
102
|
+
comment: "@context: Help text for the primary language field",
|
|
103
|
+
}),
|
|
104
|
+
),
|
|
105
|
+
languagesLabel: i18n._(
|
|
106
|
+
msg({
|
|
107
|
+
message: "Languages",
|
|
108
|
+
comment: "@context: Label above the list of the site's languages",
|
|
109
|
+
}),
|
|
110
|
+
),
|
|
111
|
+
primaryBadge: i18n._(
|
|
112
|
+
msg({
|
|
113
|
+
message: "Primary",
|
|
114
|
+
comment: "@context: Badge on the language served at the root address",
|
|
115
|
+
}),
|
|
116
|
+
),
|
|
117
|
+
makePrimary: i18n._(
|
|
118
|
+
msg({
|
|
119
|
+
message: "Make primary",
|
|
120
|
+
comment:
|
|
121
|
+
"@context: Button that moves a language to the site's root address",
|
|
122
|
+
}),
|
|
123
|
+
),
|
|
124
|
+
dashboardLanguage: i18n._(
|
|
125
|
+
msg({
|
|
126
|
+
message: "Dashboard language",
|
|
127
|
+
comment: "@context: Language settings field — the admin UI language",
|
|
128
|
+
}),
|
|
129
|
+
),
|
|
130
|
+
dashboardLanguageHelp: i18n._(
|
|
131
|
+
msg({
|
|
132
|
+
message: "The language of your admin pages. Only you see this.",
|
|
133
|
+
comment: "@context: Help text for the dashboard language field",
|
|
134
|
+
}),
|
|
135
|
+
),
|
|
136
|
+
followContent: i18n._(
|
|
137
|
+
msg({
|
|
138
|
+
message: "Follow content language",
|
|
139
|
+
comment:
|
|
140
|
+
"@context: Dashboard language option that follows the site language",
|
|
141
|
+
}),
|
|
142
|
+
),
|
|
143
|
+
multilingual: i18n._(
|
|
144
|
+
msg({
|
|
145
|
+
message: "Multilingual content",
|
|
146
|
+
comment: "@context: Language settings toggle for multilingual content",
|
|
147
|
+
}),
|
|
148
|
+
),
|
|
149
|
+
multilingualHelp: i18n._(
|
|
150
|
+
msg({
|
|
151
|
+
message:
|
|
152
|
+
"Give each language its own home page, archive, and feed. Once it's on, you pick a language when you publish, and can link an existing post to a version of it in another language.",
|
|
153
|
+
comment: "@context: Help text for the multilingual content toggle",
|
|
154
|
+
}),
|
|
155
|
+
),
|
|
156
|
+
multilingualDocs: i18n._(
|
|
157
|
+
msg({
|
|
158
|
+
message: "Multilingual guide",
|
|
159
|
+
comment:
|
|
160
|
+
"@context: Link to multilingual documentation on the Language settings page",
|
|
161
|
+
}),
|
|
162
|
+
),
|
|
163
|
+
multilingualDocsHelp: i18n._(
|
|
164
|
+
msg({
|
|
165
|
+
message: "URL structure, per-language feeds, and linking translations.",
|
|
166
|
+
comment: "@context: Description of the multilingual documentation link",
|
|
167
|
+
}),
|
|
168
|
+
),
|
|
169
|
+
statusOn: i18n._(
|
|
170
|
+
msg({
|
|
171
|
+
message: "On",
|
|
172
|
+
comment: "@context: Status badge — multilingual content is on",
|
|
173
|
+
}),
|
|
174
|
+
),
|
|
175
|
+
turnOn: i18n._(
|
|
176
|
+
msg({
|
|
177
|
+
message: "Turn on",
|
|
178
|
+
comment:
|
|
179
|
+
"@context: Link in the multilingual section that opens the setup dialog",
|
|
180
|
+
}),
|
|
181
|
+
),
|
|
182
|
+
addMissingLanguage: i18n._(
|
|
183
|
+
msg({
|
|
184
|
+
message: "Add {language}",
|
|
185
|
+
comment:
|
|
186
|
+
"@context: One-click fix in the multilingual dialog, putting a language with posts back on the list",
|
|
187
|
+
}),
|
|
188
|
+
{ language: keepPlaceholder("language") },
|
|
189
|
+
),
|
|
190
|
+
viewPosts: i18n._(
|
|
191
|
+
msg({
|
|
192
|
+
message: "View these posts",
|
|
193
|
+
comment:
|
|
194
|
+
"@context: Link in the cannot-remove-language error, leading to that language's archive",
|
|
195
|
+
}),
|
|
196
|
+
),
|
|
197
|
+
otherLanguages: i18n._(
|
|
198
|
+
msg({
|
|
199
|
+
message: "Other languages",
|
|
200
|
+
comment: "@context: Label for the list of non-primary languages",
|
|
201
|
+
}),
|
|
202
|
+
),
|
|
203
|
+
addLanguage: i18n._(
|
|
204
|
+
msg({
|
|
205
|
+
message: "Add language",
|
|
206
|
+
comment: "@context: Button that adds another content language",
|
|
207
|
+
}),
|
|
208
|
+
),
|
|
209
|
+
removeLanguage: i18n._(
|
|
210
|
+
msg({
|
|
211
|
+
message: "Remove {language}",
|
|
212
|
+
comment: "@context: Accessible label on the button removing a language",
|
|
213
|
+
}),
|
|
214
|
+
{ language: keepPlaceholder("language") },
|
|
215
|
+
),
|
|
216
|
+
languageMenu: i18n._(
|
|
217
|
+
msg({
|
|
218
|
+
message: "Options for {language}",
|
|
219
|
+
comment:
|
|
220
|
+
"@context: Accessible label on a language row's actions menu trigger",
|
|
221
|
+
}),
|
|
222
|
+
{ language: keepPlaceholder("language") },
|
|
223
|
+
),
|
|
224
|
+
enableTitle: i18n._(
|
|
225
|
+
msg({
|
|
226
|
+
message: "Turn on multilingual content",
|
|
227
|
+
comment:
|
|
228
|
+
"@context: Title of the dialog that configures languages and turns multilingual on",
|
|
229
|
+
}),
|
|
230
|
+
),
|
|
231
|
+
enableReassurance: i18n._(
|
|
232
|
+
msg({
|
|
233
|
+
message:
|
|
234
|
+
"Post addresses do not change, and you can turn this off again at any time.",
|
|
235
|
+
comment:
|
|
236
|
+
"@context: Reassurance line at the bottom of the multilingual dialog",
|
|
237
|
+
}),
|
|
238
|
+
),
|
|
239
|
+
enableMarkTitle: i18n._(
|
|
240
|
+
msg({
|
|
241
|
+
message: "One-time change to your existing posts",
|
|
242
|
+
comment:
|
|
243
|
+
"@context: Title of the stamping warning in the multilingual dialog",
|
|
244
|
+
}),
|
|
245
|
+
),
|
|
246
|
+
enableMarkWarning: i18n._(
|
|
247
|
+
msg({
|
|
248
|
+
message:
|
|
249
|
+
"{count, plural, one {# existing post} other {# existing posts}} with no language yet will be marked as {language}.",
|
|
250
|
+
comment:
|
|
251
|
+
"@context: Warning in the multilingual dialog about stamping posts that have no language",
|
|
252
|
+
}),
|
|
253
|
+
// The count is fixed for this page load, so Lingui resolves the plural
|
|
254
|
+
// here. The language is picked inside the dialog, so its placeholder is
|
|
255
|
+
// carried through untouched and filled in by the component.
|
|
256
|
+
{ count: unmarkedPostCount, language: keepPlaceholder("language") },
|
|
257
|
+
),
|
|
258
|
+
enableFixHint: i18n._(
|
|
259
|
+
msg({
|
|
260
|
+
message:
|
|
261
|
+
"Any post written in another language can be corrected from its own menu afterwards.",
|
|
262
|
+
comment: "@context: Follow-up hint under the stamping warning",
|
|
263
|
+
}),
|
|
264
|
+
),
|
|
265
|
+
enableNeedsLanguage: i18n._(
|
|
266
|
+
msg({
|
|
267
|
+
message: "Add at least one more language to turn this on.",
|
|
268
|
+
comment:
|
|
269
|
+
"@context: Validation message when the multilingual dialog has no second language",
|
|
270
|
+
}),
|
|
271
|
+
),
|
|
272
|
+
changePrimaryTitle: i18n._(
|
|
273
|
+
msg({
|
|
274
|
+
message: "Change the primary language?",
|
|
275
|
+
comment: "@context: Title of the change-primary-language dialog",
|
|
276
|
+
}),
|
|
277
|
+
),
|
|
278
|
+
changePrimaryBody: i18n._(
|
|
279
|
+
msg({
|
|
280
|
+
message:
|
|
281
|
+
"{next} will be served at the root address (/, /feed, /archive), and {previous} moves to {prefix}. Post addresses do not change, but anyone subscribed to /feed starts receiving {next} posts.",
|
|
282
|
+
comment: "@context: Body of the change-primary-language dialog",
|
|
283
|
+
}),
|
|
284
|
+
{
|
|
285
|
+
next: keepPlaceholder("next"),
|
|
286
|
+
previous: keepPlaceholder("previous"),
|
|
287
|
+
prefix: keepPlaceholder("prefix"),
|
|
288
|
+
},
|
|
289
|
+
),
|
|
290
|
+
changePrimaryConfirm: i18n._(
|
|
291
|
+
msg({
|
|
292
|
+
message: "Switch",
|
|
293
|
+
comment:
|
|
294
|
+
"@context: Confirm button in the change-primary-language dialog",
|
|
295
|
+
}),
|
|
296
|
+
),
|
|
297
|
+
disableTitle: i18n._(
|
|
298
|
+
msg({
|
|
299
|
+
message: "Turn off multilingual content?",
|
|
300
|
+
comment: "@context: Title of the disable-multilingual dialog",
|
|
301
|
+
}),
|
|
302
|
+
),
|
|
303
|
+
disableBody: i18n._(
|
|
304
|
+
msg({
|
|
305
|
+
message:
|
|
306
|
+
"The root address goes back to showing every language, and addresses like {prefix} redirect to it, so existing links and feed subscriptions keep working. Post addresses and each post's language are unchanged, so you can turn this back on any time.",
|
|
307
|
+
comment: "@context: Body of the disable-multilingual dialog",
|
|
308
|
+
}),
|
|
309
|
+
{ prefix: keepPlaceholder("prefix") },
|
|
310
|
+
),
|
|
311
|
+
disableConfirm: i18n._(
|
|
312
|
+
msg({
|
|
313
|
+
message: "Turn off",
|
|
314
|
+
comment: "@context: Confirm button in the disable-multilingual dialog",
|
|
315
|
+
}),
|
|
316
|
+
),
|
|
317
|
+
removeLastTitle: i18n._(
|
|
318
|
+
msg({
|
|
319
|
+
message: "Turn off multilingual content?",
|
|
320
|
+
comment:
|
|
321
|
+
"@context: Title of the dialog confirming removal of the last additional language",
|
|
322
|
+
}),
|
|
323
|
+
),
|
|
324
|
+
removeLastBody: i18n._(
|
|
325
|
+
msg({
|
|
326
|
+
message:
|
|
327
|
+
"{language} is the only other language on this site, so removing it turns multilingual content off. The root address goes back to showing every language, {prefix} stops working, and each post keeps the language it is written in.",
|
|
328
|
+
comment:
|
|
329
|
+
"@context: Body of the dialog confirming removal of the last additional language",
|
|
330
|
+
}),
|
|
331
|
+
{
|
|
332
|
+
language: keepPlaceholder("language"),
|
|
333
|
+
prefix: keepPlaceholder("prefix"),
|
|
334
|
+
},
|
|
335
|
+
),
|
|
336
|
+
removeLastConfirm: i18n._(
|
|
337
|
+
msg({
|
|
338
|
+
message: "Remove and turn off",
|
|
339
|
+
comment:
|
|
340
|
+
"@context: Confirm button when removing the last additional language",
|
|
341
|
+
}),
|
|
342
|
+
),
|
|
343
|
+
cancel: i18n._(
|
|
344
|
+
msg({ message: "Cancel", comment: "@context: Dialog cancel button" }),
|
|
345
|
+
),
|
|
346
|
+
save: i18n._(
|
|
347
|
+
msg({ message: "Save", comment: "@context: Settings save button" }),
|
|
348
|
+
),
|
|
349
|
+
saving: i18n._(
|
|
350
|
+
msg({
|
|
351
|
+
message: "Saving…",
|
|
352
|
+
comment: "@context: Settings save in progress",
|
|
353
|
+
}),
|
|
354
|
+
),
|
|
355
|
+
searchPlaceholder: i18n._(
|
|
356
|
+
msg({
|
|
357
|
+
message: "Search…",
|
|
358
|
+
comment: "@context: Placeholder in the language picker search box",
|
|
359
|
+
}),
|
|
360
|
+
),
|
|
361
|
+
noMatches: i18n._(
|
|
362
|
+
msg({
|
|
363
|
+
message: "No matches.",
|
|
364
|
+
comment: "@context: Empty state in the language picker",
|
|
365
|
+
}),
|
|
366
|
+
),
|
|
367
|
+
}).replace(/</g, "\\u003c");
|
|
368
|
+
|
|
369
|
+
const locales = JSON.stringify(
|
|
370
|
+
getSupportedLocaleEntries().map((entry) => ({
|
|
371
|
+
tag: entry.tag,
|
|
372
|
+
native: entry.native,
|
|
373
|
+
english: entry.english,
|
|
374
|
+
coverage: entry.coverage,
|
|
375
|
+
})),
|
|
376
|
+
).replace(/</g, "\\u003c");
|
|
377
|
+
|
|
378
|
+
const initialState = JSON.stringify({
|
|
379
|
+
contentLanguage,
|
|
380
|
+
dashboardLanguage,
|
|
381
|
+
multilingualEnabled,
|
|
382
|
+
additionalLanguages,
|
|
383
|
+
unmarkedPostCount,
|
|
384
|
+
sitePathPrefix,
|
|
385
|
+
// Resolved here because the docs host depends on the build environment,
|
|
386
|
+
// which the browser bundle cannot see.
|
|
387
|
+
multilingualDocsUrl: getJantDocsUrl("multilingual"),
|
|
388
|
+
}).replace(/</g, "\\u003c");
|
|
389
|
+
|
|
390
|
+
return (
|
|
391
|
+
<>
|
|
392
|
+
<div class="flex flex-col max-w-form">
|
|
393
|
+
<jant-settings-language labels={labels} locales={locales}>
|
|
394
|
+
{/* SSR fallback skeleton */}
|
|
395
|
+
<div>
|
|
396
|
+
<h2 class="skel-label" />
|
|
397
|
+
<div class="skel-section-lg" />
|
|
398
|
+
</div>
|
|
399
|
+
</jant-settings-language>
|
|
400
|
+
</div>
|
|
401
|
+
|
|
402
|
+
<script
|
|
403
|
+
type="application/json"
|
|
404
|
+
id="language-settings-initial-data"
|
|
405
|
+
dangerouslySetInnerHTML={{ __html: initialState }}
|
|
406
|
+
/>
|
|
407
|
+
</>
|
|
408
|
+
);
|
|
409
|
+
}
|
|
@@ -17,6 +17,7 @@ const ICONS = {
|
|
|
17
17
|
settings: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/></svg>`,
|
|
18
18
|
image: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>`,
|
|
19
19
|
menu: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="4" x2="20" y1="12" y2="12"/><line x1="4" x2="20" y1="6" y2="6"/><line x1="4" x2="20" y1="18" y2="18"/></svg>`,
|
|
20
|
+
languages: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m5 8 6 6"/><path d="m4 14 6-6 2-3"/><path d="M2 5h12"/><path d="M7 2h1"/><path d="m22 22-5-10-5 10"/><path d="M14 18h6"/></svg>`,
|
|
20
21
|
palette: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"/><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"/><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"/><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"/><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z"/></svg>`,
|
|
21
22
|
type: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 7 4 4 20 4 20 7"/><line x1="9" x2="15" y1="20" y2="20"/><line x1="12" x2="12" y1="4" y2="20"/></svg>`,
|
|
22
23
|
code: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>`,
|
|
@@ -114,11 +115,28 @@ export function SettingsRootContent({
|
|
|
114
115
|
)}
|
|
115
116
|
description={i18n._(
|
|
116
117
|
msg({
|
|
117
|
-
message: "Name,
|
|
118
|
+
message: "Name, visibility, feeds, and time zone",
|
|
118
119
|
comment: "@context: Settings item description for general",
|
|
119
120
|
}),
|
|
120
121
|
)}
|
|
121
122
|
/>
|
|
123
|
+
<SettingsDirectoryLink
|
|
124
|
+
href={toPublicPath("/settings/language", sitePathPrefix)}
|
|
125
|
+
icon={ICONS.languages}
|
|
126
|
+
tone="subtle"
|
|
127
|
+
name={i18n._(
|
|
128
|
+
msg({
|
|
129
|
+
message: "Language",
|
|
130
|
+
comment: "@context: Settings item — language settings",
|
|
131
|
+
}),
|
|
132
|
+
)}
|
|
133
|
+
description={i18n._(
|
|
134
|
+
msg({
|
|
135
|
+
message: "Content language, dashboard language, multilingual",
|
|
136
|
+
comment: "@context: Settings item description for language",
|
|
137
|
+
}),
|
|
138
|
+
)}
|
|
139
|
+
/>
|
|
122
140
|
<SettingsDirectoryLink
|
|
123
141
|
href={toPublicPath("/settings/custom-urls", sitePathPrefix)}
|
|
124
142
|
icon={ICONS.arrowRightLeft}
|