@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,697 @@
|
|
|
1
|
+
import { IN_LAYER, Z } from "../../../shared/layers.mjs";
|
|
2
|
+
import { onOutlineOpen, onPreferences, outlineOpen, preference, setPreference } from "../../../shared/preferences.mjs";
|
|
3
|
+
import { t } from "../../../shared/i18n/index.mjs";
|
|
4
|
+
import { SHEETS } from "../../components/kit.mjs";
|
|
5
|
+
import { task } from "../frames.mjs";
|
|
6
|
+
import { cancelOnEscape, endsGesture, gestureLock } from "../gesture.mjs";
|
|
7
|
+
import { MARGIN, onMargin, outlineMost, outlineWidth, setMargin } from "../margin.mjs";
|
|
8
|
+
import { drawOver, shapeOf } from "../overlay-layer.mjs";
|
|
9
|
+
import { onSettle, own } from "../overlays.mjs";
|
|
10
|
+
import { local } from "../storage.mjs";
|
|
11
|
+
import { addStyle, element } from "../ui.mjs";
|
|
12
|
+
import { carryFolds, foldsOf, keepFolds } from "./folds.mjs";
|
|
13
|
+
import { ROW, createList } from "./list.mjs";
|
|
14
|
+
import { entriesOf, touchesOutline } from "./read.mjs";
|
|
15
|
+
import { STRIP_TOP, createStrip } from "./strip.mjs";
|
|
16
|
+
import { currentOf, followTop, glideFrom, keysOf, markedRow, nodesOf, pathTo, rowsOf, signatureOf, spyLine, treeOf } from "./tree.mjs";
|
|
17
|
+
|
|
18
|
+
// 目录: the page's outline at the right of the editor area (docs/editor.md, "The outline and the right side"), while the
|
|
19
|
+
// reader has it on for this report (the top bar's 更多 › 目录: shared/preferences.mjs outlineOpen, each
|
|
20
|
+
// report's own, off until switched on there; the page follows a switch at once, made in the workbench
|
|
21
|
+
// or in another tab of the same report). Never on a page opened on its own in a frame (?solo), in 演示视图 (no
|
|
22
|
+
// editor), an export or print. The editor starts it before the page's blocks are made editable
|
|
23
|
+
// (editor.mjs start, before enter: the headings' kinds marked from the map, core.mjs markKinds), and it
|
|
24
|
+
// is drawn at once, with no fade, and given a frame to show in: it comes with the page; switched on, it
|
|
25
|
+
// fades in; switched off, it goes at once.
|
|
26
|
+
//
|
|
27
|
+
// What it lists (read.mjs, tree.mjs): the heading blocks, nested by level, a tabs area's tabs as pills
|
|
28
|
+
// with their headings under them. Its form is margin.mjs's: the list in full at the window's right
|
|
29
|
+
// edge, the column in the middle of what it leaves (200px unless the reader dragged its guide: a quiet
|
|
30
|
+
// list on the page's background, a hairline guide down its left, the current row's segment dark on
|
|
31
|
+
// it), or, with less room, its strip (strip.mjs), which shows the list as a card while the pointer is on it, each of its
|
|
32
|
+
// lines lighting its own row. A form that changes after the page came is faded in (the list sliding a
|
|
33
|
+
// little from the right), never there all at once.
|
|
34
|
+
//
|
|
35
|
+
// - A click on a heading's row scrolls the page smoothly (at once with reduced motion; from more than
|
|
36
|
+
// two windows away at once to a window short of it, gliding the rest) to put the heading 24px below
|
|
37
|
+
// the window's top, as 演示视图's 上一节/下一节, then lights it for a moment (a quiet gray, in the
|
|
38
|
+
// overlay layer of its block; gone with the heading, or once it is hidden). A hidden tab is shown
|
|
39
|
+
// first, a closed disclosure opened (reading state: nothing is saved). The row is current at once and
|
|
40
|
+
// stays so until the page has moved 40px from where the jump left it. The reader taking the page over
|
|
41
|
+
// during the jump (the wheel, a key that scrolls, the scrollbar, a press in the page) ends it there:
|
|
42
|
+
// it never pulls the page back. A tab's row shows that tab and scrolls to its tab row.
|
|
43
|
+
// - A jump leaves the text: its selection goes (the format bar with it, which stood over the heading
|
|
44
|
+
// gone to). Chosen by the pointer, the page is the reader's: the focus leaves the outline (the keys
|
|
45
|
+
// that read scroll the page, a letter types nothing; a click in the text edits there). Chosen by a key
|
|
46
|
+
// (Enter, Space), the focus stays in the tree, where PageUp/PageDown scroll the page. Esc leaves the
|
|
47
|
+
// tree: for the caret where it was while no jump has moved the page, else for the page where it is.
|
|
48
|
+
// - The current heading (the spy): the one furthest down, of those with a box on the page, whose top
|
|
49
|
+
// has passed a line min(120px, 30% of the window) below the window's top, the first in order of those
|
|
50
|
+
// level with it (headings side by side in columns); none above the first. Over the page's last window
|
|
51
|
+
// the line comes down with the scroll to the window's bottom (tree.mjs spyLine), so the last short
|
|
52
|
+
// sections each get their turn. Inside a folded row, that row is marked. The list keeps the current
|
|
53
|
+
// row at most a third of its clear view down (the rows to come below it) and two rows from its top
|
|
54
|
+
// at least, scrolling (smoothly) as little as that takes; not while the pointer is over it, or the
|
|
55
|
+
// reader scrolled it in the last 1.5s (the pointer gone after that, a row scrolled out of sight is
|
|
56
|
+
// brought back). The wheel over it scrolls it, and at its ends the page.
|
|
57
|
+
// - A triangle at a parent's left folds or unfolds it (a folded one always shows it; an open one while
|
|
58
|
+
// the pointer is over the list or the keyboard is in it); what is folded is kept for the report
|
|
59
|
+
// (folds.mjs), so the page the workbench shows again after an Agent's write folds the same, and
|
|
60
|
+
// follows a heading whose key changes (one with no block id, keyed by its text, typed in or given its
|
|
61
|
+
// id as it is saved). The top level's headings are bold.
|
|
62
|
+
// - Its guide line, dragged, makes the list wider or narrower (160 to 360px, as far as the room lets
|
|
63
|
+
// it while the column keeps its edge room at both sides), the column staying in the middle of what
|
|
64
|
+
// it leaves (margin.mjs: its two rooms giving or taking half each); let go, the width is the
|
|
65
|
+
// reader's for every report (shared/preferences.mjs outlineWidth); Esc puts it back.
|
|
66
|
+
// - It follows the page as it changes (one reading a frame at most, the rows drawn again only when
|
|
67
|
+
// what they show changed): headings typed, renamed, added, deleted, moved, undone, tabs renamed or
|
|
68
|
+
// shown; not while an input method composes (its letters are no title yet: read once it commits).
|
|
69
|
+
// It is the editor's own UI (data-doc-dev): a press on it starts no box selection, the handle
|
|
70
|
+
// does not show by it, and while a block is dragged or a box drawn it lets the pointer through.
|
|
71
|
+
|
|
72
|
+
const DOCK = { top: 52, left: MARGIN.guide, right: 8 }; // the list's room in the dock: below the page's top room, its guide 8px in (where the column's right room ends: margin.mjs), 8px short of the scrollbar
|
|
73
|
+
const CARD = 56; // the strip's card: as wide as the list chosen, and this much more
|
|
74
|
+
const ENTER = { ms: 160, slide: 8 }; // the list in full coming after the page did: faded in, sliding this far from the right
|
|
75
|
+
const RESIZING = "data-ge-outline-resize"; // on the document element while the guide is dragged
|
|
76
|
+
const JUMP_TOP = 24; // a heading's top after a jump, below the window's
|
|
77
|
+
const STAY = 40; // px the page moves after a jump before the heading gone to stops being the current one
|
|
78
|
+
const FOLLOW_QUIET = 1500; // ms after the reader scrolled the list, it is not scrolled to the current row
|
|
79
|
+
const FOLLOW_LEAST = 2 * ROW; // the current row at least two rows below the list's clear top (tree.mjs followTop)
|
|
80
|
+
const FADE = { top: 24, bottom: 32 }; // the list's faded ends while there is more (STYLE)
|
|
81
|
+
const PAGE = 0.875; // PageUp/PageDown in the tree scroll the page by this much of the window, as the browser's do
|
|
82
|
+
const LINE = 40; // and ↑/↓ by this much, with the focus on the page after a press in the list (as the browser does)
|
|
83
|
+
const FLASH = { hold: 600, fade: 600 };
|
|
84
|
+
const UI_FONT = `ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "PingFang SC", "Microsoft YaHei", Arial, sans-serif`;
|
|
85
|
+
// The current row and the tabs' pills in a medium weight where the system's Chinese face has one
|
|
86
|
+
// (PingFang, on Apple's systems). Elsewhere (Microsoft YaHei has none) 500 draws a title's Latin words in
|
|
87
|
+
// Segoe's semibold beside regular Chinese, so they keep 400 there: the color and the guide's segment
|
|
88
|
+
// mark the current row, the fill the tab shown.
|
|
89
|
+
const MEDIUM = /Mac|iPhone|iPad/.test(globalThis.navigator?.platform ?? "") ? 500 : 400;
|
|
90
|
+
// The keys that scroll the page: pressed during a jump, the reader takes the page over.
|
|
91
|
+
const SCROLL_KEYS = new Set(["PageUp", "PageDown", "Home", "End", " ", "ArrowUp", "ArrowDown"]);
|
|
92
|
+
|
|
93
|
+
const STYLE = `
|
|
94
|
+
.ge-outline, .ge-outline-strip, .ge-outline-card { font: 400 14px/22px ${UI_FONT}; color: var(--ge-tx2); -webkit-user-select: none; user-select: none; }
|
|
95
|
+
.ge-outline svg, .ge-outline-strip svg, .ge-outline-card svg { display: block; width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
|
|
96
|
+
.ge-outline[hidden], .ge-outline-strip[hidden], .ge-outline-card[hidden] { display: none; }
|
|
97
|
+
|
|
98
|
+
/* The dock: fixed at the window's right edge, its whole height, the list from the page's top room down; only the list and its guide take the pointer. */
|
|
99
|
+
.ge-outline { position: fixed; top: 0; right: 0; bottom: 0; z-index: ${Z.outline}; width: ${MARGIN.full}px; box-sizing: border-box; padding: ${DOCK.top}px ${DOCK.right}px 0 ${DOCK.left}px; display: flex; flex-direction: column; pointer-events: none; }
|
|
100
|
+
.ge-outline-frame { position: relative; flex: 0 1 auto; min-height: 0; display: flex; flex-direction: column; }
|
|
101
|
+
/* The list scrolls by itself with no scrollbar (none to move its rows as it comes and goes, none beside the page's own): its fades say there is more; the wheel and a touch move it, and at its ends go on to the page (no wheel trapped over it). */
|
|
102
|
+
.ge-outline-scroll { flex: 0 1 auto; min-height: 0; overflow-y: auto; scrollbar-width: none; }
|
|
103
|
+
.ge-outline-scroll::-webkit-scrollbar { display: none; }
|
|
104
|
+
.ge-outline-frame > .ge-outline-scroll { padding-bottom: 24px; pointer-events: auto; }
|
|
105
|
+
.ge-outline-scroll[data-more="up"] { -webkit-mask-image: linear-gradient(transparent, #000 24px); mask-image: linear-gradient(transparent, #000 24px); }
|
|
106
|
+
.ge-outline-scroll[data-more="down"] { -webkit-mask-image: linear-gradient(#000 calc(100% - 32px), transparent); mask-image: linear-gradient(#000 calc(100% - 32px), transparent); }
|
|
107
|
+
.ge-outline-scroll[data-more="up down"] { -webkit-mask-image: linear-gradient(transparent, #000 24px, #000 calc(100% - 32px), transparent); mask-image: linear-gradient(transparent, #000 24px, #000 calc(100% - 32px), transparent); }
|
|
108
|
+
/* The guide's grip: dragged, the list wider or narrower; under the pointer (a moment after it came) and while dragged, the guide a wider, darker bar. */
|
|
109
|
+
.ge-outline-grip { position: absolute; left: -${MARGIN.grip}px; top: 0; bottom: 24px; width: 9px; cursor: col-resize; pointer-events: auto; }
|
|
110
|
+
.ge-outline-grip::after { content: ""; position: absolute; left: 3px; top: 4px; bottom: 4px; width: 3px; border-radius: 2px; transition: background-color 120ms ease; }
|
|
111
|
+
.ge-outline-grip:hover::after { background: var(--ge-line-strong); transition-delay: 120ms; }
|
|
112
|
+
:root[${RESIZING}] .ge-outline-grip::after { background: color-mix(in srgb, var(--ge-tx3) 70%, transparent); transition-delay: 0s; }
|
|
113
|
+
:root[${RESIZING}] .ge-outline-scroll { pointer-events: none; }
|
|
114
|
+
${gestureLock(RESIZING, { cursor: "col-resize", select: true })}
|
|
115
|
+
|
|
116
|
+
/* The list: a hairline guide at its left, the current row's segment darker on it, the lit row's blue (whole pixels: crisp at any scale). */
|
|
117
|
+
.ge-outline-list { position: relative; padding-left: 6px; outline: none; }
|
|
118
|
+
.ge-outline-list::before { content: ""; position: absolute; left: 0; top: 4px; bottom: 4px; width: 1px; background: var(--ge-line-strong); }
|
|
119
|
+
.ge-outline-list[data-empty]::before { display: none; }
|
|
120
|
+
.ge-outline-mark { position: absolute; left: -1px; top: 0; width: 2px; height: 16px; border-radius: 1px; background: var(--ge-tx); pointer-events: none; }
|
|
121
|
+
.ge-outline-mark[data-hot] { background: var(--ge-accent); }
|
|
122
|
+
.ge-outline-mark[hidden] { display: none; }
|
|
123
|
+
.ge-outline-row { position: relative; display: flex; align-items: center; gap: 2px; height: ${ROW}px; box-sizing: border-box; padding: 0 6px 0 calc(2px + var(--ge-depth, 0) * 12px); border-radius: 6px; cursor: pointer; white-space: nowrap; outline: none; }
|
|
124
|
+
.ge-outline-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
125
|
+
.ge-outline-row:is(:hover, :focus-visible, [data-hot]) { color: var(--ge-tx); background: var(--ge-hover); }
|
|
126
|
+
.ge-outline-row:active { background: var(--ge-press); }
|
|
127
|
+
.ge-outline-row[data-current] { color: var(--ge-tx); font-weight: ${MEDIUM}; }
|
|
128
|
+
/* The top level's headings bold: at the top, or right under a tab (its pill keeps its own look). */
|
|
129
|
+
.ge-outline-row[data-top] { font-weight: 600; }
|
|
130
|
+
/* The triangle at a parent's left, in a column of its own (a leaf keeps the room): a folded one always shows (pointing right), an open one (pointing down) while the pointer is over the list or the keyboard is in it (the focus seen: a fold by the pointer leaves the focus on its row, unseen). No grey under the pointer, only while pressed. */
|
|
131
|
+
.ge-outline-twist, .ge-outline-slot { flex: none; width: 16px; height: 16px; }
|
|
132
|
+
.ge-outline-twist { border-radius: 4px; color: var(--ge-tx3); }
|
|
133
|
+
.ge-outline-twist svg { fill: currentColor; transition: transform 120ms ease; }
|
|
134
|
+
.ge-outline-twist:hover { color: var(--ge-tx2); }
|
|
135
|
+
.ge-outline-twist:active { background: var(--ge-press); }
|
|
136
|
+
.ge-outline-row[aria-expanded="true"] .ge-outline-twist svg { transform: rotate(90deg); }
|
|
137
|
+
.ge-outline-list:not(:hover, :focus-visible, :has(:focus-visible)) .ge-outline-row[aria-expanded="true"] .ge-outline-twist { visibility: hidden; }
|
|
138
|
+
/* A tabs area's tab: its name as a pill at the rows' size (its text in line with the rows beside it), the tab shown filled as the page's pills, the others ringed by a hairline (plain, they read as less than their own headings). */
|
|
139
|
+
.ge-outline-row[data-kind="tab"] .ge-outline-text { margin-left: -4px; }
|
|
140
|
+
.ge-outline-tab { display: inline-block; max-width: 100%; box-sizing: border-box; height: 22px; padding: 0 6px; border-radius: 6px; overflow: hidden; text-overflow: ellipsis; vertical-align: top; font-weight: ${MEDIUM}; line-height: 22px; box-shadow: inset 0 0 0 1px var(--ge-line-strong); }
|
|
141
|
+
.ge-outline-row[data-shown] .ge-outline-tab { background: var(--ge-hover); color: var(--ge-tx); box-shadow: none; }
|
|
142
|
+
.ge-outline-row[data-shown]:is(:hover, :focus-visible, [data-hot]) .ge-outline-tab { background: transparent; }
|
|
143
|
+
.ge-outline-empty { padding: 4px 0 4px 8px; color: var(--ge-tx3); white-space: normal; }
|
|
144
|
+
|
|
145
|
+
/* The strip: short lines, each its own target: the one under the pointer blue, longer and thicker. */
|
|
146
|
+
.ge-outline-strip { position: fixed; top: 0; right: 0; bottom: 0; z-index: ${Z.outline}; width: ${MARGIN.strip}px; pointer-events: none; }
|
|
147
|
+
.ge-outline-ticks { position: absolute; top: ${STRIP_TOP}px; right: 4px; width: 28px; box-sizing: border-box; display: flex; flex-direction: column; align-items: flex-end; gap: var(--ge-tick-gap, 6px); padding: 8px 6px; border-radius: 6px; cursor: pointer; pointer-events: auto; outline: none; }
|
|
148
|
+
.ge-outline-ticks:focus-visible { background: var(--ge-hover); }
|
|
149
|
+
.ge-outline-ticks i { display: block; flex: none; width: var(--ge-tick, 16px); height: 2px; border-radius: 1px; background: var(--ge-line-strong); transform-origin: right center; transition: width 120ms ease-out, transform 120ms ease-out, background-color 120ms ease-out; }
|
|
150
|
+
.ge-outline-ticks:is(:hover, :focus-visible, [aria-expanded="true"]) i { background: color-mix(in srgb, var(--ge-tx3) 75%, transparent); }
|
|
151
|
+
.ge-outline-ticks i[data-current] { background: var(--ge-tx); }
|
|
152
|
+
.ge-outline-ticks i[data-hot] { width: calc(var(--ge-tick, 16px) + 6px); background: var(--ge-accent); transform: scaleY(1.5); }
|
|
153
|
+
.ge-outline-none { display: block; width: 16px; height: 16px; color: var(--ge-tx3); }
|
|
154
|
+
/* Its card: the list over the page beside the strip, its top level with the strip's lines, the menus' surface; the list scrolls inside it, faded at its ends as in full. */
|
|
155
|
+
.ge-outline-card { position: fixed; z-index: ${Z.menu}; top: ${STRIP_TOP}px; right: ${MARGIN.strip + 4}px; width: ${MARGIN.full + CARD}px; max-height: calc(100vh - ${STRIP_TOP + 16}px); box-sizing: border-box; display: flex; flex-direction: column; padding: 8px 8px 8px 12px; border-radius: 10px; background: var(--ge-bg); box-shadow: var(--ge-shadow-pop); }
|
|
156
|
+
|
|
157
|
+
/* While a block is dragged, a box drawn, text selected across blocks or something resized, the outline lets the pointer through. */
|
|
158
|
+
:root:is([data-ge-drag], [data-ge-marquee], [data-ge-cross], [data-ge-resize], [data-ge-gap-drag], [data-ge-tdrag], [data-ge-tresize], [data-ge-tcells]) :is(.ge-outline-scroll, .ge-outline-ticks, .ge-outline-grip) { pointer-events: none; }
|
|
159
|
+
|
|
160
|
+
/* A heading lit for a moment after a jump: its fill's shape, a quiet gray. */
|
|
161
|
+
.ge-outline-flash { z-index: ${IN_LAYER.tint}; pointer-events: none; background: var(--ge-outline-flash); }
|
|
162
|
+
|
|
163
|
+
@media print { .ge-outline, .ge-outline-strip, .ge-outline-card { display: none; } }
|
|
164
|
+
`;
|
|
165
|
+
|
|
166
|
+
const still = () => globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false;
|
|
167
|
+
const editableAt = (node) => (node?.nodeType === 1 && node.closest?.('[contenteditable="true"]')) || null;
|
|
168
|
+
const shown = (node) => Boolean(node?.isConnected && node.getClientRects().length > 0);
|
|
169
|
+
|
|
170
|
+
let made = null; // the page's outline: one
|
|
171
|
+
|
|
172
|
+
/** slug: the report's (what is folded is kept under it). Returns { holds(target): a node of the outline, shown: whether it shows (in full or as its strip) }. */
|
|
173
|
+
export function createOutline({ slug }) {
|
|
174
|
+
if (made) return made;
|
|
175
|
+
const main = document.querySelector("main");
|
|
176
|
+
if (!main) return { holds: () => false, shown: false };
|
|
177
|
+
addStyle(STYLE);
|
|
178
|
+
|
|
179
|
+
let on = outlineOpen(slug); // this report's switch (off until switched on here)
|
|
180
|
+
let chosen = preference("outlineWidth"); // the list's width in full as the reader dragged it (0: the default)
|
|
181
|
+
let form = null; // the form shown: "full", "strip" or null
|
|
182
|
+
let tree = [];
|
|
183
|
+
let rows = [];
|
|
184
|
+
let heads = []; // the heading nodes in the outline's order
|
|
185
|
+
let drawnSignature = null; // what the rows drawn show (tree.mjs signatureOf), and with which folds
|
|
186
|
+
let dirty = true; // the page changed: read it again
|
|
187
|
+
const folded = foldsOf(local, slug);
|
|
188
|
+
const keyOfRef = new WeakMap(); // a node's element -> its key read last (a fold follows a key that changes)
|
|
189
|
+
let chosenKey = null; // the heading a click went to: current until the page moves STAY from where it landed
|
|
190
|
+
let jumping = false; // a jump's scroll under way (from the click until it lands)
|
|
191
|
+
let jumps = 0; // jumps begun (a frame's start of one taken over meanwhile, or followed by another, does nothing)
|
|
192
|
+
let landedAt = null; // the page's scrollY where the jump landed
|
|
193
|
+
let settling = null; // the jump's scroll waiting for its end: (arrived) => void ends it
|
|
194
|
+
let markedKey = null; // the node marked last (to keep it in view only when it changes)
|
|
195
|
+
let pointerIn = false;
|
|
196
|
+
let listScrolled = 0; // when the reader last scrolled the list
|
|
197
|
+
let returnTo = null; // { host, range }: where the caret was when the outline took the focus
|
|
198
|
+
let composing = false; // an input method composing: its letters are no title yet
|
|
199
|
+
let flashing = null; // { node, heading }: the heading lit after a jump
|
|
200
|
+
|
|
201
|
+
const list = createList({ jump: go, fold: toggle, escape: giveBack, page: (direction) => page(direction) });
|
|
202
|
+
const scroller = element("div", { class: "ge-outline-scroll" }, list.node);
|
|
203
|
+
const grip = element("div", { class: "ge-outline-grip", role: "separator", "aria-orientation": "vertical", "aria-label": t("拖动调整目录宽度") });
|
|
204
|
+
const dock = element("nav", { class: "ge-outline", "aria-label": t("目录"), "data-doc-dev": "", hidden: "" }, element("div", { class: "ge-outline-frame" }, scroller, grip));
|
|
205
|
+
const strip = createStrip({
|
|
206
|
+
list,
|
|
207
|
+
opened: () => frames.wake(),
|
|
208
|
+
closed: () => frames.wake(),
|
|
209
|
+
escape: () => giveBack(),
|
|
210
|
+
choose: (index) => { if (rows[index]) go(rows[index].node); },
|
|
211
|
+
});
|
|
212
|
+
document.body.append(dock, strip.strip, strip.card);
|
|
213
|
+
|
|
214
|
+
// ---------- reading the page ----------
|
|
215
|
+
|
|
216
|
+
function read() {
|
|
217
|
+
tree = treeOf(entriesOf(main));
|
|
218
|
+
const nodes = nodesOf(tree);
|
|
219
|
+
const moves = [];
|
|
220
|
+
for (const node of nodes) {
|
|
221
|
+
if (!node.ref) continue;
|
|
222
|
+
const before = keyOfRef.get(node.ref);
|
|
223
|
+
if (before !== undefined && before !== node.key) moves.push([before, node.key]);
|
|
224
|
+
keyOfRef.set(node.ref, node.key);
|
|
225
|
+
}
|
|
226
|
+
if (carryFolds(folded, moves)) keepFolds(local, slug, folded, keysOf(tree));
|
|
227
|
+
heads = nodes.filter((node) => node.kind === "heading");
|
|
228
|
+
rows = rowsOf(tree, folded);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// The heading the reader is at (tree.mjs currentOf), of those with a box on the page; the line it
|
|
232
|
+
// must pass comes down over the page's last window (spyLine: the last short sections each get their turn).
|
|
233
|
+
function spied() {
|
|
234
|
+
const tops = heads.map((node) => (node.ref?.isConnected ? node.ref.getClientRects()[0]?.top ?? null : null));
|
|
235
|
+
const line = spyLine({ scrollY, maxScroll: document.documentElement.scrollHeight - innerHeight, view: innerHeight, base: Math.min(120, innerHeight * 0.3) });
|
|
236
|
+
const at = currentOf(tops, line);
|
|
237
|
+
return at >= 0 ? heads[at] : null;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function currentNode() {
|
|
241
|
+
if (chosenKey !== null) {
|
|
242
|
+
const chosen = heads.find((node) => node.key === chosenKey);
|
|
243
|
+
if (shown(chosen?.ref)) return chosen; // not one a tab switched since has hidden
|
|
244
|
+
chosenKey = null;
|
|
245
|
+
}
|
|
246
|
+
return spied();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// One frame: the page read again when it changed (not while an input method composes), the rows
|
|
250
|
+
// drawn when what they show did, the current row marked, the strip's lines, the edges of the list.
|
|
251
|
+
function run() {
|
|
252
|
+
if (!form) return false;
|
|
253
|
+
if (dirty && !composing) {
|
|
254
|
+
dirty = false;
|
|
255
|
+
read();
|
|
256
|
+
const signature = `${signatureOf(tree)}\u0003${[...folded].join("\u0001")}`;
|
|
257
|
+
if (signature !== drawnSignature) {
|
|
258
|
+
drawnSignature = signature;
|
|
259
|
+
list.render(rows, folded, -1);
|
|
260
|
+
markedKey = null;
|
|
261
|
+
} else list.update(rows);
|
|
262
|
+
}
|
|
263
|
+
if (flashing && !shown(flashing.heading)) unflash(); // its heading hidden (a tab switched) or gone
|
|
264
|
+
const current = currentNode();
|
|
265
|
+
const marked = markedRow(rows, current && pathTo(tree, current), folded);
|
|
266
|
+
list.mark(marked);
|
|
267
|
+
if (form === "strip") strip.draw(rows, marked);
|
|
268
|
+
const key = rows[marked]?.node.key ?? null;
|
|
269
|
+
if (key !== markedKey) {
|
|
270
|
+
const first = markedKey === null;
|
|
271
|
+
markedKey = key;
|
|
272
|
+
follow(marked, { smooth: !first });
|
|
273
|
+
}
|
|
274
|
+
edges();
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
const frames = task("outline", {
|
|
278
|
+
run,
|
|
279
|
+
fail: () => { drawnSignature = null; dirty = true; },
|
|
280
|
+
});
|
|
281
|
+
const wake = () => { if (form) frames.wake(); };
|
|
282
|
+
|
|
283
|
+
// The list scrolled to keep the current row in its band (tree.mjs followTop: at most a third of the
|
|
284
|
+
// way down, so reading down the rows to come fill the rest; two rows from the top at least), as little
|
|
285
|
+
// as that takes; not while the pointer is over the outline or the reader just scrolled it. `hidden`:
|
|
286
|
+
// only when the row is out of the list's clear view (the reader's own scroll kept while it shows).
|
|
287
|
+
function follow(index, { smooth = true, hidden = false } = {}) {
|
|
288
|
+
const box = form === "full" ? scroller : strip.open ? strip.scroll : null;
|
|
289
|
+
const row = list.rowAt(index);
|
|
290
|
+
if (!box || !row || pointerIn || Date.now() - listScrolled < FOLLOW_QUIET) return;
|
|
291
|
+
const frame = box.getBoundingClientRect();
|
|
292
|
+
const rect = row.getBoundingClientRect();
|
|
293
|
+
if (hidden && rect.top >= frame.top + FADE.top && rect.bottom <= frame.bottom - FADE.bottom) return;
|
|
294
|
+
const top = rect.top - frame.top + box.scrollTop;
|
|
295
|
+
const to = followTop({ top, row: ROW, scrollTop: box.scrollTop, view: box.clientHeight, full: box.scrollHeight, least: FOLLOW_LEAST, fade: FADE });
|
|
296
|
+
if (to !== null) box.scrollTo({ top: to, behavior: smooth && !still() ? "smooth" : "instant" });
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// The pointer gone from the outline: once the list has been left alone FOLLOW_QUIET, it comes back to
|
|
300
|
+
// the current row if the reader scrolled it out of sight (the wheel over it).
|
|
301
|
+
let backTimer = 0;
|
|
302
|
+
function backSoon() {
|
|
303
|
+
clearTimeout(backTimer);
|
|
304
|
+
backTimer = setTimeout(() => { if (!pointerIn) follow(list.marked, { hidden: true }); }, Math.max(0, FOLLOW_QUIET - (Date.now() - listScrolled)) + 50);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// The list's fades at its ends while there is more above or below (in full, or in the strip's card).
|
|
308
|
+
function edges() {
|
|
309
|
+
const box = form === "full" ? scroller : strip.open ? strip.scroll : null;
|
|
310
|
+
if (!box) return;
|
|
311
|
+
const more = [];
|
|
312
|
+
if (box.scrollTop > 1) more.push("up");
|
|
313
|
+
if (box.scrollTop + box.clientHeight < box.scrollHeight - 1) more.push("down");
|
|
314
|
+
const value = more.join(" ");
|
|
315
|
+
if ((box.getAttribute("data-more") ?? "") !== value) {
|
|
316
|
+
if (value) box.setAttribute("data-more", value);
|
|
317
|
+
else box.removeAttribute("data-more");
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
for (const box of [scroller, strip.scroll]) {
|
|
322
|
+
box.addEventListener("scroll", edges, { passive: true });
|
|
323
|
+
for (const type of ["wheel", "touchmove"]) box.addEventListener(type, () => { listScrolled = Date.now(); }, { passive: true });
|
|
324
|
+
}
|
|
325
|
+
for (const node of [dock, strip.strip, strip.card]) {
|
|
326
|
+
node.addEventListener("pointerenter", () => { pointerIn = true; });
|
|
327
|
+
node.addEventListener("pointerleave", () => { pointerIn = false; backSoon(); wake(); });
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// ---------- folding ----------
|
|
331
|
+
|
|
332
|
+
function toggle(node) {
|
|
333
|
+
if (folded.has(node.key)) folded.delete(node.key);
|
|
334
|
+
else folded.add(node.key);
|
|
335
|
+
keepFolds(local, slug, folded, keysOf(tree));
|
|
336
|
+
dirty = true;
|
|
337
|
+
frames.wake();
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// ---------- going to a heading ----------
|
|
341
|
+
|
|
342
|
+
// The page scrolled to put `target` JUMP_TOP below the window's top; `then(end, wanted)` once the
|
|
343
|
+
// scroll is over (`end`: the scrollY it went for, `wanted`: where the target was then, unclamped).
|
|
344
|
+
// More than two windows away, the page goes at once to a window short of it and glides the rest
|
|
345
|
+
// (tree.mjs glideFrom: the browser's glide over 14000px took 1.5s). Over means: at its end, or no
|
|
346
|
+
// longer moving towards it (a scrollend, or 1.5s gone by, then looked at again while it still moves:
|
|
347
|
+
// a slow machine's glide is waited for, the reader's scroll is not).
|
|
348
|
+
function scrollToTarget(target, then) {
|
|
349
|
+
settling?.(false);
|
|
350
|
+
const top = Math.round(target.getBoundingClientRect().top + scrollY - JUMP_TOP);
|
|
351
|
+
const end = Math.max(0, Math.min(top, document.documentElement.scrollHeight - innerHeight));
|
|
352
|
+
let timer = 0;
|
|
353
|
+
const done = (arrived = true) => {
|
|
354
|
+
if (settling !== done) return;
|
|
355
|
+
settling = null;
|
|
356
|
+
clearTimeout(timer);
|
|
357
|
+
removeEventListener("scrollend", check);
|
|
358
|
+
if (arrived) then?.(end, top);
|
|
359
|
+
};
|
|
360
|
+
function check() {
|
|
361
|
+
if (settling !== done) return;
|
|
362
|
+
const left = Math.abs(scrollY - end);
|
|
363
|
+
if (left < 1) return done(true);
|
|
364
|
+
clearTimeout(timer);
|
|
365
|
+
timer = setTimeout(() => {
|
|
366
|
+
if (Math.abs(scrollY - end) < left - 0.5) timer = setTimeout(check, 250); // still on its way
|
|
367
|
+
else done(true);
|
|
368
|
+
}, 60);
|
|
369
|
+
}
|
|
370
|
+
settling = done;
|
|
371
|
+
if (Math.abs(end - scrollY) < 1) {
|
|
372
|
+
done(true);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
const from = still() ? null : glideFrom(scrollY, end, innerHeight);
|
|
376
|
+
if (from !== null) scrollTo({ top: from, behavior: "instant" });
|
|
377
|
+
addEventListener("scrollend", check);
|
|
378
|
+
timer = setTimeout(check, 1500);
|
|
379
|
+
scrollTo({ top: end, behavior: still() ? "instant" : "smooth" });
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Scrolled to `target`, and again while it is not there yet and the page can still go (what was just
|
|
383
|
+
// shown lays itself out as the page scrolls: a tab's tables, a disclosure's content), then `then()`.
|
|
384
|
+
// A scroll that ended somewhere else than it went for, the page laid out as it was, was the reader's
|
|
385
|
+
// (the scrollbar): the jump ends there, never pulling the page back. One the page's layout moved (the
|
|
386
|
+
// browser keeping what was in view where it was as a tab's tables laid themselves out above it) lands
|
|
387
|
+
// again. While it goes, the list says so (data-going: the browser scenarios wait for it).
|
|
388
|
+
function land(target, then, tries = 0) {
|
|
389
|
+
jumping = true;
|
|
390
|
+
list.node.setAttribute("data-going", "");
|
|
391
|
+
scrollToTarget(target, (end, wanted) => {
|
|
392
|
+
const max = document.documentElement.scrollHeight - innerHeight;
|
|
393
|
+
const clamped = end > max && scrollY >= max - 1; // the page got shorter meanwhile: as far as it goes
|
|
394
|
+
const shifted = Math.abs(Math.round(target.getBoundingClientRect().top + scrollY - JUMP_TOP) - wanted) > 1;
|
|
395
|
+
if (Math.abs(scrollY - end) > 1 && !clamped && !shifted) return stopJump();
|
|
396
|
+
const off = Math.round(target.getBoundingClientRect().top) - JUMP_TOP;
|
|
397
|
+
const room = off > 0 ? max - scrollY : scrollY;
|
|
398
|
+
if (Math.abs(off) > 2 && room > 1 && tries < 3 && target.isConnected) return land(target, then, tries + 1);
|
|
399
|
+
jumping = false;
|
|
400
|
+
list.node.removeAttribute("data-going");
|
|
401
|
+
then?.();
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// The jump ended before it landed: the page is the reader's, the spy says where they are.
|
|
406
|
+
function stopJump() {
|
|
407
|
+
settling?.(false);
|
|
408
|
+
jumping = false;
|
|
409
|
+
chosenKey = null;
|
|
410
|
+
landedAt = null;
|
|
411
|
+
list.node.removeAttribute("data-going");
|
|
412
|
+
wake();
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
function unflash() {
|
|
416
|
+
flashing?.node.remove();
|
|
417
|
+
flashing = null;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
function flash(heading) {
|
|
421
|
+
unflash();
|
|
422
|
+
const shape = shown(heading) ? shapeOf(heading) : null;
|
|
423
|
+
if (!shape) return;
|
|
424
|
+
const node = element("div", { class: "ge-outline-flash", "data-doc-dev": "" });
|
|
425
|
+
const entry = { node, heading };
|
|
426
|
+
own(node, "outline-flash", { owner: heading, alive: () => flashing === entry && heading.isConnected });
|
|
427
|
+
drawOver(node, shape, { x: 4, y: 2, radius: 4 });
|
|
428
|
+
flashing = entry;
|
|
429
|
+
setTimeout(() => {
|
|
430
|
+
if (flashing !== entry) return;
|
|
431
|
+
const gone = () => { if (flashing === entry) unflash(); };
|
|
432
|
+
const fade = still() ? null : node.animate?.([{ opacity: 1 }, { opacity: 0 }], { duration: FLASH.fade, easing: "ease-in", fill: "forwards" });
|
|
433
|
+
if (fade) fade.onfinish = gone;
|
|
434
|
+
else gone();
|
|
435
|
+
}, FLASH.hold);
|
|
436
|
+
}
|
|
437
|
+
// After a change of the page (history: a change, an undo, a redo), at once: a heading lit and gone with it is let go.
|
|
438
|
+
onSettle(() => { if (flashing && !shown(flashing.heading)) unflash(); });
|
|
439
|
+
|
|
440
|
+
// A jump leaves the text: its selection goes (the format bar, a selection's strips with it: they stood
|
|
441
|
+
// over the heading gone to), and Esc has no caret to give back (the page is where the reader went).
|
|
442
|
+
function leaveText() {
|
|
443
|
+
returnTo = null;
|
|
444
|
+
const selection = getSelection();
|
|
445
|
+
if (selection.rangeCount && main.contains(selection.anchorNode)) selection.removeAllRanges();
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// `keyboard`: chosen by Enter or Space, the focus stays in the tree; by the pointer, the page is the
|
|
449
|
+
// reader's: the focus leaves the outline (the keys that read scroll the page, a letter types nothing).
|
|
450
|
+
function go(node, { keyboard = false } = {}) {
|
|
451
|
+
const jump = ++jumps;
|
|
452
|
+
const begin = (target, then) => requestAnimationFrame(() => { if (jump === jumps && jumping) land(target, then); });
|
|
453
|
+
if (node.kind === "tab") {
|
|
454
|
+
const area = node.ref?.closest(SHEETS.match);
|
|
455
|
+
if (!area) return;
|
|
456
|
+
const key = node.ref.getAttribute(SHEETS.tabKey);
|
|
457
|
+
globalThis.DocKit.reveal([...area.children].find((child) => child.getAttribute(SHEETS.panelKey) === key) ?? area);
|
|
458
|
+
chosenKey = null;
|
|
459
|
+
landedAt = null;
|
|
460
|
+
jumping = true;
|
|
461
|
+
begin(node.ref.closest(SHEETS.rowAt) ?? area);
|
|
462
|
+
} else {
|
|
463
|
+
const heading = node.ref;
|
|
464
|
+
if (!heading?.isConnected) return;
|
|
465
|
+
globalThis.DocKit.reveal(heading);
|
|
466
|
+
chosenKey = node.key;
|
|
467
|
+
landedAt = null;
|
|
468
|
+
jumping = true;
|
|
469
|
+
begin(heading, () => {
|
|
470
|
+
landedAt = scrollY;
|
|
471
|
+
flash(heading);
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
leaveText();
|
|
475
|
+
// Chosen by a key, the card closes (the focus back on the strip); by the pointer, it stays while the pointer is on it.
|
|
476
|
+
if (strip.open && (keyboard || (!strip.keyed && !pointerIn))) strip.closeCard({ focus: keyboard });
|
|
477
|
+
if (!keyboard) toPage();
|
|
478
|
+
frames.wake();
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// The focus on the page itself, out of the outline and the text: a letter types nothing, the keys that
|
|
482
|
+
// read scroll the page (below), the editor's keys for the page (undo, select-all) are the page's.
|
|
483
|
+
function toPage() {
|
|
484
|
+
const active = document.activeElement;
|
|
485
|
+
if (active && active !== document.body && (holds(active) || main.contains(active))) active.blur();
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// With the focus on the page itself after a press in the list (a jump by the pointer), the browser
|
|
489
|
+
// scrolls the list with the keys that read (it scrolls what holds the focus, else what was pressed
|
|
490
|
+
// last): the page is scrolled instead, by what those keys scroll it with nothing pressed there.
|
|
491
|
+
let pressedInList = false;
|
|
492
|
+
document.addEventListener("pointerdown", (event) => { pressedInList = Boolean(event.target?.closest?.(".ge-outline-scroll")); }, true);
|
|
493
|
+
addEventListener("keydown", (event) => {
|
|
494
|
+
if (!pressedInList || event.defaultPrevented || document.activeElement !== document.body || event.ctrlKey || event.metaKey || event.altKey || event.isComposing) return;
|
|
495
|
+
const step = Math.round(innerHeight * PAGE);
|
|
496
|
+
const by = event.shiftKey ? (event.key === " " ? -step : undefined) : { PageDown: step, PageUp: -step, " ": step, ArrowDown: LINE, ArrowUp: -LINE }[event.key];
|
|
497
|
+
const behavior = still() ? "instant" : "smooth";
|
|
498
|
+
if (by !== undefined) scrollBy({ top: by, behavior });
|
|
499
|
+
else if (!event.shiftKey && (event.key === "Home" || event.key === "End")) scrollTo({ top: event.key === "Home" ? 0 : document.documentElement.scrollHeight, behavior });
|
|
500
|
+
else return;
|
|
501
|
+
event.preventDefault();
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
// PageUp/PageDown in the tree: the page scrolls, as with the focus on it (the list, with no scrollbar, is not paged).
|
|
505
|
+
function page(direction) {
|
|
506
|
+
scrollBy({ top: direction * Math.round(innerHeight * PAGE), behavior: still() ? "instant" : "smooth" });
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// The reader taking the page over during a jump: the wheel or a touch (not on the outline's own
|
|
510
|
+
// list), a key that scrolls the page (not the rows' own keys), a press in the page or on its scrollbar.
|
|
511
|
+
const takeOver = () => { if (jumping) stopJump(); };
|
|
512
|
+
// The wheel over the list scrolls it, and at its end in the wheel's way the page: then it is the reader's.
|
|
513
|
+
const listEnd = (box, down) => (down ? box.scrollTop + box.clientHeight >= box.scrollHeight - 1 : box.scrollTop <= 0);
|
|
514
|
+
addEventListener("wheel", (event) => {
|
|
515
|
+
const box = holds(event.target) ? event.target.closest(".ge-outline-scroll") : null;
|
|
516
|
+
if (!holds(event.target) || !box || listEnd(box, event.deltaY > 0)) takeOver();
|
|
517
|
+
}, { passive: true, capture: true });
|
|
518
|
+
addEventListener("touchstart", (event) => { if (!holds(event.target)) takeOver(); }, { passive: true, capture: true });
|
|
519
|
+
addEventListener("keydown", (event) => {
|
|
520
|
+
if (!jumping || !SCROLL_KEYS.has(event.key)) return;
|
|
521
|
+
if (list.holds(event.target) && event.key !== "PageUp" && event.key !== "PageDown") return;
|
|
522
|
+
takeOver();
|
|
523
|
+
}, true);
|
|
524
|
+
addEventListener("pointerdown", (event) => { if (!holds(event.target)) takeOver(); }, true);
|
|
525
|
+
// After it landed, the heading gone to stays current until the page has moved STAY px.
|
|
526
|
+
addEventListener("scroll", () => {
|
|
527
|
+
if (!jumping && chosenKey !== null && (landedAt === null || Math.abs(scrollY - landedAt) > STAY)) {
|
|
528
|
+
chosenKey = null;
|
|
529
|
+
landedAt = null;
|
|
530
|
+
}
|
|
531
|
+
wake();
|
|
532
|
+
}, { passive: true });
|
|
533
|
+
|
|
534
|
+
// ---------- the focus ----------
|
|
535
|
+
|
|
536
|
+
// The caret's place when the outline takes the focus from the text, given back by Esc.
|
|
537
|
+
document.addEventListener("focusin", (event) => {
|
|
538
|
+
if (!holds(event.target)) return;
|
|
539
|
+
const host = editableAt(event.relatedTarget);
|
|
540
|
+
if (!host || holds(host)) return;
|
|
541
|
+
const selection = getSelection();
|
|
542
|
+
const range = selection.rangeCount ? selection.getRangeAt(0) : null;
|
|
543
|
+
returnTo = { host, range: range && host.contains(range.startContainer) ? range.cloneRange() : null };
|
|
544
|
+
}, true);
|
|
545
|
+
|
|
546
|
+
function giveBack() {
|
|
547
|
+
if (strip.open) {
|
|
548
|
+
strip.closeCard({ focus: true });
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
const back = returnTo;
|
|
552
|
+
returnTo = null;
|
|
553
|
+
if (back?.host?.isConnected) {
|
|
554
|
+
back.host.focus({ preventScroll: true });
|
|
555
|
+
if (back.range) {
|
|
556
|
+
const selection = getSelection();
|
|
557
|
+
selection.removeAllRanges();
|
|
558
|
+
selection.addRange(back.range);
|
|
559
|
+
}
|
|
560
|
+
} else toPage();
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// ---------- shown or not, in which form ----------
|
|
564
|
+
|
|
565
|
+
// The outline in the form the room gives it (null: none), the list as wide as the room gives it. Drawn
|
|
566
|
+
// at once as the page comes (no frame shows it empty); a form coming after that fades in (`fade`);
|
|
567
|
+
// one going goes at once (the reader switching it off too). The focus in it stays in it as its form
|
|
568
|
+
// changes (on its row in full, on the strip's button).
|
|
569
|
+
function show(layout, { fade = false } = {}) {
|
|
570
|
+
if (layout.outline === "full") dock.style.width = `${layout.dock}px`;
|
|
571
|
+
const next = on ? layout.outline : null;
|
|
572
|
+
if (next === form) return;
|
|
573
|
+
const active = document.activeElement;
|
|
574
|
+
const focusedRow = list.node.contains(active) ? Number(active.closest?.(".ge-outline-row")?.dataset.index ?? -1) : -1;
|
|
575
|
+
const hadFocus = holds(active);
|
|
576
|
+
const was = form;
|
|
577
|
+
form = next;
|
|
578
|
+
if (was === "full") dock.hidden = true;
|
|
579
|
+
if (was === "strip") strip.show(false);
|
|
580
|
+
if (form === "full") {
|
|
581
|
+
if (list.node.parentNode !== scroller) scroller.append(list.node);
|
|
582
|
+
for (const animation of dock.getAnimations?.() ?? []) animation.cancel();
|
|
583
|
+
dock.hidden = false;
|
|
584
|
+
if (fade && !still()) dock.animate?.([{ opacity: 0, transform: `translateX(${ENTER.slide}px)` }, { opacity: 1, transform: "none" }], { duration: ENTER.ms, easing: "ease-out" });
|
|
585
|
+
} else if (form === "strip") strip.show(true, { fade });
|
|
586
|
+
if (!form) return;
|
|
587
|
+
dirty = true;
|
|
588
|
+
markedKey = null;
|
|
589
|
+
try {
|
|
590
|
+
run();
|
|
591
|
+
} catch {
|
|
592
|
+
drawnSignature = null;
|
|
593
|
+
dirty = true;
|
|
594
|
+
frames.wake(); // drawn by the loop, which says what went wrong
|
|
595
|
+
}
|
|
596
|
+
if (hadFocus) {
|
|
597
|
+
if (form === "full") list.focus(focusedRow >= 0 ? focusedRow : Math.max(0, list.marked));
|
|
598
|
+
else strip.focusButton();
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
// The strip's card as wide as the list chosen, and a little more.
|
|
603
|
+
const cardWidth = () => { strip.card.style.width = `${outlineWidth(chosen, MARGIN) + CARD}px`; };
|
|
604
|
+
cardWidth();
|
|
605
|
+
|
|
606
|
+
// Shown in the form the room gives it as the editor starts, at once (it comes with the page), then
|
|
607
|
+
// as the room changes (the window, the list's width) and switched on or off by the
|
|
608
|
+
// reader, faded in (switched off, gone at once). Another page of the origin dragging the list's width
|
|
609
|
+
// (every report's): followed. This report's outline switched by another page (the workbench's top bar,
|
|
610
|
+
// the report in another tab): followed; another report's switch changes nothing here.
|
|
611
|
+
show(setMargin({ outline: on, outlineWidth: chosen }));
|
|
612
|
+
onMargin((layout) => show(layout, { fade: true }));
|
|
613
|
+
onPreferences(() => {
|
|
614
|
+
const width = preference("outlineWidth");
|
|
615
|
+
if (width === chosen || sizing) return;
|
|
616
|
+
chosen = width;
|
|
617
|
+
cardWidth();
|
|
618
|
+
setMargin({ outlineWidth: chosen });
|
|
619
|
+
});
|
|
620
|
+
onOutlineOpen(() => {
|
|
621
|
+
const next = outlineOpen(slug);
|
|
622
|
+
if (next === on) return;
|
|
623
|
+
on = next;
|
|
624
|
+
show(setMargin({ outline: on }), { fade: true });
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
// ---------- the width ----------
|
|
628
|
+
|
|
629
|
+
// The guide dragged: the list wider or narrower as the pointer goes (the column staying in the middle
|
|
630
|
+
// of what it leaves: margin.mjs), within 160px and what leaves the column its edge room at both sides
|
|
631
|
+
// (outlineMost); let go, the
|
|
632
|
+
// width is the reader's (every report, every page of the origin); Esc, the window losing the focus or
|
|
633
|
+
// the pointer taken away put it back.
|
|
634
|
+
let sizing = null; // { x, width, most, now, before }
|
|
635
|
+
grip.addEventListener("pointerdown", (event) => {
|
|
636
|
+
if (event.button !== 0 || form !== "full") return;
|
|
637
|
+
event.preventDefault();
|
|
638
|
+
const width = Math.round(dock.getBoundingClientRect().width);
|
|
639
|
+
sizing = { x: event.clientX, width, most: Math.max(width, outlineMost()), now: width, before: chosen };
|
|
640
|
+
try { document.documentElement.setPointerCapture(event.pointerId); } catch {}
|
|
641
|
+
document.documentElement.setAttribute(RESIZING, "");
|
|
642
|
+
});
|
|
643
|
+
document.documentElement.addEventListener("pointermove", (event) => {
|
|
644
|
+
if (!sizing) return;
|
|
645
|
+
const width = Math.round(Math.max(MARGIN.fullMin, Math.min(sizing.most, sizing.width + sizing.x - event.clientX)));
|
|
646
|
+
if (width === sizing.now) return;
|
|
647
|
+
sizing.now = width;
|
|
648
|
+
setMargin({ outlineWidth: width });
|
|
649
|
+
});
|
|
650
|
+
// Let go where it began (or never moved): nothing chosen, the width chosen before laid out again (the
|
|
651
|
+
// drag gave the layout the width shown, narrower than the one chosen where the room is short).
|
|
652
|
+
function endSizing(keep) {
|
|
653
|
+
if (!sizing) return;
|
|
654
|
+
const { now, before, width } = sizing;
|
|
655
|
+
sizing = null;
|
|
656
|
+
document.documentElement.removeAttribute(RESIZING);
|
|
657
|
+
if (!keep || now === width) setMargin({ outlineWidth: before });
|
|
658
|
+
else {
|
|
659
|
+
chosen = now;
|
|
660
|
+
setPreference("outlineWidth", now);
|
|
661
|
+
cardWidth();
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
document.documentElement.addEventListener("pointerup", () => endSizing(true));
|
|
665
|
+
endsGesture({ active: () => Boolean(sizing), cancel: () => endSizing(false) });
|
|
666
|
+
cancelOnEscape({ active: () => Boolean(sizing), cancel: () => endSizing(false) });
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
// The page changing: read again on the next frame when it may change what is listed (one reading
|
|
670
|
+
// a frame however much changed; words typed elsewhere only move the headings: the current one again).
|
|
671
|
+
// Off, nothing is read (showing it reads the page anew).
|
|
672
|
+
new MutationObserver((records) => {
|
|
673
|
+
if (!form) return;
|
|
674
|
+
if (touchesOutline(records)) dirty = true;
|
|
675
|
+
wake();
|
|
676
|
+
}).observe(main, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ["hidden", "open", "aria-selected", "data-block-id", "data-sheet-tab", "data-ge-unit-kind"] });
|
|
677
|
+
// Where the headings are changes without a scroll too (a picture loaded, a disclosure opened, the window resized).
|
|
678
|
+
new ResizeObserver(wake).observe(main);
|
|
679
|
+
addEventListener("resize", wake);
|
|
680
|
+
// An input method composing: what it types is read once it commits (compositionend; Chrome does
|
|
681
|
+
// not always send one, editor.mjs compositionOver: a key, an input or a press that is no part of one ends it too).
|
|
682
|
+
const composed = () => {
|
|
683
|
+
if (!composing) return;
|
|
684
|
+
composing = false;
|
|
685
|
+
wake();
|
|
686
|
+
};
|
|
687
|
+
document.addEventListener("compositionstart", () => { composing = true; }, true);
|
|
688
|
+
document.addEventListener("compositionend", composed, true);
|
|
689
|
+
for (const type of ["keydown", "input"]) document.addEventListener(type, (event) => { if (composing && !event.isComposing && event.keyCode !== 229) composed(); }, true);
|
|
690
|
+
document.addEventListener("pointerdown", composed, true);
|
|
691
|
+
|
|
692
|
+
function holds(target) {
|
|
693
|
+
return Boolean(target?.nodeType === 1 && (dock.contains(target) || strip.holds(target)));
|
|
694
|
+
}
|
|
695
|
+
made = { holds, get shown() { return form !== null; } };
|
|
696
|
+
return made;
|
|
697
|
+
}
|