@jant/core 0.6.16 → 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 +60 -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-C7_4oab9.js → app-K_Aa1MMn.js} +52476 -13330
- 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-Dl5KCiEs.js → github-sync-BPAvT999.js} +2254 -107
- 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__/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 +272 -0
- package/src/client/__tests__/compose-launch.test.ts +62 -1
- package/src/client/__tests__/compose-shortcuts.test.ts +38 -9
- 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 +23 -0
- 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__/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 +28 -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 +1250 -53
- package/src/client/components/__tests__/jant-compose-editor.test.ts +544 -40
- package/src/client/components/__tests__/jant-compose-fullscreen.test.ts +0 -1
- 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-types.ts +75 -1
- 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 +100 -49
- package/src/client/components/jant-compose-dialog.ts +1486 -707
- package/src/client/components/jant-compose-editor.ts +673 -336
- package/src/client/components/jant-compose-fullscreen.ts +51 -43
- 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 +1086 -282
- 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 +214 -141
- package/src/client/compose-launch.ts +76 -2
- package/src/client/compose-shortcuts.ts +6 -8
- 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/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/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-toolbar.ts +22 -9
- package/src/client/toast.ts +13 -0
- 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__/schema-enum-sources.test.ts +33 -0
- package/src/db/__tests__/smart-collection-placement.test.ts +402 -0
- package/src/db/backfills/0006_clear_mirrored_page_nav_labels.sql +31 -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/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 +21 -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/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 +21 -0
- package/src/db/pg/schema.ts +195 -27
- package/src/db/post-visibility.ts +117 -0
- package/src/db/schema.ts +222 -27
- 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 +490 -158
- package/src/i18n/locales/public/en.ts +1 -1
- package/src/i18n/locales/public/zh-Hans.po +487 -155
- package/src/i18n/locales/public/zh-Hans.ts +1 -1
- package/src/i18n/locales/public/zh-Hant.po +487 -155
- 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 +1526 -15
- 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__/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 +70 -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__/upload-sideload.test.ts +14 -0
- package/src/lib/__tests__/url-fetch.test.ts +1 -2
- package/src/lib/__tests__/url.test.ts +78 -72
- 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 +926 -73
- 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 +16 -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/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-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 +42 -1
- package/src/lib/tiptap-render.ts +1 -2
- package/src/lib/upload.ts +16 -13
- package/src/lib/url.ts +139 -86
- package/src/lib/version.ts +10 -8
- package/src/lib/view-language.ts +436 -0
- package/src/lib/view.ts +51 -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__/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 +159 -0
- package/src/routes/api/public/__tests__/archive.test.ts +111 -0
- package/src/routes/api/public/archive.ts +77 -81
- package/src/routes/api/public/posts.ts +23 -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 +5 -0
- 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/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 +370 -6
- 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__/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__/smart-collection.test.ts +298 -0
- package/src/routes/pages/__tests__/subscribe.test.ts +248 -0
- package/src/routes/pages/archive.tsx +471 -369
- 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 +178 -17
- 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 +108 -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.test.ts +46 -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 +331 -46
- 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 +278 -19
- 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 +221 -6
- package/src/services/post.ts +1021 -152
- package/src/services/search.ts +39 -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 -1571
- package/src/styles/site-media.css +16 -2
- package/src/styles/tokens.css +82 -12
- package/src/styles/ui-author.css +7602 -0
- package/src/styles/ui.css +1087 -7219
- 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 +87 -1
- package/src/types/operations.ts +64 -2
- package/src/types/props.ts +157 -31
- package/src/types/views.ts +55 -1
- package/src/ui/__tests__/font-themes.test.ts +52 -12
- package/src/ui/compose/ComposeDialog.tsx +201 -7
- 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/NoteCard.tsx +9 -4
- package/src/ui/feed/PostStatusBadges.tsx +90 -43
- 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 +282 -289
- 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 +65 -9
- 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/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 +20 -11
- 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/navigation-labels.ts +45 -71
- package/src/ui/shared/post-article-attributes.ts +2 -0
- package/src/ui/shared/smart-collection-labels.ts +343 -0
- package/dist/app-C75Zc8dD.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-CU9pEbk5.js +0 -1
- package/dist/client/_assets/client-Bq0vre8Y.js +0 -296
- package/dist/client/_assets/client-D3VZyG4L.css +0 -2
- package/dist/client/_assets/client-auth-F2rb9WfF.js +0 -5571
- package/dist/env-BPYViDJJ.js +0 -281
- package/dist/github-api-BNF35Lkx.js +0 -176
- package/dist/github-app-DdiD-bC4.js +0 -275
- package/dist/github-sync-Bqg62IvV.js +0 -4
- package/dist/github-sync-HdK2EgvJ.js +0 -431
- package/dist/url-CbLAtlZe.js +0 -900
- 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,343 @@
|
|
|
1
|
+
import { msg } from "@lingui/core/macro";
|
|
2
|
+
import type { I18n } from "../../i18n/i18n.js";
|
|
3
|
+
import type {
|
|
4
|
+
DimensionContext,
|
|
5
|
+
PostFilterSelection,
|
|
6
|
+
} from "../../lib/filter-dimensions.js";
|
|
7
|
+
import {
|
|
8
|
+
describeFilterSelection,
|
|
9
|
+
FILTER_DIMENSION_KEYS,
|
|
10
|
+
FILTER_DIMENSIONS,
|
|
11
|
+
getMediaKindLabel,
|
|
12
|
+
serializePostFilterSelection,
|
|
13
|
+
} from "../../lib/filter-dimensions.js";
|
|
14
|
+
import { MEDIA_KINDS } from "../../types/constants.js";
|
|
15
|
+
import { getCollectionDialogLabels } from "./collection-management-labels.js";
|
|
16
|
+
|
|
17
|
+
type Translator = Pick<I18n, "_">;
|
|
18
|
+
|
|
19
|
+
/** Separator between conditions on the condition line. */
|
|
20
|
+
const CONDITION_SEPARATOR = " · ";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* What a smart collection gathers, in one line every reader sees.
|
|
24
|
+
*
|
|
25
|
+
* Not an owner-only detail. It changes how the page is read: a manual
|
|
26
|
+
* collection is an editorial claim, a smart collection is a standing query, and
|
|
27
|
+
* a reader who does not know which one they are looking at cannot tell whether
|
|
28
|
+
* an absence means "not chosen" or "does not match".
|
|
29
|
+
*
|
|
30
|
+
* Safe to show to anyone by construction — a smart collection is always public,
|
|
31
|
+
* so its conditions can only be made of public information.
|
|
32
|
+
*
|
|
33
|
+
* @param selection - The conditions
|
|
34
|
+
* @param i18n - Translator
|
|
35
|
+
* @param ctx - Collection vocabulary, for naming a selected collection
|
|
36
|
+
* @returns A label and its conditions, joined by a middle dot — or one plain
|
|
37
|
+
* sentence when nothing narrows the selection
|
|
38
|
+
* @example
|
|
39
|
+
* describeSmartCollection({ format: "quote" }, i18n, ctx);
|
|
40
|
+
* // "Automatically collects: Quotes"
|
|
41
|
+
*/
|
|
42
|
+
export function describeSmartCollection(
|
|
43
|
+
selection: PostFilterSelection,
|
|
44
|
+
i18n: Translator,
|
|
45
|
+
ctx: DimensionContext = {},
|
|
46
|
+
): string {
|
|
47
|
+
const parts = describeFilterSelection(selection, i18n, ctx);
|
|
48
|
+
|
|
49
|
+
if (parts.length === 0) {
|
|
50
|
+
// True, and it explains why the number matches the whole site.
|
|
51
|
+
return i18n._(
|
|
52
|
+
msg({
|
|
53
|
+
message: "Automatically collects every post.",
|
|
54
|
+
comment:
|
|
55
|
+
"@context: Smart collection page — what it gathers, when no condition narrows it",
|
|
56
|
+
}),
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return i18n._(
|
|
61
|
+
msg({
|
|
62
|
+
message: "Automatically collects: {conditions}",
|
|
63
|
+
comment:
|
|
64
|
+
'@context: Smart collection page — what it gathers. {conditions} is the list of conditions, already joined. A label and a list, not a sentence: the conditions are named in the archive\'s own words, which are noun fragments like "Titled" or "With media".',
|
|
65
|
+
}),
|
|
66
|
+
{ conditions: parts.join(CONDITION_SEPARATOR) },
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The archive URL showing the same posts this smart collection gathers.
|
|
72
|
+
*
|
|
73
|
+
* Ordinary navigation, not a coupling: the archive knows nothing about smart
|
|
74
|
+
* collections. A reader who wants to narrow further ("these, but only 2024")
|
|
75
|
+
* has somewhere to go, and the conditions are spelled in the vocabulary the
|
|
76
|
+
* archive already reads.
|
|
77
|
+
*
|
|
78
|
+
* @param selection - The conditions
|
|
79
|
+
* @param ctx - Collection vocabulary, for spelling a selected collection
|
|
80
|
+
* @returns Path with query string, without any site or language prefix
|
|
81
|
+
* @example
|
|
82
|
+
* buildSmartCollectionArchiveHref({ format: "quote" }, ctx);
|
|
83
|
+
* // "/archive?format=quote"
|
|
84
|
+
*/
|
|
85
|
+
export function buildSmartCollectionArchiveHref(
|
|
86
|
+
selection: PostFilterSelection,
|
|
87
|
+
ctx: DimensionContext = {},
|
|
88
|
+
): string {
|
|
89
|
+
const query = serializePostFilterSelection(selection, ctx).toString();
|
|
90
|
+
return query ? `/archive?${query}` : "/archive";
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const smartCollectionMessages = {
|
|
94
|
+
/** The word for the thing itself, wherever one has to be named. */
|
|
95
|
+
noun: msg({
|
|
96
|
+
message: "Smart Collection",
|
|
97
|
+
comment:
|
|
98
|
+
"@context: Name of a collection whose members come from conditions",
|
|
99
|
+
}),
|
|
100
|
+
newSmartCollection: msg({
|
|
101
|
+
message: "New Smart Collection",
|
|
102
|
+
comment:
|
|
103
|
+
"@context: Menu item on the collections page that opens the smart collection dialog",
|
|
104
|
+
}),
|
|
105
|
+
editSmartCollection: msg({
|
|
106
|
+
message: "Edit Smart Collection",
|
|
107
|
+
comment: "@context: Dialog title when editing an existing smart collection",
|
|
108
|
+
}),
|
|
109
|
+
deleteSmartCollection: msg({
|
|
110
|
+
message: "Delete",
|
|
111
|
+
comment:
|
|
112
|
+
"@context: Destructive menu item on a smart collection's row and page. The row says which one; the confirmation names what is lost.",
|
|
113
|
+
}),
|
|
114
|
+
confirmDelete: msg({
|
|
115
|
+
message: "Delete this smart collection? Its link stops working.",
|
|
116
|
+
comment:
|
|
117
|
+
"@context: Confirmation before deleting a smart collection, naming what is lost",
|
|
118
|
+
}),
|
|
119
|
+
emptyMatches: msg({
|
|
120
|
+
message: "Nothing matches these conditions yet.",
|
|
121
|
+
comment: "@context: Smart collection page when no post matches",
|
|
122
|
+
}),
|
|
123
|
+
whatItIs: msg({
|
|
124
|
+
message:
|
|
125
|
+
"Conditions choose what belongs here, not you. Posts you write later join on their own.",
|
|
126
|
+
comment:
|
|
127
|
+
"@context: One line under the New Smart Collection heading, saying how it differs from an ordinary collection",
|
|
128
|
+
}),
|
|
129
|
+
} as const;
|
|
130
|
+
|
|
131
|
+
/** Every reusable smart-collection string, translated once per render. */
|
|
132
|
+
export const getSmartCollectionLabels = (i18n: Translator) => ({
|
|
133
|
+
noun: i18n._(smartCollectionMessages.noun),
|
|
134
|
+
newSmartCollection: i18n._(smartCollectionMessages.newSmartCollection),
|
|
135
|
+
editSmartCollection: i18n._(smartCollectionMessages.editSmartCollection),
|
|
136
|
+
deleteSmartCollection: i18n._(smartCollectionMessages.deleteSmartCollection),
|
|
137
|
+
confirmDelete: i18n._(smartCollectionMessages.confirmDelete),
|
|
138
|
+
emptyMatches: i18n._(smartCollectionMessages.emptyMatches),
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
export type SmartCollectionLabels = ReturnType<typeof getSmartCollectionLabels>;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Every string the editing dialog renders, translated on the server.
|
|
145
|
+
*
|
|
146
|
+
* The dialog is a Lit component and cannot reach the i18n catalogs itself, so
|
|
147
|
+
* the page that can open it hands them down. Dimension names and value labels
|
|
148
|
+
* come from the shared registry, so the words in the dialog and the words on
|
|
149
|
+
* the condition line are the same words.
|
|
150
|
+
*/
|
|
151
|
+
export function getSmartCollectionDialogLabels(i18n: Translator) {
|
|
152
|
+
// The address, the ordering and the buttons are the same decisions a
|
|
153
|
+
// collection's dialog asks about, in the same words.
|
|
154
|
+
const shared = getCollectionDialogLabels(i18n);
|
|
155
|
+
const dimensions: Record<string, string> = {};
|
|
156
|
+
const values: Record<string, string> = {};
|
|
157
|
+
|
|
158
|
+
for (const key of FILTER_DIMENSION_KEYS) {
|
|
159
|
+
const dimension = FILTER_DIMENSIONS[key];
|
|
160
|
+
dimensions[key] = i18n._(dimension.label);
|
|
161
|
+
|
|
162
|
+
const control = dimension.control;
|
|
163
|
+
if (control.kind === "enum") {
|
|
164
|
+
for (const option of control.options) {
|
|
165
|
+
// Stored under the URL spelling, because that is what the control
|
|
166
|
+
// emits and what the registry parses back.
|
|
167
|
+
const spelled =
|
|
168
|
+
serializePostFilterSelection(
|
|
169
|
+
{ [key]: option } as PostFilterSelection,
|
|
170
|
+
{},
|
|
171
|
+
).get(dimension.url.param) ?? option;
|
|
172
|
+
values[`${key}.${spelled}`] = i18n._(control.labelOf(option));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (control.kind === "presence") {
|
|
176
|
+
values[`${key}.any`] = i18n._(control.yes);
|
|
177
|
+
values[`${key}.none`] = i18n._(control.no);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// The media control folds presence and kinds into one vocabulary, so its
|
|
182
|
+
// value labels are assembled rather than enumerated from a single shape.
|
|
183
|
+
values["media.any"] = i18n._(
|
|
184
|
+
msg({
|
|
185
|
+
message: "With media",
|
|
186
|
+
comment: "@context: Archive filter - posts carrying any media attachment",
|
|
187
|
+
}),
|
|
188
|
+
);
|
|
189
|
+
values["media.none"] = i18n._(
|
|
190
|
+
msg({
|
|
191
|
+
message: "Without media",
|
|
192
|
+
comment: "@context: Archive filter - posts with no media attachment",
|
|
193
|
+
}),
|
|
194
|
+
);
|
|
195
|
+
for (const kind of MEDIA_KINDS) {
|
|
196
|
+
values[`media.${kind}`] = getMediaKindLabel(kind, i18n);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return {
|
|
200
|
+
createHeading: i18n._(smartCollectionMessages.newSmartCollection),
|
|
201
|
+
editHeading: i18n._(smartCollectionMessages.editSmartCollection),
|
|
202
|
+
whatItIs: i18n._(smartCollectionMessages.whatItIs),
|
|
203
|
+
title: i18n._(
|
|
204
|
+
msg({
|
|
205
|
+
message: "Title",
|
|
206
|
+
comment: "@context: Smart collection dialog field",
|
|
207
|
+
}),
|
|
208
|
+
),
|
|
209
|
+
link: shared.link,
|
|
210
|
+
linkHelp: shared.linkHelp,
|
|
211
|
+
editLink: shared.editLink,
|
|
212
|
+
resetLink: shared.resetLink,
|
|
213
|
+
linkInvalid: shared.linkInvalid,
|
|
214
|
+
linkReserved: shared.linkReserved,
|
|
215
|
+
linkTooLong: shared.linkTooLong,
|
|
216
|
+
linkTaken: shared.linkTaken,
|
|
217
|
+
linkMovesWarning: shared.linkMovesWarning,
|
|
218
|
+
description: i18n._(
|
|
219
|
+
msg({
|
|
220
|
+
message: "Description",
|
|
221
|
+
comment: "@context: Smart collection dialog field",
|
|
222
|
+
}),
|
|
223
|
+
),
|
|
224
|
+
conditionsHeading: i18n._(
|
|
225
|
+
msg({
|
|
226
|
+
message: "Conditions",
|
|
227
|
+
comment: "@context: Smart collection dialog section heading",
|
|
228
|
+
}),
|
|
229
|
+
),
|
|
230
|
+
matchAllHint: i18n._(
|
|
231
|
+
msg({
|
|
232
|
+
message: "Posts matching all of these",
|
|
233
|
+
comment:
|
|
234
|
+
"@context: Smart collection dialog — conditions are combined with AND",
|
|
235
|
+
}),
|
|
236
|
+
),
|
|
237
|
+
noConditions: i18n._(
|
|
238
|
+
msg({
|
|
239
|
+
message: "No conditions yet. Add one to choose what lands here.",
|
|
240
|
+
comment: "@context: Smart collection dialog with no conditions set",
|
|
241
|
+
}),
|
|
242
|
+
),
|
|
243
|
+
addCondition: i18n._(
|
|
244
|
+
msg({
|
|
245
|
+
message: "Add condition",
|
|
246
|
+
comment: "@context: Smart collection dialog button",
|
|
247
|
+
}),
|
|
248
|
+
),
|
|
249
|
+
removeCondition: i18n._(
|
|
250
|
+
msg({
|
|
251
|
+
message: "Remove condition",
|
|
252
|
+
comment: "@context: Smart collection dialog condition row button",
|
|
253
|
+
}),
|
|
254
|
+
),
|
|
255
|
+
// Interpolated in the browser, where the numbers live. The placeholders
|
|
256
|
+
// stay in the message so translators can reorder them.
|
|
257
|
+
countSummary: i18n._(
|
|
258
|
+
msg({
|
|
259
|
+
message: "{count} of {total} threads",
|
|
260
|
+
comment:
|
|
261
|
+
"@context: Smart collection dialog live count — how many threads the conditions gather out of the site total",
|
|
262
|
+
}),
|
|
263
|
+
{ count: "{count}", total: "{total}" },
|
|
264
|
+
),
|
|
265
|
+
counting: i18n._(
|
|
266
|
+
msg({
|
|
267
|
+
message: "Counting…",
|
|
268
|
+
comment: "@context: Smart collection dialog while the count is loading",
|
|
269
|
+
}),
|
|
270
|
+
),
|
|
271
|
+
displayHeading: i18n._(
|
|
272
|
+
msg({
|
|
273
|
+
message: "Display",
|
|
274
|
+
comment: "@context: Smart collection dialog section heading",
|
|
275
|
+
}),
|
|
276
|
+
),
|
|
277
|
+
orderBy: shared.orderBy,
|
|
278
|
+
layout: i18n._(
|
|
279
|
+
msg({
|
|
280
|
+
message: "Layout",
|
|
281
|
+
comment: "@context: Smart collection dialog field",
|
|
282
|
+
}),
|
|
283
|
+
),
|
|
284
|
+
cancel: shared.cancel,
|
|
285
|
+
save: shared.save,
|
|
286
|
+
saved: i18n._(
|
|
287
|
+
msg({
|
|
288
|
+
message: "Smart collection saved.",
|
|
289
|
+
comment: "@context: Confirmation after saving a smart collection",
|
|
290
|
+
}),
|
|
291
|
+
),
|
|
292
|
+
saveFailed: i18n._(
|
|
293
|
+
msg({
|
|
294
|
+
message: "Could not save. Try again.",
|
|
295
|
+
comment: "@context: Smart collection dialog save failure",
|
|
296
|
+
}),
|
|
297
|
+
),
|
|
298
|
+
loadFailed: i18n._(
|
|
299
|
+
msg({
|
|
300
|
+
message: "Could not open this smart collection. Try again.",
|
|
301
|
+
comment: "@context: Smart collection dialog load failure",
|
|
302
|
+
}),
|
|
303
|
+
),
|
|
304
|
+
titleAndLinkRequired: i18n._(
|
|
305
|
+
msg({
|
|
306
|
+
message: "A smart collection needs a title and a link.",
|
|
307
|
+
comment: "@context: Smart collection dialog validation message",
|
|
308
|
+
}),
|
|
309
|
+
),
|
|
310
|
+
dimensions,
|
|
311
|
+
values,
|
|
312
|
+
sortOptions: {
|
|
313
|
+
newest: shared.sortOptions.newest,
|
|
314
|
+
oldest: shared.sortOptions.oldest,
|
|
315
|
+
rating_desc: shared.sortOptions.rating_desc,
|
|
316
|
+
},
|
|
317
|
+
layoutOptions: {
|
|
318
|
+
"": i18n._(
|
|
319
|
+
msg({
|
|
320
|
+
message: "Follow site default",
|
|
321
|
+
comment:
|
|
322
|
+
"@context: Smart collection layout option — use the site's configured archive layout",
|
|
323
|
+
}),
|
|
324
|
+
),
|
|
325
|
+
list: i18n._(
|
|
326
|
+
msg({
|
|
327
|
+
message: "List",
|
|
328
|
+
comment: "@context: Smart collection layout option",
|
|
329
|
+
}),
|
|
330
|
+
),
|
|
331
|
+
grid: i18n._(
|
|
332
|
+
msg({
|
|
333
|
+
message: "Grid",
|
|
334
|
+
comment: "@context: Smart collection layout option",
|
|
335
|
+
}),
|
|
336
|
+
),
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export type SmartCollectionDialogLabels = ReturnType<
|
|
342
|
+
typeof getSmartCollectionDialogLabels
|
|
343
|
+
>;
|