@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,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the collection dialog.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { CollectionSortOrder } from "../../types.js";
|
|
6
|
+
|
|
7
|
+
/** What the dialog hands back to whoever opened it. */
|
|
8
|
+
export interface CollectionDialogResult {
|
|
9
|
+
/** Whether anything was created or saved. */
|
|
10
|
+
changed: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* The collection as it stands after saving.
|
|
13
|
+
*
|
|
14
|
+
* The caller needs it: a directory flags the row it just created, and a
|
|
15
|
+
* collection page has to follow its own address when the link moved.
|
|
16
|
+
*/
|
|
17
|
+
collection?: {
|
|
18
|
+
id: string;
|
|
19
|
+
slug: string;
|
|
20
|
+
title: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface CollectionDialogLabels {
|
|
25
|
+
createHeading: string;
|
|
26
|
+
editHeading: string;
|
|
27
|
+
title: string;
|
|
28
|
+
titlePlaceholder: string;
|
|
29
|
+
/** The collection link, in the collection form's own words. */
|
|
30
|
+
link: string;
|
|
31
|
+
linkHelp: string;
|
|
32
|
+
editLink: string;
|
|
33
|
+
resetLink: string;
|
|
34
|
+
linkTaken: string;
|
|
35
|
+
linkInvalid: string;
|
|
36
|
+
linkReserved: string;
|
|
37
|
+
linkTooLong: string;
|
|
38
|
+
linkMovesWarning: string;
|
|
39
|
+
description: string;
|
|
40
|
+
descriptionPlaceholder: string;
|
|
41
|
+
orderBy: string;
|
|
42
|
+
sortOptions: Record<CollectionSortOrder, string>;
|
|
43
|
+
cancel: string;
|
|
44
|
+
save: string;
|
|
45
|
+
saved: string;
|
|
46
|
+
saveFailed: string;
|
|
47
|
+
loadFailed: string;
|
|
48
|
+
titleAndLinkRequired: string;
|
|
49
|
+
}
|
|
@@ -6,6 +6,13 @@ import type { CollectionFormLabels } from "./collection-types.js";
|
|
|
6
6
|
|
|
7
7
|
export interface CollectionManagerLabels {
|
|
8
8
|
collectionsTitle: string;
|
|
9
|
+
/** The kind itself, for the marker beside a smart collection's title. */
|
|
10
|
+
smartCollectionNoun: string;
|
|
11
|
+
newSmartCollection: string;
|
|
12
|
+
editSmartCollection: string;
|
|
13
|
+
deleteSmartCollection: string;
|
|
14
|
+
confirmDeleteSmartCollection: string;
|
|
15
|
+
smartCollectionDeleted: string;
|
|
9
16
|
organize: string;
|
|
10
17
|
done: string;
|
|
11
18
|
organizeHint: string;
|
|
@@ -41,6 +48,7 @@ export interface CollectionManagerLabels {
|
|
|
41
48
|
threadPlural: string;
|
|
42
49
|
emptyState: string;
|
|
43
50
|
orderSaved: string;
|
|
51
|
+
save: string;
|
|
44
52
|
saved: string;
|
|
45
53
|
linkCreated: string;
|
|
46
54
|
linkSaved: string;
|
|
@@ -60,13 +68,36 @@ export interface ManagedCollection {
|
|
|
60
68
|
recentActivityAt: number;
|
|
61
69
|
}
|
|
62
70
|
|
|
71
|
+
/**
|
|
72
|
+
* A smart collection as the directory manager sees it.
|
|
73
|
+
*
|
|
74
|
+
* `recentActivityAt` means what it means on a manual collection: the newest
|
|
75
|
+
* activity among the threads in it. Membership is what the two kinds disagree
|
|
76
|
+
* about — tagged by hand or decided by conditions — and freshness does not
|
|
77
|
+
* depend on how a thread got in.
|
|
78
|
+
*/
|
|
79
|
+
export interface ManagedSmartCollection {
|
|
80
|
+
id: string;
|
|
81
|
+
slug: string;
|
|
82
|
+
title: string;
|
|
83
|
+
description: string | null;
|
|
84
|
+
/** Conditions, in the shared dimension vocabulary. */
|
|
85
|
+
selection: Record<string, unknown>;
|
|
86
|
+
sort: string;
|
|
87
|
+
layout: string | null;
|
|
88
|
+
threadCount: number;
|
|
89
|
+
recentActivityAt: number;
|
|
90
|
+
}
|
|
91
|
+
|
|
63
92
|
export interface CollectionManagerItem {
|
|
64
93
|
id: string;
|
|
65
|
-
type: "collection" | "divider" | "link";
|
|
94
|
+
type: "collection" | "smart_collection" | "divider" | "link";
|
|
66
95
|
collectionId?: string | null;
|
|
96
|
+
smartCollectionId?: string | null;
|
|
67
97
|
label?: string | null;
|
|
68
98
|
url?: string | null;
|
|
69
99
|
description?: string | null;
|
|
70
100
|
position?: string;
|
|
71
101
|
collection?: ManagedCollection;
|
|
102
|
+
smartCollection?: ManagedSmartCollection;
|
|
72
103
|
}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared type definitions for the collection form
|
|
2
|
+
* Shared type definitions for the collection quick-create form.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type { CollectionSortOrder } from "../../types.js";
|
|
6
|
-
|
|
7
5
|
export interface CollectionFormLabels {
|
|
8
6
|
titleLabel: string;
|
|
9
7
|
titlePlaceholder: string;
|
|
@@ -17,21 +15,12 @@ export interface CollectionFormLabels {
|
|
|
17
15
|
quickHint: string;
|
|
18
16
|
quickSubmitLabel: string;
|
|
19
17
|
createdLabel: string;
|
|
20
|
-
descriptionLabel: string;
|
|
21
|
-
descriptionPlaceholder: string;
|
|
22
|
-
sortOrderLabel: string;
|
|
23
|
-
sortNewest: string;
|
|
24
|
-
sortOldest: string;
|
|
25
|
-
sortRatingDesc: string;
|
|
26
|
-
submitLabel: string;
|
|
27
18
|
cancelLabel: string;
|
|
28
19
|
}
|
|
29
20
|
|
|
30
21
|
export interface CollectionFormInitial {
|
|
31
22
|
title: string;
|
|
32
23
|
slug: string;
|
|
33
|
-
description: string;
|
|
34
|
-
sortOrder: CollectionSortOrder;
|
|
35
24
|
}
|
|
36
25
|
|
|
37
26
|
export interface CollectionSubmitDetail {
|
|
@@ -39,8 +28,5 @@ export interface CollectionSubmitDetail {
|
|
|
39
28
|
data: {
|
|
40
29
|
title: string;
|
|
41
30
|
slug: string;
|
|
42
|
-
description?: string;
|
|
43
|
-
sortOrder?: CollectionSortOrder;
|
|
44
31
|
};
|
|
45
|
-
isEdit: boolean;
|
|
46
32
|
}
|
|
@@ -249,7 +249,11 @@ export function convertComposeFormat(
|
|
|
249
249
|
if (prepend.length) content.unshift(...prepend);
|
|
250
250
|
|
|
251
251
|
out.bodyJson = content.length ? { type: "doc", content } : null;
|
|
252
|
-
|
|
252
|
+
// A title carried in from another format has nowhere to show unless the note's
|
|
253
|
+
// title field is open, so opening it is the only way not to drop it. The
|
|
254
|
+
// toggle is otherwise left alone, so note → link → note keeps the user's
|
|
255
|
+
// choice instead of resetting it.
|
|
256
|
+
if (to === "note" && out.title.trim().length > 0) out.showTitle = true;
|
|
253
257
|
|
|
254
258
|
return out;
|
|
255
259
|
}
|
|
@@ -11,6 +11,18 @@ import type { TableControlLabels } from "../tiptap/table-control-labels.js";
|
|
|
11
11
|
|
|
12
12
|
export type ComposeFormat = "note" | "link" | "quote";
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* What one composer row says about itself. An editor owns its fields, so it
|
|
16
|
+
* owns these two answers too — the dialog reduces them over the rows it has
|
|
17
|
+
* instead of reading editors back out of the DOM while it renders.
|
|
18
|
+
*/
|
|
19
|
+
export interface ComposeRowStatus {
|
|
20
|
+
/** Anything worth keeping: the check behind "discard this?" and autosave. */
|
|
21
|
+
hasContent: boolean;
|
|
22
|
+
/** Enough to publish this row: its format's requirements met, fields valid. */
|
|
23
|
+
publishable: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
14
26
|
export interface ComposeAttachment {
|
|
15
27
|
clientId: string;
|
|
16
28
|
file: File;
|
|
@@ -25,6 +37,12 @@ export interface ComposeAttachment {
|
|
|
25
37
|
status: "pending" | "processing" | "uploading" | "done" | "error";
|
|
26
38
|
progress: number | null;
|
|
27
39
|
mediaId: string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Server URL of the uploaded file, set when the upload completes. Unlike
|
|
42
|
+
* `previewUrl` (a blob URL revoked on editor reset) it stays valid, so
|
|
43
|
+
* draft restore can rehydrate the attachment after the dialog closed.
|
|
44
|
+
*/
|
|
45
|
+
remoteUrl: string | null;
|
|
28
46
|
alt: string;
|
|
29
47
|
error: string | null;
|
|
30
48
|
/** Text content preview for text files (first ~100 chars) */
|
|
@@ -64,6 +82,46 @@ export interface DraftItem {
|
|
|
64
82
|
}[];
|
|
65
83
|
}
|
|
66
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Snapshot of a media attachment whose upload completed. Stored in the local
|
|
87
|
+
* draft (and passed by the bridge on failure restore) so uploaded images
|
|
88
|
+
* survive a failed publish or a page reload — the bytes are already on the
|
|
89
|
+
* server, only the reference needs restoring.
|
|
90
|
+
*/
|
|
91
|
+
export interface LocalDraftMedia {
|
|
92
|
+
clientId: string;
|
|
93
|
+
mediaId: string;
|
|
94
|
+
url: string;
|
|
95
|
+
mimeType: string;
|
|
96
|
+
name?: string;
|
|
97
|
+
alt?: string;
|
|
98
|
+
summary?: string | null;
|
|
99
|
+
chars?: number | null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Why a stored local draft did or did not reach the composer.
|
|
104
|
+
*
|
|
105
|
+
* Every exit from a restore leaves the composer looking the same — empty — so
|
|
106
|
+
* without a reported reason there is nothing to inspect when an author asks
|
|
107
|
+
* where their work went. `none` is the ordinary case (the composer opened and
|
|
108
|
+
* there was simply no draft); every other non-`restored` value means bytes
|
|
109
|
+
* existed and did not come back.
|
|
110
|
+
*/
|
|
111
|
+
export type DraftRestoreOutcome =
|
|
112
|
+
| "restored"
|
|
113
|
+
| "none"
|
|
114
|
+
/** The composer is already committed to an edit or a server-side draft. */
|
|
115
|
+
| "composer-busy"
|
|
116
|
+
/** The composer already holds content a restore would overwrite. */
|
|
117
|
+
| "composer-has-content"
|
|
118
|
+
/** Stored, but not parseable as a draft. */
|
|
119
|
+
| "unreadable"
|
|
120
|
+
/** Older than the retention window. */
|
|
121
|
+
| "expired"
|
|
122
|
+
/** A reply draft belonging to a different parent post. */
|
|
123
|
+
| "other-reply";
|
|
124
|
+
|
|
67
125
|
export interface LocalDraft {
|
|
68
126
|
format: ComposeFormat;
|
|
69
127
|
title: string;
|
|
@@ -80,6 +138,13 @@ export interface LocalDraft {
|
|
|
80
138
|
showRating: boolean;
|
|
81
139
|
collectionIds: string[];
|
|
82
140
|
replyToId: string | null;
|
|
141
|
+
/** Language the author picked, if they picked one. */
|
|
142
|
+
language?: string | null;
|
|
143
|
+
/**
|
|
144
|
+
* Thread root this draft is a translation of. Carried so a half-written
|
|
145
|
+
* translation picked up later still knows what it belongs to.
|
|
146
|
+
*/
|
|
147
|
+
translationOfId?: string | null;
|
|
83
148
|
attachedTexts: Array<{
|
|
84
149
|
clientId: string;
|
|
85
150
|
bodyJson: JSONContent | null;
|
|
@@ -87,14 +152,24 @@ export interface LocalDraft {
|
|
|
87
152
|
summary: string;
|
|
88
153
|
}>;
|
|
89
154
|
attachmentOrder?: string[];
|
|
155
|
+
mediaAttachments?: LocalDraftMedia[];
|
|
90
156
|
/** Present when the draft is a multi-post thread */
|
|
91
157
|
threadItems?: Array<{
|
|
92
158
|
format: ComposeFormat;
|
|
159
|
+
/** Per-post publish date; empty means "follows the thread". */
|
|
160
|
+
publishedAtInput?: string;
|
|
161
|
+
publishedAtTimeMinutes?: number | null;
|
|
162
|
+
/** Per-post permalink; empty means the server assigns a random id. */
|
|
163
|
+
slug?: string;
|
|
93
164
|
title: string;
|
|
94
165
|
bodyJson: JSONContent | null;
|
|
95
166
|
url: string;
|
|
96
167
|
quoteText: string;
|
|
97
168
|
quoteAuthor: string;
|
|
169
|
+
/** Optional: drafts stored before thread posts kept these lack them. */
|
|
170
|
+
rating?: number;
|
|
171
|
+
showTitle?: boolean;
|
|
172
|
+
showRating?: boolean;
|
|
98
173
|
attachedTexts: Array<{
|
|
99
174
|
clientId: string;
|
|
100
175
|
bodyJson: JSONContent | null;
|
|
@@ -102,12 +177,14 @@ export interface LocalDraft {
|
|
|
102
177
|
summary: string;
|
|
103
178
|
}>;
|
|
104
179
|
attachmentOrder?: string[];
|
|
180
|
+
mediaAttachments?: LocalDraftMedia[];
|
|
105
181
|
}>;
|
|
106
182
|
savedAt: number;
|
|
107
183
|
}
|
|
108
184
|
|
|
109
185
|
export interface ComposeLabels {
|
|
110
186
|
cancel: string;
|
|
187
|
+
close: string;
|
|
111
188
|
note: string;
|
|
112
189
|
link: string;
|
|
113
190
|
quote: string;
|
|
@@ -146,7 +223,13 @@ export interface ComposeLabels {
|
|
|
146
223
|
altHint: string;
|
|
147
224
|
addMore: string;
|
|
148
225
|
removeAttachment: string;
|
|
226
|
+
moveAttachmentEarlier: string;
|
|
227
|
+
moveAttachmentLater: string;
|
|
149
228
|
uploading: string;
|
|
229
|
+
/** Toast shown while the submitted post is being published. */
|
|
230
|
+
publishing: string;
|
|
231
|
+
/** Toast shown while a draft or an edited post is being saved. */
|
|
232
|
+
saving: string;
|
|
150
233
|
/** Toast when exactly one pasted remote image couldn't be rehosted. */
|
|
151
234
|
imageNotRehosted?: string;
|
|
152
235
|
/** Toast when several pasted remote images couldn't be rehosted (uses a {count} placeholder). */
|
|
@@ -187,14 +270,32 @@ export interface ComposeLabels {
|
|
|
187
270
|
deleteDraft: string;
|
|
188
271
|
draftDeleted: string;
|
|
189
272
|
publishFailedDraft: string;
|
|
273
|
+
publishFailed: string;
|
|
274
|
+
publishFailedOffline: string;
|
|
190
275
|
uploadFailedDraft: string;
|
|
191
276
|
addCollection: string;
|
|
192
277
|
collectionCountLabel: string;
|
|
193
278
|
draftRestored: string;
|
|
279
|
+
draftStoreFailed: string;
|
|
194
280
|
reply: string;
|
|
195
281
|
publishHideFromLatest: string;
|
|
196
282
|
publishPrivate: string;
|
|
197
283
|
publishSettings: string;
|
|
284
|
+
languageLabel: string;
|
|
285
|
+
languageAuto: string;
|
|
286
|
+
languageAutoHint: string;
|
|
287
|
+
languageAutoDetected: string;
|
|
288
|
+
languageAutoPending: string;
|
|
289
|
+
languageTriggerLabel: string;
|
|
290
|
+
translationOf: string;
|
|
291
|
+
translationContext: string;
|
|
292
|
+
translationContextInLanguage: string;
|
|
293
|
+
translationContextOpen: string;
|
|
294
|
+
translationContextOriginal: string;
|
|
295
|
+
translationContextHide: string;
|
|
296
|
+
translationContextHideLong: string;
|
|
297
|
+
translationContextShow: string;
|
|
298
|
+
translationContextShowLong: string;
|
|
198
299
|
publishVisibilityLabel: string;
|
|
199
300
|
publishVisibilityPublic: string;
|
|
200
301
|
publishVisibilityPublicHint: string;
|
|
@@ -229,9 +330,8 @@ export interface ComposeLabels {
|
|
|
229
330
|
threadLimitReached: string;
|
|
230
331
|
showMore: string;
|
|
231
332
|
showLess: string;
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
editTitle: string;
|
|
333
|
+
editing: string;
|
|
334
|
+
composeDialogLabel: string;
|
|
235
335
|
slashHint: string;
|
|
236
336
|
tableControls: TableControlLabels;
|
|
237
337
|
collectionFormLabels: CollectionFormLabels;
|
|
@@ -301,15 +401,33 @@ export interface ComposeSubmitDetail {
|
|
|
301
401
|
collectionIds: string[];
|
|
302
402
|
attachments: ComposeSubmitAttachment[];
|
|
303
403
|
editPostId?: string;
|
|
404
|
+
/** Identifies an existing server draft loaded through the drafts workflow. */
|
|
405
|
+
draftSourceId?: string;
|
|
304
406
|
replyToId?: string;
|
|
305
407
|
quietReply?: boolean;
|
|
306
408
|
replyThreadRootId?: string;
|
|
307
409
|
replyRefreshKind?: "timeline-item" | "post-card" | "post-view";
|
|
308
410
|
replyRefreshId?: string;
|
|
411
|
+
/**
|
|
412
|
+
* Content language chosen by the author. Absent means "nobody said" — the
|
|
413
|
+
* server reads one out of the text rather than guessing in the browser,
|
|
414
|
+
* because it sees the final text.
|
|
415
|
+
*/
|
|
416
|
+
language?: string;
|
|
417
|
+
/** Thread root this post is being written as a translation of. */
|
|
418
|
+
translationOfId?: string;
|
|
309
419
|
/** Present when submitting a multi-post thread; index 0 is the root */
|
|
310
420
|
threadPosts?: ComposeSubmitDetail[];
|
|
311
421
|
}
|
|
312
422
|
|
|
423
|
+
/** One language the site publishes, as offered in the composer. */
|
|
424
|
+
export interface ComposeLanguage {
|
|
425
|
+
/** Canonical BCP 47 tag. */
|
|
426
|
+
tag: string;
|
|
427
|
+
/** The language's own name for itself, e.g. "日本語". */
|
|
428
|
+
label: string;
|
|
429
|
+
}
|
|
430
|
+
|
|
313
431
|
export interface ComposeCollection {
|
|
314
432
|
id: string;
|
|
315
433
|
title: string;
|