@heycys/gallery 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +50 -2
- package/THIRD-PARTY-NOTICES.md +3253 -0
- package/assets/writing-preferences.md +107 -0
- package/bin/gallery.mjs +10 -0
- package/browser/editor/components/bookmark/icons.mjs +6 -0
- package/browser/editor/components/bookmark/index.mjs +80 -0
- package/browser/editor/components/bookmark/page.mjs +147 -0
- package/browser/editor/components/builders.mjs +19 -0
- package/browser/editor/components/callout/index.mjs +39 -0
- package/browser/editor/components/callout/page.mjs +13 -0
- package/browser/editor/components/code/index.mjs +327 -0
- package/browser/editor/components/code/page.mjs +561 -0
- package/browser/editor/components/colors.mjs +50 -0
- package/browser/editor/components/columns/index.mjs +104 -0
- package/browser/editor/components/columns/page.mjs +297 -0
- package/browser/editor/components/details/index.mjs +72 -0
- package/browser/editor/components/details/page.mjs +86 -0
- package/browser/editor/components/dialog/index.mjs +83 -0
- package/browser/editor/components/dialog/page.mjs +219 -0
- package/browser/editor/components/divider/index.mjs +48 -0
- package/browser/editor/components/embed/icons.mjs +11 -0
- package/browser/editor/components/embed/index.mjs +123 -0
- package/browser/editor/components/embed/page.mjs +309 -0
- package/browser/editor/components/figure/index.mjs +87 -0
- package/browser/editor/components/figure/page.mjs +33 -0
- package/browser/editor/components/file/icons.mjs +14 -0
- package/browser/editor/components/file/index.mjs +77 -0
- package/browser/editor/components/file/page.mjs +114 -0
- package/browser/editor/components/flowchart/add.mjs +123 -0
- package/browser/editor/components/flowchart/index.mjs +246 -0
- package/browser/editor/components/flowchart/page.mjs +453 -0
- package/browser/editor/components/heading/index.mjs +51 -0
- package/browser/editor/components/highlight/index.mjs +79 -0
- package/browser/editor/components/icon/index.mjs +57 -0
- package/browser/editor/components/icon/page.mjs +286 -0
- package/browser/editor/components/icons.mjs +45 -0
- package/browser/editor/components/image/crop.mjs +189 -0
- package/browser/editor/components/image/index.mjs +104 -0
- package/browser/editor/components/image/page.mjs +385 -0
- package/browser/editor/components/image/viewer.mjs +213 -0
- package/browser/editor/components/installed/index.mjs +133 -0
- package/browser/editor/components/installed/page.mjs +422 -0
- package/browser/editor/components/installed/served.mjs +35 -0
- package/browser/editor/components/kit.mjs +64 -0
- package/browser/editor/components/list/index.mjs +194 -0
- package/browser/editor/components/list/join.mjs +68 -0
- package/browser/editor/components/list/numbers.mjs +107 -0
- package/browser/editor/components/list/page.mjs +632 -0
- package/browser/editor/components/math/index.mjs +88 -0
- package/browser/editor/components/math/page.mjs +236 -0
- package/browser/editor/components/math/tex-logo.mjs +6 -0
- package/browser/editor/components/media/icons.mjs +19 -0
- package/browser/editor/components/media/page.mjs +162 -0
- package/browser/editor/components/media/parts.mjs +60 -0
- package/browser/editor/components/media/size.mjs +20 -0
- package/browser/editor/components/media/toolbar.mjs +37 -0
- package/browser/editor/components/media/write.mjs +7 -0
- package/browser/editor/components/pages.mjs +46 -0
- package/browser/editor/components/paragraph/index.mjs +43 -0
- package/browser/editor/components/paragraph/page.mjs +52 -0
- package/browser/editor/components/placeholder-bar.mjs +17 -0
- package/browser/editor/components/placeholder.mjs +128 -0
- package/browser/editor/components/quote/index.mjs +33 -0
- package/browser/editor/components/registry.mjs +833 -0
- package/browser/editor/components/rows.mjs +16 -0
- package/browser/editor/components/section/index.mjs +41 -0
- package/browser/editor/components/section/page.mjs +141 -0
- package/browser/editor/components/sheets/index.mjs +137 -0
- package/browser/editor/components/sheets/page.mjs +227 -0
- package/browser/editor/components/sheets/pills.mjs +226 -0
- package/browser/editor/components/table/grid.mjs +73 -0
- package/browser/editor/components/table/index.mjs +306 -0
- package/browser/editor/components/table/page.mjs +672 -0
- package/browser/editor/components/table/slots.mjs +41 -0
- package/browser/editor/components/widget/index.mjs +50 -0
- package/browser/editor/page/annotate/anchors.mjs +229 -0
- package/browser/editor/page/annotate/card.mjs +102 -0
- package/browser/editor/page/annotate/index.mjs +1629 -0
- package/browser/editor/page/at-menu/index.mjs +317 -0
- package/browser/editor/page/autosave.mjs +977 -0
- package/browser/editor/page/beside.mjs +21 -0
- package/browser/editor/page/block-info.mjs +63 -0
- package/browser/editor/page/block-menu/colors.mjs +82 -0
- package/browser/editor/page/block-menu/index.mjs +215 -0
- package/browser/editor/page/blocks.mjs +246 -0
- package/browser/editor/page/caret.mjs +679 -0
- package/browser/editor/page/chip-fills.mjs +126 -0
- package/browser/editor/page/clipboard/import/colors.mjs +192 -0
- package/browser/editor/page/clipboard/import/html.mjs +792 -0
- package/browser/editor/page/clipboard/import/inline.mjs +232 -0
- package/browser/editor/page/clipboard/import/languages.mjs +42 -0
- package/browser/editor/page/clipboard/import/markdown.mjs +760 -0
- package/browser/editor/page/clipboard/import/math.mjs +100 -0
- package/browser/editor/page/clipboard/import/office.mjs +245 -0
- package/browser/editor/page/clipboard/import/read.mjs +120 -0
- package/browser/editor/page/clipboard/import/rich.mjs +29 -0
- package/browser/editor/page/clipboard/import/to-blocks.mjs +290 -0
- package/browser/editor/page/clipboard/index.mjs +797 -0
- package/browser/editor/page/clipboard/own/blocks.mjs +202 -0
- package/browser/editor/page/clipboard/own/chart-keys.mjs +58 -0
- package/browser/editor/page/clipboard/own/describe.mjs +115 -0
- package/browser/editor/page/clipboard/own/export.mjs +167 -0
- package/browser/editor/page/clipboard/own/ids.mjs +39 -0
- package/browser/editor/page/clipboard/own/index.mjs +13 -0
- package/browser/editor/page/clipboard/own/rules.mjs +44 -0
- package/browser/editor/page/clipboard/own/selection.mjs +159 -0
- package/browser/editor/page/clipboard/own/writers.mjs +326 -0
- package/browser/editor/page/columns/index.mjs +360 -0
- package/browser/editor/page/commit.mjs +1798 -0
- package/browser/editor/page/conflicts.mjs +269 -0
- package/browser/editor/page/convert.mjs +830 -0
- package/browser/editor/page/core.mjs +1655 -0
- package/browser/editor/page/drag/drop.mjs +307 -0
- package/browser/editor/page/drag/index.mjs +335 -0
- package/browser/editor/page/drag/preview.mjs +121 -0
- package/browser/editor/page/edge-scroll.mjs +50 -0
- package/browser/editor/page/editor.mjs +1725 -0
- package/browser/editor/page/emoji-picker/emoji-tab.mjs +278 -0
- package/browser/editor/page/emoji-picker/glyph-html.mjs +26 -0
- package/browser/editor/page/emoji-picker/grid.mjs +79 -0
- package/browser/editor/page/emoji-picker/icon-tab.mjs +217 -0
- package/browser/editor/page/emoji-picker/icons.mjs +32 -0
- package/browser/editor/page/emoji-picker/index.mjs +164 -0
- package/browser/editor/page/emoji-picker/styles.mjs +2 -0
- package/browser/editor/page/emoji-picker/support.mjs +202 -0
- package/browser/editor/page/emoji-picker/upload.mjs +235 -0
- package/browser/editor/page/export-report.mjs +23 -0
- package/browser/editor/page/fills.mjs +60 -0
- package/browser/editor/page/find/index.mjs +107 -0
- package/browser/editor/page/flags.mjs +70 -0
- package/browser/editor/page/format-bar/bar.mjs +448 -0
- package/browser/editor/page/format-bar/brush.mjs +77 -0
- package/browser/editor/page/format-bar/colors.mjs +46 -0
- package/browser/editor/page/format-bar/index.mjs +404 -0
- package/browser/editor/page/formula/index.mjs +236 -0
- package/browser/editor/page/formula/panel.mjs +336 -0
- package/browser/editor/page/formula/symbols.mjs +156 -0
- package/browser/editor/page/frame.mjs +74 -0
- package/browser/editor/page/frames.mjs +196 -0
- package/browser/editor/page/geometry.mjs +400 -0
- package/browser/editor/page/gesture.mjs +45 -0
- package/browser/editor/page/handle/index.mjs +639 -0
- package/browser/editor/page/handle-sizes.mjs +14 -0
- package/browser/editor/page/hints/index.mjs +84 -0
- package/browser/editor/page/history.mjs +401 -0
- package/browser/editor/page/insert/index.mjs +243 -0
- package/browser/editor/page/kept.mjs +38 -0
- package/browser/editor/page/links/address.mjs +40 -0
- package/browser/editor/page/links/index.mjs +866 -0
- package/browser/editor/page/links/pages.mjs +131 -0
- package/browser/editor/page/links/views.mjs +369 -0
- package/browser/editor/page/look.mjs +65 -0
- package/browser/editor/page/made.mjs +24 -0
- package/browser/editor/page/margin.mjs +352 -0
- package/browser/editor/page/markdown/index.mjs +88 -0
- package/browser/editor/page/markdown/rules.mjs +33 -0
- package/browser/editor/page/marks.mjs +377 -0
- package/browser/editor/page/media-menu/index.mjs +158 -0
- package/browser/editor/page/menu.mjs +500 -0
- package/browser/editor/page/merge.mjs +100 -0
- package/browser/editor/page/notices.mjs +142 -0
- package/browser/editor/page/offered.mjs +32 -0
- package/browser/editor/page/outline/folds.mjs +52 -0
- package/browser/editor/page/outline/index.mjs +697 -0
- package/browser/editor/page/outline/list.mjs +172 -0
- package/browser/editor/page/outline/read.mjs +201 -0
- package/browser/editor/page/outline/strip.mjs +281 -0
- package/browser/editor/page/outline/tree.mjs +248 -0
- package/browser/editor/page/overlay-layer.mjs +227 -0
- package/browser/editor/page/overlays.mjs +205 -0
- package/browser/editor/page/own.mjs +28 -0
- package/browser/editor/page/pads.mjs +71 -0
- package/browser/editor/page/page-objects.mjs +105 -0
- package/browser/editor/page/panel.mjs +64 -0
- package/browser/editor/page/placement.mjs +58 -0
- package/browser/editor/page/post.mjs +41 -0
- package/browser/editor/page/present-links.mjs +50 -0
- package/browser/editor/page/quiet.mjs +48 -0
- package/browser/editor/page/resize/index.mjs +327 -0
- package/browser/editor/page/select-all/index.mjs +262 -0
- package/browser/editor/page/selection/delete.mjs +59 -0
- package/browser/editor/page/selection/index.mjs +157 -0
- package/browser/editor/page/selection/marquee.mjs +174 -0
- package/browser/editor/page/session.mjs +117 -0
- package/browser/editor/page/slash-menu/index.mjs +291 -0
- package/browser/editor/page/storage.mjs +48 -0
- package/browser/editor/page/sync-state.mjs +267 -0
- package/browser/editor/page/table/aligns.mjs +29 -0
- package/browser/editor/page/table/cell-bar.mjs +138 -0
- package/browser/editor/page/table/cells.mjs +527 -0
- package/browser/editor/page/table/icons.mjs +40 -0
- package/browser/editor/page/table/index.mjs +985 -0
- package/browser/editor/page/table/lists.mjs +187 -0
- package/browser/editor/page/table/widths.mjs +308 -0
- package/browser/editor/page/tex.mjs +32 -0
- package/browser/editor/page/text-select/index.mjs +656 -0
- package/browser/editor/page/tooltip.mjs +98 -0
- package/browser/editor/page/type-grid.mjs +82 -0
- package/browser/editor/page/typing/code-edges.mjs +228 -0
- package/browser/editor/page/typing/index.mjs +276 -0
- package/browser/editor/page/typing/leave.mjs +68 -0
- package/browser/editor/page/ui.mjs +160 -0
- package/browser/shared/annotations.mjs +571 -0
- package/browser/shared/code-folds.mjs +10 -0
- package/browser/shared/code-languages.mjs +70 -0
- package/browser/shared/code-lines.mjs +30 -0
- package/browser/shared/colors.mjs +28 -0
- package/browser/shared/component-catalog.mjs +559 -0
- package/browser/shared/components/bookmark.mjs +26 -0
- package/browser/shared/components/callout.mjs +7 -0
- package/browser/shared/components/chart.mjs +20 -0
- package/browser/shared/components/code.mjs +37 -0
- package/browser/shared/components/columns.mjs +16 -0
- package/browser/shared/components/details.mjs +15 -0
- package/browser/shared/components/dialog.mjs +28 -0
- package/browser/shared/components/diff.mjs +18 -0
- package/browser/shared/components/divider.mjs +6 -0
- package/browser/shared/components/embed.mjs +25 -0
- package/browser/shared/components/figure.mjs +14 -0
- package/browser/shared/components/file.mjs +23 -0
- package/browser/shared/components/heading.mjs +6 -0
- package/browser/shared/components/highlight.mjs +9 -0
- package/browser/shared/components/icon.mjs +18 -0
- package/browser/shared/components/image.mjs +39 -0
- package/browser/shared/components/index.mjs +342 -0
- package/browser/shared/components/installed.mjs +162 -0
- package/browser/shared/components/list.mjs +146 -0
- package/browser/shared/components/math.mjs +49 -0
- package/browser/shared/components/mention.mjs +33 -0
- package/browser/shared/components/page.mjs +37 -0
- package/browser/shared/components/paragraph.mjs +9 -0
- package/browser/shared/components/quote.mjs +6 -0
- package/browser/shared/components/section.mjs +8 -0
- package/browser/shared/components/sheets.mjs +80 -0
- package/browser/shared/components/state.mjs +20 -0
- package/browser/shared/components/table.mjs +49 -0
- package/browser/shared/components/text.mjs +14 -0
- package/browser/shared/components/widget.mjs +10 -0
- package/browser/shared/copy-ids.mjs +72 -0
- package/browser/shared/css-references.mjs +110 -0
- package/browser/shared/emoji/custom.mjs +91 -0
- package/browser/shared/emoji/data/LICENSE-mingcute.txt +202 -0
- package/browser/shared/emoji/data/LICENSE-tabler.txt +21 -0
- package/browser/shared/emoji/data/README.md +26 -0
- package/browser/shared/emoji/data/categories.json +1 -0
- package/browser/shared/emoji/data/icons.json +1 -0
- package/browser/shared/emoji/data/keywords-en.json +1 -0
- package/browser/shared/emoji/data/keywords-zh.json +1 -0
- package/browser/shared/emoji/data/names.json +1 -0
- package/browser/shared/emoji/data/positions.json +1 -0
- package/browser/shared/emoji/data/twemoji-index.json +1 -0
- package/browser/shared/emoji/data/twemoji-svg.bin +0 -0
- package/browser/shared/emoji/data.mjs +196 -0
- package/browser/shared/emoji/emoji.mjs +37 -0
- package/browser/shared/emoji/glyphs.mjs +134 -0
- package/browser/shared/emoji/icon-value.mjs +90 -0
- package/browser/shared/escape.mjs +20 -0
- package/browser/shared/export-wrap.mjs +89 -0
- package/browser/shared/files.mjs +33 -0
- package/browser/shared/html-tree.mjs +53 -0
- package/browser/shared/http.mjs +22 -0
- package/browser/shared/i18n/en.mjs +1164 -0
- package/browser/shared/i18n/index.mjs +132 -0
- package/browser/shared/ids.mjs +24 -0
- package/browser/shared/import-types.mjs +23 -0
- package/browser/shared/inline-spacing.mjs +97 -0
- package/browser/shared/layers.mjs +42 -0
- package/browser/shared/media.mjs +162 -0
- package/browser/shared/new-names.mjs +64 -0
- package/browser/shared/number-reading.mjs +92 -0
- package/browser/shared/old-names.mjs +143 -0
- package/browser/shared/page-address.mjs +140 -0
- package/browser/shared/page-links.mjs +86 -0
- package/browser/shared/paths.mjs +73 -0
- package/browser/shared/preferences.mjs +110 -0
- package/browser/shared/preview-server.mjs +247 -0
- package/browser/shared/qa-levels.mjs +93 -0
- package/browser/shared/reading-place.mjs +91 -0
- package/browser/shared/renamed-storage.mjs +220 -0
- package/browser/shared/reports.mjs +46 -0
- package/browser/shared/search.mjs +85 -0
- package/browser/shared/session.mjs +76 -0
- package/browser/shared/table-chart.mjs +113 -0
- package/browser/shared/table-hides.mjs +120 -0
- package/browser/shared/table-slots.mjs +75 -0
- package/browser/shared/words.mjs +23 -0
- package/browser/shared/workspace.mjs +535 -0
- package/browser/shared/writing-preferences.mjs +68 -0
- package/browser/shared/zoom.mjs +57 -0
- package/dist/chunk-2B5E4CDJ.mjs +2 -0
- package/dist/chunk-2PBALTR3.mjs +57 -0
- package/dist/chunk-342HXE3Q.mjs +2 -0
- package/dist/chunk-3LA3EMDE.mjs +15 -0
- package/dist/chunk-43B75J5T.mjs +2 -0
- package/dist/chunk-4K5KC6V2.mjs +2 -0
- package/dist/chunk-5FRMCDPY.mjs +16 -0
- package/dist/chunk-5L7RYZCL.mjs +2 -0
- package/dist/chunk-5LEK2CBS.mjs +2 -0
- package/dist/chunk-5OFN5AHC.mjs +2 -0
- package/dist/chunk-5SIYS5HN.mjs +2 -0
- package/dist/chunk-5TEK3RAD.mjs +2 -0
- package/dist/chunk-6CYG3Z4V.mjs +2 -0
- package/dist/chunk-6U2SLSDN.mjs +3 -0
- package/dist/chunk-742D2WWJ.mjs +19 -0
- package/dist/chunk-7GHT2UCA.mjs +15 -0
- package/dist/chunk-7QQBR7PB.mjs +2 -0
- package/dist/chunk-A55HN5OK.mjs +2 -0
- package/dist/chunk-ACOPDCNB.mjs +2 -0
- package/dist/chunk-AGDILNWB.mjs +2 -0
- package/dist/chunk-ATCJYAR4.mjs +2 -0
- package/dist/chunk-B3VTYBYR.mjs +960 -0
- package/dist/chunk-C564NU2H.mjs +77 -0
- package/dist/chunk-C7HWOBIF.mjs +2 -0
- package/dist/chunk-DB4WKGYF.mjs +7 -0
- package/dist/chunk-E7VYDG2X.mjs +2 -0
- package/dist/chunk-EUX7IC5J.mjs +48 -0
- package/dist/chunk-EVJ3BX3M.mjs +2 -0
- package/dist/chunk-EZY3WC6Z.mjs +15 -0
- package/dist/chunk-FQGQH4KM.mjs +2 -0
- package/dist/chunk-G7TOXONE.mjs +6 -0
- package/dist/chunk-GPF4YWWB.mjs +9 -0
- package/dist/chunk-GRAXKKG4.mjs +2 -0
- package/dist/chunk-GYQV7Y4J.mjs +120 -0
- package/dist/chunk-HMHK3EQ6.mjs +2 -0
- package/dist/chunk-HQQMJCQJ.mjs +10 -0
- package/dist/chunk-HYMEEXKN.mjs +4 -0
- package/dist/chunk-IERUOGC3.mjs +6 -0
- package/dist/chunk-ITNLYXXV.mjs +3 -0
- package/dist/chunk-L4DVONOG.mjs +2 -0
- package/dist/chunk-LAE5NQ4B.mjs +2 -0
- package/dist/chunk-LC7YNQFG.mjs +2 -0
- package/dist/chunk-LHTFLRB6.mjs +4 -0
- package/dist/chunk-LKX55H76.mjs +2 -0
- package/dist/chunk-MAFIGVXY.mjs +2 -0
- package/dist/chunk-NFIBI4IP.mjs +26 -0
- package/dist/chunk-NSKUTQ5J.mjs +5 -0
- package/dist/chunk-O52JMOCZ.mjs +2 -0
- package/dist/chunk-P2CAZPDP.mjs +3 -0
- package/dist/chunk-QAIHRH3I.mjs +13 -0
- package/dist/chunk-QMQUXTU4.mjs +12 -0
- package/dist/chunk-QR6A54KJ.mjs +3 -0
- package/dist/chunk-QVWVFC5K.mjs +6 -0
- package/dist/chunk-QYKCJ7FG.mjs +8 -0
- package/dist/chunk-QZY6Q64C.mjs +2 -0
- package/dist/chunk-TDQP3DKQ.mjs +10 -0
- package/dist/chunk-TMYZB6AV.mjs +2 -0
- package/dist/chunk-TX6JH7TR.mjs +2 -0
- package/dist/chunk-U3SSPL4K.mjs +8 -0
- package/dist/chunk-UH4SIXTR.mjs +2 -0
- package/dist/chunk-UNUEWH4S.mjs +2 -0
- package/dist/chunk-UXUK4PMC.mjs +27 -0
- package/dist/chunk-V4CPWKMZ.mjs +2 -0
- package/dist/chunk-V6XZ4VIR.mjs +2 -0
- package/dist/chunk-VACRB2NE.mjs +3 -0
- package/dist/chunk-W63L7367.mjs +7 -0
- package/dist/chunk-W7CXPCRV.mjs +6 -0
- package/dist/chunk-W7XHE4CT.mjs +2 -0
- package/dist/chunk-XINNG4F2.mjs +4 -0
- package/dist/chunk-Y34NR5JL.mjs +2 -0
- package/dist/chunk-YEY3RSFQ.mjs +2 -0
- package/dist/chunk-YL2DPWVS.mjs +4 -0
- package/dist/chunk-YXAUQPVK.mjs +8 -0
- package/dist/chunk-YZ5Z6H4W.mjs +4 -0
- package/dist/chunk-Z52HTUW7.mjs +4 -0
- package/dist/chunk-ZBIM6ARY.mjs +216 -0
- package/dist/cli.mjs +2 -0
- package/dist/server.mjs +2 -0
- package/dist/worker.mjs +5 -0
- package/kit/charts.js +355 -0
- package/kit/code.js +164 -0
- package/kit/dialogs.js +157 -0
- package/kit/math.js +1988 -0
- package/kit/report.css +2821 -0
- package/kit/runtime.js +1707 -0
- package/kit/sheets.js +123 -0
- package/kit/state.js +217 -0
- package/kit/tables.js +1449 -0
- package/kit/tokens.js +29 -0
- package/kit/ui.js +561 -0
- package/package.json +41 -4
- package/release.json +25 -0
- package/sdk/column-widths.d.ts +56 -0
- package/sdk/doc-charts.d.ts +82 -0
- package/sdk/doc-code.d.ts +28 -0
- package/sdk/doc-dialogs.d.ts +4 -0
- package/sdk/doc-kit.d.ts +141 -0
- package/sdk/doc-math.d.ts +3 -0
- package/sdk/doc-sheets.d.ts +15 -0
- package/sdk/doc-state.d.ts +41 -0
- package/sdk/doc-tables.d.ts +24 -0
- package/sdk/doc-tokens.d.ts +22 -0
- package/sdk/index.d.ts +30 -0
- package/skill/SKILL.md +138 -0
- package/skill/agents/openai.yaml +5 -0
- package/skill/references/building-components.md +327 -0
- package/skill/references/example-report.html +356 -0
- package/skill/references/writing-html.md +187 -0
- package/skill/sdk/column-widths.d.ts +56 -0
- package/skill/sdk/doc-charts.d.ts +82 -0
- package/skill/sdk/doc-code.d.ts +28 -0
- package/skill/sdk/doc-dialogs.d.ts +4 -0
- package/skill/sdk/doc-kit.d.ts +141 -0
- package/skill/sdk/doc-math.d.ts +3 -0
- package/skill/sdk/doc-sheets.d.ts +15 -0
- package/skill/sdk/doc-state.d.ts +41 -0
- package/skill/sdk/doc-tables.d.ts +24 -0
- package/skill/sdk/doc-tokens.d.ts +22 -0
- package/skill/sdk/index.d.ts +30 -0
- package/starter/doc.html +21 -0
- package/starter/doc.json +5 -0
- package/vendor/d3.v7.9.0.min.js +2 -0
- package/vendor/katex/auto-render.min.js +1 -0
- package/vendor/katex/contrib/mhchem.min.js +1 -0
- package/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/vendor/katex/katex.min.css +1 -0
- package/vendor/katex/katex.min.js +1 -0
- package/vendor/pdfjs/LICENSE +177 -0
- package/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
- package/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
- package/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
- package/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
- package/vendor/pdfjs/cmaps/LICENSE +36 -0
- package/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
- package/vendor/pdfjs/legacy/build/pdf.min.mjs +27 -0
- package/vendor/pdfjs/legacy/build/pdf.worker.min.mjs +27 -0
- package/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
- package/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +363 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
- package/vendor/types/@types/d3/LICENSE +21 -0
- package/vendor/types/@types/d3/index.d.ts +39 -0
- package/vendor/types/@types/d3/package.json +81 -0
- package/vendor/types/@types/d3-array/LICENSE +21 -0
- package/vendor/types/@types/d3-array/index.d.ts +1118 -0
- package/vendor/types/@types/d3-array/package.json +56 -0
- package/vendor/types/@types/d3-axis/LICENSE +21 -0
- package/vendor/types/@types/d3-axis/index.d.ts +293 -0
- package/vendor/types/@types/d3-axis/package.json +47 -0
- package/vendor/types/@types/d3-brush/LICENSE +21 -0
- package/vendor/types/@types/d3-brush/index.d.ts +255 -0
- package/vendor/types/@types/d3-brush/package.json +42 -0
- package/vendor/types/@types/d3-chord/LICENSE +21 -0
- package/vendor/types/@types/d3-chord/index.d.ts +471 -0
- package/vendor/types/@types/d3-chord/package.json +40 -0
- package/vendor/types/@types/d3-color/LICENSE +21 -0
- package/vendor/types/@types/d3-color/index.d.ts +669 -0
- package/vendor/types/@types/d3-color/package.json +55 -0
- package/vendor/types/@types/d3-contour/LICENSE +21 -0
- package/vendor/types/@types/d3-contour/index.d.ts +222 -0
- package/vendor/types/@types/d3-contour/package.json +38 -0
- package/vendor/types/@types/d3-delaunay/LICENSE +21 -0
- package/vendor/types/@types/d3-delaunay/index.d.ts +316 -0
- package/vendor/types/@types/d3-delaunay/package.json +30 -0
- package/vendor/types/@types/d3-dispatch/LICENSE +21 -0
- package/vendor/types/@types/d3-dispatch/index.d.ts +96 -0
- package/vendor/types/@types/d3-dispatch/package.json +51 -0
- package/vendor/types/@types/d3-drag/LICENSE +21 -0
- package/vendor/types/@types/d3-drag/index.d.ts +395 -0
- package/vendor/types/@types/d3-drag/package.json +42 -0
- package/vendor/types/@types/d3-dsv/LICENSE +21 -0
- package/vendor/types/@types/d3-dsv/index.d.ts +482 -0
- package/vendor/types/@types/d3-dsv/package.json +45 -0
- package/vendor/types/@types/d3-ease/LICENSE +21 -0
- package/vendor/types/@types/d3-ease/index.d.ts +316 -0
- package/vendor/types/@types/d3-ease/package.json +40 -0
- package/vendor/types/@types/d3-fetch/LICENSE +21 -0
- package/vendor/types/@types/d3-fetch/index.d.ts +282 -0
- package/vendor/types/@types/d3-fetch/package.json +37 -0
- package/vendor/types/@types/d3-force/LICENSE +21 -0
- package/vendor/types/@types/d3-force/index.d.ts +899 -0
- package/vendor/types/@types/d3-force/package.json +45 -0
- package/vendor/types/@types/d3-format/LICENSE +21 -0
- package/vendor/types/@types/d3-format/index.d.ts +337 -0
- package/vendor/types/@types/d3-format/package.json +45 -0
- package/vendor/types/@types/d3-geo/LICENSE +21 -0
- package/vendor/types/@types/d3-geo/index.d.ts +1371 -0
- package/vendor/types/@types/d3-geo/package.json +48 -0
- package/vendor/types/@types/d3-hierarchy/LICENSE +21 -0
- package/vendor/types/@types/d3-hierarchy/index.d.ts +928 -0
- package/vendor/types/@types/d3-hierarchy/package.json +50 -0
- package/vendor/types/@types/d3-interpolate/LICENSE +21 -0
- package/vendor/types/@types/d3-interpolate/index.d.ts +387 -0
- package/vendor/types/@types/d3-interpolate/package.json +47 -0
- package/vendor/types/@types/d3-path/LICENSE +21 -0
- package/vendor/types/@types/d3-path/index.d.ts +108 -0
- package/vendor/types/@types/d3-path/package.json +41 -0
- package/vendor/types/@types/d3-polygon/LICENSE +21 -0
- package/vendor/types/@types/d3-polygon/index.d.ts +41 -0
- package/vendor/types/@types/d3-polygon/package.json +40 -0
- package/vendor/types/@types/d3-quadtree/LICENSE +21 -0
- package/vendor/types/@types/d3-quadtree/index.d.ts +204 -0
- package/vendor/types/@types/d3-quadtree/package.json +45 -0
- package/vendor/types/@types/d3-random/LICENSE +21 -0
- package/vendor/types/@types/d3-random/index.d.ts +313 -0
- package/vendor/types/@types/d3-random/package.json +41 -0
- package/vendor/types/@types/d3-scale/LICENSE +21 -0
- package/vendor/types/@types/d3-scale/index.d.ts +2669 -0
- package/vendor/types/@types/d3-scale/package.json +53 -0
- package/vendor/types/@types/d3-scale-chromatic/LICENSE +21 -0
- package/vendor/types/@types/d3-scale-chromatic/index.d.ts +520 -0
- package/vendor/types/@types/d3-scale-chromatic/package.json +46 -0
- package/vendor/types/@types/d3-selection/LICENSE +21 -0
- package/vendor/types/@types/d3-selection/index.d.ts +1210 -0
- package/vendor/types/@types/d3-selection/package.json +56 -0
- package/vendor/types/@types/d3-shape/LICENSE +21 -0
- package/vendor/types/@types/d3-shape/index.d.ts +2792 -0
- package/vendor/types/@types/d3-shape/package.json +53 -0
- package/vendor/types/@types/d3-time/LICENSE +21 -0
- package/vendor/types/@types/d3-time/index.d.ts +697 -0
- package/vendor/types/@types/d3-time/package.json +46 -0
- package/vendor/types/@types/d3-time-format/LICENSE +21 -0
- package/vendor/types/@types/d3-time-format/index.d.ts +202 -0
- package/vendor/types/@types/d3-time-format/package.json +40 -0
- package/vendor/types/@types/d3-timer/LICENSE +21 -0
- package/vendor/types/@types/d3-timer/index.d.ts +68 -0
- package/vendor/types/@types/d3-timer/package.json +45 -0
- package/vendor/types/@types/d3-transition/LICENSE +21 -0
- package/vendor/types/@types/d3-transition/index.d.ts +664 -0
- package/vendor/types/@types/d3-transition/package.json +47 -0
- package/vendor/types/@types/d3-zoom/LICENSE +21 -0
- package/vendor/types/@types/d3-zoom/index.d.ts +611 -0
- package/vendor/types/@types/d3-zoom/package.json +48 -0
- package/vendor/types/@types/geojson/LICENSE +21 -0
- package/vendor/types/@types/geojson/index.d.ts +202 -0
- package/vendor/types/@types/geojson/package.json +46 -0
- package/vendor/typescript/LICENSE.txt +55 -0
- package/vendor/typescript/lib.decorators.d.ts +384 -0
- package/vendor/typescript/lib.decorators.legacy.d.ts +22 -0
- package/vendor/typescript/lib.dom.d.ts +39429 -0
- package/vendor/typescript/lib.dom.iterable.d.ts +571 -0
- package/vendor/typescript/lib.es2015.collection.d.ts +147 -0
- package/vendor/typescript/lib.es2015.core.d.ts +597 -0
- package/vendor/typescript/lib.es2015.d.ts +28 -0
- package/vendor/typescript/lib.es2015.generator.d.ts +77 -0
- package/vendor/typescript/lib.es2015.iterable.d.ts +605 -0
- package/vendor/typescript/lib.es2015.promise.d.ts +81 -0
- package/vendor/typescript/lib.es2015.proxy.d.ts +128 -0
- package/vendor/typescript/lib.es2015.reflect.d.ts +144 -0
- package/vendor/typescript/lib.es2015.symbol.d.ts +46 -0
- package/vendor/typescript/lib.es2015.symbol.wellknown.d.ts +326 -0
- package/vendor/typescript/lib.es2016.array.include.d.ts +116 -0
- package/vendor/typescript/lib.es2016.d.ts +21 -0
- package/vendor/typescript/lib.es2016.intl.d.ts +31 -0
- package/vendor/typescript/lib.es2017.arraybuffer.d.ts +21 -0
- package/vendor/typescript/lib.es2017.d.ts +26 -0
- package/vendor/typescript/lib.es2017.date.d.ts +31 -0
- package/vendor/typescript/lib.es2017.intl.d.ts +44 -0
- package/vendor/typescript/lib.es2017.object.d.ts +49 -0
- package/vendor/typescript/lib.es2017.sharedmemory.d.ts +135 -0
- package/vendor/typescript/lib.es2017.string.d.ts +45 -0
- package/vendor/typescript/lib.es2017.typedarrays.d.ts +53 -0
- package/vendor/typescript/lib.es2018.asyncgenerator.d.ts +77 -0
- package/vendor/typescript/lib.es2018.asynciterable.d.ts +53 -0
- package/vendor/typescript/lib.es2018.d.ts +24 -0
- package/vendor/typescript/lib.es2018.intl.d.ts +83 -0
- package/vendor/typescript/lib.es2018.promise.d.ts +30 -0
- package/vendor/typescript/lib.es2018.regexp.d.ts +37 -0
- package/vendor/typescript/lib.es2019.array.d.ts +79 -0
- package/vendor/typescript/lib.es2019.d.ts +24 -0
- package/vendor/typescript/lib.es2019.intl.d.ts +23 -0
- package/vendor/typescript/lib.es2019.object.d.ts +33 -0
- package/vendor/typescript/lib.es2019.string.d.ts +37 -0
- package/vendor/typescript/lib.es2019.symbol.d.ts +24 -0
- package/vendor/typescript/lib.es2020.bigint.d.ts +765 -0
- package/vendor/typescript/lib.es2020.d.ts +27 -0
- package/vendor/typescript/lib.es2020.date.d.ts +42 -0
- package/vendor/typescript/lib.es2020.intl.d.ts +474 -0
- package/vendor/typescript/lib.es2020.number.d.ts +28 -0
- package/vendor/typescript/lib.es2020.promise.d.ts +47 -0
- package/vendor/typescript/lib.es2020.sharedmemory.d.ts +99 -0
- package/vendor/typescript/lib.es2020.string.d.ts +44 -0
- package/vendor/typescript/lib.es2020.symbol.wellknown.d.ts +41 -0
- package/vendor/typescript/lib.es2021.d.ts +23 -0
- package/vendor/typescript/lib.es2021.intl.d.ts +166 -0
- package/vendor/typescript/lib.es2021.promise.d.ts +48 -0
- package/vendor/typescript/lib.es2021.string.d.ts +33 -0
- package/vendor/typescript/lib.es2021.weakref.d.ts +78 -0
- package/vendor/typescript/lib.es2022.array.d.ts +121 -0
- package/vendor/typescript/lib.es2022.d.ts +25 -0
- package/vendor/typescript/lib.es2022.error.d.ts +75 -0
- package/vendor/typescript/lib.es2022.intl.d.ts +145 -0
- package/vendor/typescript/lib.es2022.object.d.ts +26 -0
- package/vendor/typescript/lib.es2022.regexp.d.ts +39 -0
- package/vendor/typescript/lib.es2022.string.d.ts +25 -0
- package/vendor/typescript/lib.es5.d.ts +4601 -0
- package/vendor/typescript/package.json +4 -0
- package/vendor/typescript/typescript.js +446 -0
- package/web/assets/index-B6Ai3wsa.js +13 -0
- package/web/assets/index-SYPC3EZy.css +1 -0
- package/web/index.html +14 -0
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
import { chipBox } from "../chip-fills.mjs";
|
|
2
|
+
import { DETAILS, DIALOG } from "../../components/kit.mjs";
|
|
3
|
+
import { boxRole } from "../../components/registry.mjs";
|
|
4
|
+
import { UNIT, can, isHost, mergeInto, partsOf, removalTarget, takeOut, textEnd, unitElement } from "../core.mjs";
|
|
5
|
+
import { atomOf, caretAt, caretAtOffset, dragPlace, editable, hosts, pointRange, select } from "../caret.mjs";
|
|
6
|
+
import { edgeFollower } from "../edge-scroll.mjs";
|
|
7
|
+
import { gapScore } from "../geometry.mjs";
|
|
8
|
+
import { endsGesture, gestureLock } from "../gesture.mjs";
|
|
9
|
+
import { joinCode } from "../marks.mjs";
|
|
10
|
+
import { own } from "../overlays.mjs";
|
|
11
|
+
import { keptByComponent } from "../page-objects.mjs";
|
|
12
|
+
import { addStyle, element } from "../ui.mjs";
|
|
13
|
+
import { Z } from "../../../shared/layers.mjs";
|
|
14
|
+
import { t } from "../../../shared/i18n/index.mjs";
|
|
15
|
+
|
|
16
|
+
// Selecting text across blocks (Feishu's: a press in text dragged into other blocks selects the
|
|
17
|
+
// text between; feishu-lite D:\code\feishu-lite, src/editing/selection/). Each block is a text
|
|
18
|
+
// block of its own here, and the browser keeps a selection inside one, so once the pointer leaves
|
|
19
|
+
// the block the press began in, the page takes the selection over: from where the press began to the
|
|
20
|
+
// text under the pointer (or the nearest block's, beside or between blocks; the page scrolls near
|
|
21
|
+
// the window's edges), drawn with the CSS Custom Highlight API in the selection's own colors, the
|
|
22
|
+
// browser's selecting held off meanwhile; back in that block, the browser's again. Shift+click in
|
|
23
|
+
// another block selects from the caret to there.
|
|
24
|
+
// Its text is that of body text, headings and list items (in quotes, highlight blocks, columns…).
|
|
25
|
+
// A block holding none (a code block, a table, a file, an image, a formula block, a callout, a
|
|
26
|
+
// divider…) is taken whole as it passes it, filled as a selected block is (selection/ mark), its
|
|
27
|
+
// own text not marked: over one, an end of the selection stands before it or after it, as the drag
|
|
28
|
+
// goes, and a press begun in one (its code, a cell) takes it whole once it has left it.
|
|
29
|
+
// The selection stays after the press: Ctrl+C copies it (its blocks, each of its type, the first and
|
|
30
|
+
// the last partly: clipboard/ copyAcross), Ctrl+X too and deletes it; Backspace, Delete, typing,
|
|
31
|
+
// Enter and a paste delete it first (the first block keeps its text before the selection and takes
|
|
32
|
+
// the last block's after it; the blocks between go, those taken whole among them; one undo step),
|
|
33
|
+
// Esc selects its blocks, an arrow collapses it. The format
|
|
34
|
+
// bar shows for it once the press ends (format-bar/: its text formatted, piece by piece, one undo
|
|
35
|
+
// step; its blocks turned into another type together, drawn again over them; no link, formula or
|
|
36
|
+
// card), and its keys format it too; a press on the bar keeps it. Ctrl+A selects the blocks of the
|
|
37
|
+
// first container holding all it touches (select-all/). Anything else (a press, Ctrl+Z) lets it go.
|
|
38
|
+
|
|
39
|
+
const NAME = "ge-cross"; // its ranges (what it holds; the scenarios read them), drawn by the strips below
|
|
40
|
+
const SHOWN = "ge-cross-shown"; // the same, drawn by the browser: in a modal dialog, which the page's layer is under
|
|
41
|
+
// Selected text looks the same in a block (the browser's) and across blocks (the page's), whatever
|
|
42
|
+
// the system's colors: the text keeps its color on Notion's blue (as the link box's stand-in, links/).
|
|
43
|
+
// The browser draws a selection a line high, so its lines meet; a highlight (the CSS Custom Highlight
|
|
44
|
+
// API) only as high as the letters, which leaves a gap between lines. So across blocks the page draws
|
|
45
|
+
// it as the browser does: a strip a line high over each line of each block's selected text (from its
|
|
46
|
+
// first letter to its last), in a layer of its own at the page's origin (it scrolls with the page)
|
|
47
|
+
// blended over the page, so the text keeps its color and the blue is the browser's (the palette's
|
|
48
|
+
// selection strip: multiplied on a light page, screened on a dark one).
|
|
49
|
+
const SELECTED = "var(--ge-select)";
|
|
50
|
+
const STYLE = `
|
|
51
|
+
${gestureLock("data-ge-cross", { select: true })}
|
|
52
|
+
:is([data-ge-block], [data-ge-new])::selection, :is([data-ge-block], [data-ge-new]) ::selection { color: inherit; background-color: ${SELECTED}; }
|
|
53
|
+
::highlight(${NAME}) { color: inherit; background-color: transparent; }
|
|
54
|
+
::highlight(${SHOWN}) { color: inherit; background-color: ${SELECTED}; }
|
|
55
|
+
.ge-cross-layer { position: absolute; left: 0; top: 0; width: 0; height: 0; overflow: visible; pointer-events: none; z-index: ${Z.layer}; mix-blend-mode: multiply; }
|
|
56
|
+
.ge-cross-layer > span { position: absolute; left: 0; top: 0; background: var(--ge-select-strip); }
|
|
57
|
+
:root[data-doc-theme="dark"] .ge-cross-layer { mix-blend-mode: screen; }
|
|
58
|
+
@media (prefers-color-scheme: dark) {
|
|
59
|
+
:root:not([data-doc-theme="light"]) .ge-cross-layer { mix-blend-mode: screen; }
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
|
|
63
|
+
// The boxes of what `range` holds, a chip of `chips` (those it holds whole) its own box and no piece of it.
|
|
64
|
+
function boxesOf(range, chips) {
|
|
65
|
+
const boxes = [];
|
|
66
|
+
const words = range.cloneRange();
|
|
67
|
+
for (const chip of chips) {
|
|
68
|
+
words.setEndBefore(chip);
|
|
69
|
+
boxes.push(...words.getClientRects(), ...chip.getClientRects());
|
|
70
|
+
words.setEnd(range.endContainer, range.endOffset);
|
|
71
|
+
words.setStartAfter(chip);
|
|
72
|
+
}
|
|
73
|
+
boxes.push(...words.getClientRects());
|
|
74
|
+
return boxes;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The strips over each line of `texts` ([{ host, range }]), relative to `origin` (the layer's corner
|
|
78
|
+
// in the window): a line's from its first letter to its last, a line high (the block's line-height),
|
|
79
|
+
// centred on its letters; what a range holds that is a block of its own (taller than a line) left out,
|
|
80
|
+
// and a chip of the text it holds whole a strip of its own, over all of it (the layer's strips blend as
|
|
81
|
+
// one), but for one the line wraps, its pieces on their lines.
|
|
82
|
+
function lineStrips(texts, origin) {
|
|
83
|
+
const strips = [];
|
|
84
|
+
for (const { host, range } of texts) {
|
|
85
|
+
const style = getComputedStyle(host);
|
|
86
|
+
const height = parseFloat(style.lineHeight) || parseFloat(style.fontSize) * 1.6;
|
|
87
|
+
const chips = [...host.querySelectorAll("[data-ge-atom]")].filter((chip) => holds(range, chip));
|
|
88
|
+
const lines = [];
|
|
89
|
+
for (const rect of boxesOf(range, chips)) {
|
|
90
|
+
if (rect.width === 0 || rect.height > height * 1.5) continue;
|
|
91
|
+
const middle = (rect.top + rect.bottom) / 2;
|
|
92
|
+
const line = lines.find((each) => Math.abs(each.middle - middle) < height / 2);
|
|
93
|
+
if (line) {
|
|
94
|
+
line.left = Math.min(line.left, rect.left);
|
|
95
|
+
line.right = Math.max(line.right, rect.right);
|
|
96
|
+
} else lines.push({ middle, left: rect.left, right: rect.right });
|
|
97
|
+
}
|
|
98
|
+
for (const line of lines) strips.push({ left: line.left - origin.left, top: line.middle - height / 2 - origin.top, width: line.right - line.left, height });
|
|
99
|
+
for (const chip of chips) {
|
|
100
|
+
if (chip.getClientRects().length > 1) continue;
|
|
101
|
+
const box = chipBox(chip);
|
|
102
|
+
strips.push({ left: box.left - origin.left, top: box.top - origin.top, width: box.width, height: box.height });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return strips;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// The text blocks it takes text from, and a deletion joins: body text, headings, list items.
|
|
109
|
+
const isText = (host) => isHost(host) && (host.getAttribute("data-ge-kind") ?? "flow") === "flow";
|
|
110
|
+
const textHosts = (unit) => [...unit.querySelectorAll("[data-ge-block], [data-ge-new]")].filter((node) => isHost(node) && isText(node));
|
|
111
|
+
|
|
112
|
+
// The outermost block around `node` holding no text of the body (a code block, a table, a file…),
|
|
113
|
+
// taken whole, or null.
|
|
114
|
+
function wholeOf(node) {
|
|
115
|
+
let whole = null;
|
|
116
|
+
for (let unit = (node?.nodeType === 1 ? node : node?.parentElement)?.closest(UNIT); unit?.closest("main"); unit = unit.parentElement?.closest(UNIT)) {
|
|
117
|
+
if ((isHost(unit) && isText(unit)) || textHosts(unit).length > 0) break;
|
|
118
|
+
whole = unit;
|
|
119
|
+
}
|
|
120
|
+
return whole;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// The text a press can begin in: a text block's, or what a block taken whole edits as its own (a
|
|
124
|
+
// code block's code), or null.
|
|
125
|
+
function textAt(node) {
|
|
126
|
+
const host = editable(node);
|
|
127
|
+
if (host) return host;
|
|
128
|
+
const own = (node?.nodeType === 1 ? node : node?.parentElement)?.closest('[contenteditable="true"]');
|
|
129
|
+
return own?.closest("main") && wholeOf(own) ? own : null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Whether a block is no block of a selection between its ends, taken or deleted only with the block
|
|
133
|
+
// around it: a part of that block (a card's title, a tabs area's tab: notion-lite's tabs are no
|
|
134
|
+
// blocks a selection holds), or in a tab not shown (notion-lite's tabs not shown are not on the page).
|
|
135
|
+
const ownPart = (unit) => (!unit.parentElement?.hasAttribute("data-ge-box") && !isHost(unit))
|
|
136
|
+
|| boxRole(unit.parentElement.getAttribute("data-ge-box-kind")) === "tabs" || Boolean(unit.parentElement.closest("main [hidden]"));
|
|
137
|
+
|
|
138
|
+
// The place right before a block (with what goes with it: core.mjs partsOf) or right after it.
|
|
139
|
+
function edge(unit, after) {
|
|
140
|
+
const parts = partsOf(unit);
|
|
141
|
+
const node = after ? parts.at(-1) : parts[0];
|
|
142
|
+
const index = [...node.parentNode.childNodes].indexOf(node);
|
|
143
|
+
return { host: null, unit, node: node.parentNode, offset: after ? index + 1 : index };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Whether point a comes before point b in the page.
|
|
147
|
+
function before(a, b) {
|
|
148
|
+
const range = document.createRange();
|
|
149
|
+
range.setStart(a.node, a.offset);
|
|
150
|
+
return range.comparePoint(b.node, b.offset) > 0;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const rangeOf = ({ start, end }) => {
|
|
154
|
+
const range = document.createRange();
|
|
155
|
+
range.setStart(start.node, start.offset);
|
|
156
|
+
range.setEnd(end.node, end.offset);
|
|
157
|
+
return range;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// Whether `range` holds all of `node`.
|
|
161
|
+
function holds(range, node) {
|
|
162
|
+
const own = document.createRange();
|
|
163
|
+
own.selectNode(node);
|
|
164
|
+
return range.compareBoundaryPoints(Range.START_TO_START, own) <= 0 && range.compareBoundaryPoints(Range.END_TO_END, own) >= 0;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* isEditing(); struct(parents, touched, mutate): the editor's undoable structural change; say;
|
|
169
|
+
* keepText(unit): why a block may not go (block-info.mjs); selectUnits(units): select blocks;
|
|
170
|
+
* markUnits(units): fill blocks as selected without selecting them (blocks.mjs); split(host): Enter
|
|
171
|
+
* in a text block (typing/). copy(data, range, { texts, wholes }, cut): it written to the clipboard's
|
|
172
|
+
* `data`, whether it was (clipboard/ copyAcross: a cut it refuses deletes nothing). claims(from, to):
|
|
173
|
+
* whether a drag from text block `from` into `to` is another tool's (a table's cells:
|
|
174
|
+
* table/cells.mjs), which then selects; the press is no longer this one's. keeps(node): a press on it keeps the selection (the format bar); formatKey(event):
|
|
175
|
+
* a key that formats it, handled (the format bar's keys); changed(): it was drawn by a press that
|
|
176
|
+
* ended, or let go (the format bar shows or hides). selectAll(event, touched): whether a key over it
|
|
177
|
+
* was Ctrl+A, handled (select-all/: the first container holding all it touches, as blocks),
|
|
178
|
+
* `touched()` letting it go and giving the blocks it touches.
|
|
179
|
+
*/
|
|
180
|
+
export function createTextSelection({ isEditing, struct, say, keepText, selectUnits, markUnits = () => {}, split, copy: write, claims = () => false, keeps = () => false, formatKey = () => false, changed = () => {}, selectAll = () => false }) {
|
|
181
|
+
addStyle(STYLE);
|
|
182
|
+
const supported = Boolean(globalThis.CSS?.highlights && globalThis.Highlight);
|
|
183
|
+
let press = null; // the main button down in text: { anchor, crossing }
|
|
184
|
+
let cross = null; // the page's selection: { start, end } (points { host, node, offset }, in page order; host null at a block's edge)
|
|
185
|
+
let swallow = false; // a Shift+click drew it: the mousedown after the press does nothing
|
|
186
|
+
|
|
187
|
+
// ---------- points ----------
|
|
188
|
+
|
|
189
|
+
// Where the pointer is in the page's text, `from` being the selection's other end: the body text
|
|
190
|
+
// under it; over a block taken whole, before it or after it (whichever leaves it inside); else the
|
|
191
|
+
// nearest text block by height (at its start above it, its end below it, beside it the nearest
|
|
192
|
+
// place on that line).
|
|
193
|
+
function pointAt(x, y, from) {
|
|
194
|
+
const place = dragPlace([from.node, from.offset], x, y);
|
|
195
|
+
const host = place && editable(place[0]);
|
|
196
|
+
if (host?.closest("main") && isText(host)) return { host, node: place[0], offset: place[1] };
|
|
197
|
+
const whole = wholeOf(document.elementFromPoint(x, y));
|
|
198
|
+
if (whole) return edge(whole, !from || before(from, edge(whole, false)));
|
|
199
|
+
let best = null;
|
|
200
|
+
let bestScore = null;
|
|
201
|
+
for (const each of hosts().filter((node) => node.closest("main") && isText(node))) {
|
|
202
|
+
const rect = each.getBoundingClientRect();
|
|
203
|
+
// By height, then (level ones: columns side by side) by width; of nested ones, the innermost.
|
|
204
|
+
const score = gapScore(rect, x, y);
|
|
205
|
+
if (!bestScore || score[0] < bestScore[0] || (score[0] === bestScore[0] && score[1] <= bestScore[1])) {
|
|
206
|
+
best = each;
|
|
207
|
+
bestScore = score;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (!best) return null;
|
|
211
|
+
const rect = best.getBoundingClientRect();
|
|
212
|
+
if (y < rect.top) return { host: best, node: best, offset: 0 };
|
|
213
|
+
if (y > rect.bottom) return { host: best, node: best, offset: textEnd(best) };
|
|
214
|
+
const inside = pointRange(Math.min(Math.max(x, rect.left + 1), rect.right - 1), y);
|
|
215
|
+
if (inside && editable(inside.startContainer) === best) return { host: best, node: inside.startContainer, offset: inside.startOffset };
|
|
216
|
+
return { host: best, node: best, offset: x < rect.left + rect.width / 2 ? 0 : textEnd(best) };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Where the selection starts, `focus` being its other end: the press's place in body text; begun
|
|
220
|
+
// in a block taken whole (its code, a cell), that block's edge away from `focus`.
|
|
221
|
+
function startOf(anchor, focus) {
|
|
222
|
+
if (isText(anchor.host)) return anchor;
|
|
223
|
+
const whole = wholeOf(anchor.host) ?? unitElement(anchor.host);
|
|
224
|
+
if (!whole) return anchor;
|
|
225
|
+
const head = edge(whole, false);
|
|
226
|
+
return before(head, focus) ? head : edge(whole, true);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// ---------- what it holds ----------
|
|
230
|
+
|
|
231
|
+
// Its text, by text block ({ host, range }, the block's own text: not the lists it holds), and the
|
|
232
|
+
// blocks it takes whole (outermost), each in page order.
|
|
233
|
+
function piecesOf(selection) {
|
|
234
|
+
const range = rangeOf(selection);
|
|
235
|
+
// A closed disclosure it holds all of is taken whole (its content folded away is no text to
|
|
236
|
+
// draw); in one it holds a part of (from its title on), what is folded away is no piece either.
|
|
237
|
+
const closed = [...document.querySelectorAll(`main ${DETAILS.match}:not([open])`)];
|
|
238
|
+
const wholeClosed = closed.filter((details) => holds(range, details) && !closed.some((other) => other !== details && other.contains(details) && holds(range, other)));
|
|
239
|
+
const folded = (host) => closed.some((details) => details.contains(host) && (wholeClosed.includes(details) || !details.querySelector(DETAILS.label)?.contains(host)));
|
|
240
|
+
// A text block between its ends has all its own text in it; one holding an end (a list item, a
|
|
241
|
+
// flowchart's step, holding the block the selection starts or ends in) only the part of its own
|
|
242
|
+
// text it reaches: none when its text stands before the start (the selection begun in a block the
|
|
243
|
+
// item holds) or after the end.
|
|
244
|
+
const reaches = (host) => host === selection.start.host || host === selection.end.host || (range.isPointInRange(host, 0) && range.isPointInRange(host, textEnd(host)));
|
|
245
|
+
const texts = hosts().filter((host) => host.closest("main") && isText(host) && range.intersectsNode(host) && reaches(host) && !folded(host)).map((host) => {
|
|
246
|
+
const part = document.createRange();
|
|
247
|
+
part.setStart(host, 0);
|
|
248
|
+
part.setEnd(host, textEnd(host));
|
|
249
|
+
if (host === selection.start.host) part.setStart(selection.start.node, selection.start.offset);
|
|
250
|
+
if (host === selection.end.host) part.setEnd(selection.end.node, selection.end.offset);
|
|
251
|
+
return { host, range: part };
|
|
252
|
+
});
|
|
253
|
+
const wholes = [...wholeClosed];
|
|
254
|
+
for (const unit of document.querySelectorAll(`main :is(${UNIT})`)) {
|
|
255
|
+
if (wholes.some((other) => other === unit || other.contains(unit))) continue;
|
|
256
|
+
if (ownPart(unit)) continue;
|
|
257
|
+
if ((isHost(unit) && isText(unit)) || textHosts(unit).length > 0 || !holds(range, unit)) continue;
|
|
258
|
+
wholes.push(unit);
|
|
259
|
+
}
|
|
260
|
+
return { texts, wholes };
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// The outermost blocks wholly between its two ends (not holding either), which a deletion takes.
|
|
264
|
+
function unitsBetween(selection) {
|
|
265
|
+
const range = rangeOf(selection);
|
|
266
|
+
const ends = [selection.start.host, selection.end.host].filter(Boolean);
|
|
267
|
+
const chosen = [];
|
|
268
|
+
for (const unit of document.querySelectorAll(`main :is(${UNIT})`)) {
|
|
269
|
+
if (ends.some((host) => unit === host || unit.contains(host))) continue;
|
|
270
|
+
if (chosen.some((other) => other.contains(unit))) continue;
|
|
271
|
+
if (ownPart(unit)) continue; // with the block
|
|
272
|
+
if (holds(range, unit)) chosen.push(unit);
|
|
273
|
+
}
|
|
274
|
+
return chosen;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// The blocks it touches, outermost: those wholly between its ends, and the blocks of its two ends
|
|
278
|
+
// (a block whose text blocks it all reaches, as a list whose every item it reaches, for them).
|
|
279
|
+
function blocksTouched(selection) {
|
|
280
|
+
const between = unitsBetween(selection);
|
|
281
|
+
const reached = new Set(piecesOf(selection).texts.map(({ host }) => host));
|
|
282
|
+
const covered = (host) => reached.has(host) || between.some((unit) => unit.contains(host));
|
|
283
|
+
const units = new Set(between);
|
|
284
|
+
for (const host of [selection.start.host, selection.end.host].filter(Boolean)) {
|
|
285
|
+
let unit = unitElement(host);
|
|
286
|
+
for (let outer = unit?.parentElement?.closest(UNIT); outer?.closest("main") && [...outer.querySelectorAll("[data-ge-block], [data-ge-new]")].filter(isHost).every(covered); outer = outer.parentElement?.closest(UNIT)) unit = outer;
|
|
287
|
+
if (unit) units.add(unit);
|
|
288
|
+
}
|
|
289
|
+
return [...units].filter((unit) => ![...units].some((other) => other !== unit && other.contains(unit)));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// ---------- drawing ----------
|
|
293
|
+
|
|
294
|
+
function draw(a, b) {
|
|
295
|
+
cross = before(a, b) ? { start: a, end: b } : { start: b, end: a };
|
|
296
|
+
getSelection().removeAllRanges(); // the page's own from now
|
|
297
|
+
const { texts, wholes } = piecesOf(cross);
|
|
298
|
+
CSS.highlights.set(NAME, new Highlight(...texts.map(({ range }) => range)));
|
|
299
|
+
paint(texts);
|
|
300
|
+
markUnits(wholes);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Its text drawn: the strips (lineStrips) in the page's layer, or, in a modal dialog, the browser's highlight.
|
|
304
|
+
let layer = null;
|
|
305
|
+
function paint(texts) {
|
|
306
|
+
const inDialog = texts.some(({ host }) => host.closest("dialog[open]")?.matches(":modal"));
|
|
307
|
+
if (inDialog) CSS.highlights.set(SHOWN, new Highlight(...texts.map(({ range }) => range)));
|
|
308
|
+
else CSS.highlights.delete(SHOWN);
|
|
309
|
+
layer ??= element("div", { class: "ge-cross-layer", "data-doc-dev": "" });
|
|
310
|
+
if (!layer.isConnected) document.body.append(layer);
|
|
311
|
+
const strips = inDialog ? [] : lineStrips(texts, layer.getBoundingClientRect());
|
|
312
|
+
while (layer.children.length > strips.length) layer.lastChild.remove();
|
|
313
|
+
while (layer.children.length < strips.length) layer.append(own(element("span"), "cross-selection", { alive: () => cross !== null }));
|
|
314
|
+
strips.forEach(({ left, top, width, height }, index) => Object.assign(layer.children[index].style, {
|
|
315
|
+
transform: `translate(${Math.round(left)}px, ${Math.round(top)}px)`, width: `${Math.round(width)}px`, height: `${Math.round(height)}px`,
|
|
316
|
+
}));
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function letGo() {
|
|
320
|
+
if (!cross) return;
|
|
321
|
+
cross = null;
|
|
322
|
+
if (supported) {
|
|
323
|
+
CSS.highlights.delete(NAME);
|
|
324
|
+
CSS.highlights.delete(SHOWN);
|
|
325
|
+
}
|
|
326
|
+
layer?.replaceChildren();
|
|
327
|
+
markUnits([]);
|
|
328
|
+
changed();
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// The page laid out again (the window resized): the strips over the text where it is now.
|
|
332
|
+
window.addEventListener("resize", () => {
|
|
333
|
+
if (cross) paint(piecesOf(cross).texts);
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
// Drawn again over its text changed in place (formatted, its blocks turned into another type:
|
|
337
|
+
// `texts` its pieces' new ranges in page order): its ends in text where they were, at a block's
|
|
338
|
+
// edge as they were (one still on the page).
|
|
339
|
+
function redraw(texts) {
|
|
340
|
+
if (!cross || texts.length === 0) return;
|
|
341
|
+
const first = texts[0].range;
|
|
342
|
+
const last = texts.at(-1).range;
|
|
343
|
+
const edge = (point) => !point.host && point.node.isConnected;
|
|
344
|
+
const start = edge(cross.start) ? cross.start : { host: texts[0].host, node: first.startContainer, offset: first.startOffset };
|
|
345
|
+
const end = edge(cross.end) ? cross.end : { host: texts.at(-1).host, node: last.endContainer, offset: last.endOffset };
|
|
346
|
+
draw(start, end);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Drawn again over its text blocks turned into another type (`texts`: where its pieces are now, in
|
|
350
|
+
// page order), as notion-lite's placeCaret(keep) keeps a selection; when one of them holds no text of
|
|
351
|
+
// the body now (a callout, a disclosure's title, code), let go instead. Returns whether it is drawn.
|
|
352
|
+
function reselect(texts) {
|
|
353
|
+
if (!cross) return false;
|
|
354
|
+
if (texts.length === 0 || !texts.every(({ host }) => host.isConnected && isText(host))) {
|
|
355
|
+
letGo();
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
redraw(texts);
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// ---------- the press ----------
|
|
363
|
+
|
|
364
|
+
document.addEventListener("pointerdown", (event) => {
|
|
365
|
+
if (cross && keeps(event.target)) return; // the format bar's buttons act on it
|
|
366
|
+
const extending = event.shiftKey && cross;
|
|
367
|
+
const shiftFrom = event.shiftKey ? (cross?.start ?? caretPoint()) : null;
|
|
368
|
+
letGo();
|
|
369
|
+
if (!supported || !isEditing() || event.button !== 0 || event.pointerType !== "mouse" || event.ctrlKey || event.metaKey || event.altKey) return;
|
|
370
|
+
// In text, or anywhere in a block taken whole (its code, not open yet; a file's row), which the
|
|
371
|
+
// press then stands for, but for what a component keeps: a drag there is its own.
|
|
372
|
+
const host = textAt(event.target) ?? (keptByComponent(event.target) ? null : wholeOf(event.target));
|
|
373
|
+
if (!host?.closest("main")) return;
|
|
374
|
+
// Shift+click in another block: from the caret (or the selection's start) to there (unless it is
|
|
375
|
+
// another tool's: cells of a table).
|
|
376
|
+
if (shiftFrom && shiftFrom.host !== host && !claims(shiftFrom.host, host)) {
|
|
377
|
+
const to = pointAt(event.clientX, event.clientY, shiftFrom);
|
|
378
|
+
if (!to) return;
|
|
379
|
+
event.preventDefault();
|
|
380
|
+
event.stopImmediatePropagation();
|
|
381
|
+
swallow = true; // and the browser's own selecting on the mousedown after it
|
|
382
|
+
draw(startOf(shiftFrom, to), to);
|
|
383
|
+
changed();
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
if (extending) return;
|
|
387
|
+
const at = pointRange(event.clientX, event.clientY);
|
|
388
|
+
if (!at || (textAt(at.startContainer) ?? wholeOf(at.startContainer)) !== host) return;
|
|
389
|
+
// Beside a chip the browser's place may be in its text: the place beside it.
|
|
390
|
+
const [node, offset] = atomOf(event.target) ? [at.startContainer, at.startOffset] : dragPlace([at.startContainer, at.startOffset], event.clientX, event.clientY);
|
|
391
|
+
press = { anchor: { host, node, offset }, crossing: false, whole: isText(host) ? null : wholeOf(host) };
|
|
392
|
+
}, true);
|
|
393
|
+
document.addEventListener("mousedown", (event) => {
|
|
394
|
+
if (!swallow) return;
|
|
395
|
+
swallow = false;
|
|
396
|
+
event.preventDefault();
|
|
397
|
+
event.stopImmediatePropagation();
|
|
398
|
+
}, true);
|
|
399
|
+
|
|
400
|
+
document.addEventListener("pointermove", (event) => {
|
|
401
|
+
if (!press || !(event.buttons & 1)) return;
|
|
402
|
+
press.x = event.clientX;
|
|
403
|
+
press.y = event.clientY;
|
|
404
|
+
// Into another tool's blocks (a table's cells, from a cell): theirs.
|
|
405
|
+
const at = pointRange(press.x, press.y);
|
|
406
|
+
const under = at ? textAt(at.startContainer) : null;
|
|
407
|
+
if (under && under !== press.anchor.host && claims(press.anchor.host, under)) {
|
|
408
|
+
if (press.crossing) letGo();
|
|
409
|
+
release();
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
// Still in the block taken whole the press began in: the block's own (its code's selection).
|
|
413
|
+
if (press.whole?.contains(document.elementFromPoint(press.x, press.y))) {
|
|
414
|
+
if (!press.crossing) return;
|
|
415
|
+
press.crossing = false;
|
|
416
|
+
document.documentElement.removeAttribute("data-ge-cross");
|
|
417
|
+
letGo();
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const focus = under === press.anchor.host ? { host: under, node: at.startContainer, offset: at.startOffset } : pointAt(press.x, press.y, press.anchor);
|
|
421
|
+
if (!focus) return;
|
|
422
|
+
if (focus.host === press.anchor.host) {
|
|
423
|
+
if (!press.crossing) return;
|
|
424
|
+
// Back in the block the press began in: the browser's selection again.
|
|
425
|
+
press.crossing = false;
|
|
426
|
+
document.documentElement.removeAttribute("data-ge-cross");
|
|
427
|
+
letGo();
|
|
428
|
+
const range = document.createRange();
|
|
429
|
+
range.setStart(press.anchor.node, press.anchor.offset);
|
|
430
|
+
range.collapse(true);
|
|
431
|
+
select(range);
|
|
432
|
+
getSelection().extend(focus.node, focus.offset);
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
if (!press.crossing) {
|
|
436
|
+
press.crossing = true;
|
|
437
|
+
document.documentElement.setAttribute("data-ge-cross", "");
|
|
438
|
+
}
|
|
439
|
+
draw(startOf(press.anchor, focus), focus);
|
|
440
|
+
scrolling.wake();
|
|
441
|
+
}, true);
|
|
442
|
+
|
|
443
|
+
// Near the top or bottom edge of what it started in (the window, or a detail card's content) that
|
|
444
|
+
// scrolls (as long as the pointer stays there), the selection reaching what comes into view: a task
|
|
445
|
+
// of the editor's frames (edge-scroll.mjs).
|
|
446
|
+
const scrolling = edgeFollower("text selection", {
|
|
447
|
+
pointer: () => (press?.crossing ? press : null),
|
|
448
|
+
scroller: () => press.anchor.host.closest(DIALOG.openContent),
|
|
449
|
+
scrolled() {
|
|
450
|
+
const focus = pointAt(press.x, press.y, press.anchor);
|
|
451
|
+
if (focus && focus.host !== press.anchor.host) draw(startOf(press.anchor, focus), focus);
|
|
452
|
+
},
|
|
453
|
+
fail: () => release(),
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
const release = () => {
|
|
457
|
+
if (!press) return;
|
|
458
|
+
press = null;
|
|
459
|
+
document.documentElement.removeAttribute("data-ge-cross");
|
|
460
|
+
if (cross) changed();
|
|
461
|
+
};
|
|
462
|
+
document.addEventListener("pointerup", release, true);
|
|
463
|
+
// The press ends the other ways too (the pointer cancelled, the window blurred, the page hidden).
|
|
464
|
+
endsGesture({ active: () => Boolean(press), cancel: release });
|
|
465
|
+
|
|
466
|
+
// The caret as a point, or null.
|
|
467
|
+
function caretPoint() {
|
|
468
|
+
const selection = getSelection();
|
|
469
|
+
if (!selection.rangeCount) return null;
|
|
470
|
+
const host = editable(selection.anchorNode);
|
|
471
|
+
return host?.closest("main") ? { host, node: selection.anchorNode, offset: selection.anchorOffset } : null;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// The caret at `point`; at a block's edge, in the body text nearest it that way (`forward`: after
|
|
475
|
+
// it), or the other way when there is none.
|
|
476
|
+
function caretTo(point, forward) {
|
|
477
|
+
if (point.host) {
|
|
478
|
+
const range = document.createRange();
|
|
479
|
+
range.setStart(point.node, point.offset);
|
|
480
|
+
point.host.focus({ preventScroll: true });
|
|
481
|
+
select(range);
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
const texts = hosts().filter((host) => host.closest("main") && isText(host));
|
|
485
|
+
const next = texts.find((host) => before(point, { node: host, offset: 0 }));
|
|
486
|
+
const previous = texts.filter((host) => before({ node: host, offset: textEnd(host) }, point)).at(-1);
|
|
487
|
+
const host = forward ? next ?? previous : previous ?? next;
|
|
488
|
+
if (host) caretAt(host, host === next ? "start" : "end");
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Delete it: the first block keeps its text before it and takes the last block's after it, the
|
|
492
|
+
// blocks between go (those taken whole among them); one undo step, the caret where it began.
|
|
493
|
+
// Returns whether it went.
|
|
494
|
+
function remove() {
|
|
495
|
+
const selection = cross;
|
|
496
|
+
const { start, end } = selection;
|
|
497
|
+
letGo();
|
|
498
|
+
if (!(start.host ?? start.node).isConnected || !(end.host ?? end.node).isConnected) return false;
|
|
499
|
+
if (![start.host, end.host].every((host) => !host || isText(host))) {
|
|
500
|
+
say(t("跨块删除只支持正文、标题和列表里的文字。"));
|
|
501
|
+
return false;
|
|
502
|
+
}
|
|
503
|
+
// A block between goes as a selected block would (keepText: block-info.mjs), a text block between
|
|
504
|
+
// unless it cannot be deleted (a block taken whole, a formula block too, by the first rule only).
|
|
505
|
+
const units = unitsBetween(selection);
|
|
506
|
+
const reason = units.map((unit) => keepText(unit) ?? (isText(unit) && !can(unit, "remove") ? t("这里有不能删除的块。") : null)).find(Boolean);
|
|
507
|
+
if (reason) {
|
|
508
|
+
say(reason, "note", 6000);
|
|
509
|
+
return false;
|
|
510
|
+
}
|
|
511
|
+
let offset = 0;
|
|
512
|
+
if (start.host) {
|
|
513
|
+
const head = document.createRange();
|
|
514
|
+
head.setStart(start.host, 0);
|
|
515
|
+
head.setEnd(start.node, start.offset);
|
|
516
|
+
offset = head.toString().length;
|
|
517
|
+
}
|
|
518
|
+
// What goes: the blocks between, and a container they (and the last block, joined) leave
|
|
519
|
+
// empty, as when blocks are deleted (core.mjs removalTarget).
|
|
520
|
+
const targets = units.map((unit) => removalTarget(unit, new Set(units))).filter((node, index, all) => all.indexOf(node) === index);
|
|
521
|
+
const endTarget = start.host && end.host ? removalTarget(end.host, new Set([...units, end.host])) : null;
|
|
522
|
+
const parents = [...new Set([start.host, end.host, ...[end.host, endTarget, ...targets].map((node) => node?.parentElement)].filter(Boolean))];
|
|
523
|
+
const touched = [start.host, end.host].filter(Boolean);
|
|
524
|
+
// With neither end in text, the caret goes to the text after where the blocks were (else before).
|
|
525
|
+
const beside = start.host || end.host ? null : end;
|
|
526
|
+
const result = struct(parents, touched, () => {
|
|
527
|
+
if (end.host) {
|
|
528
|
+
const lead = document.createRange();
|
|
529
|
+
lead.setStart(end.host, 0);
|
|
530
|
+
lead.setEnd(end.node, end.offset);
|
|
531
|
+
lead.deleteContents();
|
|
532
|
+
}
|
|
533
|
+
if (start.host) {
|
|
534
|
+
const tail = document.createRange();
|
|
535
|
+
tail.setStart(start.node, start.offset);
|
|
536
|
+
tail.setEnd(start.host, textEnd(start.host));
|
|
537
|
+
tail.deleteContents();
|
|
538
|
+
}
|
|
539
|
+
for (const target of targets) takeOut(target);
|
|
540
|
+
// Joined unless the two cannot be (a block that may not merge, lists that cannot go along):
|
|
541
|
+
// then each keeps what is left of its text.
|
|
542
|
+
if (start.host && end.host && mergeInto(start.host, end.host, { anyKind: true }) && endTarget !== end.host && endTarget.isConnected) takeOut(endTarget);
|
|
543
|
+
if (start.host) joinCode(start.host); // inline code meeting inline code at the join is one piece
|
|
544
|
+
return { touched: touched.filter((host) => host.isConnected), focus: start.host ?? end.host ?? null };
|
|
545
|
+
});
|
|
546
|
+
if (!result) return false;
|
|
547
|
+
if (start.host) {
|
|
548
|
+
start.host.focus({ preventScroll: true }); // the block pressed in may have gone (a selection drawn upwards)
|
|
549
|
+
caretAtOffset(start.host, offset);
|
|
550
|
+
} else if (end.host?.isConnected) caretAt(end.host, "start");
|
|
551
|
+
else if (beside?.node.isConnected) caretTo({ host: null, node: beside.node, offset: Math.min(beside.offset, beside.node.childNodes.length) }, true);
|
|
552
|
+
return true;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// ---------- keys and the clipboard ----------
|
|
556
|
+
|
|
557
|
+
document.addEventListener("keydown", (event) => {
|
|
558
|
+
if (!cross) return;
|
|
559
|
+
const key = event.key;
|
|
560
|
+
const mod = event.ctrlKey || event.metaKey;
|
|
561
|
+
if (["Shift", "Control", "Meta", "Alt"].includes(key) || (mod && ["c", "x", "v"].includes(key.toLowerCase()))) return; // the clipboard's events do it
|
|
562
|
+
if (key === "Escape") {
|
|
563
|
+
event.preventDefault();
|
|
564
|
+
event.stopImmediatePropagation();
|
|
565
|
+
const units = blocksTouched(cross);
|
|
566
|
+
letGo();
|
|
567
|
+
selectUnits(units);
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
if (key.startsWith("Arrow") && !mod) {
|
|
571
|
+
event.preventDefault();
|
|
572
|
+
event.stopImmediatePropagation();
|
|
573
|
+
const back = key === "ArrowLeft" || key === "ArrowUp";
|
|
574
|
+
const point = back ? cross.start : cross.end;
|
|
575
|
+
letGo();
|
|
576
|
+
caretTo(point, !back);
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
if (key === "Backspace" || key === "Delete") {
|
|
580
|
+
event.preventDefault();
|
|
581
|
+
event.stopImmediatePropagation();
|
|
582
|
+
remove();
|
|
583
|
+
return;
|
|
584
|
+
}
|
|
585
|
+
if (key === "Enter") {
|
|
586
|
+
event.preventDefault();
|
|
587
|
+
event.stopImmediatePropagation();
|
|
588
|
+
if (!remove()) return;
|
|
589
|
+
const host = editable(getSelection().anchorNode);
|
|
590
|
+
if (host) split(host);
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
// Typing (an input method too): what is typed replaces it.
|
|
594
|
+
if ((key.length === 1 && !mod) || event.keyCode === 229) {
|
|
595
|
+
if (!remove()) event.preventDefault();
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
// Ctrl+A: the blocks of the first container holding all it touches (select-all/).
|
|
599
|
+
if (selectAll(event, () => {
|
|
600
|
+
const units = blocksTouched(cross);
|
|
601
|
+
letGo();
|
|
602
|
+
return units;
|
|
603
|
+
})) {
|
|
604
|
+
event.stopImmediatePropagation();
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
// The format keys format it (the format bar's), it staying.
|
|
608
|
+
if (mod && formatKey(event)) {
|
|
609
|
+
event.stopImmediatePropagation();
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
letGo();
|
|
613
|
+
}, true);
|
|
614
|
+
|
|
615
|
+
// Text put in without a key before it (some input methods, dictation): it replaces it too, typed
|
|
616
|
+
// where the deletion leaves the caret.
|
|
617
|
+
document.addEventListener("beforeinput", (event) => {
|
|
618
|
+
if (!cross) return;
|
|
619
|
+
event.preventDefault();
|
|
620
|
+
event.stopImmediatePropagation();
|
|
621
|
+
const text = event.inputType === "insertText" || event.inputType === "insertReplacementText" ? event.data ?? event.dataTransfer?.getData("text/plain") : null;
|
|
622
|
+
if ((event.inputType.startsWith("insert") || event.inputType.startsWith("delete")) && remove() && text) document.execCommand("insertText", false, text);
|
|
623
|
+
else letGo();
|
|
624
|
+
}, true);
|
|
625
|
+
|
|
626
|
+
// Copied (cut: deleted after, unless the copy refused it).
|
|
627
|
+
const copy = (event) => {
|
|
628
|
+
event.preventDefault();
|
|
629
|
+
event.stopImmediatePropagation();
|
|
630
|
+
return write(event.clipboardData, rangeOf(cross), piecesOf(cross), event.type === "cut");
|
|
631
|
+
};
|
|
632
|
+
document.addEventListener("copy", (event) => { if (cross) copy(event); }, true);
|
|
633
|
+
document.addEventListener("cut", (event) => {
|
|
634
|
+
if (cross && copy(event)) remove();
|
|
635
|
+
}, true);
|
|
636
|
+
document.addEventListener("paste", (event) => {
|
|
637
|
+
if (!cross) return;
|
|
638
|
+
// What is pasted replaces it: deleted first, the paste goes on at the caret.
|
|
639
|
+
if (!remove()) {
|
|
640
|
+
event.preventDefault();
|
|
641
|
+
event.stopImmediatePropagation();
|
|
642
|
+
}
|
|
643
|
+
}, true);
|
|
644
|
+
|
|
645
|
+
return {
|
|
646
|
+
/** Whether the page holds a selection across blocks. */
|
|
647
|
+
get active() { return cross !== null; },
|
|
648
|
+
/** Its text, by text block ({ host, range }, page order), or null when there is none. */
|
|
649
|
+
texts: () => (cross ? piecesOf(cross).texts : null),
|
|
650
|
+
/** The blocks it takes whole (outermost, page order), or null when there is none. */
|
|
651
|
+
wholes: () => (cross ? piecesOf(cross).wholes : null),
|
|
652
|
+
redraw,
|
|
653
|
+
reselect,
|
|
654
|
+
letGo,
|
|
655
|
+
};
|
|
656
|
+
}
|