@heycys/gallery 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +50 -2
- package/THIRD-PARTY-NOTICES.md +3303 -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 +64 -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 +310 -0
- package/browser/editor/components/details/index.mjs +73 -0
- package/browser/editor/components/details/page.mjs +86 -0
- package/browser/editor/components/dialog/index.mjs +84 -0
- package/browser/editor/components/dialog/page.mjs +201 -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 +42 -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 +53 -0
- package/browser/editor/components/heading/page.mjs +6 -0
- package/browser/editor/components/highlight/index.mjs +63 -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 +48 -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 +179 -0
- package/browser/editor/components/installed/page.mjs +523 -0
- package/browser/editor/components/installed/served.mjs +35 -0
- package/browser/editor/components/kit.mjs +67 -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 +192 -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 +859 -0
- package/browser/editor/components/rows.mjs +16 -0
- package/browser/editor/components/section/index.mjs +42 -0
- package/browser/editor/components/section/page.mjs +141 -0
- package/browser/editor/components/set-apart.mjs +24 -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 +308 -0
- package/browser/editor/components/table/page.mjs +683 -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 +230 -0
- package/browser/editor/page/annotate/card.mjs +102 -0
- package/browser/editor/page/annotate/index.mjs +1656 -0
- package/browser/editor/page/at-menu/index.mjs +317 -0
- package/browser/editor/page/autosave.mjs +1023 -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 +84 -0
- package/browser/editor/page/block-menu/index.mjs +217 -0
- package/browser/editor/page/blocks.mjs +255 -0
- package/browser/editor/page/caret.mjs +682 -0
- package/browser/editor/page/changes/bar.mjs +102 -0
- package/browser/editor/page/changes/ghost.mjs +206 -0
- package/browser/editor/page/changes/gone-words.mjs +94 -0
- package/browser/editor/page/changes/index.mjs +447 -0
- package/browser/editor/page/changes/words.mjs +27 -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 +816 -0
- package/browser/editor/page/clipboard/own/blocks.mjs +211 -0
- package/browser/editor/page/clipboard/own/chart-keys.mjs +58 -0
- package/browser/editor/page/clipboard/own/describe.mjs +124 -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 +315 -0
- package/browser/editor/page/columns/index.mjs +360 -0
- package/browser/editor/page/commit.mjs +1813 -0
- package/browser/editor/page/conflicts.mjs +249 -0
- package/browser/editor/page/convert.mjs +831 -0
- package/browser/editor/page/core.mjs +1693 -0
- package/browser/editor/page/drag/drop.mjs +307 -0
- package/browser/editor/page/drag/index.mjs +351 -0
- package/browser/editor/page/drag/preview.mjs +126 -0
- package/browser/editor/page/edge-scroll.mjs +50 -0
- package/browser/editor/page/editor.mjs +1780 -0
- package/browser/editor/page/emoji-picker/emoji-tab.mjs +287 -0
- package/browser/editor/page/emoji-picker/glyph-html.mjs +26 -0
- package/browser/editor/page/emoji-picker/grid.mjs +81 -0
- package/browser/editor/page/emoji-picker/icon-tab.mjs +217 -0
- package/browser/editor/page/emoji-picker/icons.mjs +31 -0
- package/browser/editor/page/emoji-picker/index.mjs +166 -0
- package/browser/editor/page/emoji-picker/styles.mjs +161 -0
- package/browser/editor/page/emoji-picker/support.mjs +204 -0
- package/browser/editor/page/emoji-picker/upload.mjs +236 -0
- package/browser/editor/page/export-report.mjs +23 -0
- package/browser/editor/page/fills.mjs +62 -0
- package/browser/editor/page/find/index.mjs +107 -0
- package/browser/editor/page/flags.mjs +70 -0
- package/browser/editor/page/fold/index.mjs +348 -0
- package/browser/editor/page/fold/rule.mjs +125 -0
- package/browser/editor/page/folded.mjs +23 -0
- package/browser/editor/page/format-bar/bar.mjs +449 -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 +402 -0
- package/browser/editor/page/gesture.mjs +45 -0
- package/browser/editor/page/handle/index.mjs +650 -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 +256 -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/long-runs.mjs +75 -0
- package/browser/editor/page/look.mjs +77 -0
- package/browser/editor/page/made.mjs +24 -0
- package/browser/editor/page/margin.mjs +373 -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 +544 -0
- package/browser/editor/page/merge.mjs +124 -0
- package/browser/editor/page/notices.mjs +142 -0
- package/browser/editor/page/offered.mjs +32 -0
- package/browser/editor/page/outline/folds.mjs +53 -0
- package/browser/editor/page/outline/index.mjs +783 -0
- package/browser/editor/page/outline/list.mjs +184 -0
- package/browser/editor/page/outline/read.mjs +201 -0
- package/browser/editor/page/outline/strip.mjs +287 -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 +65 -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 +61 -0
- package/browser/editor/page/selection/index.mjs +164 -0
- package/browser/editor/page/selection/marquee.mjs +174 -0
- package/browser/editor/page/session.mjs +168 -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 +141 -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 +990 -0
- package/browser/editor/page/table/lists.mjs +187 -0
- package/browser/editor/page/table/widths.mjs +313 -0
- package/browser/editor/page/tex.mjs +32 -0
- package/browser/editor/page/text-select/index.mjs +671 -0
- package/browser/editor/page/tooltip.mjs +98 -0
- package/browser/editor/page/type-grid.mjs +83 -0
- package/browser/editor/page/typing/code-edges.mjs +274 -0
- package/browser/editor/page/typing/index.mjs +282 -0
- package/browser/editor/page/typing/leave.mjs +68 -0
- package/browser/editor/page/ui.mjs +160 -0
- package/browser/shared/annotations.mjs +569 -0
- package/browser/shared/code-folds.mjs +14 -0
- package/browser/shared/code-languages.mjs +70 -0
- package/browser/shared/code-lines.mjs +30 -0
- package/browser/shared/colors.mjs +30 -0
- package/browser/shared/component-catalog.mjs +573 -0
- package/browser/shared/components/bookmark.mjs +26 -0
- package/browser/shared/components/callout.mjs +9 -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 +396 -0
- package/browser/shared/components/installed.mjs +232 -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 +46 -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/document-look.mjs +178 -0
- package/browser/shared/emoji/custom.mjs +91 -0
- package/browser/shared/emoji/data/LICENSE-lucide.txt +43 -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 +28 -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 +194 -0
- package/browser/shared/emoji/emoji.mjs +38 -0
- package/browser/shared/emoji/glyphs.mjs +134 -0
- package/browser/shared/emoji/icon-value.mjs +91 -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 +59 -0
- package/browser/shared/http.mjs +22 -0
- package/browser/shared/i18n/en.mjs +1223 -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/long-runs.mjs +39 -0
- package/browser/shared/media.mjs +162 -0
- package/browser/shared/new-names.mjs +67 -0
- package/browser/shared/number-reading.mjs +92 -0
- package/browser/shared/old-names.mjs +143 -0
- package/browser/shared/outline.mjs +194 -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 +116 -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 +77 -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-look.mjs +91 -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-342HXE3Q.mjs +2 -0
- package/dist/chunk-3HIRPVLU.mjs +2 -0
- package/dist/chunk-43B75J5T.mjs +2 -0
- package/dist/chunk-4FS7Z7WR.mjs +2 -0
- package/dist/chunk-4K5KC6V2.mjs +2 -0
- package/dist/chunk-5L7RYZCL.mjs +2 -0
- package/dist/chunk-5MHMDLZD.mjs +4 -0
- package/dist/chunk-5ZKJ3H4P.mjs +8 -0
- package/dist/chunk-64K7IPLO.mjs +255 -0
- package/dist/chunk-6QXGZM36.mjs +8 -0
- package/dist/chunk-6RGJOMJP.mjs +16 -0
- package/dist/chunk-742D2WWJ.mjs +19 -0
- package/dist/chunk-7DTINW6U.mjs +48 -0
- package/dist/chunk-A55HN5OK.mjs +2 -0
- package/dist/chunk-AGDILNWB.mjs +2 -0
- package/dist/chunk-AJ73XJF3.mjs +2 -0
- package/dist/chunk-AUZGSZJH.mjs +13 -0
- package/dist/chunk-BFE45AKL.mjs +2 -0
- package/dist/chunk-BGGDRNYQ.mjs +10 -0
- package/dist/chunk-BXO2ZY5P.mjs +2 -0
- package/dist/chunk-C564NU2H.mjs +77 -0
- package/dist/chunk-CEH4MRCC.mjs +2 -0
- package/dist/chunk-CY2FNNAB.mjs +16 -0
- package/dist/chunk-DFUDV4LX.mjs +2 -0
- package/dist/chunk-DKXG4XDG.mjs +2 -0
- package/dist/chunk-E7LWZRXY.mjs +4 -0
- package/dist/chunk-EZQ34M3F.mjs +124 -0
- package/dist/chunk-EZY3WC6Z.mjs +15 -0
- package/dist/chunk-FDLXYYG4.mjs +4 -0
- package/dist/chunk-FUKQNOQS.mjs +9 -0
- package/dist/chunk-GB5SOYQJ.mjs +7 -0
- package/dist/chunk-GRAXKKG4.mjs +2 -0
- package/dist/chunk-HYMEEXKN.mjs +4 -0
- package/dist/chunk-IVDLMMBD.mjs +2 -0
- package/dist/chunk-JPOSLGOC.mjs +6 -0
- package/dist/chunk-JVHHHGEA.mjs +3 -0
- package/dist/chunk-L3QKH4OK.mjs +26 -0
- package/dist/chunk-LAE5NQ4B.mjs +2 -0
- package/dist/chunk-LCTHTZIL.mjs +960 -0
- package/dist/chunk-LEF6DRCK.mjs +59 -0
- package/dist/chunk-LKX55H76.mjs +2 -0
- package/dist/chunk-LS4F7JUM.mjs +2 -0
- package/dist/chunk-MAFIGVXY.mjs +2 -0
- package/dist/chunk-NO5NJCHO.mjs +2 -0
- package/dist/chunk-NQPVAU63.mjs +2 -0
- package/dist/chunk-NSKUTQ5J.mjs +5 -0
- package/dist/chunk-O35FIXRB.mjs +2 -0
- package/dist/chunk-P2CAZPDP.mjs +3 -0
- package/dist/chunk-PL6GHLGD.mjs +15 -0
- package/dist/chunk-QAIHRH3I.mjs +13 -0
- package/dist/chunk-QJIR2BLP.mjs +6 -0
- package/dist/chunk-QR6A54KJ.mjs +3 -0
- package/dist/chunk-QUPLVPB2.mjs +7 -0
- package/dist/chunk-R7BNENLY.mjs +4 -0
- package/dist/chunk-S6O4UHLC.mjs +2 -0
- package/dist/chunk-SGJWQKEI.mjs +2 -0
- package/dist/chunk-SYGN7GLU.mjs +2 -0
- package/dist/chunk-TMYZB6AV.mjs +2 -0
- package/dist/chunk-TX6JH7TR.mjs +2 -0
- package/dist/chunk-TYK6VNAB.mjs +10 -0
- package/dist/chunk-U3SSPL4K.mjs +8 -0
- package/dist/chunk-U6KNPJPR.mjs +2 -0
- package/dist/chunk-UALRNVSE.mjs +4 -0
- package/dist/chunk-UH4SIXTR.mjs +2 -0
- package/dist/chunk-UMHUSOPJ.mjs +2 -0
- package/dist/chunk-V3HXVQEM.mjs +2 -0
- package/dist/chunk-V5JTW2LH.mjs +27 -0
- package/dist/chunk-V5VXUJKG.mjs +2 -0
- package/dist/chunk-V6XZ4VIR.mjs +2 -0
- package/dist/chunk-VBXMADMP.mjs +2 -0
- package/dist/chunk-VNV55RUA.mjs +2 -0
- package/dist/chunk-VPD2PS35.mjs +2 -0
- package/dist/chunk-W3BGBJQW.mjs +2 -0
- package/dist/chunk-W4VKN3GF.mjs +7 -0
- package/dist/chunk-W5BXXPDJ.mjs +3 -0
- package/dist/chunk-W7XHE4CT.mjs +2 -0
- package/dist/chunk-XNROSH2T.mjs +4 -0
- package/dist/chunk-XUNHRCOG.mjs +6 -0
- package/dist/chunk-Y34NR5JL.mjs +2 -0
- package/dist/chunk-Y6RLRPG3.mjs +3 -0
- package/dist/chunk-YEY3RSFQ.mjs +2 -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 +2004 -0
- package/kit/report.css +2932 -0
- package/kit/runtime.js +1782 -0
- package/kit/sheets.js +123 -0
- package/kit/state.js +217 -0
- package/kit/tables.js +1499 -0
- package/kit/tokens.js +29 -0
- package/kit/ui.js +658 -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 +147 -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 +150 -0
- package/skill/agents/openai.yaml +5 -0
- package/skill/references/building-components.md +367 -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 +147 -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-Bh74DfsV.css +1 -0
- package/web/assets/index-UW0RyFFt.js +13 -0
- package/web/index.html +14 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { boxKind, can, isEmpty, isFirstLine, limitText, ownHTML } from "../core.mjs";
|
|
2
|
+
import { editable, select, selectionContext } from "../caret.mjs";
|
|
3
|
+
import { turnTargets, typeOf } from "../convert.mjs";
|
|
4
|
+
import { formulaBoxNode, openFormula } from "../formula/index.mjs";
|
|
5
|
+
import { linkAround, linkBoxNode, openLink } from "../links/index.mjs";
|
|
6
|
+
import { formatRange, markAround, markValue, rangeAt, rangeOffsets } from "../marks.mjs";
|
|
7
|
+
import { pageOfType } from "../page-objects.mjs";
|
|
8
|
+
import { textAnchor } from "../placement.mjs";
|
|
9
|
+
import { ZWSP, spaceAround } from "../../../shared/inline-spacing.mjs";
|
|
10
|
+
import { createFormatBar } from "./bar.mjs";
|
|
11
|
+
import { brushed, currentEffects, describeEffects, effectChanges, noteEffects } from "./brush.mjs";
|
|
12
|
+
import { useColor } from "./colors.mjs";
|
|
13
|
+
import { FROM_SELECTION, isLead, takesFormula } from "../../components/registry.mjs";
|
|
14
|
+
import { t } from "../../../shared/i18n/index.mjs";
|
|
15
|
+
|
|
16
|
+
// Inline formatting (docs/editor.md, "Inline formatting"): the bar over selected text (bar.mjs:
|
|
17
|
+
// the format brush, the colors, bold, underline, clearing the format, inline code, a formula, and
|
|
18
|
+
// under "更多" a link, strikethrough, italic, a detail card and 批注; and the block's type to turn it
|
|
19
|
+
// into another) shows once the mouse is released over a selection inside one block that takes marks,
|
|
20
|
+
// and the keys (FORMAT_KEYS, SHIFT_KEYS). Bold, italic, strikethrough, underline (Ctrl+U: red, 2px)
|
|
21
|
+
// and inline code toggle; a color, or an underline's color or weight, picked in a panel sets a kit
|
|
22
|
+
// class; clearing takes all of them off (links stay). Each change goes through marks.mjs
|
|
23
|
+
// formatRange as one undo step that brings its selection back, and is remembered by the format
|
|
24
|
+
// brush (brush.mjs), which its button (and Ctrl+Shift+H) puts on other text. The link item opens
|
|
25
|
+
// the link box (links/), the formula button the formula box (formula/); the card item makes the
|
|
26
|
+
// selected text the entry of a new detail card (components/dialog/page.mjs); turning the block goes
|
|
27
|
+
// through the editor's conversion (convert.mjs, one undo step).
|
|
28
|
+
// Text selected across blocks (text-select/: body text, headings, list items) has the bar too, once
|
|
29
|
+
// the press ends: a format goes on each block's piece of it (a toggle on unless every piece has it),
|
|
30
|
+
// one undo step, the selection drawn again over it. Its blocks' types are there too when it holds
|
|
31
|
+
// nothing but text (notion-lite's: "多个类型" for a mix), turned together (editor.mjs convertAll, one
|
|
32
|
+
// undo step) and the selection drawn again over their text where it is then. The link, the formula
|
|
33
|
+
// and the card are not for several blocks, their buttons off.
|
|
34
|
+
|
|
35
|
+
/** Ctrl (⌘) + these keys format the selected text. */
|
|
36
|
+
export const FORMAT_KEYS = { b: "bold", i: "italic", u: "underline", e: "code" };
|
|
37
|
+
/** Ctrl (⌘) + Alt + \ clears the format (Notion's; Ctrl+\ alone is the workbench's sidebar). */
|
|
38
|
+
const CLEAR_KEY = "\\";
|
|
39
|
+
/** Ctrl (⌘) + Shift + these keys. */
|
|
40
|
+
const SHIFT_KEYS = { s: "strike", x: "strike", e: "formula", h: "brush" };
|
|
41
|
+
|
|
42
|
+
// The formats a caret with nothing selected keeps for the next text typed there (notion-lite's pending
|
|
43
|
+
// annotations): the toggles, by what they are called in the status line. A flowchart node's empty
|
|
44
|
+
// first line keeps bold so by itself (armed: its title is bold by default, <p><strong>…</strong></p>,
|
|
45
|
+
// the <strong> real markup the reader may take off): a new node, one emptied, one a conversion made.
|
|
46
|
+
const CARRIED = { bold: t("加粗"), italic: t("斜体"), underline: t("下划线"), strike: t("删除线"), code: t("行内代码") };
|
|
47
|
+
|
|
48
|
+
// What "清除格式" takes off: every mark the bar sets but links.
|
|
49
|
+
const CLEAR = [["bold", false], ["italic", false], ["underline", false], ["strike", false], ["code", false], ["text", null], ["highlight", null]];
|
|
50
|
+
// The format a change touches, as the brush remembers it (inline code it does not).
|
|
51
|
+
const FACET = { bold: "bold", italic: "italic", strike: "strike", text: "text", highlight: "highlight", underline: "underline", underlineColor: "underline", underlineWeight: "underline" };
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* active(): whether the bar may show (editing, no input method composing). say: the status line.
|
|
55
|
+
* recordStep(host, before, selection): a change of a block's text as its own undo step
|
|
56
|
+
* (history.mjs).
|
|
57
|
+
* convert(host, type): turn a text block into another type (editor.mjs convertHost).
|
|
58
|
+
* struct(parents, touched, mutate): the editor's undoable change of several blocks (history.mjs).
|
|
59
|
+
* cross: the selection across blocks (text-select/): texts() its pieces ({ host, range }) or null,
|
|
60
|
+
* wholes() the blocks it takes whole, redraw(texts) once they are formatted, reselect(texts) once
|
|
61
|
+
* they are turned (false when it let go). turnIntoAll(hosts): what text blocks can be turned into
|
|
62
|
+
* together ({ types, current, first }, convert.mjs groupTargets), convertAll(hosts, type) turns
|
|
63
|
+
* them (editor.mjs: its outcome, `hosts` where each one's text is now, or null); selectBlocks(units).
|
|
64
|
+
* annotates(): whether the selection now can be annotated (annotate/: "更多" shows its 批注);
|
|
65
|
+
* annotate() does it.
|
|
66
|
+
*/
|
|
67
|
+
export function createFormatting({ active, say, recordStep, struct, convert, cross, turnIntoAll = () => null, convertAll = () => null, selectBlocks = () => {}, annotates = () => false, annotate = () => {} }) {
|
|
68
|
+
let pointerHeld = false; // the bar waits until the mouse is released
|
|
69
|
+
let pressKept = false; // the press is a component's: released, it brings no bar back
|
|
70
|
+
let pending = false;
|
|
71
|
+
let carry = null; // { host, at, marks: Map(name -> on), armed? }: the formats the next text typed at the caret `at` (visible characters into the block) takes
|
|
72
|
+
let declined = null; // the empty first line whose armed bold the reader let go (Ctrl+B, the bar): not armed again until the caret leaves it or something is typed
|
|
73
|
+
let shownFor = null; // the selection the bar shows for ({ host, at }): its panels go when it moves on
|
|
74
|
+
|
|
75
|
+
// changes: [[name, value]], applied in order as one undo step. value undefined toggles
|
|
76
|
+
// bold/italic/underline/strike/code; true or false sets it; a color name or null sets (or
|
|
77
|
+
// removes) text color or highlight. What it leaves on the text is remembered by the brush, unless
|
|
78
|
+
// it is the brush being put on (`brushing`). Returns whether it applied.
|
|
79
|
+
function format(changes, brushing = false) {
|
|
80
|
+
const context = selectionContext();
|
|
81
|
+
const pieces = context ? null : crossPieces();
|
|
82
|
+
if (pieces) return formatPieces(pieces, changes);
|
|
83
|
+
if (!context) return void carryFormat(changes);
|
|
84
|
+
const { host } = context;
|
|
85
|
+
let { range } = context;
|
|
86
|
+
if (can(host, "plain")) return void say(limitText(host, "format"));
|
|
87
|
+
if (changes.some(([name, value]) => name === "code" && value !== false) && range.cloneContents().querySelector("[data-ge-atom]")) return void say(t("公式和带图标的链接不能放进行内代码。"));
|
|
88
|
+
const before = ownHTML(host);
|
|
89
|
+
for (const [name, value] of changes) {
|
|
90
|
+
range = formatRange(host, range, name, value === undefined ? markValue(host, range, name) !== true : value);
|
|
91
|
+
}
|
|
92
|
+
// Text made inline code stands a space apart from the words beside it (shared/inline-spacing.mjs spaceAround).
|
|
93
|
+
if (changes.some(([name]) => name === "code") && markValue(host, range, "code") === true) {
|
|
94
|
+
[...host.querySelectorAll("code")].filter((code) => range.intersectsNode(code)).forEach(spaceAround);
|
|
95
|
+
}
|
|
96
|
+
select(range);
|
|
97
|
+
const offsets = rangeOffsets(host, range);
|
|
98
|
+
if (ownHTML(host) !== before) recordStep(host, before, offsets);
|
|
99
|
+
const at = { start: offsets[0], end: offsets[1] };
|
|
100
|
+
if (brushing) brushed(host, at);
|
|
101
|
+
else {
|
|
102
|
+
const touched = {};
|
|
103
|
+
for (const facet of new Set(changes.map(([name]) => FACET[name]).filter(Boolean))) touched[facet] = facetOn(host, range, facet);
|
|
104
|
+
if (Object.keys(touched).length > 0) noteEffects(host, at, touched);
|
|
105
|
+
}
|
|
106
|
+
schedule();
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// The pieces of the selection across blocks that take marks (not a plain block's, not an empty
|
|
111
|
+
// one at a block's end), or null.
|
|
112
|
+
function crossPieces() {
|
|
113
|
+
const pieces = cross.texts()?.filter(({ host, range }) => !range.collapsed && !can(host, "plain"));
|
|
114
|
+
return pieces?.length > 0 ? pieces : null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// `changes` on each piece of the selection across blocks, one undo step (a toggle on unless every
|
|
118
|
+
// piece has it), the selection drawn again over them. The brush remembers the first piece's.
|
|
119
|
+
function formatPieces(pieces, changes) {
|
|
120
|
+
if (changes.some(([name, value]) => name === "code" && value !== false) && pieces.some(({ range }) => range.cloneContents().querySelector("[data-ge-atom]"))) return void say(t("公式和带图标的链接不能放进行内代码。"));
|
|
121
|
+
const values = changes.map(([name, value]) => [name, value === undefined ? !pieces.every(({ host, range }) => markValue(host, range, name) === true) : value]);
|
|
122
|
+
const hosts = pieces.map(({ host }) => host);
|
|
123
|
+
let done = pieces;
|
|
124
|
+
const result = struct([], hosts, () => {
|
|
125
|
+
done = pieces.map(({ host, range }) => {
|
|
126
|
+
for (const [name, value] of values) range = formatRange(host, range, name, value);
|
|
127
|
+
if (values.some(([name, value]) => name === "code" && value)) [...host.querySelectorAll("code")].filter((code) => range.intersectsNode(code)).forEach(spaceAround);
|
|
128
|
+
return { host, range };
|
|
129
|
+
});
|
|
130
|
+
return { touched: hosts, focus: null };
|
|
131
|
+
});
|
|
132
|
+
if (!result) return false;
|
|
133
|
+
cross.redraw(done);
|
|
134
|
+
const [{ host, range }] = done;
|
|
135
|
+
const [start, end] = rangeOffsets(host, range);
|
|
136
|
+
const touched = {};
|
|
137
|
+
for (const facet of new Set(changes.map(([name]) => FACET[name]).filter(Boolean))) touched[facet] = facetOn(host, range, facet);
|
|
138
|
+
if (Object.keys(touched).length > 0) noteEffects(host, { start, end }, touched);
|
|
139
|
+
schedule();
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// The visible characters (no pads) between the block's start and a point.
|
|
144
|
+
function charsBefore(host, node, offset) {
|
|
145
|
+
const before = document.createRange();
|
|
146
|
+
before.setStart(host, 0);
|
|
147
|
+
before.setEnd(node, offset);
|
|
148
|
+
return before.toString().replaceAll(ZWSP, "").length;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// With nothing selected a toggle (bold, italic, underline, strikethrough, code) is kept for the next
|
|
152
|
+
// text typed at the caret, as notion-lite's does (432331): pressed again it is let go; the caret
|
|
153
|
+
// moving elsewhere forgets it (moved); the text typed takes it (typed).
|
|
154
|
+
function carryFormat(changes) {
|
|
155
|
+
const selection = getSelection();
|
|
156
|
+
const host = selection.rangeCount && selection.isCollapsed ? editable(selection.anchorNode) : null;
|
|
157
|
+
const [[name, value] = []] = changes;
|
|
158
|
+
if (!host || changes.length !== 1 || value !== undefined || !CARRIED[name]) return void say(t("先选中要设置格式的文字。"));
|
|
159
|
+
if (can(host, "plain")) return void say(limitText(host, "format"));
|
|
160
|
+
const at = charsBefore(host, selection.anchorNode, selection.anchorOffset);
|
|
161
|
+
const armed = Boolean(carry?.armed && carry.host === host);
|
|
162
|
+
if (carry?.host !== host || carry.at !== at) carry = { host, at, marks: new Map() };
|
|
163
|
+
const now = carry.marks.get(name) ?? markAround(host, selection.anchorNode, name);
|
|
164
|
+
if (now === markAround(host, selection.anchorNode, name)) carry.marks.set(name, !now);
|
|
165
|
+
else carry.marks.delete(name);
|
|
166
|
+
const asked = [...carry.marks].map(([each, on]) => (on ? CARRIED[each] : t("不{0}", CARRIED[each])));
|
|
167
|
+
if (asked.length === 0) {
|
|
168
|
+
carry = null;
|
|
169
|
+
if (armed) declined = host; // the title's bold let go: it stays so while the caret is here
|
|
170
|
+
}
|
|
171
|
+
say(asked.length > 0 ? t("接着打的字:{0} · 再按一次取消", asked.join("、")) : t("接着打的字照旧"));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// The text just typed (`data`, the caret right after it): it takes the formats the caret kept, and
|
|
175
|
+
// the caret goes on after it. Whatever was typed, the caret's memory is spent.
|
|
176
|
+
function typed(host, data) {
|
|
177
|
+
const asked = carry;
|
|
178
|
+
carry = null;
|
|
179
|
+
declined = null; // bold let go in an empty title holds for what is typed next only: emptied again, it is armed again
|
|
180
|
+
const selection = getSelection();
|
|
181
|
+
const node = selection.anchorNode;
|
|
182
|
+
if (!asked || asked.host !== host || !data || !selection.rangeCount || !selection.isCollapsed || node?.nodeType !== 3 || !host.contains(node)) return;
|
|
183
|
+
const start = selection.anchorOffset - data.length;
|
|
184
|
+
if (start < 0 || node.data.slice(start, selection.anchorOffset) !== data || charsBefore(host, node, start) !== asked.at) return;
|
|
185
|
+
let range = document.createRange();
|
|
186
|
+
range.setStart(node, start);
|
|
187
|
+
range.setEnd(node, selection.anchorOffset);
|
|
188
|
+
for (const [name, on] of asked.marks) range = formatRange(host, range, name, on);
|
|
189
|
+
if (asked.marks.get("code")) [...host.querySelectorAll("code")].filter((code) => range.intersectsNode(code)).forEach(spaceAround);
|
|
190
|
+
range.collapse(false);
|
|
191
|
+
select(range);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// The caret moved off the place that kept a format (an input method composing may move it freely);
|
|
195
|
+
// in a flowchart node's empty first line, bold is armed (arm).
|
|
196
|
+
function moved() {
|
|
197
|
+
if (carry) {
|
|
198
|
+
const selection = getSelection();
|
|
199
|
+
const node = selection.anchorNode;
|
|
200
|
+
if (!selection.rangeCount || !selection.isCollapsed || editable(node) !== carry.host || charsBefore(carry.host, node, selection.anchorOffset) !== carry.at) carry = null;
|
|
201
|
+
else if (carry.armed && !armable(carry.host)) carry = null; // no title of a node any more (moved out, written in)
|
|
202
|
+
}
|
|
203
|
+
arm();
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// A flowchart node's empty first line, which takes marks: what is typed there is bold (core.mjs firstLineOf).
|
|
207
|
+
const armable = (host) => isFirstLine(host) && isEmpty(host) && !can(host, "plain");
|
|
208
|
+
|
|
209
|
+
// Bold armed at a caret in a node's empty first line, as Ctrl+B with nothing selected arms it (the
|
|
210
|
+
// reader's Ctrl+B there lets it go, `declined`, until the caret leaves the line or something is typed).
|
|
211
|
+
function arm() {
|
|
212
|
+
const selection = getSelection();
|
|
213
|
+
const host = selection.rangeCount && selection.isCollapsed ? editable(selection.anchorNode) : null;
|
|
214
|
+
if (declined && declined !== host) declined = null;
|
|
215
|
+
if (carry || !host || host === declined || !armable(host)) return;
|
|
216
|
+
carry = { host, at: 0, marks: new Map([["bold", true]]), armed: true };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// A format as the selected text has it now: true, a color, an underline's { color, weight }, or
|
|
220
|
+
// false / null when it is not on all of it.
|
|
221
|
+
function facetOn(host, range, facet) {
|
|
222
|
+
if (facet === "text" || facet === "highlight") return markValue(host, range, facet);
|
|
223
|
+
if (facet !== "underline") return markValue(host, range, facet) === true;
|
|
224
|
+
if (markValue(host, range, "underline") !== true) return false;
|
|
225
|
+
return { color: markValue(host, range, "underlineColor") ?? "default", weight: markValue(host, range, "underlineWeight") ?? "default" };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
// A button of the bar, or a key.
|
|
230
|
+
function run(command, value) {
|
|
231
|
+
const context = selectionContext();
|
|
232
|
+
const makes = FROM_SELECTION.some(({ type }) => type === command);
|
|
233
|
+
if (!context && crossPieces() && (makes || ["link", "formula"].includes(command))) return say(t("选中的文字跨了几块:链接、公式和详情卡片只能加在一块里的文字上。"));
|
|
234
|
+
if (command === "link") return context ? openLink(context.host) : say(t("先选中要加链接的文字。"));
|
|
235
|
+
if (command === "formula") return context ? openFormula(context.host) : say(t("先选中要变成公式的文字。"));
|
|
236
|
+
if (makes) return pageOfType(command).fromSelection(); // a block made from the selected text
|
|
237
|
+
if (command === "annotate") return annotate();
|
|
238
|
+
if (command === "turn") {
|
|
239
|
+
if (!context) return turnAcross(value);
|
|
240
|
+
bar.hide();
|
|
241
|
+
return convert(context.host, value);
|
|
242
|
+
}
|
|
243
|
+
if (command === "clear") return format(CLEAR);
|
|
244
|
+
if (command === "text" || command === "highlight") {
|
|
245
|
+
useColor(command, value);
|
|
246
|
+
return format([[command, value]]);
|
|
247
|
+
}
|
|
248
|
+
// The format brush (and Ctrl+Shift+H): the formats it remembers on the selected text.
|
|
249
|
+
if (command === "brush") {
|
|
250
|
+
const effects = currentEffects();
|
|
251
|
+
if (Object.keys(effects).length === 0) return say(t("还没有可应用的格式:先给一段文字设置格式,再选中别的文字点它。"));
|
|
252
|
+
if (format(effectChanges(effects), true)) say(t("已应用{0} · Ctrl+Z 撤销", describeEffects(effects)));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
format([[command, value]]);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const bar = createFormatBar(run);
|
|
259
|
+
|
|
260
|
+
// The bar follows the selection, once what changed it is done.
|
|
261
|
+
function schedule() {
|
|
262
|
+
if (pending) return;
|
|
263
|
+
pending = true;
|
|
264
|
+
setTimeout(() => {
|
|
265
|
+
pending = false;
|
|
266
|
+
update();
|
|
267
|
+
}, 0);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// The panels go when the selection the bar shows for moves on.
|
|
271
|
+
function showingFor(host, at) {
|
|
272
|
+
if (shownFor && (shownFor.host !== host || shownFor.at !== at)) bar.closeSub();
|
|
273
|
+
shownFor = { host, at };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function update() {
|
|
277
|
+
const free = active() && !pointerHeld && !linkBoxNode() && !formulaBoxNode();
|
|
278
|
+
const context = free ? selectionContext() : null;
|
|
279
|
+
const pieces = free && !context ? crossPieces() : null;
|
|
280
|
+
if (pieces) return showAcross(pieces);
|
|
281
|
+
if (!context || can(context.host, "plain") || context.host.hasAttribute("data-ge-part")) return bar.hide();
|
|
282
|
+
const { host, range } = context;
|
|
283
|
+
showingFor(host, rangeOffsets(host, range).join());
|
|
284
|
+
const types = turnTargets(host);
|
|
285
|
+
const mark = (name) => markValue(host, range, name);
|
|
286
|
+
const code = mark("code") === true;
|
|
287
|
+
bar.show(textAnchor(range), {
|
|
288
|
+
bold: mark("bold") === true,
|
|
289
|
+
italic: mark("italic") === true,
|
|
290
|
+
underline: mark("underline") === true,
|
|
291
|
+
strike: mark("strike") === true,
|
|
292
|
+
code,
|
|
293
|
+
text: mark("text"),
|
|
294
|
+
highlight: mark("highlight"),
|
|
295
|
+
underlineColor: mark("underlineColor"), // "default" (the red), a color, or null (not one throughout)
|
|
296
|
+
underlineWeight: mark("underlineWeight"),
|
|
297
|
+
link: Boolean(linkAround(host, range)),
|
|
298
|
+
links: can(host, "links"),
|
|
299
|
+
fromSelection: can(host, "links") && Boolean(document.querySelector("main[data-ge-box]")),
|
|
300
|
+
formula: !code && takesFormula(host), // over a formula: edits it
|
|
301
|
+
annotates: annotates(),
|
|
302
|
+
block: types.length > 0 ? { current: typeOf(host), types } : null,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// The text blocks of the selection across blocks, when it holds nothing but text (no block taken
|
|
307
|
+
// whole: notion-lite turns a selection whose every piece is a block's text; a highlight block's
|
|
308
|
+
// icon it goes over, its box's lead, is no block of the body), and what they can be turned into
|
|
309
|
+
// together ({ hosts, types, current, first }), or null. A block it only touches at its start
|
|
310
|
+
// (nothing of it selected) is not among them; an empty one it goes over is.
|
|
311
|
+
function crossTurn() {
|
|
312
|
+
const pieces = cross.texts();
|
|
313
|
+
const lead = (unit) => isLead(boxKind(unit.parentElement), unit.getAttribute("data-ge-unit-kind"));
|
|
314
|
+
if (!pieces || (cross.wholes?.() ?? []).some((unit) => !lead(unit))) return null;
|
|
315
|
+
const hosts = [...new Set(pieces.filter(({ host, range }) => !range.collapsed || isEmpty(host)).map(({ host }) => host))];
|
|
316
|
+
const turn = hosts.length > 0 ? turnIntoAll(hosts) : null;
|
|
317
|
+
return turn && { ...turn, hosts };
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// The blocks of the selection across blocks turned into `type` together (one undo step), the
|
|
321
|
+
// selection drawn again over their text where it is now (notion-lite's placeCaret(keep)); blocks
|
|
322
|
+
// that hold no text of the body then (a disclosure, code) are selected instead.
|
|
323
|
+
function turnAcross(type) {
|
|
324
|
+
const turn = crossTurn();
|
|
325
|
+
if (!turn) return;
|
|
326
|
+
const pieces = cross.texts().map(({ host, range }) => ({ host, offsets: rangeOffsets(host, range) }));
|
|
327
|
+
const outcome = convertAll(turn.hosts, type);
|
|
328
|
+
if (!outcome) return;
|
|
329
|
+
const texts = pieces.map(({ host, offsets }) => {
|
|
330
|
+
const now = outcome.hosts.get(host) ?? host;
|
|
331
|
+
return now?.isConnected ? { host: now, range: rangeAt(now, offsets) } : null;
|
|
332
|
+
}).filter(Boolean);
|
|
333
|
+
if (!cross.reselect(texts)) selectBlocks(outcome.units);
|
|
334
|
+
schedule();
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// The bar for text selected across blocks: what every piece has on (a color the same in all of
|
|
338
|
+
// them), by the end of its last piece, and the types its blocks can be turned into together; no
|
|
339
|
+
// link, formula or card.
|
|
340
|
+
function showAcross(pieces) {
|
|
341
|
+
showingFor(pieces[0].host, pieces.map(({ host, range }) => rangeOffsets(host, range).join()).join("|"));
|
|
342
|
+
const all = (name) => pieces.every(({ host, range }) => markValue(host, range, name) === true);
|
|
343
|
+
const same = (name) => {
|
|
344
|
+
const values = pieces.map(({ host, range }) => markValue(host, range, name));
|
|
345
|
+
return values.every((value) => value === values[0]) ? values[0] : null;
|
|
346
|
+
};
|
|
347
|
+
const whole = document.createRange();
|
|
348
|
+
whole.setStart(pieces[0].range.startContainer, pieces[0].range.startOffset);
|
|
349
|
+
whole.setEnd(pieces.at(-1).range.endContainer, pieces.at(-1).range.endOffset);
|
|
350
|
+
const underline = all("underline");
|
|
351
|
+
const turn = crossTurn();
|
|
352
|
+
bar.show(textAnchor(whole), {
|
|
353
|
+
bold: all("bold"), italic: all("italic"), underline, strike: all("strike"), code: all("code"),
|
|
354
|
+
text: same("text"), highlight: same("highlight"),
|
|
355
|
+
underlineColor: underline ? same("underlineColor") : null, underlineWeight: underline ? same("underlineWeight") : null,
|
|
356
|
+
link: false, links: false, fromSelection: false, formula: false, annotates: annotates(), block: turn && { current: turn.current, types: turn.types, first: turn.first },
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return {
|
|
361
|
+
format,
|
|
362
|
+
typed,
|
|
363
|
+
moved,
|
|
364
|
+
/** Whether bold is armed at the caret (a flowchart node's empty first line), for the tests. */
|
|
365
|
+
get armed() { return Boolean(carry?.armed && carry.marks.get("bold")); },
|
|
366
|
+
schedule,
|
|
367
|
+
hide: () => bar.hide(),
|
|
368
|
+
/** Keys in text: Esc closes the bar's panel, else the bar; the format keys. Returns true when handled. */
|
|
369
|
+
key(event) {
|
|
370
|
+
const ctrl = event.ctrlKey || event.metaKey;
|
|
371
|
+
const mod = ctrl && !event.altKey;
|
|
372
|
+
const key = event.key.toLowerCase();
|
|
373
|
+
const name = ctrl && event.altKey && !event.shiftKey && key === CLEAR_KEY ? "clear" : !mod ? null : event.shiftKey ? SHIFT_KEYS[key] : FORMAT_KEYS[key];
|
|
374
|
+
if (event.key === "Escape" && bar.visible) {
|
|
375
|
+
event.preventDefault();
|
|
376
|
+
if (!bar.closeSub()) bar.hide();
|
|
377
|
+
} else if (name) {
|
|
378
|
+
event.preventDefault();
|
|
379
|
+
run(name);
|
|
380
|
+
} else return false;
|
|
381
|
+
return true;
|
|
382
|
+
},
|
|
383
|
+
/**
|
|
384
|
+
* A press on the page (`main`: the main button): the bar hides until it is released. One a component
|
|
385
|
+
* keeps (`kept`: on its button, on what it draws) is none the editor answers: released, it brings no
|
|
386
|
+
* bar back over words selected before it, which the press did not move.
|
|
387
|
+
*/
|
|
388
|
+
pressed(main, kept = false) {
|
|
389
|
+
pointerHeld = main;
|
|
390
|
+
pressKept = kept;
|
|
391
|
+
bar.hide();
|
|
392
|
+
},
|
|
393
|
+
/** The press ended. */
|
|
394
|
+
released() {
|
|
395
|
+
pointerHeld = false;
|
|
396
|
+
if (!pressKept) schedule();
|
|
397
|
+
pressKept = false;
|
|
398
|
+
},
|
|
399
|
+
/** Whether a node is part of the bar. */
|
|
400
|
+
holds: (node) => bar.holds(node),
|
|
401
|
+
get visible() { return bar.visible; },
|
|
402
|
+
get node() { return bar.node; },
|
|
403
|
+
};
|
|
404
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { can, formulaParts, limitText, newFormula, ownHTML, setOwnHTML } from "../core.mjs";
|
|
2
|
+
import { editable, select } from "../caret.mjs";
|
|
3
|
+
import { chipBox, fillEdited } from "../chip-fills.mjs";
|
|
4
|
+
import { rangeOffsets } from "../marks.mjs";
|
|
5
|
+
import { spaceAround } from "../../../shared/inline-spacing.mjs";
|
|
6
|
+
import { addStyle, element, loadScript } from "../ui.mjs";
|
|
7
|
+
import { chipHtml, markEmpty } from "../../components/placeholder.mjs";
|
|
8
|
+
import { takesFormula } from "../../components/registry.mjs";
|
|
9
|
+
import { renderTex } from "../tex.mjs";
|
|
10
|
+
import { formulaSays, openFormulaPanel } from "./panel.mjs";
|
|
11
|
+
import { t } from "../../../shared/i18n/index.mjs";
|
|
12
|
+
|
|
13
|
+
// Inline formulas (docs/editor.md, "Inline formatting"), as Notion's: the format bar's √x button
|
|
14
|
+
// or Ctrl+Shift+E turns the selected text into a formula at once (its TeX: the text, without the
|
|
15
|
+
// $…$ or \( \) around it), and a click on a formula edits it; either way the formula box opens
|
|
16
|
+
// below the formula, a field holding its TeX, the formula in the text following what is typed
|
|
17
|
+
// (tinted while it is edited; "√x 新公式" when empty, "√x 无效的公式" with KaTeX's reason below the
|
|
18
|
+
// field when it cannot be read; the editor and its symbol bar: panel.mjs). However the box is left
|
|
19
|
+
// (Ctrl+Enter, Enter with all of the field selected, Enter itself being a new line, Esc, a press
|
|
20
|
+
// elsewhere, Ctrl+S, the page left) what is in it is kept as one undo step, the caret after it. TeX
|
|
21
|
+
// that does not read stays a formula of the file, as typed, for it may be a stage on the way: a gray "√x 无效的公式" on the page,
|
|
22
|
+
// which a click opens with its words, a reader having KaTeX's error. A formula left empty stays, as an
|
|
23
|
+
// empty block does: the "/" menu's 公式 given nothing, or a formula emptied, is \(\) in the file, a gray
|
|
24
|
+
// "√x 新公式" on the page (core.mjs data-ge-empty, components/placeholder.mjs), a whole as a character
|
|
25
|
+
// is, shown to no reader; a click on it edits it. The formula is a chip like the report's own (core.mjs
|
|
26
|
+
// newFormula), written as the kit's .doc-math-inline, a formula of the file keeping its own tags. Nothing
|
|
27
|
+
// is committed while the box is open (the editor's autosave waits: formulaBoxNode). The page's KaTeX
|
|
28
|
+
// (the kit's) renders it; a report without formulas is served without KaTeX, so the box loads it the
|
|
29
|
+
// first time. connectFormula() gives the box what it needs from the editor.
|
|
30
|
+
|
|
31
|
+
const STYLE = `
|
|
32
|
+
/* The formula being edited, in the text: all of it (chip-fills.mjs). */
|
|
33
|
+
[data-ge-editing] [data-ge-formula-edit=""] { cursor: pointer; }
|
|
34
|
+
[data-ge-editing] [data-ge-formula-edit=""] .katex { background: var(--ge-fill); }
|
|
35
|
+
/* Empty, or not read: a chip, served with the page (components/placeholder.mjs). */
|
|
36
|
+
[data-ge-editing] .doc-math-inline[data-ge-atom] { cursor: pointer; }
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
// A formula of the text (a chip of the page: core.mjs; not a link shown with its icon, links/).
|
|
40
|
+
const FORMULA = ".doc-math-inline[data-ge-atom]";
|
|
41
|
+
|
|
42
|
+
let use = null; // { say, recordStep, active }
|
|
43
|
+
let box = null; // { panel, host, chip, parts, before, original }
|
|
44
|
+
|
|
45
|
+
export function connectFormula(editor) {
|
|
46
|
+
use = editor;
|
|
47
|
+
addStyle(STYLE);
|
|
48
|
+
// A click on a formula in the text edits it (a press there puts no caret anywhere).
|
|
49
|
+
const formulaAt = (target) => {
|
|
50
|
+
const chip = use.active() ? target?.closest?.(FORMULA) : null;
|
|
51
|
+
const host = chip && editable(chip.parentElement);
|
|
52
|
+
return host && !can(host, "plain") && takesFormula(host) && main(chip) ? chip : null;
|
|
53
|
+
};
|
|
54
|
+
document.addEventListener("mousedown", (event) => {
|
|
55
|
+
if (event.button === 0 && !event.shiftKey && formulaAt(event.target)) event.preventDefault();
|
|
56
|
+
}, true);
|
|
57
|
+
document.addEventListener("click", (event) => {
|
|
58
|
+
const chip = event.shiftKey ? null : formulaAt(event.target);
|
|
59
|
+
if (!chip || chip.hasAttribute("data-ge-formula-edit")) return;
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
editFormula(chip);
|
|
62
|
+
}, true);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const main = (node) => Boolean(node.closest("main"));
|
|
66
|
+
const katex = () => globalThis.katex ?? null;
|
|
67
|
+
// The dev server's KaTeX (src/render/assets.mjs), for a page served without it, and KaTeX's mhchem
|
|
68
|
+
// (\ce, \pu: the symbol bar's 化学), which the kit's math.js bundles, for a page served without that.
|
|
69
|
+
const KATEX = { script: "/vendor/katex/katex.min.js", style: "/vendor/katex/katex.min.css", chemistry: "/__gallery/edit/mhchem.js" };
|
|
70
|
+
|
|
71
|
+
// Whether the page's KaTeX reads \ce (mhchem's).
|
|
72
|
+
const readsChemistry = () => {
|
|
73
|
+
try {
|
|
74
|
+
katex().renderToString("\\ce{H}", { throwOnError: true });
|
|
75
|
+
return true;
|
|
76
|
+
} catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// mhchem on the page's KaTeX (once it is there): true once it reads \ce, false when it cannot be had.
|
|
82
|
+
const loadChemistry = () => loadScript(KATEX.chemistry, readsChemistry);
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Inline formulas pasted as the page's own: (tex) => a formula chip drawn by KaTeX (null when its TeX
|
|
86
|
+
* does not render), or null while KaTeX is not on the page (loadKatex). The clipboard's (blocks,
|
|
87
|
+
* text) and a table's cells' (table/cells.mjs) pastes.
|
|
88
|
+
*/
|
|
89
|
+
export function formulaMaker() {
|
|
90
|
+
if (!globalThis.katex) return null;
|
|
91
|
+
return (tex) => {
|
|
92
|
+
const { html, error } = renderTex(tex);
|
|
93
|
+
return error ? null : newFormula(document, tex, html);
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// KaTeX on the page, with mhchem: true once it is there, false when it cannot be loaded (formulas pasted too: clipboard/).
|
|
98
|
+
export async function loadKatex() {
|
|
99
|
+
if (!(await loadMath())) return false;
|
|
100
|
+
await loadChemistry();
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const loadMath = () => loadScript(KATEX.script, katex, {
|
|
105
|
+
before: () => {
|
|
106
|
+
if (!document.querySelector('link[data-doc-vendor="katex-styles"]')) document.head.append(element("link", { rel: "stylesheet", href: KATEX.style, "data-doc-dev": "" }));
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// The selected text as TeX: \( \) or up to two layers of $…$ around it are the formula's delimiters.
|
|
111
|
+
function texOf(text) {
|
|
112
|
+
let tex = text.trim();
|
|
113
|
+
const wrapped = tex.match(/^\\\(([\s\S]*)\\\)$/);
|
|
114
|
+
if (wrapped) return wrapped[1].trim();
|
|
115
|
+
for (let layer = 0; layer < 2 && tex.length > 1 && tex.startsWith("$") && tex.endsWith("$"); layer++) tex = tex.slice(1, -1).trim();
|
|
116
|
+
return tex;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Inline elements a replaced selection left empty go (a formula chip and its insides stay).
|
|
120
|
+
function dropEmpty(host) {
|
|
121
|
+
for (const node of [...host.querySelectorAll("strong, em, u, s, code, a, sup, sub, span")].reverse()) {
|
|
122
|
+
if (node.closest("[data-ge-atom]") || node.hasAttribute("data-ge-atom")) continue;
|
|
123
|
+
if (!node.textContent && !node.querySelector("br, [data-ge-atom]")) node.remove();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// The formula in the text follows the field: rendered, or a chip: √x 新公式 (an empty one's) or
|
|
128
|
+
// √x 无效的公式 (components/placeholder.mjs).
|
|
129
|
+
function refresh(value) {
|
|
130
|
+
const tex = value.trim();
|
|
131
|
+
const { html, error } = tex ? renderTex(tex) : {};
|
|
132
|
+
if (!tex) markEmpty(box.chip, "formula");
|
|
133
|
+
else {
|
|
134
|
+
box.chip.removeAttribute("data-ge-empty");
|
|
135
|
+
box.chip.innerHTML = error ? chipHtml("invalid") : html;
|
|
136
|
+
}
|
|
137
|
+
box.chip.setAttribute("data-ge-formula-edit", !tex ? "empty" : error ? "invalid" : "");
|
|
138
|
+
fillEdited(box.chip);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// The caret right after `node`.
|
|
142
|
+
function caretAfter(host, node) {
|
|
143
|
+
const after = document.createRange();
|
|
144
|
+
after.setStartAfter(node);
|
|
145
|
+
after.collapse(true);
|
|
146
|
+
host.focus({ preventScroll: true });
|
|
147
|
+
select(after);
|
|
148
|
+
return after;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** The box left from outside it (a press elsewhere, the page saved or left): what is in it is kept. */
|
|
152
|
+
export function dismissFormula() {
|
|
153
|
+
if (box) submit(box.panel.value);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Keep the formula as one undo step, the caret after it.
|
|
157
|
+
function submit(value) {
|
|
158
|
+
const tex = value.trim();
|
|
159
|
+
const { html, error } = tex ? renderTex(tex) : {};
|
|
160
|
+
const { panel, host, chip, parts, before, original } = box;
|
|
161
|
+
panel.close();
|
|
162
|
+
box = null;
|
|
163
|
+
fillEdited(null);
|
|
164
|
+
if (!host.isConnected) return;
|
|
165
|
+
if (tex === original) { // a formula of the text, unchanged
|
|
166
|
+
setOwnHTML(host, before);
|
|
167
|
+
const same = [...host.querySelectorAll("[data-ge-atom]")].find((each) => each.getAttribute("data-ge-atom") === chip.getAttribute("data-ge-atom"));
|
|
168
|
+
if (same) caretAfter(host, same);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// A formula stands a space apart from the words beside it (shared/inline-spacing.mjs spaceAround), the caret going
|
|
172
|
+
// on after it, past the space put there; one left empty (\(\), its gray chip) stands as it is.
|
|
173
|
+
const formula = newFormula(document, tex, html, parts);
|
|
174
|
+
if (error) markEmpty(formula, "invalid");
|
|
175
|
+
chip.replaceWith(formula);
|
|
176
|
+
const { after } = tex ? spaceAround(formula) : {};
|
|
177
|
+
const caret = caretAfter(host, after ?? formula);
|
|
178
|
+
dropEmpty(host);
|
|
179
|
+
use.recordStep(host, before, rangeOffsets(host, caret));
|
|
180
|
+
if (tex || original) use.say(formulaSays.kept(tex, original !== null));
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// The editor below `chip` (in `host`, whose HTML was `before`), holding `tex`.
|
|
184
|
+
function openBox(host, chip, { before, tex, parts, original }) {
|
|
185
|
+
box = { host, chip, parts, before, original };
|
|
186
|
+
box.panel = openFormulaPanel({
|
|
187
|
+
value: tex, anchor: () => chipBox(chip),
|
|
188
|
+
onInput: (value) => box?.chip === chip && refresh(value),
|
|
189
|
+
onSubmit: (value) => { if (box?.chip === chip) submit(value); },
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Turn the text selected in `host` into a formula (one there already: edit it); `fresh` (the "/"
|
|
195
|
+
* menu's 公式): a new, empty one at the caret, its field open for what is pasted or typed.
|
|
196
|
+
*/
|
|
197
|
+
export async function openFormula(host, { fresh = false } = {}) {
|
|
198
|
+
if (can(host, "plain")) return use.say(limitText(host, "format"));
|
|
199
|
+
if (!takesFormula(host)) return use.say(limitText(host, "formula"));
|
|
200
|
+
const selection = getSelection();
|
|
201
|
+
const range = selection.rangeCount ? selection.getRangeAt(0).cloneRange() : null;
|
|
202
|
+
if (!range || (range.collapsed && !fresh) || !host.contains(range.commonAncestorContainer)) return use.say(t("先选中要变成公式的文字。"));
|
|
203
|
+
const inside = range.cloneContents().querySelector(FORMULA);
|
|
204
|
+
if (inside) {
|
|
205
|
+
const chip = [...host.querySelectorAll(FORMULA)].find((each) => range.intersectsNode(each));
|
|
206
|
+
return chip ? editFormula(chip) : undefined;
|
|
207
|
+
}
|
|
208
|
+
const around = range.commonAncestorContainer.nodeType === 1 ? range.commonAncestorContainer : range.commonAncestorContainer.parentElement;
|
|
209
|
+
const code = around.closest("code");
|
|
210
|
+
if (code && host.contains(code)) return use.say(t("行内代码里不能放公式。"));
|
|
211
|
+
if (!(await loadKatex())) return use.say(formulaSays.unloaded(true), "error");
|
|
212
|
+
if (!host.isConnected) return;
|
|
213
|
+
dismissFormula();
|
|
214
|
+
const before = ownHTML(host);
|
|
215
|
+
const tex = texOf(range.toString());
|
|
216
|
+
range.deleteContents();
|
|
217
|
+
const chip = newFormula(document, tex || "x", "", null); // its source is set when it is kept
|
|
218
|
+
range.insertNode(chip);
|
|
219
|
+
dropEmpty(host);
|
|
220
|
+
openBox(host, chip, { before, tex, parts: null, original: null });
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** Edit a formula of the text (a click on it). */
|
|
224
|
+
export async function editFormula(chip) {
|
|
225
|
+
const host = editable(chip.parentElement);
|
|
226
|
+
if (!host) return;
|
|
227
|
+
const parts = formulaParts(chip);
|
|
228
|
+
if (!parts) return use.say(formulaSays.peculiar);
|
|
229
|
+
if (!(await loadKatex())) return use.say(formulaSays.unloaded(false), "error");
|
|
230
|
+
dismissFormula();
|
|
231
|
+
if (!chip.isConnected) return;
|
|
232
|
+
openBox(host, chip, { before: ownHTML(host), tex: parts.tex, parts, original: parts.tex });
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** The open formula box, if any (the editor's UI moves it into an open dialog; commits wait while it is). */
|
|
236
|
+
export const formulaBoxNode = () => box?.panel.node ?? null;
|