@heycys/gallery 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +50 -2
- package/THIRD-PARTY-NOTICES.md +3253 -0
- package/assets/writing-preferences.md +107 -0
- package/bin/gallery.mjs +10 -0
- package/browser/editor/components/bookmark/icons.mjs +6 -0
- package/browser/editor/components/bookmark/index.mjs +80 -0
- package/browser/editor/components/bookmark/page.mjs +147 -0
- package/browser/editor/components/builders.mjs +19 -0
- package/browser/editor/components/callout/index.mjs +39 -0
- package/browser/editor/components/callout/page.mjs +13 -0
- package/browser/editor/components/code/index.mjs +327 -0
- package/browser/editor/components/code/page.mjs +561 -0
- package/browser/editor/components/colors.mjs +50 -0
- package/browser/editor/components/columns/index.mjs +104 -0
- package/browser/editor/components/columns/page.mjs +297 -0
- package/browser/editor/components/details/index.mjs +72 -0
- package/browser/editor/components/details/page.mjs +86 -0
- package/browser/editor/components/dialog/index.mjs +83 -0
- package/browser/editor/components/dialog/page.mjs +219 -0
- package/browser/editor/components/divider/index.mjs +48 -0
- package/browser/editor/components/embed/icons.mjs +11 -0
- package/browser/editor/components/embed/index.mjs +123 -0
- package/browser/editor/components/embed/page.mjs +309 -0
- package/browser/editor/components/figure/index.mjs +87 -0
- package/browser/editor/components/figure/page.mjs +33 -0
- package/browser/editor/components/file/icons.mjs +14 -0
- package/browser/editor/components/file/index.mjs +77 -0
- package/browser/editor/components/file/page.mjs +114 -0
- package/browser/editor/components/flowchart/add.mjs +123 -0
- package/browser/editor/components/flowchart/index.mjs +246 -0
- package/browser/editor/components/flowchart/page.mjs +453 -0
- package/browser/editor/components/heading/index.mjs +51 -0
- package/browser/editor/components/highlight/index.mjs +79 -0
- package/browser/editor/components/icon/index.mjs +57 -0
- package/browser/editor/components/icon/page.mjs +286 -0
- package/browser/editor/components/icons.mjs +45 -0
- package/browser/editor/components/image/crop.mjs +189 -0
- package/browser/editor/components/image/index.mjs +104 -0
- package/browser/editor/components/image/page.mjs +385 -0
- package/browser/editor/components/image/viewer.mjs +213 -0
- package/browser/editor/components/installed/index.mjs +133 -0
- package/browser/editor/components/installed/page.mjs +422 -0
- package/browser/editor/components/installed/served.mjs +35 -0
- package/browser/editor/components/kit.mjs +64 -0
- package/browser/editor/components/list/index.mjs +194 -0
- package/browser/editor/components/list/join.mjs +68 -0
- package/browser/editor/components/list/numbers.mjs +107 -0
- package/browser/editor/components/list/page.mjs +632 -0
- package/browser/editor/components/math/index.mjs +88 -0
- package/browser/editor/components/math/page.mjs +236 -0
- package/browser/editor/components/math/tex-logo.mjs +6 -0
- package/browser/editor/components/media/icons.mjs +19 -0
- package/browser/editor/components/media/page.mjs +162 -0
- package/browser/editor/components/media/parts.mjs +60 -0
- package/browser/editor/components/media/size.mjs +20 -0
- package/browser/editor/components/media/toolbar.mjs +37 -0
- package/browser/editor/components/media/write.mjs +7 -0
- package/browser/editor/components/pages.mjs +46 -0
- package/browser/editor/components/paragraph/index.mjs +43 -0
- package/browser/editor/components/paragraph/page.mjs +52 -0
- package/browser/editor/components/placeholder-bar.mjs +17 -0
- package/browser/editor/components/placeholder.mjs +128 -0
- package/browser/editor/components/quote/index.mjs +33 -0
- package/browser/editor/components/registry.mjs +833 -0
- package/browser/editor/components/rows.mjs +16 -0
- package/browser/editor/components/section/index.mjs +41 -0
- package/browser/editor/components/section/page.mjs +141 -0
- package/browser/editor/components/sheets/index.mjs +137 -0
- package/browser/editor/components/sheets/page.mjs +227 -0
- package/browser/editor/components/sheets/pills.mjs +226 -0
- package/browser/editor/components/table/grid.mjs +73 -0
- package/browser/editor/components/table/index.mjs +306 -0
- package/browser/editor/components/table/page.mjs +672 -0
- package/browser/editor/components/table/slots.mjs +41 -0
- package/browser/editor/components/widget/index.mjs +50 -0
- package/browser/editor/page/annotate/anchors.mjs +229 -0
- package/browser/editor/page/annotate/card.mjs +102 -0
- package/browser/editor/page/annotate/index.mjs +1629 -0
- package/browser/editor/page/at-menu/index.mjs +317 -0
- package/browser/editor/page/autosave.mjs +977 -0
- package/browser/editor/page/beside.mjs +21 -0
- package/browser/editor/page/block-info.mjs +63 -0
- package/browser/editor/page/block-menu/colors.mjs +82 -0
- package/browser/editor/page/block-menu/index.mjs +215 -0
- package/browser/editor/page/blocks.mjs +246 -0
- package/browser/editor/page/caret.mjs +679 -0
- package/browser/editor/page/chip-fills.mjs +126 -0
- package/browser/editor/page/clipboard/import/colors.mjs +192 -0
- package/browser/editor/page/clipboard/import/html.mjs +792 -0
- package/browser/editor/page/clipboard/import/inline.mjs +232 -0
- package/browser/editor/page/clipboard/import/languages.mjs +42 -0
- package/browser/editor/page/clipboard/import/markdown.mjs +760 -0
- package/browser/editor/page/clipboard/import/math.mjs +100 -0
- package/browser/editor/page/clipboard/import/office.mjs +245 -0
- package/browser/editor/page/clipboard/import/read.mjs +120 -0
- package/browser/editor/page/clipboard/import/rich.mjs +29 -0
- package/browser/editor/page/clipboard/import/to-blocks.mjs +290 -0
- package/browser/editor/page/clipboard/index.mjs +797 -0
- package/browser/editor/page/clipboard/own/blocks.mjs +202 -0
- package/browser/editor/page/clipboard/own/chart-keys.mjs +58 -0
- package/browser/editor/page/clipboard/own/describe.mjs +115 -0
- package/browser/editor/page/clipboard/own/export.mjs +167 -0
- package/browser/editor/page/clipboard/own/ids.mjs +39 -0
- package/browser/editor/page/clipboard/own/index.mjs +13 -0
- package/browser/editor/page/clipboard/own/rules.mjs +44 -0
- package/browser/editor/page/clipboard/own/selection.mjs +159 -0
- package/browser/editor/page/clipboard/own/writers.mjs +326 -0
- package/browser/editor/page/columns/index.mjs +360 -0
- package/browser/editor/page/commit.mjs +1798 -0
- package/browser/editor/page/conflicts.mjs +269 -0
- package/browser/editor/page/convert.mjs +830 -0
- package/browser/editor/page/core.mjs +1655 -0
- package/browser/editor/page/drag/drop.mjs +307 -0
- package/browser/editor/page/drag/index.mjs +335 -0
- package/browser/editor/page/drag/preview.mjs +121 -0
- package/browser/editor/page/edge-scroll.mjs +50 -0
- package/browser/editor/page/editor.mjs +1725 -0
- package/browser/editor/page/emoji-picker/emoji-tab.mjs +278 -0
- package/browser/editor/page/emoji-picker/glyph-html.mjs +26 -0
- package/browser/editor/page/emoji-picker/grid.mjs +79 -0
- package/browser/editor/page/emoji-picker/icon-tab.mjs +217 -0
- package/browser/editor/page/emoji-picker/icons.mjs +32 -0
- package/browser/editor/page/emoji-picker/index.mjs +164 -0
- package/browser/editor/page/emoji-picker/styles.mjs +2 -0
- package/browser/editor/page/emoji-picker/support.mjs +202 -0
- package/browser/editor/page/emoji-picker/upload.mjs +235 -0
- package/browser/editor/page/export-report.mjs +23 -0
- package/browser/editor/page/fills.mjs +60 -0
- package/browser/editor/page/find/index.mjs +107 -0
- package/browser/editor/page/flags.mjs +70 -0
- package/browser/editor/page/format-bar/bar.mjs +448 -0
- package/browser/editor/page/format-bar/brush.mjs +77 -0
- package/browser/editor/page/format-bar/colors.mjs +46 -0
- package/browser/editor/page/format-bar/index.mjs +404 -0
- package/browser/editor/page/formula/index.mjs +236 -0
- package/browser/editor/page/formula/panel.mjs +336 -0
- package/browser/editor/page/formula/symbols.mjs +156 -0
- package/browser/editor/page/frame.mjs +74 -0
- package/browser/editor/page/frames.mjs +196 -0
- package/browser/editor/page/geometry.mjs +400 -0
- package/browser/editor/page/gesture.mjs +45 -0
- package/browser/editor/page/handle/index.mjs +639 -0
- package/browser/editor/page/handle-sizes.mjs +14 -0
- package/browser/editor/page/hints/index.mjs +84 -0
- package/browser/editor/page/history.mjs +401 -0
- package/browser/editor/page/insert/index.mjs +243 -0
- package/browser/editor/page/kept.mjs +38 -0
- package/browser/editor/page/links/address.mjs +40 -0
- package/browser/editor/page/links/index.mjs +866 -0
- package/browser/editor/page/links/pages.mjs +131 -0
- package/browser/editor/page/links/views.mjs +369 -0
- package/browser/editor/page/look.mjs +65 -0
- package/browser/editor/page/made.mjs +24 -0
- package/browser/editor/page/margin.mjs +352 -0
- package/browser/editor/page/markdown/index.mjs +88 -0
- package/browser/editor/page/markdown/rules.mjs +33 -0
- package/browser/editor/page/marks.mjs +377 -0
- package/browser/editor/page/media-menu/index.mjs +158 -0
- package/browser/editor/page/menu.mjs +500 -0
- package/browser/editor/page/merge.mjs +100 -0
- package/browser/editor/page/notices.mjs +142 -0
- package/browser/editor/page/offered.mjs +32 -0
- package/browser/editor/page/outline/folds.mjs +52 -0
- package/browser/editor/page/outline/index.mjs +697 -0
- package/browser/editor/page/outline/list.mjs +172 -0
- package/browser/editor/page/outline/read.mjs +201 -0
- package/browser/editor/page/outline/strip.mjs +281 -0
- package/browser/editor/page/outline/tree.mjs +248 -0
- package/browser/editor/page/overlay-layer.mjs +227 -0
- package/browser/editor/page/overlays.mjs +205 -0
- package/browser/editor/page/own.mjs +28 -0
- package/browser/editor/page/pads.mjs +71 -0
- package/browser/editor/page/page-objects.mjs +105 -0
- package/browser/editor/page/panel.mjs +64 -0
- package/browser/editor/page/placement.mjs +58 -0
- package/browser/editor/page/post.mjs +41 -0
- package/browser/editor/page/present-links.mjs +50 -0
- package/browser/editor/page/quiet.mjs +48 -0
- package/browser/editor/page/resize/index.mjs +327 -0
- package/browser/editor/page/select-all/index.mjs +262 -0
- package/browser/editor/page/selection/delete.mjs +59 -0
- package/browser/editor/page/selection/index.mjs +157 -0
- package/browser/editor/page/selection/marquee.mjs +174 -0
- package/browser/editor/page/session.mjs +117 -0
- package/browser/editor/page/slash-menu/index.mjs +291 -0
- package/browser/editor/page/storage.mjs +48 -0
- package/browser/editor/page/sync-state.mjs +267 -0
- package/browser/editor/page/table/aligns.mjs +29 -0
- package/browser/editor/page/table/cell-bar.mjs +138 -0
- package/browser/editor/page/table/cells.mjs +527 -0
- package/browser/editor/page/table/icons.mjs +40 -0
- package/browser/editor/page/table/index.mjs +985 -0
- package/browser/editor/page/table/lists.mjs +187 -0
- package/browser/editor/page/table/widths.mjs +308 -0
- package/browser/editor/page/tex.mjs +32 -0
- package/browser/editor/page/text-select/index.mjs +656 -0
- package/browser/editor/page/tooltip.mjs +98 -0
- package/browser/editor/page/type-grid.mjs +82 -0
- package/browser/editor/page/typing/code-edges.mjs +228 -0
- package/browser/editor/page/typing/index.mjs +276 -0
- package/browser/editor/page/typing/leave.mjs +68 -0
- package/browser/editor/page/ui.mjs +160 -0
- package/browser/shared/annotations.mjs +571 -0
- package/browser/shared/code-folds.mjs +10 -0
- package/browser/shared/code-languages.mjs +70 -0
- package/browser/shared/code-lines.mjs +30 -0
- package/browser/shared/colors.mjs +28 -0
- package/browser/shared/component-catalog.mjs +559 -0
- package/browser/shared/components/bookmark.mjs +26 -0
- package/browser/shared/components/callout.mjs +7 -0
- package/browser/shared/components/chart.mjs +20 -0
- package/browser/shared/components/code.mjs +37 -0
- package/browser/shared/components/columns.mjs +16 -0
- package/browser/shared/components/details.mjs +15 -0
- package/browser/shared/components/dialog.mjs +28 -0
- package/browser/shared/components/diff.mjs +18 -0
- package/browser/shared/components/divider.mjs +6 -0
- package/browser/shared/components/embed.mjs +25 -0
- package/browser/shared/components/figure.mjs +14 -0
- package/browser/shared/components/file.mjs +23 -0
- package/browser/shared/components/heading.mjs +6 -0
- package/browser/shared/components/highlight.mjs +9 -0
- package/browser/shared/components/icon.mjs +18 -0
- package/browser/shared/components/image.mjs +39 -0
- package/browser/shared/components/index.mjs +342 -0
- package/browser/shared/components/installed.mjs +162 -0
- package/browser/shared/components/list.mjs +146 -0
- package/browser/shared/components/math.mjs +49 -0
- package/browser/shared/components/mention.mjs +33 -0
- package/browser/shared/components/page.mjs +37 -0
- package/browser/shared/components/paragraph.mjs +9 -0
- package/browser/shared/components/quote.mjs +6 -0
- package/browser/shared/components/section.mjs +8 -0
- package/browser/shared/components/sheets.mjs +80 -0
- package/browser/shared/components/state.mjs +20 -0
- package/browser/shared/components/table.mjs +49 -0
- package/browser/shared/components/text.mjs +14 -0
- package/browser/shared/components/widget.mjs +10 -0
- package/browser/shared/copy-ids.mjs +72 -0
- package/browser/shared/css-references.mjs +110 -0
- package/browser/shared/emoji/custom.mjs +91 -0
- package/browser/shared/emoji/data/LICENSE-mingcute.txt +202 -0
- package/browser/shared/emoji/data/LICENSE-tabler.txt +21 -0
- package/browser/shared/emoji/data/README.md +26 -0
- package/browser/shared/emoji/data/categories.json +1 -0
- package/browser/shared/emoji/data/icons.json +1 -0
- package/browser/shared/emoji/data/keywords-en.json +1 -0
- package/browser/shared/emoji/data/keywords-zh.json +1 -0
- package/browser/shared/emoji/data/names.json +1 -0
- package/browser/shared/emoji/data/positions.json +1 -0
- package/browser/shared/emoji/data/twemoji-index.json +1 -0
- package/browser/shared/emoji/data/twemoji-svg.bin +0 -0
- package/browser/shared/emoji/data.mjs +196 -0
- package/browser/shared/emoji/emoji.mjs +37 -0
- package/browser/shared/emoji/glyphs.mjs +134 -0
- package/browser/shared/emoji/icon-value.mjs +90 -0
- package/browser/shared/escape.mjs +20 -0
- package/browser/shared/export-wrap.mjs +89 -0
- package/browser/shared/files.mjs +33 -0
- package/browser/shared/html-tree.mjs +53 -0
- package/browser/shared/http.mjs +22 -0
- package/browser/shared/i18n/en.mjs +1164 -0
- package/browser/shared/i18n/index.mjs +132 -0
- package/browser/shared/ids.mjs +24 -0
- package/browser/shared/import-types.mjs +23 -0
- package/browser/shared/inline-spacing.mjs +97 -0
- package/browser/shared/layers.mjs +42 -0
- package/browser/shared/media.mjs +162 -0
- package/browser/shared/new-names.mjs +64 -0
- package/browser/shared/number-reading.mjs +92 -0
- package/browser/shared/old-names.mjs +143 -0
- package/browser/shared/page-address.mjs +140 -0
- package/browser/shared/page-links.mjs +86 -0
- package/browser/shared/paths.mjs +73 -0
- package/browser/shared/preferences.mjs +110 -0
- package/browser/shared/preview-server.mjs +247 -0
- package/browser/shared/qa-levels.mjs +93 -0
- package/browser/shared/reading-place.mjs +91 -0
- package/browser/shared/renamed-storage.mjs +220 -0
- package/browser/shared/reports.mjs +46 -0
- package/browser/shared/search.mjs +85 -0
- package/browser/shared/session.mjs +76 -0
- package/browser/shared/table-chart.mjs +113 -0
- package/browser/shared/table-hides.mjs +120 -0
- package/browser/shared/table-slots.mjs +75 -0
- package/browser/shared/words.mjs +23 -0
- package/browser/shared/workspace.mjs +535 -0
- package/browser/shared/writing-preferences.mjs +68 -0
- package/browser/shared/zoom.mjs +57 -0
- package/dist/chunk-2B5E4CDJ.mjs +2 -0
- package/dist/chunk-2PBALTR3.mjs +57 -0
- package/dist/chunk-342HXE3Q.mjs +2 -0
- package/dist/chunk-3LA3EMDE.mjs +15 -0
- package/dist/chunk-43B75J5T.mjs +2 -0
- package/dist/chunk-4K5KC6V2.mjs +2 -0
- package/dist/chunk-5FRMCDPY.mjs +16 -0
- package/dist/chunk-5L7RYZCL.mjs +2 -0
- package/dist/chunk-5LEK2CBS.mjs +2 -0
- package/dist/chunk-5OFN5AHC.mjs +2 -0
- package/dist/chunk-5SIYS5HN.mjs +2 -0
- package/dist/chunk-5TEK3RAD.mjs +2 -0
- package/dist/chunk-6CYG3Z4V.mjs +2 -0
- package/dist/chunk-6U2SLSDN.mjs +3 -0
- package/dist/chunk-742D2WWJ.mjs +19 -0
- package/dist/chunk-7GHT2UCA.mjs +15 -0
- package/dist/chunk-7QQBR7PB.mjs +2 -0
- package/dist/chunk-A55HN5OK.mjs +2 -0
- package/dist/chunk-ACOPDCNB.mjs +2 -0
- package/dist/chunk-AGDILNWB.mjs +2 -0
- package/dist/chunk-ATCJYAR4.mjs +2 -0
- package/dist/chunk-B3VTYBYR.mjs +960 -0
- package/dist/chunk-C564NU2H.mjs +77 -0
- package/dist/chunk-C7HWOBIF.mjs +2 -0
- package/dist/chunk-DB4WKGYF.mjs +7 -0
- package/dist/chunk-E7VYDG2X.mjs +2 -0
- package/dist/chunk-EUX7IC5J.mjs +48 -0
- package/dist/chunk-EVJ3BX3M.mjs +2 -0
- package/dist/chunk-EZY3WC6Z.mjs +15 -0
- package/dist/chunk-FQGQH4KM.mjs +2 -0
- package/dist/chunk-G7TOXONE.mjs +6 -0
- package/dist/chunk-GPF4YWWB.mjs +9 -0
- package/dist/chunk-GRAXKKG4.mjs +2 -0
- package/dist/chunk-GYQV7Y4J.mjs +120 -0
- package/dist/chunk-HMHK3EQ6.mjs +2 -0
- package/dist/chunk-HQQMJCQJ.mjs +10 -0
- package/dist/chunk-HYMEEXKN.mjs +4 -0
- package/dist/chunk-IERUOGC3.mjs +6 -0
- package/dist/chunk-ITNLYXXV.mjs +3 -0
- package/dist/chunk-L4DVONOG.mjs +2 -0
- package/dist/chunk-LAE5NQ4B.mjs +2 -0
- package/dist/chunk-LC7YNQFG.mjs +2 -0
- package/dist/chunk-LHTFLRB6.mjs +4 -0
- package/dist/chunk-LKX55H76.mjs +2 -0
- package/dist/chunk-MAFIGVXY.mjs +2 -0
- package/dist/chunk-NFIBI4IP.mjs +26 -0
- package/dist/chunk-NSKUTQ5J.mjs +5 -0
- package/dist/chunk-O52JMOCZ.mjs +2 -0
- package/dist/chunk-P2CAZPDP.mjs +3 -0
- package/dist/chunk-QAIHRH3I.mjs +13 -0
- package/dist/chunk-QMQUXTU4.mjs +12 -0
- package/dist/chunk-QR6A54KJ.mjs +3 -0
- package/dist/chunk-QVWVFC5K.mjs +6 -0
- package/dist/chunk-QYKCJ7FG.mjs +8 -0
- package/dist/chunk-QZY6Q64C.mjs +2 -0
- package/dist/chunk-TDQP3DKQ.mjs +10 -0
- package/dist/chunk-TMYZB6AV.mjs +2 -0
- package/dist/chunk-TX6JH7TR.mjs +2 -0
- package/dist/chunk-U3SSPL4K.mjs +8 -0
- package/dist/chunk-UH4SIXTR.mjs +2 -0
- package/dist/chunk-UNUEWH4S.mjs +2 -0
- package/dist/chunk-UXUK4PMC.mjs +27 -0
- package/dist/chunk-V4CPWKMZ.mjs +2 -0
- package/dist/chunk-V6XZ4VIR.mjs +2 -0
- package/dist/chunk-VACRB2NE.mjs +3 -0
- package/dist/chunk-W63L7367.mjs +7 -0
- package/dist/chunk-W7CXPCRV.mjs +6 -0
- package/dist/chunk-W7XHE4CT.mjs +2 -0
- package/dist/chunk-XINNG4F2.mjs +4 -0
- package/dist/chunk-Y34NR5JL.mjs +2 -0
- package/dist/chunk-YEY3RSFQ.mjs +2 -0
- package/dist/chunk-YL2DPWVS.mjs +4 -0
- package/dist/chunk-YXAUQPVK.mjs +8 -0
- package/dist/chunk-YZ5Z6H4W.mjs +4 -0
- package/dist/chunk-Z52HTUW7.mjs +4 -0
- package/dist/chunk-ZBIM6ARY.mjs +216 -0
- package/dist/cli.mjs +2 -0
- package/dist/server.mjs +2 -0
- package/dist/worker.mjs +5 -0
- package/kit/charts.js +355 -0
- package/kit/code.js +164 -0
- package/kit/dialogs.js +157 -0
- package/kit/math.js +1988 -0
- package/kit/report.css +2821 -0
- package/kit/runtime.js +1707 -0
- package/kit/sheets.js +123 -0
- package/kit/state.js +217 -0
- package/kit/tables.js +1449 -0
- package/kit/tokens.js +29 -0
- package/kit/ui.js +561 -0
- package/package.json +41 -4
- package/release.json +25 -0
- package/sdk/column-widths.d.ts +56 -0
- package/sdk/doc-charts.d.ts +82 -0
- package/sdk/doc-code.d.ts +28 -0
- package/sdk/doc-dialogs.d.ts +4 -0
- package/sdk/doc-kit.d.ts +141 -0
- package/sdk/doc-math.d.ts +3 -0
- package/sdk/doc-sheets.d.ts +15 -0
- package/sdk/doc-state.d.ts +41 -0
- package/sdk/doc-tables.d.ts +24 -0
- package/sdk/doc-tokens.d.ts +22 -0
- package/sdk/index.d.ts +30 -0
- package/skill/SKILL.md +138 -0
- package/skill/agents/openai.yaml +5 -0
- package/skill/references/building-components.md +327 -0
- package/skill/references/example-report.html +356 -0
- package/skill/references/writing-html.md +187 -0
- package/skill/sdk/column-widths.d.ts +56 -0
- package/skill/sdk/doc-charts.d.ts +82 -0
- package/skill/sdk/doc-code.d.ts +28 -0
- package/skill/sdk/doc-dialogs.d.ts +4 -0
- package/skill/sdk/doc-kit.d.ts +141 -0
- package/skill/sdk/doc-math.d.ts +3 -0
- package/skill/sdk/doc-sheets.d.ts +15 -0
- package/skill/sdk/doc-state.d.ts +41 -0
- package/skill/sdk/doc-tables.d.ts +24 -0
- package/skill/sdk/doc-tokens.d.ts +22 -0
- package/skill/sdk/index.d.ts +30 -0
- package/starter/doc.html +21 -0
- package/starter/doc.json +5 -0
- package/vendor/d3.v7.9.0.min.js +2 -0
- package/vendor/katex/auto-render.min.js +1 -0
- package/vendor/katex/contrib/mhchem.min.js +1 -0
- package/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/vendor/katex/katex.min.css +1 -0
- package/vendor/katex/katex.min.js +1 -0
- package/vendor/pdfjs/LICENSE +177 -0
- package/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
- package/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
- package/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
- package/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
- package/vendor/pdfjs/cmaps/LICENSE +36 -0
- package/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
- package/vendor/pdfjs/legacy/build/pdf.min.mjs +27 -0
- package/vendor/pdfjs/legacy/build/pdf.worker.min.mjs +27 -0
- package/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
- package/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +363 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
- package/vendor/types/@types/d3/LICENSE +21 -0
- package/vendor/types/@types/d3/index.d.ts +39 -0
- package/vendor/types/@types/d3/package.json +81 -0
- package/vendor/types/@types/d3-array/LICENSE +21 -0
- package/vendor/types/@types/d3-array/index.d.ts +1118 -0
- package/vendor/types/@types/d3-array/package.json +56 -0
- package/vendor/types/@types/d3-axis/LICENSE +21 -0
- package/vendor/types/@types/d3-axis/index.d.ts +293 -0
- package/vendor/types/@types/d3-axis/package.json +47 -0
- package/vendor/types/@types/d3-brush/LICENSE +21 -0
- package/vendor/types/@types/d3-brush/index.d.ts +255 -0
- package/vendor/types/@types/d3-brush/package.json +42 -0
- package/vendor/types/@types/d3-chord/LICENSE +21 -0
- package/vendor/types/@types/d3-chord/index.d.ts +471 -0
- package/vendor/types/@types/d3-chord/package.json +40 -0
- package/vendor/types/@types/d3-color/LICENSE +21 -0
- package/vendor/types/@types/d3-color/index.d.ts +669 -0
- package/vendor/types/@types/d3-color/package.json +55 -0
- package/vendor/types/@types/d3-contour/LICENSE +21 -0
- package/vendor/types/@types/d3-contour/index.d.ts +222 -0
- package/vendor/types/@types/d3-contour/package.json +38 -0
- package/vendor/types/@types/d3-delaunay/LICENSE +21 -0
- package/vendor/types/@types/d3-delaunay/index.d.ts +316 -0
- package/vendor/types/@types/d3-delaunay/package.json +30 -0
- package/vendor/types/@types/d3-dispatch/LICENSE +21 -0
- package/vendor/types/@types/d3-dispatch/index.d.ts +96 -0
- package/vendor/types/@types/d3-dispatch/package.json +51 -0
- package/vendor/types/@types/d3-drag/LICENSE +21 -0
- package/vendor/types/@types/d3-drag/index.d.ts +395 -0
- package/vendor/types/@types/d3-drag/package.json +42 -0
- package/vendor/types/@types/d3-dsv/LICENSE +21 -0
- package/vendor/types/@types/d3-dsv/index.d.ts +482 -0
- package/vendor/types/@types/d3-dsv/package.json +45 -0
- package/vendor/types/@types/d3-ease/LICENSE +21 -0
- package/vendor/types/@types/d3-ease/index.d.ts +316 -0
- package/vendor/types/@types/d3-ease/package.json +40 -0
- package/vendor/types/@types/d3-fetch/LICENSE +21 -0
- package/vendor/types/@types/d3-fetch/index.d.ts +282 -0
- package/vendor/types/@types/d3-fetch/package.json +37 -0
- package/vendor/types/@types/d3-force/LICENSE +21 -0
- package/vendor/types/@types/d3-force/index.d.ts +899 -0
- package/vendor/types/@types/d3-force/package.json +45 -0
- package/vendor/types/@types/d3-format/LICENSE +21 -0
- package/vendor/types/@types/d3-format/index.d.ts +337 -0
- package/vendor/types/@types/d3-format/package.json +45 -0
- package/vendor/types/@types/d3-geo/LICENSE +21 -0
- package/vendor/types/@types/d3-geo/index.d.ts +1371 -0
- package/vendor/types/@types/d3-geo/package.json +48 -0
- package/vendor/types/@types/d3-hierarchy/LICENSE +21 -0
- package/vendor/types/@types/d3-hierarchy/index.d.ts +928 -0
- package/vendor/types/@types/d3-hierarchy/package.json +50 -0
- package/vendor/types/@types/d3-interpolate/LICENSE +21 -0
- package/vendor/types/@types/d3-interpolate/index.d.ts +387 -0
- package/vendor/types/@types/d3-interpolate/package.json +47 -0
- package/vendor/types/@types/d3-path/LICENSE +21 -0
- package/vendor/types/@types/d3-path/index.d.ts +108 -0
- package/vendor/types/@types/d3-path/package.json +41 -0
- package/vendor/types/@types/d3-polygon/LICENSE +21 -0
- package/vendor/types/@types/d3-polygon/index.d.ts +41 -0
- package/vendor/types/@types/d3-polygon/package.json +40 -0
- package/vendor/types/@types/d3-quadtree/LICENSE +21 -0
- package/vendor/types/@types/d3-quadtree/index.d.ts +204 -0
- package/vendor/types/@types/d3-quadtree/package.json +45 -0
- package/vendor/types/@types/d3-random/LICENSE +21 -0
- package/vendor/types/@types/d3-random/index.d.ts +313 -0
- package/vendor/types/@types/d3-random/package.json +41 -0
- package/vendor/types/@types/d3-scale/LICENSE +21 -0
- package/vendor/types/@types/d3-scale/index.d.ts +2669 -0
- package/vendor/types/@types/d3-scale/package.json +53 -0
- package/vendor/types/@types/d3-scale-chromatic/LICENSE +21 -0
- package/vendor/types/@types/d3-scale-chromatic/index.d.ts +520 -0
- package/vendor/types/@types/d3-scale-chromatic/package.json +46 -0
- package/vendor/types/@types/d3-selection/LICENSE +21 -0
- package/vendor/types/@types/d3-selection/index.d.ts +1210 -0
- package/vendor/types/@types/d3-selection/package.json +56 -0
- package/vendor/types/@types/d3-shape/LICENSE +21 -0
- package/vendor/types/@types/d3-shape/index.d.ts +2792 -0
- package/vendor/types/@types/d3-shape/package.json +53 -0
- package/vendor/types/@types/d3-time/LICENSE +21 -0
- package/vendor/types/@types/d3-time/index.d.ts +697 -0
- package/vendor/types/@types/d3-time/package.json +46 -0
- package/vendor/types/@types/d3-time-format/LICENSE +21 -0
- package/vendor/types/@types/d3-time-format/index.d.ts +202 -0
- package/vendor/types/@types/d3-time-format/package.json +40 -0
- package/vendor/types/@types/d3-timer/LICENSE +21 -0
- package/vendor/types/@types/d3-timer/index.d.ts +68 -0
- package/vendor/types/@types/d3-timer/package.json +45 -0
- package/vendor/types/@types/d3-transition/LICENSE +21 -0
- package/vendor/types/@types/d3-transition/index.d.ts +664 -0
- package/vendor/types/@types/d3-transition/package.json +47 -0
- package/vendor/types/@types/d3-zoom/LICENSE +21 -0
- package/vendor/types/@types/d3-zoom/index.d.ts +611 -0
- package/vendor/types/@types/d3-zoom/package.json +48 -0
- package/vendor/types/@types/geojson/LICENSE +21 -0
- package/vendor/types/@types/geojson/index.d.ts +202 -0
- package/vendor/types/@types/geojson/package.json +46 -0
- package/vendor/typescript/LICENSE.txt +55 -0
- package/vendor/typescript/lib.decorators.d.ts +384 -0
- package/vendor/typescript/lib.decorators.legacy.d.ts +22 -0
- package/vendor/typescript/lib.dom.d.ts +39429 -0
- package/vendor/typescript/lib.dom.iterable.d.ts +571 -0
- package/vendor/typescript/lib.es2015.collection.d.ts +147 -0
- package/vendor/typescript/lib.es2015.core.d.ts +597 -0
- package/vendor/typescript/lib.es2015.d.ts +28 -0
- package/vendor/typescript/lib.es2015.generator.d.ts +77 -0
- package/vendor/typescript/lib.es2015.iterable.d.ts +605 -0
- package/vendor/typescript/lib.es2015.promise.d.ts +81 -0
- package/vendor/typescript/lib.es2015.proxy.d.ts +128 -0
- package/vendor/typescript/lib.es2015.reflect.d.ts +144 -0
- package/vendor/typescript/lib.es2015.symbol.d.ts +46 -0
- package/vendor/typescript/lib.es2015.symbol.wellknown.d.ts +326 -0
- package/vendor/typescript/lib.es2016.array.include.d.ts +116 -0
- package/vendor/typescript/lib.es2016.d.ts +21 -0
- package/vendor/typescript/lib.es2016.intl.d.ts +31 -0
- package/vendor/typescript/lib.es2017.arraybuffer.d.ts +21 -0
- package/vendor/typescript/lib.es2017.d.ts +26 -0
- package/vendor/typescript/lib.es2017.date.d.ts +31 -0
- package/vendor/typescript/lib.es2017.intl.d.ts +44 -0
- package/vendor/typescript/lib.es2017.object.d.ts +49 -0
- package/vendor/typescript/lib.es2017.sharedmemory.d.ts +135 -0
- package/vendor/typescript/lib.es2017.string.d.ts +45 -0
- package/vendor/typescript/lib.es2017.typedarrays.d.ts +53 -0
- package/vendor/typescript/lib.es2018.asyncgenerator.d.ts +77 -0
- package/vendor/typescript/lib.es2018.asynciterable.d.ts +53 -0
- package/vendor/typescript/lib.es2018.d.ts +24 -0
- package/vendor/typescript/lib.es2018.intl.d.ts +83 -0
- package/vendor/typescript/lib.es2018.promise.d.ts +30 -0
- package/vendor/typescript/lib.es2018.regexp.d.ts +37 -0
- package/vendor/typescript/lib.es2019.array.d.ts +79 -0
- package/vendor/typescript/lib.es2019.d.ts +24 -0
- package/vendor/typescript/lib.es2019.intl.d.ts +23 -0
- package/vendor/typescript/lib.es2019.object.d.ts +33 -0
- package/vendor/typescript/lib.es2019.string.d.ts +37 -0
- package/vendor/typescript/lib.es2019.symbol.d.ts +24 -0
- package/vendor/typescript/lib.es2020.bigint.d.ts +765 -0
- package/vendor/typescript/lib.es2020.d.ts +27 -0
- package/vendor/typescript/lib.es2020.date.d.ts +42 -0
- package/vendor/typescript/lib.es2020.intl.d.ts +474 -0
- package/vendor/typescript/lib.es2020.number.d.ts +28 -0
- package/vendor/typescript/lib.es2020.promise.d.ts +47 -0
- package/vendor/typescript/lib.es2020.sharedmemory.d.ts +99 -0
- package/vendor/typescript/lib.es2020.string.d.ts +44 -0
- package/vendor/typescript/lib.es2020.symbol.wellknown.d.ts +41 -0
- package/vendor/typescript/lib.es2021.d.ts +23 -0
- package/vendor/typescript/lib.es2021.intl.d.ts +166 -0
- package/vendor/typescript/lib.es2021.promise.d.ts +48 -0
- package/vendor/typescript/lib.es2021.string.d.ts +33 -0
- package/vendor/typescript/lib.es2021.weakref.d.ts +78 -0
- package/vendor/typescript/lib.es2022.array.d.ts +121 -0
- package/vendor/typescript/lib.es2022.d.ts +25 -0
- package/vendor/typescript/lib.es2022.error.d.ts +75 -0
- package/vendor/typescript/lib.es2022.intl.d.ts +145 -0
- package/vendor/typescript/lib.es2022.object.d.ts +26 -0
- package/vendor/typescript/lib.es2022.regexp.d.ts +39 -0
- package/vendor/typescript/lib.es2022.string.d.ts +25 -0
- package/vendor/typescript/lib.es5.d.ts +4601 -0
- package/vendor/typescript/package.json +4 -0
- package/vendor/typescript/typescript.js +446 -0
- package/web/assets/index-B6Ai3wsa.js +13 -0
- package/web/assets/index-SYPC3EZy.css +1 -0
- package/web/index.html +14 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { iconUrl } from "../../../shared/emoji/icon-value.mjs";
|
|
2
|
+
import { escapeAttribute } from "../../../shared/escape.mjs";
|
|
3
|
+
import { addressOn, decoded, hashAddress } from "../../../shared/page-address.mjs";
|
|
4
|
+
import { inTrash, namedLinks, pageLink, pageLinks } from "../../../shared/page-links.mjs";
|
|
5
|
+
import { PAGE_ICON } from "../../components/icons.mjs";
|
|
6
|
+
|
|
7
|
+
// The documents of the workspace, as a link's card, a page block's box and "@" look for them
|
|
8
|
+
// (docs/editor.md, "Links"): one search for the three. The list is read once for each opening from
|
|
9
|
+
// what the workbench reads itself (GET /__gallery/workspace/outline: no route of its own, nothing
|
|
10
|
+
// pushed), in the sidebar's order, each document with the title of the one above it in the sidebar; 写作偏好
|
|
11
|
+
// is no page to link to, and this page has the title it shows now, not the one last saved. A list that
|
|
12
|
+
// cannot be read is no results, and the field goes on taking addresses.
|
|
13
|
+
//
|
|
14
|
+
// What a copy writes is an address by a page's link, and a copy cannot wait for an answer: the
|
|
15
|
+
// clipboard takes a write only in the click itself. So the page holds the list ready, the last one
|
|
16
|
+
// read by any of these (holdPages reads one as the page starts, as it gets the focus and as a block's
|
|
17
|
+
// menu opens), and goes by it with the title it shows now (heldList), saved or not. This page has its
|
|
18
|
+
// link whatever the list says. Another page, until the first answer comes, a moment as the page opens,
|
|
19
|
+
// or for as long as the server cannot be reached, goes by its page id, which opens it all the same.
|
|
20
|
+
//
|
|
21
|
+
// A title is matched as it is written, without pinyin: it starts with what is typed, or one of its
|
|
22
|
+
// words does, or it holds it, or it holds its characters in their order (what makes it fuzzy), and
|
|
23
|
+
// within each of those the sidebar's order stands. No words typed is the sidebar's order.
|
|
24
|
+
|
|
25
|
+
const OUTLINE = "/__gallery/workspace/outline";
|
|
26
|
+
const TRASH = "/__gallery/workspace/trash";
|
|
27
|
+
const MOST = 6; // rows of a search
|
|
28
|
+
|
|
29
|
+
let held = null; // the list as last read
|
|
30
|
+
let shown = () => null; // this page, as readPages takes it
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The workspace's documents: { pages: [{ slug, title, icon, parent }] (`parent`: the title of the one
|
|
34
|
+
* it is under, or null), links: their links (shared/page-links.mjs), trash: what the trash holds }, or
|
|
35
|
+
* null when the list cannot be read. `own`: this page, { slug, title } as it shows it.
|
|
36
|
+
*/
|
|
37
|
+
export async function readPages(own = null) {
|
|
38
|
+
const listed = await fetch(OUTLINE).then((answer) => answer.json()).catch(() => null);
|
|
39
|
+
if (!listed?.reports) return null;
|
|
40
|
+
const titleOf = (slug) => (slug === own?.slug && own.title ? own.title : listed.reports[slug]?.title);
|
|
41
|
+
const pages = [];
|
|
42
|
+
const walk = (parent) => {
|
|
43
|
+
for (const slug of listed.outline?.children?.[parent] ?? []) {
|
|
44
|
+
if (!listed.reports[slug] || listed.reports[slug].instructions) continue;
|
|
45
|
+
pages.push({ slug, title: titleOf(slug) || slug, icon: listed.reports[slug].icon ?? null, parent: parent ? titleOf(parent) || parent : null });
|
|
46
|
+
walk(slug);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
walk("");
|
|
50
|
+
held = { pages, links: pageLinks(pages.map(({ slug }) => ({ slug, title: titleOf(slug) }))), trash: listed.trash ?? [] };
|
|
51
|
+
return held;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Read the list for what cannot wait for it. `own`: what readPages takes of this page, asked for each time, as its title may be changing. */
|
|
55
|
+
export function holdPages(own) {
|
|
56
|
+
shown = own;
|
|
57
|
+
readPages(own());
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** The list held, as a list readPages gives it with `named` (shared/page-links.mjs namedLinks) and this page by the title it shows now: with no list read yet, its link and no pages. */
|
|
61
|
+
export function heldList() {
|
|
62
|
+
const { slug, title } = shown() ?? {};
|
|
63
|
+
const pages = (held?.pages ?? []).map((page) => (page.slug === slug && title ? { ...page, title } : page));
|
|
64
|
+
const links = new Map(held?.links);
|
|
65
|
+
if (title) links.set(slug, pageLink({ slug, title }));
|
|
66
|
+
const trash = held?.trash ?? [];
|
|
67
|
+
return { pages, links, trash, named: namedLinks(links, trash) };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Whether document `slug` is in the workspace's trash (not when the trash cannot be read). */
|
|
71
|
+
export async function trashed(slug) {
|
|
72
|
+
const listed = await fetch(TRASH).then((answer) => answer.json()).catch(() => null);
|
|
73
|
+
return inTrash(listed?.entries ?? [], slug);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const LETTER = /[\p{L}\p{M}\p{N}]/u;
|
|
77
|
+
|
|
78
|
+
// Whether a word of `title` starts with `query`: somewhere it stands with no letter or number before it.
|
|
79
|
+
function startsWord(title, query) {
|
|
80
|
+
for (let at = title.indexOf(query); at >= 0; at = title.indexOf(query, at + 1)) if (at === 0 || !LETTER.test(title[at - 1])) return true;
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Whether the characters of `query` stand in `title`, in their order.
|
|
85
|
+
function inOrder(title, query) {
|
|
86
|
+
let at = 0;
|
|
87
|
+
for (const character of query.replace(/\s/g, "")) {
|
|
88
|
+
at = title.indexOf(character, at);
|
|
89
|
+
if (at < 0) return false;
|
|
90
|
+
at += character.length;
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// How well `title` matches `query` (both in lower case), the lower the better; null for not at all.
|
|
96
|
+
function rank(title, query) {
|
|
97
|
+
if (title.startsWith(query)) return 0;
|
|
98
|
+
if (startsWord(title, query)) return 1;
|
|
99
|
+
if (title.includes(query)) return 2;
|
|
100
|
+
return inOrder(title, query) ? 3 : null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** The first of `pages` (readPages) whose titles match `query`, best first; with no words, the first of them. */
|
|
104
|
+
export function findPages(pages, query) {
|
|
105
|
+
const wanted = query.trim().toLowerCase();
|
|
106
|
+
if (!wanted) return pages.slice(0, MOST);
|
|
107
|
+
return pages.map((page) => [page, rank(page.title.toLowerCase(), wanted)]).filter(([, score]) => score !== null).sort((a, b) => a[1] - b[1]).slice(0, MOST).map(([page]) => page);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The page of `list` (readPages) that `text` is the address of, with the block it names: a page's
|
|
112
|
+
* fields and `block`, or null. On top of every form of shared/page-address.mjs, #<link or
|
|
113
|
+
* slug>[/<block id>], what a workbench's hash holds.
|
|
114
|
+
*/
|
|
115
|
+
export function placeIn(list, text) {
|
|
116
|
+
const place = text.startsWith("#") ? hashAddress(decoded(text.slice(1)), list.links) : addressOn(text, list.links, globalThis.location?.origin);
|
|
117
|
+
const page = place && list.pages.find(({ slug }) => slug === place.slug);
|
|
118
|
+
return page ? { ...page, block: place.block } : null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** The title of the page `text` is an address of, of `list` or of its trash, or null: what stands for a link to it where its address would be a folder's. */
|
|
122
|
+
export function titleIn(list, text) {
|
|
123
|
+
const binned = addressOn(text, pageLinks(list.trash), globalThis.location?.origin)?.slug;
|
|
124
|
+
return placeIn(list, text)?.title ?? list.trash.find(({ slug }) => slug === binned)?.title ?? null;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** A page's icon, as markup: by the icon route (each icon its own color), the page's line drawing for one with none. */
|
|
128
|
+
export const pageIcon = ({ icon, slug }) => (icon ? `<img src="${escapeAttribute(iconUrl(icon, slug, { tab: true }))}" alt="" draggable="false">` : PAGE_ICON);
|
|
129
|
+
|
|
130
|
+
/** The pages `found`, as rows of a menu (menu.mjs): each its icon, its title and in gray the page it is under; choose(page) runs for the row chosen. */
|
|
131
|
+
export const pageRows = (found, choose) => found.map((page) => ({ label: page.title, hint: page.parent, long: true, icon: pageIcon(page), run: () => choose(page) }));
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { Z } from "../../../shared/layers.mjs";
|
|
2
|
+
import { can, isMention, mentionOf, newMention, ownHTML } from "../core.mjs";
|
|
3
|
+
import { caretAt, editable, select } from "../caret.mjs";
|
|
4
|
+
import { build } from "../clipboard/own/index.mjs";
|
|
5
|
+
import { createMenu } from "../menu.mjs";
|
|
6
|
+
import { besideText, textAnchor } from "../placement.mjs";
|
|
7
|
+
import { LINK_ICON, PAGE_ICON, svg } from "../../components/icons.mjs";
|
|
8
|
+
import { TYPE_INFO } from "../../components/registry.mjs";
|
|
9
|
+
import { pageOfType } from "../page-objects.mjs";
|
|
10
|
+
import { addStyle, element, mount } from "../ui.mjs";
|
|
11
|
+
import { t } from "../../../shared/i18n/index.mjs";
|
|
12
|
+
import { iconUrl } from "../../../shared/emoji/icon-value.mjs";
|
|
13
|
+
import { elsewhere, fileLink, isPageAddress } from "../../../shared/page-address.mjs";
|
|
14
|
+
|
|
15
|
+
// The views of a link to a web page (docs/editor.md, "Links"), Feishu's (510137 / 390669;
|
|
16
|
+
// feishu-lite link-toolbar.ts, bookmark-views.ts and commands/bookmark.ts), with Notion's link
|
|
17
|
+
// mention as one more:
|
|
18
|
+
// 链接视图 the address as the link's text
|
|
19
|
+
// 标题视图 the page's title as the link's text (a link as any other)
|
|
20
|
+
// 图标视图 the site's icon and the page's title, a whole in the text (a chip, as a formula is:
|
|
21
|
+
// core.mjs newMention; shared/components/mention.mjs)
|
|
22
|
+
// 书签视图 a 网页书签 block in the link's place: the text before it stays in its block, the text
|
|
23
|
+
// after it goes on in a paragraph after the bookmark, a block left empty goes
|
|
24
|
+
// (clipboard/ blocksAt)
|
|
25
|
+
// The link card's view button (index.mjs) and a bookmark's block menu (显示为 ›) switch between them;
|
|
26
|
+
// an address pasted alone, or given to the "/" menu's 链接, is a link of 链接视图 first, with its
|
|
27
|
+
// views offered (offerViews: Feishu's, notion-lite's 粘贴为), 链接视图 highlighted: after a paste
|
|
28
|
+
// 选择视图, where the format bar stands for selected text, after the "/" menu 显示为 at the link's
|
|
29
|
+
// end; Esc, a press elsewhere or typing on closes it, the link staying. Our own address pasted is
|
|
30
|
+
// a link to a document (标题视图, by the document's title from the list of pages, no web page being
|
|
31
|
+
// read) and its 选择视图 offers that or 页面块, a whole in the text as 图标视图 is, of the same element
|
|
32
|
+
// (pageChip): no 链接视图 or 书签视图, which are a web page's. The server reads the page
|
|
33
|
+
// (POST /__gallery/edit/unfurl: only its title for 标题视图; its icon too, kept in the report's
|
|
34
|
+
// folder, for 图标视图; everything for a bookmark), a spinner after the link meanwhile; a page that
|
|
35
|
+
// cannot be read gives its host as the title (飞书: 暂不支持获取该网站的预览信息), a globe for the
|
|
36
|
+
// icon. Titles are cut at 100 characters. Each switch is one undo step. connectViews() gives the
|
|
37
|
+
// views what they need from the editor.
|
|
38
|
+
|
|
39
|
+
const STYLE = `
|
|
40
|
+
/* Placed by left and top, so that it turns about its own middle (a translate with it would swing it round the corner of the window). */
|
|
41
|
+
.ge-link-spin { position: fixed; z-index: ${Z.spin}; width: 12px; height: 12px; box-sizing: border-box; pointer-events: none;
|
|
42
|
+
border: 1.5px solid light-dark(rgb(55 53 47 / 45%), rgb(255 255 255 / 45%)); border-right-color: transparent; border-radius: 50%; animation: ge-link-spin .7s linear infinite; }
|
|
43
|
+
@keyframes ge-link-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
|
|
44
|
+
`;
|
|
45
|
+
|
|
46
|
+
/** The views, in Feishu's order (图标视图 after 标题视图), with their names and icons. */
|
|
47
|
+
export const VIEWS = {
|
|
48
|
+
link: { label: t("链接视图"), icon: LINK_ICON },
|
|
49
|
+
title: { label: t("标题视图"), icon: svg('<path d="M3 10h2.25M8 10h9"/>') },
|
|
50
|
+
icon: { label: t("图标视图"), icon: svg('<circle cx="5.5" cy="10" r="2.5"/><path d="M10.5 10h6.5"/>') },
|
|
51
|
+
bookmark: { label: t("书签视图"), icon: TYPE_INFO.bookmark?.icon },
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** The rows of a link to a document, offered after a paste. */
|
|
55
|
+
const PAGE_VIEWS = {
|
|
56
|
+
title: VIEWS.title,
|
|
57
|
+
chip: { label: t("页面块"), icon: PAGE_ICON },
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const WEB = /^https?:\/\/[^\s"<>]+$/i;
|
|
61
|
+
const TITLE_MAX = 100;
|
|
62
|
+
|
|
63
|
+
let use = null; // { say, recordStep, struct, slug, unfurl(url, parts), assetUrl(path), blocksAt(host, range, made, kinds) }
|
|
64
|
+
|
|
65
|
+
export function connectViews(editor) {
|
|
66
|
+
use = editor;
|
|
67
|
+
addStyle(STYLE);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const hrefOf = (link) => link.getAttribute("href") ?? "";
|
|
71
|
+
|
|
72
|
+
/** Whether a link has views: one to a web page (not a detail card's entry, not an anchor, not a document of the workspace: an address on another server may be another program's, a web page like any). */
|
|
73
|
+
export const hasViews = (link) => WEB.test(hrefOf(link)) && (!isPageAddress(hrefOf(link)) || elsewhere(hrefOf(link), location.origin)) && !link.classList.contains("doc-dialog-trigger");
|
|
74
|
+
|
|
75
|
+
/** Whether a link is a page block: a chip whose address is a document's, not a web page's. */
|
|
76
|
+
export const isPageChip = (link) => isMention(link) && !WEB.test(hrefOf(link));
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The page block of `page` (pages.mjs placeIn): written with the title it has now and an empty icon, as
|
|
80
|
+
* its file holds it, and showing its icon by the icon route as the server draws it.
|
|
81
|
+
*/
|
|
82
|
+
export const pageChip = (page) => newMention(document, { href: fileLink(page, use.slug), title: page.title, drawn: page.icon ? iconUrl(page.icon, page.slug, { tab: true }) : null }, use.assetUrl);
|
|
83
|
+
|
|
84
|
+
/** The view a link is in: a chip is 图标视图; a link whose text is its address 链接视图; else 标题视图. */
|
|
85
|
+
export function viewOf(link) {
|
|
86
|
+
if (isMention(link)) return "icon";
|
|
87
|
+
const href = hrefOf(link);
|
|
88
|
+
const text = link.textContent.trim();
|
|
89
|
+
const plain = (value) => {
|
|
90
|
+
try {
|
|
91
|
+
return decodeURI(value);
|
|
92
|
+
} catch {
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
return text === href || plain(text) === plain(href) || text === href.replace(/^https?:\/\//i, "") ? "link" : "title";
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** The views a link can be switched to where it stands (a bookmark only from a block that splits). */
|
|
100
|
+
export function viewsOf(link) {
|
|
101
|
+
const host = editable(link);
|
|
102
|
+
return Object.keys(VIEWS).filter((view) => view !== "bookmark" || (pageOfType(view)?.fromPage && host && can(host, "split")));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** The host of an address (the address itself when it is none). */
|
|
106
|
+
export const hostOf = (url) => {
|
|
107
|
+
try {
|
|
108
|
+
return new URL(url).hostname || url;
|
|
109
|
+
} catch {
|
|
110
|
+
return url;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/** A page's title for a link: its spaces as one, at most 100 characters (else its host). */
|
|
115
|
+
export function linkTitle(title, href) {
|
|
116
|
+
const characters = [...String(title ?? "").replace(/\s+/g, " ").trim()];
|
|
117
|
+
if (characters.length === 0) return hostOf(href);
|
|
118
|
+
return characters.length > TITLE_MAX ? `${characters.slice(0, TITLE_MAX).join("")}…` : characters.join("");
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ---------- reading the page ----------
|
|
122
|
+
|
|
123
|
+
// A spinner after the link while its page is read (drawn over the page, so no snapshot of the text
|
|
124
|
+
// holds it), only once the reading takes a moment (no flash for a quick answer).
|
|
125
|
+
function spinner(link) {
|
|
126
|
+
const node = mount(element("div", { class: "ge-link-spin", "data-doc-dev": "" }));
|
|
127
|
+
node.style.visibility = "hidden";
|
|
128
|
+
const shown = setTimeout(() => { node.style.visibility = ""; }, 200);
|
|
129
|
+
const place = () => {
|
|
130
|
+
const rect = [...link.getClientRects()].at(-1);
|
|
131
|
+
if (!rect || !link.isConnected) return void (node.style.display = "none");
|
|
132
|
+
node.style.display = "";
|
|
133
|
+
node.style.left = `${Math.round(rect.right + 4)}px`;
|
|
134
|
+
node.style.top = `${Math.round(rect.top + (rect.height - 12) / 2)}px`;
|
|
135
|
+
};
|
|
136
|
+
place();
|
|
137
|
+
addEventListener("scroll", place, { passive: true, capture: true });
|
|
138
|
+
return () => {
|
|
139
|
+
clearTimeout(shown);
|
|
140
|
+
removeEventListener("scroll", place, { capture: true });
|
|
141
|
+
node.remove();
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// What the server read of the page (`parts`: "title", "icon" or "all"); `unread` when it gave
|
|
146
|
+
// nothing (飞书: 暂不支持获取该网站的预览信息), said with the switch.
|
|
147
|
+
async function read(link, href, parts) {
|
|
148
|
+
const stop = spinner(link);
|
|
149
|
+
try {
|
|
150
|
+
const page = await use.unfurl(href, parts);
|
|
151
|
+
return { ...page, unread: !page.title && !page.icon };
|
|
152
|
+
} catch {
|
|
153
|
+
return { title: "", description: "", icon: null, cover: null, unread: true };
|
|
154
|
+
} finally {
|
|
155
|
+
stop();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const UNREAD = t("暂不支持获取该网站的预览信息");
|
|
159
|
+
|
|
160
|
+
// ---------- switching ----------
|
|
161
|
+
|
|
162
|
+
// `next` (made by `make`, or the link itself changed) in the link's place: one undo step. The
|
|
163
|
+
// caret, when it was in the link, goes after it. No space goes beside it (a link shown with its
|
|
164
|
+
// icon stands as the text put it).
|
|
165
|
+
function replace(host, link, make, message) {
|
|
166
|
+
const before = ownHTML(host);
|
|
167
|
+
const next = make();
|
|
168
|
+
if (next !== link) link.replaceWith(next);
|
|
169
|
+
const selection = getSelection();
|
|
170
|
+
if (selection.rangeCount && !selection.getRangeAt(0).startContainer.isConnected) {
|
|
171
|
+
const after = document.createRange();
|
|
172
|
+
after.setStartAfter(next);
|
|
173
|
+
after.collapse(true);
|
|
174
|
+
select(after);
|
|
175
|
+
}
|
|
176
|
+
use.recordStep(host, before);
|
|
177
|
+
use.say(t("{0} · Ctrl+Z 撤销", message));
|
|
178
|
+
return next;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// A plain link to `href` showing `text`.
|
|
182
|
+
function textLink(href, text) {
|
|
183
|
+
const link = document.createElement("a");
|
|
184
|
+
link.setAttribute("href", href);
|
|
185
|
+
link.textContent = text;
|
|
186
|
+
return link;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// A plain link of `text`: the link itself when it is one (its text changed), else a new one.
|
|
190
|
+
const plainLink = (link, href, text) => () => {
|
|
191
|
+
if (isMention(link)) return textLink(href, text);
|
|
192
|
+
link.replaceChildren(text);
|
|
193
|
+
return link;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Show `link` (a link of the text, or a chip) as `view`. Reads the page where the view wants what
|
|
198
|
+
* is not known yet; nothing happens when the link has changed meanwhile.
|
|
199
|
+
*/
|
|
200
|
+
export async function switchView(link, view) {
|
|
201
|
+
const host = editable(link);
|
|
202
|
+
if (!host || !link.isConnected || !hasViews(link)) return;
|
|
203
|
+
const from = viewOf(link);
|
|
204
|
+
if (view === from) return;
|
|
205
|
+
const href = hrefOf(link);
|
|
206
|
+
if (view === "link") return replace(host, link, plainLink(link, href, href), t("已转为链接视图"));
|
|
207
|
+
// A chip's own title, when only that is wanted.
|
|
208
|
+
let page = view === "title" && from === "icon" ? { title: mentionOf(link).title, unread: false } : null;
|
|
209
|
+
if (!page) {
|
|
210
|
+
page = await read(link, href, view === "bookmark" ? "all" : view === "icon" ? "icon" : "title");
|
|
211
|
+
if (!link.isConnected || hrefOf(link) !== href || editable(link) !== host) return;
|
|
212
|
+
}
|
|
213
|
+
const title = linkTitle(page.title, href);
|
|
214
|
+
const said = (done) => (page.unread ? t("{0},{1}", UNREAD, done) : done);
|
|
215
|
+
if (view === "title") return replace(host, link, plainLink(link, href, title), said(page.unread ? t("标题用了网址的域名") : t("已转为标题视图")));
|
|
216
|
+
if (view === "icon") return replace(host, link, () => newMention(document, { href, title, icon: page.icon ?? null }, use.assetUrl), said(page.unread ? t("用了网址的域名") : t("已转为图标视图")));
|
|
217
|
+
const figure = pageOfType(view).fromPage({ url: href, title: page.title ?? "", description: page.description ?? "", icon: page.icon ?? null, cover: page.cover ?? null });
|
|
218
|
+
const range = document.createRange();
|
|
219
|
+
range.selectNode(link);
|
|
220
|
+
if (use.blocksAt(host, range, [figure], ["bookmark"])) use.say(t("{0} · Ctrl+Z 撤销", said(t("已转为网页书签"))), page.unread ? "note" : undefined);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* A link shown with its icon given another address (its card's field): the web page read again, shown
|
|
225
|
+
* so. A document's (`listed`: the page) is a page block; any other address that is no web page's has
|
|
226
|
+
* no icon to read and stays a link of the chip's title.
|
|
227
|
+
*/
|
|
228
|
+
export async function refetch(chip, href, listed = null) {
|
|
229
|
+
const host = editable(chip);
|
|
230
|
+
if (!host) return;
|
|
231
|
+
if (listed) return replace(host, chip, () => pageChip(listed), t("链接:{0}", listed.title));
|
|
232
|
+
if (!WEB.test(href)) return replace(host, chip, () => textLink(href, mentionOf(chip).title), t("链接:{0}", href));
|
|
233
|
+
const page = await read(chip, href, "icon");
|
|
234
|
+
if (!chip.isConnected || editable(chip) !== host) return;
|
|
235
|
+
replace(host, chip, () => newMention(document, { href, title: linkTitle(page.title, href), icon: page.icon ?? null }, use.assetUrl), page.unread ? t("{0},用了网址的域名", UNREAD) : t("链接:{0}", href));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* A bookmark's 显示为 › (its block menu, Feishu's 卡片视图 ▾): its link in the text again, in a
|
|
240
|
+
* paragraph in its place (feishu-lite bookmarkToText), the caret at its end; one undo step.
|
|
241
|
+
*/
|
|
242
|
+
export function bookmarkItems(figure, { href, title, icon }) {
|
|
243
|
+
return Object.entries(VIEWS).map(([view, { label, icon: drawn }]) => ({
|
|
244
|
+
label, icon: drawn, current: view === "bookmark",
|
|
245
|
+
run: () => {
|
|
246
|
+
if (view === "bookmark" || !figure.isConnected || !WEB.test(href)) return;
|
|
247
|
+
const text = linkTitle(title, href);
|
|
248
|
+
const link = view === "icon" ? newMention(document, { href, title: text, icon }, use.assetUrl) : textLink(href, view === "link" ? href : text);
|
|
249
|
+
const paragraph = build(document, { type: "paragraph", html: "" });
|
|
250
|
+
paragraph.append(link);
|
|
251
|
+
const done = use.struct([figure.parentElement], [], () => {
|
|
252
|
+
figure.replaceWith(paragraph);
|
|
253
|
+
return { touched: [paragraph], focus: paragraph, created: [] };
|
|
254
|
+
});
|
|
255
|
+
if (!done) return;
|
|
256
|
+
caretAt(paragraph, "end");
|
|
257
|
+
use.say(t("已转为{0} · Ctrl+Z 撤销", label));
|
|
258
|
+
},
|
|
259
|
+
}));
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// ---------- the menus ----------
|
|
263
|
+
|
|
264
|
+
// One menu for both, made when first needed (the module loads where there is no page too).
|
|
265
|
+
let card = null;
|
|
266
|
+
const menu = () => (card ??= createMenu());
|
|
267
|
+
let offer = null; // { link, keys, press, typed, moved }: a link's views, offered
|
|
268
|
+
|
|
269
|
+
/** The views of `link` as menu items (the card's view button), the current one checked; `done()` runs first. */
|
|
270
|
+
export function viewItems(link, done = () => {}) {
|
|
271
|
+
const current = viewOf(link);
|
|
272
|
+
return viewsOf(link).map((view) => ({
|
|
273
|
+
label: VIEWS[view].label, icon: VIEWS[view].icon, current: view === current,
|
|
274
|
+
run: () => {
|
|
275
|
+
done();
|
|
276
|
+
switchView(link, view);
|
|
277
|
+
},
|
|
278
|
+
}));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// The keys of a views menu: ↑/↓ and Enter in it (Enter with no row highlighted goes on), Esc closes
|
|
282
|
+
// it (`close`); any other key closes it and goes on. On the window, so that they come before the
|
|
283
|
+
// editor's own (on the document).
|
|
284
|
+
const menuKeys = (close) => (event) => {
|
|
285
|
+
if (event.isComposing) return;
|
|
286
|
+
if (!menu().arrow(event)) {
|
|
287
|
+
if (event.key === "Escape") close();
|
|
288
|
+
else if (event.key !== "Enter" || !menu().choose()) {
|
|
289
|
+
if (!["Shift", "Control", "Alt", "Meta"].includes(event.key)) close();
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
event.preventDefault();
|
|
294
|
+
event.stopPropagation();
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
/** The views menu below `rect` (the card's view button); `done()` before a pick, `onClose()` when it goes. */
|
|
298
|
+
export function openViews(link, rect, done, onClose = () => {}) {
|
|
299
|
+
closeOffer();
|
|
300
|
+
const keys = menuKeys(() => card?.close());
|
|
301
|
+
menu().open(viewItems(link, done), rect, {
|
|
302
|
+
label: t("显示为"), width: 168, highlight: false,
|
|
303
|
+
onClose: () => {
|
|
304
|
+
removeEventListener("keydown", keys, true);
|
|
305
|
+
onClose();
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
addEventListener("keydown", keys, true);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export const closeViews = () => card?.close();
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* The views of a link just made of an address alone: `pasted`, 选择视图 where the format bar would
|
|
315
|
+
* stand if its words were selected; else (the "/" menu's 链接) 显示为 at its end. `page`: a link to
|
|
316
|
+
* that document (pages.mjs placeIn), whose views are PAGE_VIEWS.
|
|
317
|
+
*/
|
|
318
|
+
export function offerViews(link, { pasted = false, page = null } = {}) {
|
|
319
|
+
if (!link.isConnected || !(page || hasViews(link))) return;
|
|
320
|
+
closeOffer();
|
|
321
|
+
const end = () => {
|
|
322
|
+
const rect = [...link.getClientRects()].at(-1);
|
|
323
|
+
return rect && { left: rect.right, right: rect.right, top: rect.top, bottom: rect.bottom };
|
|
324
|
+
};
|
|
325
|
+
const rect = end();
|
|
326
|
+
if (!rect) return;
|
|
327
|
+
const label = pasted ? t("选择视图") : t("显示为");
|
|
328
|
+
const words = document.createRange();
|
|
329
|
+
words.selectNodeContents(link);
|
|
330
|
+
const items = [{ title: label }, ...(page ? Object.keys(PAGE_VIEWS) : viewsOf(link)).map((view) => ({
|
|
331
|
+
label: (page ? PAGE_VIEWS : VIEWS)[view].label, icon: (page ? PAGE_VIEWS : VIEWS)[view].icon,
|
|
332
|
+
run: () => {
|
|
333
|
+
closeOffer();
|
|
334
|
+
if (view === "chip") replace(editable(link), link, () => pageChip(page), t("已转为页面块"));
|
|
335
|
+
else if (!page && view !== "link") switchView(link, view);
|
|
336
|
+
},
|
|
337
|
+
}))];
|
|
338
|
+
menu().open(items, rect, { label, width: 200, stand: pasted ? (size) => besideText(textAnchor(words), size) : null, onClose: () => closeOffer() });
|
|
339
|
+
const keys = menuKeys(closeOffer);
|
|
340
|
+
const press = (event) => {
|
|
341
|
+
if (!menu().contains(event.target)) closeOffer();
|
|
342
|
+
};
|
|
343
|
+
// Text typed (an input method's too, which may send no key first) closes it.
|
|
344
|
+
const typed = () => closeOffer();
|
|
345
|
+
// It goes with its link as the page moves, as the format bar goes with its text.
|
|
346
|
+
const moved = () => menu().follow(end());
|
|
347
|
+
addEventListener("keydown", keys, true);
|
|
348
|
+
addEventListener("pointerdown", press, true);
|
|
349
|
+
addEventListener("beforeinput", typed, true);
|
|
350
|
+
addEventListener("scroll", moved, { passive: true, capture: true });
|
|
351
|
+
addEventListener("resize", moved);
|
|
352
|
+
offer = { link, keys, press, typed, moved };
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export function closeOffer() {
|
|
356
|
+
if (!offer) return;
|
|
357
|
+
const { keys, press, typed, moved } = offer;
|
|
358
|
+
offer = null;
|
|
359
|
+
removeEventListener("keydown", keys, true);
|
|
360
|
+
removeEventListener("pointerdown", press, true);
|
|
361
|
+
removeEventListener("beforeinput", typed, true);
|
|
362
|
+
removeEventListener("scroll", moved, { capture: true });
|
|
363
|
+
removeEventListener("resize", moved);
|
|
364
|
+
card?.close();
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** Whether a node is in a views menu; the nodes to keep in the top layer when a dialog opens. */
|
|
368
|
+
export const viewsHold = (target) => Boolean(card?.contains(target));
|
|
369
|
+
export const viewNodes = () => card?.nodes ?? [];
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// What every popup of the editor is painted with, written once: Notion's neutral palette, its blue
|
|
2
|
+
// and its two shadows, light and dark by light-dark() (the page's color-scheme decides). A sheet of
|
|
3
|
+
// `:root` custom properties, put in every document the editor draws in (ui.mjs addStyleTo), so a
|
|
4
|
+
// menu, a card, a bar, a notice reads them wherever it stands and none declares a palette of its
|
|
5
|
+
// own. Values are Notion's own as notion-lite carries them (view/theme/notion-vars.css), which this
|
|
6
|
+
// editor follows; the page's content colors (--doc-*, the kit's tokens.css) are another matter.
|
|
7
|
+
//
|
|
8
|
+
// The blue is two tokens because notion-lite has two, for two jobs: --ge-accent (its
|
|
9
|
+
// --c-bluBacAccPri: a primary button, a switch, a chosen icon) and --ge-focus (its --c-butBluFocRin
|
|
10
|
+
// and --c-inpBluFocRin: the ring round a focused field).
|
|
11
|
+
//
|
|
12
|
+
// Two shadows, because Notion has two surfaces: --ge-shadow, a card standing over the text (the
|
|
13
|
+
// format bar, the formula and link cards, the conflicts, a notice), and --ge-shadow-pop, a menu
|
|
14
|
+
// (Notion's large outer shadow). The emoji picker (emoji-picker/support.mjs) carries notion-lite's
|
|
15
|
+
// own --c-* variables, taken over as they are.
|
|
16
|
+
|
|
17
|
+
export const TOKENS = `
|
|
18
|
+
:root {
|
|
19
|
+
--ge-tx: light-dark(#2c2c2b, #f0efed);
|
|
20
|
+
--ge-tx2: light-dark(#7d7a75, #ada9a3);
|
|
21
|
+
--ge-tx3: light-dark(#a19e99, #7d7a75);
|
|
22
|
+
--ge-ico: light-dark(#383836, #e6e5e3);
|
|
23
|
+
--ge-ico2: light-dark(#8e8b86, #ada9a3);
|
|
24
|
+
/* The quietest icon gray (notion-lite's --c-icoTer): the block handle's dots, its bar and its +. */
|
|
25
|
+
--ge-ico3: light-dark(#ada9a3, #7d7a75);
|
|
26
|
+
--ge-bg: light-dark(#ffffff, #252525);
|
|
27
|
+
--ge-field: light-dark(rgb(66 35 3 / 3%), rgb(252 252 252 / 3%));
|
|
28
|
+
--ge-hover: light-dark(rgb(33 27 23 / 5%), rgb(255 255 255 / 5.5%));
|
|
29
|
+
--ge-press: light-dark(rgb(33 27 23 / 10%), rgb(255 255 255 / 11%));
|
|
30
|
+
--ge-line: light-dark(rgb(42 28 0 / 7%), rgb(255 255 243 / 8.2%));
|
|
31
|
+
--ge-edge: light-dark(rgb(28 19 1 / 11%), rgb(255 255 235 / 10%));
|
|
32
|
+
--ge-outline: light-dark(rgb(42 28 0 / 7%), #383836);
|
|
33
|
+
--ge-line-strong: light-dark(rgb(42 28 0 / 14%), rgb(255 255 243 / 14%));
|
|
34
|
+
--ge-accent: #2783de;
|
|
35
|
+
--ge-accent-hover: #3d93e8;
|
|
36
|
+
--ge-accent-press: #55a2ec;
|
|
37
|
+
--ge-accent-text: light-dark(#2783de, #5e9fe8);
|
|
38
|
+
--ge-focus: #2383e2;
|
|
39
|
+
--ge-red: light-dark(#eb5757, #ff6b6b);
|
|
40
|
+
--ge-quote: light-dark(rgb(28 19 1 / 16%), rgb(255 255 235 / 16%));
|
|
41
|
+
--ge-fill: light-dark(rgb(35 131 226 / 14%), rgb(35 131 226 / 28%));
|
|
42
|
+
--ge-halo: rgb(35 131 226 / 14%);
|
|
43
|
+
--ge-select: light-dark(rgb(35 131 226 / 28%), rgb(35 131 226 / 45%));
|
|
44
|
+
/* The same blue as a strip blended over the page (text-select/: multiplied on a light page, screened on a dark one), so the text under it keeps its color. */
|
|
45
|
+
--ge-select-strip: light-dark(rgb(193 220 247), rgb(5 53 100));
|
|
46
|
+
--ge-shadow: 0 20px 24px 0 light-dark(rgb(25 25 25 / 5%), transparent), 0 5px 8px 0 light-dark(rgb(25 25 25 / 2.7%), transparent), 0 0 0 1px var(--ge-outline),
|
|
47
|
+
0 14px 28px -6px light-dark(transparent, rgb(25 25 25 / 20%)), 0 2px 4px -1px light-dark(transparent, rgb(25 25 25 / 11.8%));
|
|
48
|
+
--ge-shadow-pop: 0 20px 24px 0 light-dark(rgb(25 25 25 / 5%), rgb(25 25 25 / 20%)), 0 5px 8px 0 light-dark(rgb(25 25 25 / 2.7%), rgb(25 25 25 / 10.8%)), 0 0 0 1px var(--ge-outline);
|
|
49
|
+
--ge-tip-bg: #2c2c2b;
|
|
50
|
+
--ge-tip-tx: #f0efed;
|
|
51
|
+
--ge-tip-tx2: #ada9a3;
|
|
52
|
+
--ge-tip-shadow: 0 4px 12px -2px rgb(0 0 0 / 8%), inset 0 0 0 1px rgb(255 255 255 / 5%);
|
|
53
|
+
--ge-toast-bg: light-dark(#0f0f0f, #2f2f2f);
|
|
54
|
+
/* The quiet gray a heading is lit with for a moment when the outline goes to it (outline/), never a blue. */
|
|
55
|
+
--ge-outline-flash: light-dark(rgb(33 27 23 / 7%), rgb(255 255 255 / 8%));
|
|
56
|
+
/* 批注 (annotate/): a warm mark on the words an annotation is about, its 2px underline leading (a faint fill, so it is never
|
|
57
|
+
taken for the report's own yellow background), a block anchor's bar; stronger for the one shown. */
|
|
58
|
+
--ge-note: light-dark(rgb(255 212 0 / 6%), rgb(255 212 0 / 6%));
|
|
59
|
+
--ge-note-line: light-dark(rgb(232 174 0 / 55%), rgb(255 204 64 / 42%));
|
|
60
|
+
--ge-note-hot: light-dark(rgb(255 212 0 / 34%), rgb(255 212 0 / 24%));
|
|
61
|
+
--ge-note-hot-line: light-dark(rgb(222 160 0 / 90%), rgb(255 204 64 / 80%));
|
|
62
|
+
/* A card of 批注 in the margin under the pointer (notion-lite's --c-hovMarDisBac): a shade of the page. */
|
|
63
|
+
--ge-note-shade: light-dark(#f9f9f8, #202020);
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// What a structural change on the page made: the containers it created, whose child lists undo
|
|
2
|
+
// records too (editor.mjs `struct`), and the text block that holds the text now (the focus).
|
|
3
|
+
// Conversions (convert.mjs) and the components' own changes (a new section, an indented list item,
|
|
4
|
+
// a paragraph leaving a panel) collect them here and return done(focus): { focus, created }.
|
|
5
|
+
|
|
6
|
+
let created = [];
|
|
7
|
+
|
|
8
|
+
/** A change begins: nothing made yet. */
|
|
9
|
+
export const begin = () => {
|
|
10
|
+
created = [];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/** A container the change made. */
|
|
14
|
+
export const made = (node) => {
|
|
15
|
+
created.push(node);
|
|
16
|
+
return node;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** The change is done: { focus, created }. */
|
|
20
|
+
export const done = (focus) => {
|
|
21
|
+
const result = { focus, created };
|
|
22
|
+
created = [];
|
|
23
|
+
return result;
|
|
24
|
+
};
|