@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,168 @@
|
|
|
1
|
+
import { OLD_PROTOCOL, PROTOCOL, PROTOCOLS, VERSION, keyCombo } from "../../shared/session.mjs";
|
|
2
|
+
import { lookOf, lookOfElement } from "../../shared/document-look.mjs";
|
|
3
|
+
|
|
4
|
+
// The report page inside a workbench (an iframe of the same origin): it answers a few commands and
|
|
5
|
+
// tells the workbench its state, never the report's content. Nothing happens when the page is not
|
|
6
|
+
// embedded. The protocol is src/shared/session.mjs; how a workbench uses it, docs/workbench.md.
|
|
7
|
+
//
|
|
8
|
+
// A message counts only from the parent window, of this origin and protocol. A command names the
|
|
9
|
+
// report it is meant for: one for another report (the iframe went to another page meanwhile) is
|
|
10
|
+
// refused. Every command gets exactly one reply, once it is done. Besides the editor's commands the
|
|
11
|
+
// session itself answers five: `theme` (show the report light or dark, or as the reader chose, without
|
|
12
|
+
// storing it), `look` (show the document in a look, 字体与布局: { look }, src/shared/document-look.mjs; the
|
|
13
|
+
// workbench writes it into doc.json), `keys` (key combinations to hand to the workbench when the page does not use them),
|
|
14
|
+
// `scroll-top` (back to the top when scrolled down) and `close-card` (the detail card on top closes as a
|
|
15
|
+
// press on its backdrop closes it: the workbench asks on a press on its own bars, or Esc there, while
|
|
16
|
+
// the page says a card is open, `card` in what it sends). A card stands in the middle of the
|
|
17
|
+
// workbench's window, not of the frame (centreCards, below).
|
|
18
|
+
|
|
19
|
+
/** A page opened in a frame on its own (?solo), not as the workbench's report: no session, its own notices. */
|
|
20
|
+
export const SOLO = new URLSearchParams(location.search).has("solo");
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* slug: the report's; snapshot(): { title, state } (state: STATE_FLAGS of src/shared/session.mjs);
|
|
24
|
+
* commands: name -> async (message) => result ({ ok, … }); modals: what stands open over the page
|
|
25
|
+
* (`modalOps`, page-objects.mjs: open(), listen(listener), closeTop()).
|
|
26
|
+
* Returns { update() (call it when the state may have changed), notice({ text, tone, hold, room }) (the
|
|
27
|
+
* workbench shows it: a toast, `room` px above the frame's bottom, what the page's bottom panels take;
|
|
28
|
+
* text "" takes it away), noticeRoom(room) (that room changed: the workbench's toasts stand above it),
|
|
29
|
+
* reload() (the workbench shows the report
|
|
30
|
+
* again in a new page, swapped in once drawn), annotationsRemoved(items) (批注 deleted in the page:
|
|
31
|
+
* the workbench says so and offers them back), open({ target, block } or { hash }) (the workbench
|
|
32
|
+
* goes to another document), jump({ block, place }) (a link goes to a block of this page: the
|
|
33
|
+
* workbench adds a history entry, `place` where the reader was, for the way back: `show-place`),
|
|
34
|
+
* workspace() (a page was made under this one: the sidebar reads the list
|
|
35
|
+
* again and opens this page's row) }, or null when not embedded, or opened on its own in a frame of the
|
|
36
|
+
* workbench (?solo: the 写作偏好 dialog's page, which talks to no session).
|
|
37
|
+
*/
|
|
38
|
+
export function connectWorkbench({ slug, snapshot, commands, modals }) {
|
|
39
|
+
if (window.parent === window || SOLO) return null;
|
|
40
|
+
centreCards(modals);
|
|
41
|
+
// The id the workbench speaks (src/shared/session.mjs, OLD_PROTOCOL): null until its first command,
|
|
42
|
+
// and meanwhile every message goes under both, so that a workbench of either version hears it.
|
|
43
|
+
let spoken = null;
|
|
44
|
+
const send = (type, fields, protocols = spoken ? [spoken] : [PROTOCOL, OLD_PROTOCOL]) => {
|
|
45
|
+
for (const protocol of protocols) window.parent.postMessage({ protocol, v: VERSION, type, slug, ...fields }, location.origin);
|
|
46
|
+
};
|
|
47
|
+
let last = null;
|
|
48
|
+
const update = () => {
|
|
49
|
+
const now = { ...snapshot(), card: modals.open().length > 0 };
|
|
50
|
+
const key = JSON.stringify(now);
|
|
51
|
+
if (key === last) return;
|
|
52
|
+
last = key;
|
|
53
|
+
send("state", now);
|
|
54
|
+
};
|
|
55
|
+
modals.listen(update);
|
|
56
|
+
|
|
57
|
+
// A key combination the workbench asked for goes to it when nothing on the page took it (the
|
|
58
|
+
// editor's own keys, Ctrl+K for a link among them, are handled and prevented before this).
|
|
59
|
+
let keys = new Set();
|
|
60
|
+
addEventListener("keydown", (event) => {
|
|
61
|
+
if (event.defaultPrevented || event.isComposing || keys.size === 0) return;
|
|
62
|
+
const key = keyCombo(event);
|
|
63
|
+
if (!keys.has(key)) return;
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
send("key", { key });
|
|
66
|
+
});
|
|
67
|
+
const own = {
|
|
68
|
+
async theme({ theme = null }) {
|
|
69
|
+
if (theme !== null && theme !== "light" && theme !== "dark") return { ok: false, reason: "theme" };
|
|
70
|
+
dispatchEvent(new CustomEvent("doc-theme-request", { detail: { theme } })); // the kit's ui.js
|
|
71
|
+
return { ok: true };
|
|
72
|
+
},
|
|
73
|
+
// The document's look shown at once (the kit's ui.js puts it on <html> and lays out again), never
|
|
74
|
+
// stored here: the workbench writes doc.json. Answers with the look the page shows then.
|
|
75
|
+
async look({ look = null }) {
|
|
76
|
+
if (look !== null && (typeof look !== "object" || Array.isArray(look))) return { ok: false, reason: "look" };
|
|
77
|
+
dispatchEvent(new CustomEvent("doc-look-request", { detail: { look: lookOf(look) } }));
|
|
78
|
+
return { ok: true, look: lookOfElement(document.documentElement) };
|
|
79
|
+
},
|
|
80
|
+
async keys({ keys: list }) {
|
|
81
|
+
if (!Array.isArray(list) || !list.every((key) => typeof key === "string")) return { ok: false, reason: "keys" };
|
|
82
|
+
keys = new Set(list);
|
|
83
|
+
return { ok: true };
|
|
84
|
+
},
|
|
85
|
+
// Scrolled down (10px or more, as Notion's breadcrumb asks), the page glides back to its top.
|
|
86
|
+
async "scroll-top"() {
|
|
87
|
+
if (Math.abs(scrollY) < 10) return { ok: true, scrolled: false };
|
|
88
|
+
scrollTo({ top: 0, behavior: "smooth" });
|
|
89
|
+
return { ok: true, scrolled: true };
|
|
90
|
+
},
|
|
91
|
+
// A press on the workbench's own bars, or Esc there, while a detail card is open.
|
|
92
|
+
async "close-card"() {
|
|
93
|
+
return { ok: true, closed: modals.closeTop() };
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
const all = { ...commands, ...own };
|
|
97
|
+
|
|
98
|
+
addEventListener("message", async (event) => {
|
|
99
|
+
const message = event.data;
|
|
100
|
+
if (event.source !== window.parent || event.origin !== location.origin) return;
|
|
101
|
+
if (!PROTOCOLS.includes(message?.protocol) || message.v !== VERSION || message.type !== "command") return;
|
|
102
|
+
spoken = message.protocol;
|
|
103
|
+
const run = Object.hasOwn(all, message.name) ? all[message.name] : null;
|
|
104
|
+
let result;
|
|
105
|
+
try {
|
|
106
|
+
result = message.slug !== slug ? { ok: false, reason: "slug" } : run ? await run(message) : { ok: false, reason: "unknown" };
|
|
107
|
+
} catch (error) {
|
|
108
|
+
result = { ok: false, reason: "error", message: String(error?.message ?? error) };
|
|
109
|
+
}
|
|
110
|
+
send("reply", { id: message.id, ...result }, [message.protocol]);
|
|
111
|
+
update();
|
|
112
|
+
});
|
|
113
|
+
const first = { ...snapshot(), card: modals.open().length > 0 };
|
|
114
|
+
last = JSON.stringify(first);
|
|
115
|
+
send("ready", { commands: Object.keys(all), ...first });
|
|
116
|
+
return {
|
|
117
|
+
update,
|
|
118
|
+
notice: (fields) => send("notice", fields),
|
|
119
|
+
noticeRoom: (room) => send("noticeRoom", { room }),
|
|
120
|
+
// Show the report again (the file changed): the workbench loads it out of sight and puts it in
|
|
121
|
+
// this page's place once drawn; this page does nothing more meanwhile.
|
|
122
|
+
reload: () => send("reload", {}),
|
|
123
|
+
annotationsRemoved: (items) => send("annotations-removed", { items }),
|
|
124
|
+
open: (place) => send("open", place),
|
|
125
|
+
jump: (fields) => send("jump", fields),
|
|
126
|
+
workspace: () => send("workspace", {}),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// A detail card stands in the middle of the workbench's window, as the workbench's own dialogs do
|
|
131
|
+
// (组件列表, 写作偏好), not in the middle of this frame right of its sidebar and under its top bar;
|
|
132
|
+
// the workbench covers its bars while the page says a card is open (`card`), the card's backdrop
|
|
133
|
+
// the rest. The kit's dialog.css puts the card's middle at --doc-dialog-centre-x and -y, as far as
|
|
134
|
+
// the frame lets it stay clear of its sides, and makes it 80% as high as --doc-dialog-window-height.
|
|
135
|
+
// They are read from the frame's place in the workbench's window (of this origin, as every message
|
|
136
|
+
// of the session is), and said in a sheet the document adopts, which is in no markup (a copy of the
|
|
137
|
+
// view, the file); again as the frame changes size (the window resized, the sidebar opened, closed or
|
|
138
|
+
// dragged wider) and as a card opens or closes.
|
|
139
|
+
function centreCards(modals) {
|
|
140
|
+
let sheet;
|
|
141
|
+
try {
|
|
142
|
+
sheet = new CSSStyleSheet();
|
|
143
|
+
document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];
|
|
144
|
+
} catch {
|
|
145
|
+
return; // a browser with no constructed sheets: the card in the middle of the frame
|
|
146
|
+
}
|
|
147
|
+
let said = null;
|
|
148
|
+
const place = () => {
|
|
149
|
+
let rule = "";
|
|
150
|
+
try {
|
|
151
|
+
const frame = window.frameElement;
|
|
152
|
+
const outer = frame?.ownerDocument.documentElement;
|
|
153
|
+
if (outer) {
|
|
154
|
+
const box = frame.getBoundingClientRect();
|
|
155
|
+
const style = frame.ownerDocument.defaultView.getComputedStyle(frame);
|
|
156
|
+
const left = box.left + frame.clientLeft + parseFloat(style.paddingLeft);
|
|
157
|
+
const top = box.top + frame.clientTop + parseFloat(style.paddingTop);
|
|
158
|
+
rule = `:root { --doc-dialog-centre-x: ${outer.clientWidth / 2 - left}px; --doc-dialog-centre-y: ${outer.clientHeight / 2 - top}px; --doc-dialog-window-height: ${outer.clientHeight}px; }`;
|
|
159
|
+
}
|
|
160
|
+
} catch { /* a frame of another origin's page, or one taken away: in the middle of the frame */ }
|
|
161
|
+
if (rule === said) return;
|
|
162
|
+
said = rule;
|
|
163
|
+
sheet.replaceSync(rule);
|
|
164
|
+
};
|
|
165
|
+
place();
|
|
166
|
+
addEventListener("resize", place);
|
|
167
|
+
modals.listen(place);
|
|
168
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { MENU_GROUPS, takesFormula, textFilters } from "../../components/registry.mjs";
|
|
2
|
+
import { FORMULA_ICON, LINK_ICON, PAGE_ICON } from "../../components/icons.mjs";
|
|
3
|
+
import { caretRect, hostOf } from "../caret.mjs";
|
|
4
|
+
import { can, isFirstLine } from "../core.mjs";
|
|
5
|
+
import { belowTargets, convertible, typeOf, typedTargets } from "../convert.mjs";
|
|
6
|
+
import { rangeAt, rangeOffsets } from "../marks.mjs";
|
|
7
|
+
import { createMenu } from "../menu.mjs";
|
|
8
|
+
import { offered } from "../offered.mjs";
|
|
9
|
+
import { menuRow, variantKeys } from "../page-objects.mjs";
|
|
10
|
+
import { recentList } from "../storage.mjs";
|
|
11
|
+
import { t } from "../../../shared/i18n/index.mjs";
|
|
12
|
+
|
|
13
|
+
// The "/" menu (docs/editor.md, "New blocks and conversions"), Notion's (notion-lite
|
|
14
|
+
// editor/menus/slash-menu.js): "/" (or "、", "/", the same key with a Chinese input method) typed in
|
|
15
|
+
// a text block opens a menu of blocks at the caret, filtered by what follows it (label, pinyin,
|
|
16
|
+
// initials; while composing too). In a block holding nothing else, a block chosen is what the block
|
|
17
|
+
// turns into; in one with text, a new block of the type goes below it (insertBelow), and so it does
|
|
18
|
+
// below a flowchart node's first line (its title, which turns into nothing: core.mjs firstLineOf); 公式,
|
|
19
|
+
// 链接 and 页面 go where the "/" was. In text no block can come of (a table's cell, a caption, a card's
|
|
20
|
+
// title: what takes links, as the "@" menu goes by) it holds those three alone, where notion-lite opens
|
|
21
|
+
// no menu. Unfiltered, the menu shows 建议 (the four blocks used last, kept on
|
|
22
|
+
// this computer) and the blocks by group, the workspace's component packages the last of those
|
|
23
|
+
// (组件: notion-lite's variants, "installed:<id>", each named as the reader reads and found by its
|
|
24
|
+
// words, offered where a block of its own stands: convert.mjs); filtered, one list. 240px wide, at most min(448px, 40vh)
|
|
25
|
+
// high (its rows scroll), below the caret or above it where there is more room; ↑/↓, Enter or Tab
|
|
26
|
+
// and Esc work while it is open. It closes when the "/" goes, the caret leaves for another block or
|
|
27
|
+
// before the "/", what follows starts with a space or ends with two, or three more characters are
|
|
28
|
+
// typed after nothing matched (a "、" in the middle of text, a Chinese list's comma most often, at
|
|
29
|
+
// once), none of it while an input method composes. The block handle's "+" opens it with no "/" (in
|
|
30
|
+
// the empty block it made: `add`, notion-lite's openAddMenu), filtered by what is typed there. The card
|
|
31
|
+
// is menu.mjs; markdown/ tells it what is typed.
|
|
32
|
+
|
|
33
|
+
/** The characters that open the menu: "/", and what the same key types with a Chinese input method. */
|
|
34
|
+
export const SLASH = new Set(["/", "、", "/"]);
|
|
35
|
+
|
|
36
|
+
// The rows not blocks of their own, where the "/" was (notion-lite's inline section).
|
|
37
|
+
const INLINE = {
|
|
38
|
+
// 公式 is the format bar's (an inline formula; a formula block of its own would be 公式块).
|
|
39
|
+
"inline:formula": { label: t("公式"), icon: FORMULA_ICON, words: "公式 行内公式 gongshi hangneigongshi gs hngs equation inline math latex tex $" },
|
|
40
|
+
"inline:link": { label: t("链接"), icon: LINK_ICON, words: "链接 超链接 lianjie chaolianjie lj link url href" },
|
|
41
|
+
"inline:page": { label: t("页面"), icon: PAGE_ICON, words: "页面 页面块 子页面 yemian yemiankuai ziyemian ym zym page subpage mention" },
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Groups of the unfiltered menu: 基本区块, 高级区块 (media, code, tabs and formula blocks: what
|
|
45
|
+
// holds more than text; the types' own `menu`, registry.mjs MENU_GROUPS), 组件 (what the variants
|
|
46
|
+
// are now: the workspace's), and what is no block under 内联.
|
|
47
|
+
const SECTIONS = [
|
|
48
|
+
{ title: t("基本区块"), types: () => MENU_GROUPS.basic },
|
|
49
|
+
{ title: t("高级区块"), types: () => MENU_GROUPS.advanced },
|
|
50
|
+
{ title: t("组件@group"), types: variantKeys },
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const infoOf = (key) => INLINE[key] ?? menuRow(key);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* How well a row (a block type, or 公式 / 链接 / 页面) matches what the reader typed after "/": 0 when
|
|
57
|
+
* its name is just that, 1 when one of its words (pinyin, initials, English) is, 2 when one starts
|
|
58
|
+
* with it, 3 when one has it inside; null when none (Notion's order: "gl" is 高亮块 before 折叠列表's
|
|
59
|
+
* "toggle", "链接" the link before 网页书签, which has the word).
|
|
60
|
+
*/
|
|
61
|
+
export function matchScore(type, query) {
|
|
62
|
+
const text = query.trim().toLowerCase().replace(/\s/g, "");
|
|
63
|
+
if (!text) return 0;
|
|
64
|
+
const { label, words } = infoOf(type);
|
|
65
|
+
const names = [label.replace(/\s/g, "").toLowerCase(), ...words.split(" ")];
|
|
66
|
+
if (names[0] === text) return 0;
|
|
67
|
+
if (names.includes(text)) return 1;
|
|
68
|
+
if (names.some((name) => name.startsWith(text))) return 2;
|
|
69
|
+
if (names[0].includes(text) || (text.length > 1 && names.some((name) => name.includes(text)))) return 3;
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Whether a row matches what the reader typed after "/". */
|
|
74
|
+
export const typeMatches = (type, query) => matchScore(type, query) !== null;
|
|
75
|
+
|
|
76
|
+
// ---------- the blocks used last (建议) ----------
|
|
77
|
+
|
|
78
|
+
const recent = recentList("gallery-edit:recent-types", { max: 8, valid: (key) => typeof key === "string" && Boolean(infoOf(key)) });
|
|
79
|
+
|
|
80
|
+
/** The rows chosen last, newest first. */
|
|
81
|
+
export const recentTypes = () => recent.read();
|
|
82
|
+
|
|
83
|
+
/** A row chosen: first among the recent ones. */
|
|
84
|
+
export const rememberType = (key) => recent.use(key);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The menu's items for `those` (block types, and 公式 / 链接 / 页面 as "inline:formula" / "inline:link" / "inline:page"),
|
|
88
|
+
* but what the reader hid (offered.mjs) and a package's row that went while a card stood open, run(key) choosing one: filtered by `query`, one list; else
|
|
89
|
+
* 建议 and the groups. The block menu's 在下方新建 shows the same (block-menu/). `blocks`: in a block
|
|
90
|
+
* holding nothing but the "/…", whose type it would become — the blocks that match come before what
|
|
91
|
+
* goes in the text (/gs: 公式块, then 公式), as in text the best match comes first (公式, then 公式块).
|
|
92
|
+
*/
|
|
93
|
+
export function typeItems(those, run, query = "", { blocks = false } = {}) {
|
|
94
|
+
const keys = offered(those).filter(infoOf);
|
|
95
|
+
const rowOf = (key) => ({ ...infoOf(key), run: () => run(key) });
|
|
96
|
+
if (query) {
|
|
97
|
+
// Best match first, the menu's order within each (sort is stable).
|
|
98
|
+
const rank = (key, score) => (blocks && INLINE[key] ? 10 : 0) + score;
|
|
99
|
+
return keys.map((key) => [key, matchScore(key, query)]).filter(([, score]) => score !== null).sort((a, b) => rank(a[0], a[1]) - rank(b[0], b[1])).map(([key]) => rowOf(key));
|
|
100
|
+
}
|
|
101
|
+
const items = [];
|
|
102
|
+
const recent = recentTypes().filter((key) => keys.includes(key)).slice(0, 4);
|
|
103
|
+
if (recent.length > 0) items.push({ title: t("建议") }, ...recent.map(rowOf));
|
|
104
|
+
for (const { title, types } of SECTIONS) {
|
|
105
|
+
const shown = types().filter((key) => keys.includes(key));
|
|
106
|
+
if (shown.length > 0) items.push({ title }, ...shown.map(rowOf));
|
|
107
|
+
}
|
|
108
|
+
const inline = keys.filter((key) => INLINE[key]);
|
|
109
|
+
if (inline.length > 0) items.push({ title: t("内联") }, ...inline.map(rowOf));
|
|
110
|
+
return items;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* convert(host, type, typed): the block, holding nothing but the "/…" typed (`typed`, a range of it),
|
|
115
|
+
* turned into the type (editor.mjs convertHost); insertBelow(host, type, typed): a new block of the
|
|
116
|
+
* type below the block, the typed "/…" taken away; inline.formula(host, typed), inline.link(host,
|
|
117
|
+
* typed) and inline.page(host, typed): a formula, a link or a page block where the "/…" was, its field
|
|
118
|
+
* open. composing():
|
|
119
|
+
* whether an input method is composing (editor.mjs). closed(host): the menu the "+" opened in `host`
|
|
120
|
+
* closed (its hint, 输入以筛选…, goes: typing/ updatePlaceholder).
|
|
121
|
+
*/
|
|
122
|
+
export function createSlashMenu({ convert, insertBelow, inline, composing = () => false, closed = () => {} }) {
|
|
123
|
+
const menu = createMenu();
|
|
124
|
+
let slash = null; // { host, at, char, quiet, missed }: the block, where the "/" is (a character offset), which
|
|
125
|
+
|
|
126
|
+
const caretOffset = (host) => {
|
|
127
|
+
const selection = getSelection();
|
|
128
|
+
return selection.rangeCount && selection.isCollapsed && host.contains(selection.anchorNode) ? rangeOffsets(host, selection.getRangeAt(0))[1] : null;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
function rect(host) {
|
|
132
|
+
const selection = getSelection();
|
|
133
|
+
const caret = selection.rangeCount && host.contains(selection.anchorNode) ? caretRect(selection.getRangeAt(0)) : null;
|
|
134
|
+
const box = host.getBoundingClientRect();
|
|
135
|
+
return caret ? { left: caret.left - 4, top: caret.top, bottom: caret.bottom } : { left: box.left, top: box.top, bottom: box.bottom };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// The "/…" typed (`state`: where the menu opened), as a range of the block, or null when it is not
|
|
139
|
+
// there any more (deleted, or the caret before it). Opened by the handle's "+" (`char` null: no
|
|
140
|
+
// "/"), what is typed from where it opened, nothing at first.
|
|
141
|
+
function typedRange(state) {
|
|
142
|
+
const caret = caretOffset(state.host);
|
|
143
|
+
if (caret === null || caret < state.at || (state.char && caret === state.at)) return null;
|
|
144
|
+
const range = rangeAt(state.host, [state.at, caret]);
|
|
145
|
+
return !state.char || range.toString()[0] === state.char ? range : null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Whether a block can come of a "/" typed in it: what it turns into, or a block below it.
|
|
149
|
+
const takesBlocks = (host) => convertible(host) || can(host, "split");
|
|
150
|
+
|
|
151
|
+
// Whether the block holds nothing but the "/…": then a block chosen is what it turns into (a node's
|
|
152
|
+
// title never: what is chosen goes below it).
|
|
153
|
+
const alone = (host, typed) => !isFirstLine(host) && host.textContent.replace(/\s/g, "") === typed.toString().replace(/\s/g, "") && !host.querySelector("[data-ge-atom]");
|
|
154
|
+
|
|
155
|
+
// The rows for what follows the "/"; null closes the menu. While a Chinese input method composes
|
|
156
|
+
// pinyin there, it shows it with its syllables apart ("gs" as "g's" or "g s"): what is looked for is
|
|
157
|
+
// its letters, as Enter puts them in (the menu staying open for a second Enter to choose).
|
|
158
|
+
function rows() {
|
|
159
|
+
const state = slash;
|
|
160
|
+
const { host } = state;
|
|
161
|
+
const typed = typedRange(state);
|
|
162
|
+
if (!typed) return null;
|
|
163
|
+
const written = typed.toString().slice(state.char ? 1 : 0).replace(/ /g, " ");
|
|
164
|
+
const query = composing() ? written.replace(/['\s]/g, "") : written;
|
|
165
|
+
if (/^\s/.test(query) || /\s\s$/.test(query) || (query.length > 16 && !composing())) return null;
|
|
166
|
+
const empty = alone(host, typed);
|
|
167
|
+
const blocks = !takesBlocks(host) ? [] : empty ? typedTargets(host, true) : belowTargets(host);
|
|
168
|
+
const keys = [...blocks, ...(can(host, "links") ? Object.keys(INLINE).filter((key) => key !== "inline:formula" || takesFormula(host)) : [])];
|
|
169
|
+
const found = typeItems(keys, (key) => choose(state, key), query, { blocks: empty }); // the menu closes before a row runs
|
|
170
|
+
if (found.length > 0) {
|
|
171
|
+
slash.missed = null;
|
|
172
|
+
return found;
|
|
173
|
+
}
|
|
174
|
+
// Letters being composed are no text yet: what they turn into is looked for once they do, a
|
|
175
|
+
// package's name that its words do not spell in pinyin among it.
|
|
176
|
+
if (composing()) return found;
|
|
177
|
+
if (slash.quiet) return null; // "甲、乙": a comma, not a menu
|
|
178
|
+
slash.missed ??= query.length;
|
|
179
|
+
return query.length - slash.missed >= 3 ? null : found;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function open() {
|
|
183
|
+
const found = rows();
|
|
184
|
+
if (!found) {
|
|
185
|
+
slash = null;
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
menu.open(found, rect(slash.host), {
|
|
189
|
+
label: t("插入块"),
|
|
190
|
+
empty: t("没有结果"),
|
|
191
|
+
width: 240,
|
|
192
|
+
height: Math.min(448, Math.round(innerHeight * 0.4)),
|
|
193
|
+
gap: 8,
|
|
194
|
+
onClose: () => {
|
|
195
|
+
const added = slash && !slash.char ? slash.host : null;
|
|
196
|
+
slash = null;
|
|
197
|
+
if (added) closed(added);
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// The rows follow what is typed after the "/", and the menu its block.
|
|
203
|
+
function update() {
|
|
204
|
+
const found = slash?.host.isConnected ? rows() : null;
|
|
205
|
+
if (found) menu.update(found, rect(slash.host));
|
|
206
|
+
else menu.close();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// The typed "/…" goes, then: the block turns into the type (it held nothing else), a block of the
|
|
210
|
+
// type goes below it, or a formula or link goes where the "/" was.
|
|
211
|
+
function choose(state, key) {
|
|
212
|
+
const { host } = state;
|
|
213
|
+
const typed = typedRange(state);
|
|
214
|
+
menu.close();
|
|
215
|
+
if (!typed || !infoOf(key)) return; // (a package's row, its package gone while the menu stood)
|
|
216
|
+
rememberType(key);
|
|
217
|
+
// Opened by the "+" and nothing typed: the empty block's own type chosen changes nothing (no
|
|
218
|
+
// undo step that does nothing).
|
|
219
|
+
if (!state.char && typed.collapsed && typeOf(host) === key && alone(host, typed)) return;
|
|
220
|
+
if (key === "inline:formula") return inline.formula(host, typed);
|
|
221
|
+
if (key === "inline:link") return inline.link(host, typed);
|
|
222
|
+
if (key === "inline:page") return inline.page(host, typed);
|
|
223
|
+
if (alone(host, typed)) return convert(host, key, typed);
|
|
224
|
+
// At the block's end, the spaces typed before the "/" go with it (they were for the menu).
|
|
225
|
+
const [start, end] = rangeOffsets(host, typed);
|
|
226
|
+
const rest = document.createRange();
|
|
227
|
+
rest.selectNodeContents(host);
|
|
228
|
+
rest.setStart(typed.endContainer, typed.endOffset);
|
|
229
|
+
let from = start;
|
|
230
|
+
if (!rest.toString().trim()) while (from > 0 && /^\s$/.test(rangeAt(host, [from - 1, from]).toString())) from--;
|
|
231
|
+
insertBelow(host, key, from < start ? rangeAt(host, [from, end]) : typed);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return {
|
|
235
|
+
/**
|
|
236
|
+
* Text typed in `host`, `before` the caret: the menu opens when it ends with a "/" standing at the
|
|
237
|
+
* block's start, after a space, a whole in the text or a character no Latin word or address has
|
|
238
|
+
* ("and/or" and "https:/" open nothing; "、" anywhere), in a text block a block can be made from, or
|
|
239
|
+
* that takes links. `whole`: the block's text. Returns whether it opened.
|
|
240
|
+
*/
|
|
241
|
+
typed(host, before, whole) {
|
|
242
|
+
const char = before.at(-1);
|
|
243
|
+
if (!SLASH.has(char) || !textFilters(host) || can(host, "plain") || !(takesBlocks(host) || can(host, "links"))) return false;
|
|
244
|
+
const caret = caretOffset(host);
|
|
245
|
+
if (caret === null) return false;
|
|
246
|
+
const previous = before.at(-2);
|
|
247
|
+
const word = previous !== undefined && !/\s/.test(previous) && /[\x21-\x7e]/.test(previous);
|
|
248
|
+
if (char !== "、" && word && !rangeAt(host, [caret - 2, caret - 1]).cloneContents().querySelector("[data-ge-atom]")) return false;
|
|
249
|
+
slash = { host, at: caret - 1, char, quiet: char === "、" && whole !== char, missed: null };
|
|
250
|
+
open();
|
|
251
|
+
return Boolean(slash);
|
|
252
|
+
},
|
|
253
|
+
/**
|
|
254
|
+
* The menu opened with no "/" typed, at the caret in `host` (an empty block the block handle's
|
|
255
|
+
* "+" made: notion-lite's openAddMenu): unfiltered, then filtered by what is typed from there, the
|
|
256
|
+
* rest as after a "/" (a block chosen is what the empty block turns into). Returns whether it opened.
|
|
257
|
+
*/
|
|
258
|
+
add(host) {
|
|
259
|
+
const caret = caretOffset(host);
|
|
260
|
+
if (caret === null) return false;
|
|
261
|
+
slash = { host, at: caret, char: null, quiet: false, missed: null };
|
|
262
|
+
open();
|
|
263
|
+
return Boolean(slash);
|
|
264
|
+
},
|
|
265
|
+
/** The block the menu is open in, opened by the "+" (`add`), or null. */
|
|
266
|
+
get adding() { return slash && !slash.char && menu.isOpen ? slash.host : null; },
|
|
267
|
+
update,
|
|
268
|
+
close: () => menu.close(),
|
|
269
|
+
/**
|
|
270
|
+
* Keys while the menu is open, in its block (the caret's: a block a list item holds is edited in
|
|
271
|
+
* the item's element, which the keys go to, hostOf). Returns true when handled.
|
|
272
|
+
*/
|
|
273
|
+
key(event) {
|
|
274
|
+
if (!menu.isOpen || hostOf(event) !== slash?.host || event.isComposing || event.keyCode === 229) return false;
|
|
275
|
+
if (!menu.arrow(event)) {
|
|
276
|
+
if ((event.key === "Enter" || event.key === "Tab") && menu.hasChoice) menu.choose();
|
|
277
|
+
else if (event.key === "Escape") menu.close();
|
|
278
|
+
else {
|
|
279
|
+
if (event.key === "Enter") menu.close();
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
event.preventDefault();
|
|
284
|
+
return true;
|
|
285
|
+
},
|
|
286
|
+
/** The block the menu is open for, or null. */
|
|
287
|
+
get host() { return slash?.host ?? null; },
|
|
288
|
+
contains: (node) => menu.contains(node),
|
|
289
|
+
get nodes() { return menu.nodes; },
|
|
290
|
+
};
|
|
291
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// What the editor keeps in the browser's storage: its crash buffer and tab (autosave.mjs, as strings),
|
|
2
|
+
// the format brush, the colors, formulas and blocks used lately (JSON). Every call is safe where the
|
|
3
|
+
// storage is not: a private window, blocked site data or a full quota store nothing and read nothing,
|
|
4
|
+
// and the page works without (a list used lately is then kept for the page's life only).
|
|
5
|
+
|
|
6
|
+
/** A storage area (`area()`: localStorage or sessionStorage) whose calls never throw. */
|
|
7
|
+
export const storageOf = (area) => ({
|
|
8
|
+
get(key) { try { return area().getItem(key); } catch { return null; } },
|
|
9
|
+
set(key, value) { try { area().setItem(key, value); return true; } catch { return false; } },
|
|
10
|
+
remove(key) { try { area().removeItem(key); } catch {} },
|
|
11
|
+
keys() { try { return Object.keys(area()); } catch { return []; } },
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
/** localStorage, safe. */
|
|
15
|
+
export const local = storageOf(() => localStorage);
|
|
16
|
+
|
|
17
|
+
/** What `key` holds as JSON when `valid` says it is fit (by default: when there is something), else `fallback`. */
|
|
18
|
+
export function stored(key, fallback, valid = (value) => value !== null) {
|
|
19
|
+
try {
|
|
20
|
+
const saved = JSON.parse(local.get(key) ?? "null");
|
|
21
|
+
if (valid(saved)) return saved;
|
|
22
|
+
} catch {}
|
|
23
|
+
return fallback;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** `value` stored as JSON under `key`. */
|
|
27
|
+
export const keep = (key, value) => local.set(key, JSON.stringify(value));
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A list of what was used lately, newest first, kept under `key`: { read(), use(entry) }. At most
|
|
31
|
+
* `max` entries, those `valid` says are fit (`fallback` when none are); an entry used again moves to
|
|
32
|
+
* the front (`same(a, b)`: whether two are one).
|
|
33
|
+
*/
|
|
34
|
+
export function recentList(key, { max, valid = () => true, same = (a, b) => a === b, fallback = [] }) {
|
|
35
|
+
let list = stored(key, [], Array.isArray);
|
|
36
|
+
const fits = (entry) => { try { return valid(entry); } catch { return false; } }; // an entry that is no object
|
|
37
|
+
const read = () => {
|
|
38
|
+
const fit = list.filter(fits).slice(0, max);
|
|
39
|
+
return fit.length > 0 ? fit : fallback;
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
read,
|
|
43
|
+
use(entry) {
|
|
44
|
+
list = [entry, ...read().filter((other) => !same(other, entry))].slice(0, max);
|
|
45
|
+
keep(key, list);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|