@jant/core 0.6.16 → 0.7.1
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/export.js +3 -1
- package/bin/commands/import-site.js +749 -220
- package/bin/commands/reset-password.js +21 -8
- package/bin/commands/setup.js +136 -0
- package/bin/commands/site/export.js +71 -34
- package/bin/commands/site/pull-media.js +2 -6
- package/bin/commands/site/snapshot/export.js +19 -61
- package/bin/commands/site/snapshot/import.js +23 -24
- package/bin/lib/d1-query.js +92 -18
- package/bin/lib/hugo-markdown.js +4 -0
- package/bin/lib/node-env.js +40 -4
- package/bin/lib/site-pull-media.js +21 -28
- package/bin/lib/site-selection.js +94 -29
- package/bin/lib/site-snapshot.js +338 -3
- package/bin/lib/sql-export.js +68 -5
- package/bin/lib/wrangler-cli.js +37 -2
- package/bin/lib/wrangler-json.js +35 -0
- package/bin/lib/zip-archive.js +187 -0
- package/dist/{app-C7_4oab9.js → app-ZcaI1kPN.js} +53190 -13529
- 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-B-m7X7S5.js +261 -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-BJyd-LXE.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-BkscJx69.js +2 -0
- package/dist/client/_assets/client-DAhoqPdr.css +2 -0
- package/dist/client/_assets/client-auth-CAMfTrKW.js +828 -0
- package/dist/client/_assets/client-author-DQ8R-8KR.css +2 -0
- package/dist/client/_assets/client-compose-D6rExKVK.js +2004 -0
- package/dist/client/_assets/client-knSEyUJO.js +295 -0
- package/dist/client/_assets/client-manage-sVOkqVbH.js +2170 -0
- package/dist/client/_assets/client-settings-CGR_nZ78.js +1112 -0
- package/dist/github-sync-Gw4orAHk.js +8398 -0
- package/dist/index.js +2 -5
- package/dist/node.js +11 -9
- package/package.json +15 -5
- 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__/dev-scripts.test.ts +203 -0
- package/src/__tests__/export-collection-order.test.ts +276 -0
- package/src/__tests__/export-feed-ids.test.ts +184 -0
- package/src/__tests__/export-feed-order.test.ts +294 -0
- package/src/__tests__/export-hugo-build.test.ts +390 -0
- package/src/__tests__/export-import-roundtrip.test.ts +94 -0
- package/src/__tests__/export-service.test.ts +842 -28
- package/src/__tests__/export-smart-collection.test.ts +329 -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__/helpers/hugo-site.ts +146 -0
- package/src/__tests__/import-site-command.test.ts +487 -1
- package/src/__tests__/mise-config.test.ts +75 -4
- package/src/__tests__/node-dev-tasks.test.ts +264 -0
- package/src/__tests__/site-export-canonical-import.test.ts +149 -0
- package/src/__tests__/snapshot-canonical-replay.test.ts +179 -0
- package/src/__tests__/snapshot-settings.test.ts +97 -0
- package/src/__tests__/snapshot-tables.test.ts +219 -0
- package/src/__tests__/sql-export.test.ts +173 -0
- package/src/__tests__/stylesheet-audience.test.ts +159 -0
- package/src/__tests__/stylesheet-breakpoints.test.ts +183 -0
- package/src/__tests__/zip-archive.test.ts +106 -0
- package/src/app.tsx +86 -22
- 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 +561 -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-types.ts +6 -1
- package/src/client/components/jant-repo-picker.ts +137 -108
- package/src/client/components/jant-settings-avatar.ts +31 -27
- package/src/client/components/jant-settings-general.ts +622 -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/__tests__/list-editing.test.ts +224 -86
- package/src/client/tiptap/__tests__/mark-exit.test.ts +1 -2
- package/src/client/tiptap/__tests__/markdown-clipboard.test.ts +26 -0
- package/src/client/tiptap/bubble-menu.ts +47 -16
- package/src/client/tiptap/extensions.ts +0 -3
- 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/tiptap/structural-keymap.ts +158 -47
- 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__/d1-query.test.ts +56 -1
- 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 +555 -73
- package/src/i18n/locales/settings/en.ts +1 -1
- package/src/i18n/locales/settings/zh-Hans.po +601 -119
- package/src/i18n/locales/settings/zh-Hans.ts +1 -1
- package/src/i18n/locales/settings/zh-Hant.po +614 -132
- 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__/github-sync-repo-name.test.ts +40 -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__/image.test.ts +27 -1
- 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-to-tiptap.test.ts +105 -0
- package/src/lib/__tests__/markdown.test.ts +10 -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 +131 -3
- package/src/lib/__tests__/schemas.test.ts +69 -5
- 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__/timeline.test.ts +87 -0
- package/src/lib/__tests__/tiptap-to-markdown.test.ts +172 -4
- 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 +439 -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-repo-name.ts +45 -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 +62 -0
- package/src/lib/icons.ts +9 -2
- package/src/lib/ids.ts +3 -0
- package/src/lib/image.ts +17 -4
- package/src/lib/jant-docs.ts +42 -0
- package/src/lib/lang-detect.ts +308 -0
- package/src/lib/markdown-manager.ts +392 -2
- 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-body-html.ts +11 -4
- package/src/lib/post-meta.ts +19 -0
- package/src/lib/render.tsx +55 -7
- package/src/lib/resolve-config.ts +111 -6
- package/src/lib/schemas.ts +251 -15
- 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 +43 -2
- package/src/lib/tiptap-render.ts +1 -2
- package/src/lib/tiptap-to-markdown.ts +13 -7
- package/src/lib/upload.ts +16 -13
- package/src/lib/url.ts +159 -86
- package/src/lib/version.ts +10 -8
- package/src/lib/view-language.ts +436 -0
- package/src/lib/view.ts +53 -25
- 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-setup.test.ts +163 -0
- package/src/node/__tests__/cli-site-selection.test.ts +128 -38
- package/src/node/__tests__/cli-site-snapshot.test.ts +67 -0
- package/src/node/__tests__/cli-snapshot-meta.test.ts +20 -0
- package/src/node/__tests__/runtime.test.ts +75 -0
- package/src/node/index.ts +3 -0
- package/src/node/request-handler.ts +3 -1
- 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__/posts.test.ts +24 -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/__tests__/upload.test.ts +34 -0
- 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 +6 -3
- package/src/routes/api/internal/__tests__/sites.test.ts +42 -2
- package/src/routes/api/internal/sites.ts +0 -1
- package/src/routes/api/nav-items.ts +55 -8
- package/src/routes/api/posts.ts +161 -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 +44 -7
- package/src/routes/api/smart-collections.ts +132 -0
- package/src/routes/api/telegram.ts +2 -40
- package/src/routes/api/upload.ts +10 -3
- 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 +9 -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__/github-sync-app.test.ts +365 -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 +714 -111
- 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-page-round-trips.test.ts +211 -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/__tests__/thread-order.test.ts +179 -0
- package/src/routes/pages/archive.tsx +487 -379
- package/src/routes/pages/collection.tsx +94 -96
- package/src/routes/pages/collections.tsx +38 -50
- package/src/routes/pages/featured.tsx +43 -18
- 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 +228 -45
- package/src/routes/pages/partials.tsx +41 -0
- package/src/routes/pages/search.tsx +22 -5
- 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/__tests__/readiness.test.ts +23 -0
- package/src/runtime/cloudflare.ts +21 -2
- package/src/runtime/index.ts +27 -1
- package/src/runtime/node.ts +67 -1
- package/src/runtime/readiness.ts +15 -0
- package/src/runtime/site.ts +95 -24
- package/src/services/__tests__/auth.test.ts +116 -7
- package/src/services/__tests__/bootstrap-setup-instance.test.ts +230 -0
- package/src/services/__tests__/collection.test.ts +108 -4
- package/src/services/__tests__/custom-url.test.ts +34 -0
- package/src/services/__tests__/github-app-installations.test.ts +153 -0
- package/src/services/__tests__/github-sync-push.test.ts +46 -0
- package/src/services/__tests__/language.test.ts +495 -0
- package/src/services/__tests__/media.test.ts +31 -0
- package/src/services/__tests__/navigation.test.ts +213 -10
- package/src/services/__tests__/path.test.ts +236 -0
- package/src/services/__tests__/post-language.test.ts +830 -0
- package/src/services/__tests__/post-timeline.test.ts +127 -0
- package/src/services/__tests__/post.test.ts +120 -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 +408 -39
- package/src/services/collection-directory-position.ts +76 -0
- package/src/services/collection.ts +331 -46
- package/src/services/custom-url.ts +29 -24
- 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/alias.html +27 -1
- package/src/services/export-theme/layouts/_default/list.html +2 -63
- package/src/services/export-theme/layouts/_default/rss.xml +103 -38
- package/src/services/export-theme/layouts/collections/list.html +3 -3
- package/src/services/export-theme/layouts/featured/list.html +1 -4
- package/src/services/export-theme/layouts/index.html +40 -26
- package/src/services/export-theme/layouts/partials/collection-members.html +100 -0
- package/src/services/export-theme/layouts/partials/collection-threads.html +33 -0
- package/src/services/export-theme/layouts/partials/featured-members.html +35 -0
- package/src/services/export-theme/layouts/partials/featured-thread.html +1 -1
- package/src/services/export-theme/layouts/partials/feed-post-content.xml +105 -2
- package/src/services/export-theme/layouts/partials/footer.html +1 -1
- package/src/services/export-theme/layouts/partials/head.html +1 -1
- package/src/services/export-theme/layouts/partials/header.html +5 -3
- package/src/services/export-theme/layouts/partials/jant-data.html +23 -0
- package/src/services/export-theme/layouts/partials/latest-members.html +48 -0
- 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/smart-collection-members.html +129 -0
- package/src/services/export-theme/layouts/partials/thread-preview.html +41 -31
- package/src/services/export-theme/layouts/post/list.html +1 -1
- package/src/services/export-theme/layouts/smart_collection/list.html +24 -0
- package/src/services/export-theme/styles/main.css +13 -2
- package/src/services/export-theme/theme.toml +1 -1
- package/src/services/export.ts +880 -72
- package/src/services/github-app-installations.ts +171 -4
- package/src/services/github-sync.ts +69 -15
- package/src/services/index.ts +34 -3
- package/src/services/language.ts +412 -0
- package/src/services/mcp.ts +22 -2
- package/src/services/media.ts +22 -7
- package/src/services/navigation.ts +429 -67
- package/src/services/path.ts +254 -6
- package/src/services/post.ts +1234 -190
- package/src/services/search.ts +39 -2
- package/src/services/settings.ts +238 -43
- package/src/services/site-admin.ts +27 -14
- package/src/services/site.ts +160 -32
- 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 +1090 -7216
- package/src/types/app-context.ts +23 -0
- package/src/types/bindings.ts +8 -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 +74 -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 +277 -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/export-Dl5KCiEs.js +0 -5562
- 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/client/tiptap/exitable-marks.ts +0 -73
- package/src/ui/pages/CollectionEditorPage.tsx +0 -175
|
@@ -1,12 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Compose Structural Keymap
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Block boundaries follow the editing model shared by Notion and Google Docs,
|
|
5
|
+
* mapped onto what Markdown can represent. Tiptap's official keymaps already
|
|
6
|
+
* implement most of it; this extension owns only the cases where they differ,
|
|
7
|
+
* and delegates everything else.
|
|
8
|
+
*
|
|
9
|
+
* Backspace at the start of a line removes one layer at a time:
|
|
10
|
+
* - A list item loses its marker first and becomes a paragraph where it
|
|
11
|
+
* stands. Tiptap does this for top-level items. A nested item stays inside
|
|
12
|
+
* its parent item instead of being outdented, which is Tiptap's default;
|
|
13
|
+
* Shift-Tab and Enter on an empty item remain the outdent keys.
|
|
14
|
+
* - A paragraph then merges into the line visually above it, however deep
|
|
15
|
+
* that line is nested.
|
|
16
|
+
*
|
|
17
|
+
* Delete at the end of a line always pulls the next line's text up, whatever
|
|
18
|
+
* its list depth. The two keys are intentionally not symmetric: Backspace
|
|
19
|
+
* deletes the marker just before the caret, Delete deletes the line break.
|
|
20
|
+
*
|
|
21
|
+
* Markdown differs from Notion in one place: a paragraph cannot own a nested
|
|
22
|
+
* list. When an item loses its marker, or its text merges into a shallower
|
|
23
|
+
* line, its children move up one level instead of staying indented.
|
|
6
24
|
*/
|
|
7
25
|
|
|
8
26
|
import { Extension, type Editor } from "@tiptap/core";
|
|
9
|
-
import
|
|
27
|
+
import {
|
|
28
|
+
Fragment,
|
|
29
|
+
NodeRange,
|
|
30
|
+
type Node as ProseMirrorNode,
|
|
31
|
+
type ResolvedPos,
|
|
32
|
+
} from "@tiptap/pm/model";
|
|
33
|
+
import { TextSelection } from "@tiptap/pm/state";
|
|
34
|
+
import { liftTarget } from "@tiptap/pm/transform";
|
|
10
35
|
|
|
11
36
|
type Direction = "backward" | "forward";
|
|
12
37
|
|
|
@@ -101,6 +126,11 @@ function joinBlockquoteParagraphBoundary(
|
|
|
101
126
|
: editor.commands.joinTextblockForward();
|
|
102
127
|
}
|
|
103
128
|
|
|
129
|
+
function isListNode(node: ProseMirrorNode | null | undefined): boolean {
|
|
130
|
+
const name = node?.type.name;
|
|
131
|
+
return name === "bulletList" || name === "orderedList";
|
|
132
|
+
}
|
|
133
|
+
|
|
104
134
|
function findDirectListItemDepth($cursor: ResolvedPos): number | null {
|
|
105
135
|
const listItemDepth = $cursor.depth - 1;
|
|
106
136
|
if (
|
|
@@ -110,55 +140,48 @@ function findDirectListItemDepth($cursor: ResolvedPos): number | null {
|
|
|
110
140
|
return null;
|
|
111
141
|
}
|
|
112
142
|
|
|
113
|
-
|
|
114
|
-
const listName = $cursor.node(listDepth).type.name;
|
|
115
|
-
return listName === "bulletList" || listName === "orderedList"
|
|
116
|
-
? listItemDepth
|
|
117
|
-
: null;
|
|
143
|
+
return isListNode($cursor.node(listItemDepth - 1)) ? listItemDepth : null;
|
|
118
144
|
}
|
|
119
145
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
146
|
+
/**
|
|
147
|
+
* Removes a nested item's marker while keeping it inside its parent item: the
|
|
148
|
+
* item's content becomes blocks of the parent item, splitting the nested list
|
|
149
|
+
* around it.
|
|
150
|
+
* Top-level items are left to the official ListKeymap, which does the same
|
|
151
|
+
* against the document or blockquote.
|
|
152
|
+
*/
|
|
153
|
+
function unwrapNestedListItem(editor: Editor, listItemDepth: number): boolean {
|
|
154
|
+
const { state } = editor;
|
|
155
|
+
const { $from } = state.selection;
|
|
156
|
+
if ($from.node(listItemDepth - 2).type.name !== "listItem") return false;
|
|
157
|
+
|
|
158
|
+
const range = new NodeRange(
|
|
159
|
+
state.doc.resolve($from.start(listItemDepth)),
|
|
160
|
+
state.doc.resolve($from.end(listItemDepth)),
|
|
161
|
+
listItemDepth,
|
|
162
|
+
);
|
|
163
|
+
const target = liftTarget(range);
|
|
164
|
+
if (target === null) return false;
|
|
123
165
|
|
|
124
|
-
|
|
125
|
-
|
|
166
|
+
editor.view.dispatch(state.tr.lift(range, target).scrollIntoView());
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
126
169
|
|
|
170
|
+
function handleListBackspace(editor: Editor): boolean {
|
|
171
|
+
const { $from } = editor.state.selection;
|
|
127
172
|
const listItemDepth = findDirectListItemDepth($from);
|
|
128
173
|
if (listItemDepth === null) return false;
|
|
129
174
|
|
|
130
|
-
const listItem = $from.node(listItemDepth);
|
|
131
175
|
const childIndex = $from.index(listItemDepth);
|
|
176
|
+
if (childIndex === 0) return unwrapNestedListItem(editor, listItemDepth);
|
|
132
177
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
178
|
+
// A markerless paragraph after an adjacent textblock is joined by the
|
|
179
|
+
// official keymap. After a nested list the official fallback would wrap the
|
|
180
|
+
// paragraph into that list instead, so merge into the line visually above.
|
|
181
|
+
const previousChild = $from.node(listItemDepth).child(childIndex - 1);
|
|
182
|
+
if (previousChild.isTextblock) return false;
|
|
138
183
|
|
|
139
|
-
|
|
140
|
-
// one-key merge target. Consume Backspace instead of letting ListKeymap
|
|
141
|
-
// lift and split the entire list item.
|
|
142
|
-
return true;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const listDepth = listItemDepth - 1;
|
|
146
|
-
const itemIndex = $from.index(listDepth);
|
|
147
|
-
if (itemIndex === 0) {
|
|
148
|
-
// Let the official ListKeymap lift a first/nested-first item.
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (editor.commands.joinItemBackward()) return true;
|
|
153
|
-
|
|
154
|
-
// `joinItemBackward` cannot join when the previous item already owns a
|
|
155
|
-
// nested list. The official textblock join safely removes the current marker
|
|
156
|
-
// while preserving both subtrees in their existing document order.
|
|
157
|
-
if (editor.commands.joinBackward()) return true;
|
|
158
|
-
|
|
159
|
-
// A same-level previous item exists, so never fall through to the official
|
|
160
|
-
// lift behavior, which would split the surrounding list into top-level blocks.
|
|
161
|
-
return true;
|
|
184
|
+
return editor.commands.joinTextblockBackward();
|
|
162
185
|
}
|
|
163
186
|
|
|
164
187
|
function handleBackspace(editor: Editor): boolean {
|
|
@@ -176,11 +199,101 @@ function handleBackspace(editor: Editor): boolean {
|
|
|
176
199
|
if (editor.commands.undoInputRule()) return true;
|
|
177
200
|
|
|
178
201
|
return (
|
|
179
|
-
|
|
202
|
+
handleListBackspace(editor) ||
|
|
180
203
|
joinBlockquoteParagraphBoundary(editor, "backward")
|
|
181
204
|
);
|
|
182
205
|
}
|
|
183
206
|
|
|
207
|
+
/** Mirrors ProseMirror's `findCutAfter`, which prosemirror-commands keeps private. */
|
|
208
|
+
function findCutAfter($pos: ResolvedPos): ResolvedPos | null {
|
|
209
|
+
if ($pos.parent.type.spec.isolating) return null;
|
|
210
|
+
|
|
211
|
+
for (let depth = $pos.depth - 1; depth >= 0; depth -= 1) {
|
|
212
|
+
const parent = $pos.node(depth);
|
|
213
|
+
if ($pos.index(depth) + 1 < parent.childCount) {
|
|
214
|
+
return $pos.doc.resolve($pos.after(depth + 1));
|
|
215
|
+
}
|
|
216
|
+
if (parent.type.spec.isolating) break;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Pulls the first item of a directly following deeper list up into the
|
|
224
|
+
* caret's line. The item's text joins the line; its children cannot stay
|
|
225
|
+
* nested under a line that is no longer there, so they move up one level and
|
|
226
|
+
* sit between the joined line and the rest of the list.
|
|
227
|
+
*/
|
|
228
|
+
function pullUpFirstItemOfNestedList(
|
|
229
|
+
editor: Editor,
|
|
230
|
+
$cut: ResolvedPos,
|
|
231
|
+
): boolean {
|
|
232
|
+
const { state } = editor;
|
|
233
|
+
const { $from } = state.selection;
|
|
234
|
+
const list = $cut.nodeAfter;
|
|
235
|
+
const item = list?.firstChild;
|
|
236
|
+
const itemText = item?.firstChild;
|
|
237
|
+
if (!list || !item || item.childCount < 2 || !itemText?.isTextblock) {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
if ($from.parent.type.spec.code) return false;
|
|
241
|
+
|
|
242
|
+
const children = item.content.cut(itemText.nodeSize);
|
|
243
|
+
const remainingItems = list.content.cut(item.nodeSize);
|
|
244
|
+
const replacement =
|
|
245
|
+
remainingItems.size > 0
|
|
246
|
+
? children.addToEnd(list.copy(remainingItems))
|
|
247
|
+
: children;
|
|
248
|
+
const index = $cut.index();
|
|
249
|
+
if (!$cut.parent.canReplace(index, index + 1, replacement)) return false;
|
|
250
|
+
|
|
251
|
+
const tr = state.tr
|
|
252
|
+
.replaceWith($cut.pos, $cut.pos + list.nodeSize, replacement)
|
|
253
|
+
.insert($from.pos, Fragment.from(itemText.content));
|
|
254
|
+
tr.setSelection(TextSelection.create(tr.doc, $from.pos));
|
|
255
|
+
editor.view.dispatch(tr.scrollIntoView());
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function handleListDelete(editor: Editor): boolean {
|
|
260
|
+
const { selection } = editor.state;
|
|
261
|
+
if (!selection.empty) return false;
|
|
262
|
+
|
|
263
|
+
const { $from } = selection;
|
|
264
|
+
if (
|
|
265
|
+
!$from.parent.isTextblock ||
|
|
266
|
+
$from.parentOffset !== $from.parent.content.size
|
|
267
|
+
) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const $cut = findCutAfter($from);
|
|
272
|
+
if (!$cut) return false;
|
|
273
|
+
|
|
274
|
+
// Only boundaries that cross list structure are Jant's. Between plain
|
|
275
|
+
// blocks the official Delete already joins the next textblock.
|
|
276
|
+
const { nodeBefore, nodeAfter } = $cut;
|
|
277
|
+
const crossesList =
|
|
278
|
+
isListNode(nodeBefore) ||
|
|
279
|
+
isListNode(nodeAfter) ||
|
|
280
|
+
nodeBefore?.type.name === "listItem";
|
|
281
|
+
if (!crossesList) return false;
|
|
282
|
+
|
|
283
|
+
if ($cut.pos === $from.after() && isListNode(nodeAfter)) {
|
|
284
|
+
if (pullUpFirstItemOfNestedList(editor, $cut)) return true;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return editor.commands.joinTextblockForward();
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function handleDelete(editor: Editor): boolean {
|
|
291
|
+
return (
|
|
292
|
+
joinBlockquoteParagraphBoundary(editor, "forward") ||
|
|
293
|
+
handleListDelete(editor)
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
|
|
184
297
|
export const StructuralKeymap = Extension.create({
|
|
185
298
|
name: "structuralKeymap",
|
|
186
299
|
priority: 1000,
|
|
@@ -190,10 +303,8 @@ export const StructuralKeymap = Extension.create({
|
|
|
190
303
|
Backspace: ({ editor }) => handleBackspace(editor),
|
|
191
304
|
"Mod-Backspace": ({ editor }) => handleBackspace(editor),
|
|
192
305
|
"Shift-Backspace": ({ editor }) => handleBackspace(editor),
|
|
193
|
-
Delete: ({ editor }) =>
|
|
194
|
-
|
|
195
|
-
"Mod-Delete": ({ editor }) =>
|
|
196
|
-
joinBlockquoteParagraphBoundary(editor, "forward"),
|
|
306
|
+
Delete: ({ editor }) => handleDelete(editor),
|
|
307
|
+
"Mod-Delete": ({ editor }) => handleDelete(editor),
|
|
197
308
|
Tab: ({ editor }) => {
|
|
198
309
|
if (!editor.isActive("listItem")) return false;
|
|
199
310
|
|
package/src/client/toast.ts
CHANGED
|
@@ -337,6 +337,17 @@ export function dismissToast(id: string): void {
|
|
|
337
337
|
toast.addEventListener("animationend", () => toast.remove());
|
|
338
338
|
}
|
|
339
339
|
|
|
340
|
+
/**
|
|
341
|
+
* Re-promote the container holding a persistent toast before its message
|
|
342
|
+
* changes. A dialog may have opened since the toast appeared — a failed
|
|
343
|
+
* publish reopens the composer — and the container would otherwise be left
|
|
344
|
+
* behind in the inert tree, painted under the dialog and unclickable.
|
|
345
|
+
*/
|
|
346
|
+
function promoteAgain(toast: HTMLElement): void {
|
|
347
|
+
const container = toast.parentElement;
|
|
348
|
+
if (container) ensureTopLayer(container);
|
|
349
|
+
}
|
|
350
|
+
|
|
340
351
|
/**
|
|
341
352
|
* Replace a persistent toast with an auto-dismissing one.
|
|
342
353
|
*
|
|
@@ -358,6 +369,7 @@ export function replaceWithAutoClose(
|
|
|
358
369
|
return;
|
|
359
370
|
}
|
|
360
371
|
|
|
372
|
+
promoteAgain(toast);
|
|
361
373
|
toast.className = `toast toast-${type}`;
|
|
362
374
|
toast.replaceChildren();
|
|
363
375
|
setToastContent(toast, type, message);
|
|
@@ -388,6 +400,7 @@ export function replaceWithAutoCloseAction(
|
|
|
388
400
|
return;
|
|
389
401
|
}
|
|
390
402
|
|
|
403
|
+
promoteAgain(toast);
|
|
391
404
|
toast.className = `toast toast-${type}`;
|
|
392
405
|
toast.replaceChildren();
|
|
393
406
|
setToastContent(toast, type, message, action);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite's `?worker&inline` import: the worker script bundled into the importing
|
|
3
|
+
* chunk and started from a `blob:` URL. Declared here rather than by pulling
|
|
4
|
+
* in all of `vite/client`, which also types `import.meta.env` and every asset
|
|
5
|
+
* suffix — none of which the client uses.
|
|
6
|
+
*/
|
|
7
|
+
declare module "*?worker&inline" {
|
|
8
|
+
const workerConstructor: {
|
|
9
|
+
new (options?: { name?: string }): Worker;
|
|
10
|
+
};
|
|
11
|
+
export default workerConstructor;
|
|
12
|
+
}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared Upload Helper with Metadata
|
|
3
3
|
*
|
|
4
|
-
* Processes images via ImageProcessor,
|
|
5
|
-
* and uploads with metadata attached
|
|
4
|
+
* Processes images via ImageProcessor — resize, WebP, dimensions, blurhash —
|
|
5
|
+
* and uploads them with that metadata attached.
|
|
6
6
|
* Used by paste-media, image-node replace, and inline compose editors.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { ImageProcessor } from "./image-processor.js";
|
|
10
|
-
import { extractImageMetadata } from "./media-metadata.js";
|
|
11
10
|
import { uploadViaSession } from "./upload-session.js";
|
|
12
11
|
|
|
13
12
|
/**
|
|
@@ -18,22 +17,13 @@ import { uploadViaSession } from "./upload-session.js";
|
|
|
18
17
|
export async function uploadWithMetadata(
|
|
19
18
|
file: File,
|
|
20
19
|
): Promise<{ url: string; id: string }> {
|
|
21
|
-
// Process image (resize, convert to WebP)
|
|
22
20
|
const {
|
|
23
21
|
file: processed,
|
|
24
22
|
width,
|
|
25
23
|
height,
|
|
24
|
+
blurhash,
|
|
26
25
|
} = await ImageProcessor.processToFile(file);
|
|
27
26
|
|
|
28
|
-
// Extract blurhash from the processed file
|
|
29
|
-
let blurhash: string | undefined;
|
|
30
|
-
try {
|
|
31
|
-
const meta = await extractImageMetadata(processed);
|
|
32
|
-
blurhash = meta.blurhash;
|
|
33
|
-
} catch {
|
|
34
|
-
// Blurhash extraction failed — upload without it
|
|
35
|
-
}
|
|
36
|
-
|
|
37
27
|
const result = await uploadViaSession(processed, {
|
|
38
28
|
width,
|
|
39
29
|
height,
|