@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
package/kit/tables.js
ADDED
|
@@ -0,0 +1,1449 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
(() => {
|
|
3
|
+
// src/render/kit/tables/auto-column-widths.ts
|
|
4
|
+
var defaults = {
|
|
5
|
+
percentile: 0.9,
|
|
6
|
+
hardMinWidth: 48,
|
|
7
|
+
narrativeMinWidth: 160,
|
|
8
|
+
maxReadableFloor: Infinity,
|
|
9
|
+
tokenHeavyMinWidth: 140,
|
|
10
|
+
compactMaxProtectedWidth: 160,
|
|
11
|
+
cellPadding: 24,
|
|
12
|
+
columnOverhead: 0,
|
|
13
|
+
font: "14px system-ui"
|
|
14
|
+
};
|
|
15
|
+
var kinds = ["token-heavy", "narrative", "compact"];
|
|
16
|
+
var total = (columns) => columns.reduce((sum, column) => sum + column.width, 0);
|
|
17
|
+
var clamp = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
18
|
+
function quantile(values, q) {
|
|
19
|
+
if (!values.length) return 0;
|
|
20
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
21
|
+
const position = (sorted.length - 1) * q;
|
|
22
|
+
const low = Math.floor(position), high = Math.ceil(position);
|
|
23
|
+
return sorted[low] * (1 - position + low) + sorted[high] * (position - low);
|
|
24
|
+
}
|
|
25
|
+
function createTextMeasurer(font) {
|
|
26
|
+
const context = typeof document === "undefined" ? null : document.createElement("canvas").getContext("2d");
|
|
27
|
+
if (context) context.font = font;
|
|
28
|
+
const size = Number(font.match(/([\d.]+)px/)?.[1]) || 14;
|
|
29
|
+
const cache = /* @__PURE__ */ new Map();
|
|
30
|
+
return (text) => {
|
|
31
|
+
if (cache.has(text)) return cache.get(text);
|
|
32
|
+
const width = Math.max(0, ...text.split(/\r\n|\r|\n/).map((line) => context ? context.measureText(line).width : Array.from(line).reduce((sum, char) => sum + size * (/[^\x00-\xff]/.test(char) ? 1 : 0.55), 0)));
|
|
33
|
+
cache.set(text, width);
|
|
34
|
+
return width;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
var WORD_BREAKS = /\s+|(?<=[、,。;:!?)」』》】〉〕”’,;!?)\]/])(?=[^\s、,。;:!?)」』》】〉〕”’,;!?)\]])|(?<=-)(?=[^\d\s-])|(?<=[^\s(「『《【〈〔“‘(\[])(?=[(「『《【〈〔“‘(\[])/u;
|
|
38
|
+
var PIECE_BREAKS = new RegExp(String.raw`${WORD_BREAKS.source}|(?<=[^\s(「『《【〈〔“‘(\[])(?=[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}])|(?<=[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}])(?=[^\s、,。;:!?)」』》】〉〕”’,;!?)\]])`, "u");
|
|
39
|
+
var longest = (text, breaks, measure) => Math.max(0, ...text.trim().split(breaks).map(measure));
|
|
40
|
+
function tokenHeavy(token) {
|
|
41
|
+
if (/^https?:\/\//i.test(token) || /[/\\]/.test(token)) return true;
|
|
42
|
+
if (/^[a-f0-9]{20,}$/i.test(token)) return true;
|
|
43
|
+
if (token.length >= 24 && /^[A-Za-z0-9_.:@/+~-]+$/.test(token)) return true;
|
|
44
|
+
return token.length >= 28 && !/[\u3040-\u30ff\u3400-\u9fff\uac00-\ud7af]/.test(token);
|
|
45
|
+
}
|
|
46
|
+
function columnKind(header, cells, measure) {
|
|
47
|
+
return analyze(header, cells, measure).kind;
|
|
48
|
+
}
|
|
49
|
+
function analyze(header, cells, measure) {
|
|
50
|
+
const values = cells.length ? cells : [header];
|
|
51
|
+
let words = 0, width = 0, heavy = 0;
|
|
52
|
+
for (const value of values) {
|
|
53
|
+
const tokens = value.trim().split(/\s+/).filter(Boolean);
|
|
54
|
+
words += tokens.length;
|
|
55
|
+
width += measure(value);
|
|
56
|
+
for (const token of tokens) {
|
|
57
|
+
if (tokenHeavy(token)) heavy++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const kind = heavy > 0 && heavy / words >= 0.5 ? "token-heavy" : words / values.length >= 4 || width / values.length >= measure("abcdefghijklmnopqrstuvwxyz") ? "narrative" : "compact";
|
|
61
|
+
return { kind };
|
|
62
|
+
}
|
|
63
|
+
function shrink(columns, available, padding) {
|
|
64
|
+
let overflow = total(columns) - available;
|
|
65
|
+
const epsilon = 1e-6;
|
|
66
|
+
for (const compact of [false, true]) {
|
|
67
|
+
const group = columns.filter((column) => column.kind === "compact" === compact);
|
|
68
|
+
while (overflow > epsilon) {
|
|
69
|
+
const states = group.map((column) => ({
|
|
70
|
+
column,
|
|
71
|
+
slack: column.width - column.softMinWidth,
|
|
72
|
+
content: Math.max(1, column.preferredWidth - padding)
|
|
73
|
+
})).filter((item) => item.slack > epsilon);
|
|
74
|
+
if (!states.length) break;
|
|
75
|
+
const contentSum = states.reduce((sum, state) => sum + state.content, 0);
|
|
76
|
+
const fraction = Math.min(overflow / contentSum, ...states.map((state) => state.slack / state.content));
|
|
77
|
+
let reduced = 0;
|
|
78
|
+
for (const { column, content } of states) {
|
|
79
|
+
const before = column.width;
|
|
80
|
+
column.width = Math.max(column.softMinWidth, before - fraction * content);
|
|
81
|
+
reduced += before - column.width;
|
|
82
|
+
}
|
|
83
|
+
if (reduced <= epsilon) break;
|
|
84
|
+
overflow -= reduced;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function lowerWidest(widths, floors, excess) {
|
|
89
|
+
const lowered = (level) => widths.map((width, index) => Math.min(width, Math.max(level, floors[index])));
|
|
90
|
+
const saved = (level) => widths.reduce((sum, width, index) => sum + width - Math.min(width, Math.max(level, floors[index])), 0);
|
|
91
|
+
let low = Math.min(...floors), high = Math.max(...widths);
|
|
92
|
+
if (saved(low) <= excess) return lowered(low);
|
|
93
|
+
for (let step = 0; step < 40; step++) {
|
|
94
|
+
const level = (low + high) / 2;
|
|
95
|
+
if (saved(level) > excess) low = level;
|
|
96
|
+
else high = level;
|
|
97
|
+
}
|
|
98
|
+
return lowered(high);
|
|
99
|
+
}
|
|
100
|
+
function allocateColumnWidths(columns, options) {
|
|
101
|
+
const config = { ...defaults, ...options };
|
|
102
|
+
if (!Number.isFinite(config.totalWidth) || config.totalWidth <= 0) throw new Error("totalWidth must be positive and finite.");
|
|
103
|
+
for (const key of ["percentile", "hardMinWidth", "narrativeMinWidth", "tokenHeavyMinWidth", "compactMaxProtectedWidth", "cellPadding", "columnOverhead"]) {
|
|
104
|
+
if (!Number.isFinite(config[key]) || config[key] < 0) throw new Error(`${key} must be finite and nonnegative.`);
|
|
105
|
+
}
|
|
106
|
+
if (!(config.maxReadableFloor > 0)) throw new Error("maxReadableFloor must be positive.");
|
|
107
|
+
if (config.hardMinWidth === 0 || config.percentile > 1) throw new Error("hardMinWidth must be positive; percentile must be between 0 and 1.");
|
|
108
|
+
if (typeof config.font !== "string" || !config.font.trim()) throw new Error("font must be a nonempty string.");
|
|
109
|
+
if (!Array.isArray(columns)) throw new Error("columns must be an array.");
|
|
110
|
+
const keys = /* @__PURE__ */ new Set();
|
|
111
|
+
const measure = createTextMeasurer(config.font);
|
|
112
|
+
const compactTargets = [];
|
|
113
|
+
const wordFloors = /* @__PURE__ */ new Map();
|
|
114
|
+
const layouts2 = columns.map((column) => {
|
|
115
|
+
if (!column || typeof column.key !== "string" || !column.key || keys.has(column.key)) throw new Error("Column keys must be unique nonempty strings.");
|
|
116
|
+
keys.add(column.key);
|
|
117
|
+
if (typeof column.header !== "string" || !Array.isArray(column.cells)) throw new Error("Each column requires a header and cells.");
|
|
118
|
+
if (column.kind !== void 0 && !kinds.includes(column.kind)) throw new Error("Invalid column kind.");
|
|
119
|
+
if (column.numeric !== void 0 && typeof column.numeric !== "boolean") throw new Error("numeric must be a boolean.");
|
|
120
|
+
for (const value of column.cells) if (value != null && typeof value !== "string" && (typeof value !== "number" || !Number.isFinite(value))) throw new Error("Cells must be strings, finite numbers, null or undefined.");
|
|
121
|
+
const hardMinWidth = Math.max(config.hardMinWidth, column.minWidth ?? 0);
|
|
122
|
+
for (const bound of [column.minWidth, column.maxWidth]) if (bound !== void 0 && (!Number.isFinite(bound) || bound <= 0)) throw new Error("Column bounds must be positive and finite.");
|
|
123
|
+
if (column.maxWidth !== void 0 && column.maxWidth < hardMinWidth) throw new Error("maxWidth cannot be below the hard minimum.");
|
|
124
|
+
if (column.cellWidths !== void 0 && (!Array.isArray(column.cellWidths) || column.cellWidths.length !== column.cells.length || column.cellWidths.some((width) => !Number.isFinite(width) || width < 0))) throw new Error("cellWidths must match cells and contain finite nonnegative widths.");
|
|
125
|
+
if (column.cellWordWidths !== void 0 && (!Array.isArray(column.cellWordWidths) || column.cellWordWidths.length !== column.cells.length || column.cellWordWidths.some((width) => !Number.isFinite(width) || width < 0))) throw new Error("cellWordWidths must match cells and contain finite nonnegative widths.");
|
|
126
|
+
if (column.headerWordWidth !== void 0 && (!Number.isFinite(column.headerWordWidth) || column.headerWordWidth < 0)) throw new Error("headerWordWidth must be finite and nonnegative.");
|
|
127
|
+
if (column.cellPieceWidths !== void 0 && (!Array.isArray(column.cellPieceWidths) || column.cellPieceWidths.length !== column.cells.length || column.cellPieceWidths.some((width) => !Number.isFinite(width) || width < 0))) throw new Error("cellPieceWidths must match cells and contain finite nonnegative widths.");
|
|
128
|
+
const nonempty = column.cells.map((value, index) => ({ value, index })).filter(({ value }) => value != null && String(value).trim() !== "");
|
|
129
|
+
const values = nonempty.map(({ value }) => String(value));
|
|
130
|
+
if (column.headerWidth !== void 0 && (!Number.isFinite(column.headerWidth) || column.headerWidth < 0)) throw new Error("headerWidth must be finite and nonnegative.");
|
|
131
|
+
const headerWidth = column.headerWidth ?? measure(column.header) + config.cellPadding;
|
|
132
|
+
const analysis = analyze(column.header, values, measure);
|
|
133
|
+
const kind = column.kind ?? analysis.kind;
|
|
134
|
+
const measuredWidths = nonempty.map(({ value, index }) => column.cellWidths?.[index] ?? measure(String(value)) + config.cellPadding);
|
|
135
|
+
const protectedWidth = kind === "compact" ? measuredWidths.reduce((max, width) => width <= config.compactMaxProtectedWidth ? Math.max(max, width) : max, 0) : 0;
|
|
136
|
+
const preferredWidth = clamp(Math.max(headerWidth, protectedWidth, quantile(measuredWidths, config.percentile)), hardMinWidth, column.maxWidth ?? Infinity);
|
|
137
|
+
const contentFloor = Math.min(320, config.cellPadding + Math.max(0, quantile(measuredWidths, config.percentile) - config.cellPadding) / 3);
|
|
138
|
+
const floor = kind === "token-heavy" ? Math.max(config.tokenHeavyMinWidth, contentFloor) : kind === "narrative" ? Math.max(config.narrativeMinWidth, contentFloor) : Math.min(config.compactMaxProtectedWidth, preferredWidth);
|
|
139
|
+
const soft = column.numeric ? floor : Math.min(config.maxReadableFloor, floor);
|
|
140
|
+
const layout = { key: column.key, kind, preferredWidth, softMinWidth: clamp(soft, hardMinWidth, preferredWidth), hardMinWidth, width: preferredWidth, ratio: 0 };
|
|
141
|
+
if (kind === "compact") {
|
|
142
|
+
for (const width of new Set(measuredWidths)) {
|
|
143
|
+
if (width > preferredWidth && width <= (column.maxWidth ?? Infinity)) compactTargets.push({ column: layout, width });
|
|
144
|
+
}
|
|
145
|
+
if (!column.numeric) {
|
|
146
|
+
const words = nonempty.map(({ value, index }) => column.cellWordWidths?.[index] ?? longest(String(value), WORD_BREAKS, measure) + config.cellPadding);
|
|
147
|
+
const pieces = nonempty.map(({ value, index }) => column.cellPieceWidths?.[index] ?? longest(String(value), PIECE_BREAKS, measure) + config.cellPadding);
|
|
148
|
+
const least = Math.max(column.headerWordWidth ?? longest(column.header, WORD_BREAKS, measure) + config.cellPadding, ...pieces);
|
|
149
|
+
wordFloors.set(layout, { whole: Math.max(least, quantile(words, config.percentile)), least: Math.max(least, quantile(words, 0.5)) });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return layout;
|
|
153
|
+
});
|
|
154
|
+
const besideProse = layouts2.some((column) => column.kind === "narrative") ? wordFloors : /* @__PURE__ */ new Map();
|
|
155
|
+
for (const [column, { whole }] of besideProse) column.softMinWidth = clamp(Math.min(column.softMinWidth, whole), column.hardMinWidth, column.preferredWidth);
|
|
156
|
+
const target = config.totalWidth - columns.length * config.columnOverhead;
|
|
157
|
+
const readableWidth = layouts2.reduce((sum2, column) => sum2 + column.softMinWidth, 0);
|
|
158
|
+
const available = Math.max(target, readableWidth);
|
|
159
|
+
let spare = available - total(layouts2);
|
|
160
|
+
compactTargets.sort((a, b) => a.width - a.column.width - (b.width - b.column.width) || a.column.key.localeCompare(b.column.key));
|
|
161
|
+
for (const { column, width } of compactTargets) {
|
|
162
|
+
const extra = width - column.width;
|
|
163
|
+
if (extra > 0 && extra <= spare) {
|
|
164
|
+
column.width = width;
|
|
165
|
+
column.preferredWidth = width;
|
|
166
|
+
spare -= extra;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
shrink(layouts2, available, config.cellPadding);
|
|
170
|
+
const excess = total(layouts2) - target;
|
|
171
|
+
if (excess > 0.5 && besideProse.size) {
|
|
172
|
+
const lowered = [...besideProse].map(([column, { least }]) => ({ column, floor: clamp(Math.min(column.softMinWidth, least), column.hardMinWidth, column.preferredWidth) }));
|
|
173
|
+
if (lowered.reduce((sum2, { column, floor }) => sum2 + column.width - floor, 0) >= excess) {
|
|
174
|
+
const widths = lowerWidest(lowered.map(({ column }) => column.width), lowered.map(({ floor }) => floor), excess);
|
|
175
|
+
lowered.forEach(({ column }, index) => {
|
|
176
|
+
column.width = widths[index];
|
|
177
|
+
column.softMinWidth = Math.min(column.softMinWidth, widths[index]);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const sum = total(layouts2);
|
|
182
|
+
layouts2.forEach((column) => {
|
|
183
|
+
column.ratio = column.width / sum;
|
|
184
|
+
});
|
|
185
|
+
return layouts2;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// src/shared/number-reading.mjs
|
|
189
|
+
function rawCellValue(cell) {
|
|
190
|
+
return (cell?.dataset.sortValue ?? cell?.textContent ?? "").trim();
|
|
191
|
+
}
|
|
192
|
+
var missingValues = /* @__PURE__ */ new Set(["", "-", "\u2014", "\u2013", "\u2212", "n/a", "na", "null"]);
|
|
193
|
+
function isMissingValue(raw) {
|
|
194
|
+
return missingValues.has(raw.toLowerCase());
|
|
195
|
+
}
|
|
196
|
+
var QUALIFIER = String.raw`(?:约|大约|近|超过|不足|≈|~|<=?|>=?|≤|≥|±)?`;
|
|
197
|
+
var AMOUNT = String.raw`[$¥€£₩₹]?\s*((?:\d{1,3}(?:[,\s\u00a0\u2009]\d{3})+|\d{1,4}(?:,\d{4})+|\d+)(?:\.\d*)?(?:e[+-]?\d+)?|\.\d+)`;
|
|
198
|
+
var UNIT = String.raw`((?:[%‰x×]|[A-Za-zµμ\u4e00-\u9fff°℃]+(?:\/[A-Za-zµμ\u4e00-\u9fff°℃·]+)?)?)`;
|
|
199
|
+
var UNIT_SCALES = { \u5343: 1e3, \u4E07: 1e4, \u4EBF: 1e8 };
|
|
200
|
+
var SCALE = UNIT_SCALES;
|
|
201
|
+
var SINGLE = new RegExp(`^${QUALIFIER}\\s*([+-]?)\\s*${AMOUNT}\\s*${UNIT}$`, "i");
|
|
202
|
+
var RANGE = new RegExp(`^([+-]?)\\s*${AMOUNT}\\s*${UNIT}\\s*(?:-|~|\u81F3|\u5230)\\s*[+-]?\\s*${AMOUNT}\\s*${UNIT}$`, "i");
|
|
203
|
+
function numberReading(raw) {
|
|
204
|
+
let text = raw.normalize("NFKC").trim().replace(/[−–—]/g, "-");
|
|
205
|
+
const accounting = /^\((.+)\)$/.exec(text);
|
|
206
|
+
if (accounting) text = accounting[1].trim();
|
|
207
|
+
const single = SINGLE.exec(text);
|
|
208
|
+
const match = single ?? RANGE.exec(text);
|
|
209
|
+
if (!match) return null;
|
|
210
|
+
const value = Number(`${match[1]}${match[2].replace(/[,\s\u00a0\u2009]/g, "")}`);
|
|
211
|
+
const written = accounting ? -value : value;
|
|
212
|
+
const unit = match[3] ?? "";
|
|
213
|
+
const scaled = written * (SCALE[unit[0]] ?? 1);
|
|
214
|
+
if (!Number.isFinite(scaled)) return null;
|
|
215
|
+
return single ? { value: scaled, written, unit } : { value: scaled, written, unit, range: true };
|
|
216
|
+
}
|
|
217
|
+
function numberValue(raw) {
|
|
218
|
+
return numberReading(raw)?.value ?? null;
|
|
219
|
+
}
|
|
220
|
+
function numericParts(cell) {
|
|
221
|
+
const raw = rawCellValue(cell);
|
|
222
|
+
if (isMissingValue(raw)) return null;
|
|
223
|
+
const scalar = numberValue(raw);
|
|
224
|
+
if (scalar !== null) return [scalar];
|
|
225
|
+
const tokens = raw.split(/\s*\/\s*/);
|
|
226
|
+
if (tokens.length < 2) return null;
|
|
227
|
+
const values = tokens.map(numberValue);
|
|
228
|
+
return values.every((value) => value !== null) ? values : null;
|
|
229
|
+
}
|
|
230
|
+
function parsedValue(cell, type) {
|
|
231
|
+
const raw = rawCellValue(cell);
|
|
232
|
+
if (isMissingValue(raw)) return null;
|
|
233
|
+
if (type === "number") {
|
|
234
|
+
const values = numericParts(cell);
|
|
235
|
+
return values?.length === 1 ? values[0] : null;
|
|
236
|
+
}
|
|
237
|
+
if (type === "date") {
|
|
238
|
+
const value = Date.parse(raw);
|
|
239
|
+
return Number.isFinite(value) ? value : null;
|
|
240
|
+
}
|
|
241
|
+
return raw;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// src/render/kit/tables/cells.js
|
|
245
|
+
function elementFor(target) {
|
|
246
|
+
const element = typeof target === "string" ? document.querySelector(target) : target;
|
|
247
|
+
if (!(element instanceof HTMLTableElement)) {
|
|
248
|
+
throw new Error("DocTables target must be a table element.");
|
|
249
|
+
}
|
|
250
|
+
return element;
|
|
251
|
+
}
|
|
252
|
+
var wrapperOf = (table) => table.parentElement?.classList.contains("doc-table-wrap") ? table.parentElement : null;
|
|
253
|
+
var numbersOff = (table) => table.getAttribute("data-number-columns") === "off" || wrapperOf(table)?.getAttribute("data-number-columns") === "off";
|
|
254
|
+
var mergedCells = (table) => [...table.tHead?.rows || [], ...Array.from(table.tBodies).flatMap((body) => [...body.rows])].some((row) => Array.from(row.cells).some((cell) => cell.rowSpan !== 1 || cell.colSpan !== 1));
|
|
255
|
+
function tableRows(table) {
|
|
256
|
+
return Array.from(table.tBodies).flatMap((body) => Array.from(body.rows));
|
|
257
|
+
}
|
|
258
|
+
var footRows = (table) => Array.from(table.tFoot?.rows || []);
|
|
259
|
+
function footColumns(table) {
|
|
260
|
+
const columns = /* @__PURE__ */ new Map();
|
|
261
|
+
const rows = footRows(table);
|
|
262
|
+
if (rows.some((row) => Array.from(row.cells).some((cell) => cell.rowSpan !== 1))) return columns;
|
|
263
|
+
for (const row of rows) {
|
|
264
|
+
let column = 0;
|
|
265
|
+
for (const cell of row.cells) {
|
|
266
|
+
if (cell.colSpan === 1) columns.set(column, [...columns.get(column) || [], cell]);
|
|
267
|
+
column += cell.colSpan;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return columns;
|
|
271
|
+
}
|
|
272
|
+
function cellText(cell) {
|
|
273
|
+
return cell.textContent.trim();
|
|
274
|
+
}
|
|
275
|
+
var RUN = /\/*[^\s/]+\/*|\/+|\s+/g;
|
|
276
|
+
var CODE_RUN = "doc-code-run";
|
|
277
|
+
var NAME_BREAK = /(?<=[^.\s]\.)(?=[^.])|(?<=[^_./\s])(?=_+[A-Za-z0-9])|(?<=[a-z0-9])(?=[A-Z])/;
|
|
278
|
+
var codeRuns = (text) => text.match(RUN) ?? [];
|
|
279
|
+
var runParts = (run) => run.split(NAME_BREAK);
|
|
280
|
+
function splitCodeRuns(table) {
|
|
281
|
+
for (const code of table.querySelectorAll("td code, th code")) {
|
|
282
|
+
if (code.closest("[contenteditable]") || code.querySelector(`.${CODE_RUN}`) || !code.textContent.trim() || [...code.childNodes].some((node) => node.nodeType !== Node.TEXT_NODE)) continue;
|
|
283
|
+
const doc = code.ownerDocument;
|
|
284
|
+
const pieces = codeRuns(code.textContent);
|
|
285
|
+
code.replaceChildren(...pieces.flatMap((piece, index) => {
|
|
286
|
+
if (!piece.trim()) return [doc.createTextNode(piece)];
|
|
287
|
+
const run = doc.createElement("span");
|
|
288
|
+
run.className = CODE_RUN;
|
|
289
|
+
run.replaceChildren(...runParts(piece).flatMap((part, at) => at ? [doc.createElement("wbr"), doc.createTextNode(part)] : [doc.createTextNode(part)]));
|
|
290
|
+
return piece.endsWith("/") && index < pieces.length - 1 ? [run, doc.createElement("wbr")] : [run];
|
|
291
|
+
}));
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
function joinCodeRuns(root) {
|
|
295
|
+
for (const code of new Set([...root.querySelectorAll(`.${CODE_RUN}`)].map((run) => run.parentElement))) code.textContent = code.textContent;
|
|
296
|
+
}
|
|
297
|
+
var TEXT_SORTS = /* @__PURE__ */ new Set(["text", "date"]);
|
|
298
|
+
function inferColumnSemantics(table) {
|
|
299
|
+
const headers = Array.from(table.tHead?.rows[0]?.cells || []);
|
|
300
|
+
const rows = tableRows(table);
|
|
301
|
+
if (mergedCells(table) || numbersOff(table)) {
|
|
302
|
+
table.querySelectorAll(".number").forEach((cell) => cell.classList.remove("number"));
|
|
303
|
+
headers.forEach((header) => {
|
|
304
|
+
if (header.dataset.sortType === "number") delete header.dataset.sortType;
|
|
305
|
+
});
|
|
306
|
+
return [];
|
|
307
|
+
}
|
|
308
|
+
if (headers.length === 0 || rows.length === 0) return [];
|
|
309
|
+
const numericColumns = [];
|
|
310
|
+
const foot = footColumns(table);
|
|
311
|
+
headers.forEach((header, index) => {
|
|
312
|
+
const cells = rows.map((row) => row.cells[index]).filter(Boolean);
|
|
313
|
+
if (cells.length === 0) return;
|
|
314
|
+
const observedCells = cells.filter((cell) => !isMissingValue(rawCellValue(cell)));
|
|
315
|
+
const inferredNumericDisplay = !TEXT_SORTS.has(header.dataset.sortType) && observedCells.length > 0 && observedCells.every((cell) => numericParts(cell) !== null);
|
|
316
|
+
const inferredSortableNumber = inferredNumericDisplay && observedCells.every((cell) => parsedValue(cell, "number") !== null);
|
|
317
|
+
header.classList.toggle("number", inferredNumericDisplay);
|
|
318
|
+
cells.forEach((cell) => cell.classList.toggle("number", inferredNumericDisplay));
|
|
319
|
+
(foot.get(index) || []).forEach((cell) => cell.classList.toggle(
|
|
320
|
+
"number",
|
|
321
|
+
inferredNumericDisplay && (isMissingValue(rawCellValue(cell)) || numericParts(cell) !== null)
|
|
322
|
+
));
|
|
323
|
+
if (!inferredSortableNumber) {
|
|
324
|
+
if (header.dataset.sortType === "number") delete header.dataset.sortType;
|
|
325
|
+
if (inferredNumericDisplay) numericColumns.push(index);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
numericColumns.push(index);
|
|
329
|
+
if (!header.dataset.sortType && !header.hasAttribute("data-sort-ignore")) {
|
|
330
|
+
header.dataset.sortType = "number";
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
return numericColumns;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// src/shared/table-slots.mjs
|
|
337
|
+
function tileSlots(rows) {
|
|
338
|
+
const matrix = rows.map(() => []);
|
|
339
|
+
const places = /* @__PURE__ */ new Map();
|
|
340
|
+
for (let r = 0; r < rows.length; r++) {
|
|
341
|
+
let c = 0;
|
|
342
|
+
for (const { ref, rowspan, colspan } of rows[r].cells) {
|
|
343
|
+
while (matrix[r][c]) c++;
|
|
344
|
+
if (!(rowspan >= 1) || !(colspan >= 1)) return null;
|
|
345
|
+
for (let i = 0; i < rowspan; i++) {
|
|
346
|
+
if (rows[r + i]?.section !== rows[r].section) return null;
|
|
347
|
+
for (let j = 0; j < colspan; j++) {
|
|
348
|
+
if (matrix[r + i][c + j]) return null;
|
|
349
|
+
matrix[r + i][c + j] = ref;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
places.set(ref, { r, c, rows: rowspan, cols: colspan });
|
|
353
|
+
c += colspan;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const columns = matrix[0]?.length ?? 0;
|
|
357
|
+
if (columns === 0 || matrix.some((row) => row.length !== columns || row.includes(void 0))) return null;
|
|
358
|
+
return { matrix, places, columns };
|
|
359
|
+
}
|
|
360
|
+
var slotsOf = (rows) => tileSlots(rows.map((row) => ({ section: row.parentElement, cells: [...row.cells].map((cell) => ({ ref: cell, rowspan: cell.rowSpan, colspan: cell.colSpan })) })));
|
|
361
|
+
var columnCells = (slots, c) => [...slots.places].filter(([, place]) => place.c === c && place.cols === 1).map(([ref]) => ref);
|
|
362
|
+
var columnWidths = (slots, widthOf) => Array.from({ length: slots.columns }, (_, c) => {
|
|
363
|
+
for (const cell of columnCells(slots, c)) {
|
|
364
|
+
const width = widthOf(cell);
|
|
365
|
+
if (width) return width;
|
|
366
|
+
}
|
|
367
|
+
return null;
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
// src/render/kit/tables/edges.js
|
|
371
|
+
var EDGE = "data-doc-edge";
|
|
372
|
+
function markEdges(table) {
|
|
373
|
+
const rows = [...table.rows];
|
|
374
|
+
const edges = /* @__PURE__ */ new Map();
|
|
375
|
+
const spans = table.parentElement?.classList.contains("doc-table-wrap") && rows.some((row) => [...row.cells].some((cell) => cell.rowSpan !== 1));
|
|
376
|
+
const slots = spans ? slotsOf(rows) : null;
|
|
377
|
+
if (slots) {
|
|
378
|
+
for (const [cell, { r, c, rows: down, cols }] of slots.places) {
|
|
379
|
+
const sides = [c + cols === slots.columns && "right", r + down === rows.length && "bottom"].filter(Boolean).join(" ");
|
|
380
|
+
if (sides) edges.set(cell, sides);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
for (const cell of table.querySelectorAll(`:scope > * > tr > [${EDGE}]`)) if (!edges.has(cell)) cell.removeAttribute(EDGE);
|
|
384
|
+
for (const [cell, sides] of edges) if (cell.getAttribute(EDGE) !== sides) cell.setAttribute(EDGE, sides);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// src/shared/table-hides.mjs
|
|
388
|
+
function cellColumns(table) {
|
|
389
|
+
const taken = [];
|
|
390
|
+
const columnOf = /* @__PURE__ */ new Map();
|
|
391
|
+
let columns = 0;
|
|
392
|
+
[...table.rows].forEach((row, r) => {
|
|
393
|
+
let c = 0;
|
|
394
|
+
for (const cell of row.cells) {
|
|
395
|
+
while (taken[r]?.[c]) c++;
|
|
396
|
+
const across = Math.max(1, cell.colSpan);
|
|
397
|
+
for (let i = 0; i < Math.max(1, cell.rowSpan); i++) for (let j = 0; j < across; j++) (taken[r + i] ??= [])[c + j] = true;
|
|
398
|
+
columnOf.set(cell, c + across - 1);
|
|
399
|
+
c += across;
|
|
400
|
+
columns = Math.max(columns, c);
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
return { columnOf, columns };
|
|
404
|
+
}
|
|
405
|
+
function wordsBox(cell) {
|
|
406
|
+
const boxes = [];
|
|
407
|
+
const range = document.createRange();
|
|
408
|
+
const walker = document.createTreeWalker(cell, NodeFilter.SHOW_TEXT);
|
|
409
|
+
for (let node = walker.nextNode(); node; node = walker.nextNode()) {
|
|
410
|
+
if (!node.nodeValue.trim() || node.parentElement?.closest(".katex-mathml")) continue;
|
|
411
|
+
range.selectNodeContents(node);
|
|
412
|
+
boxes.push(...range.getClientRects());
|
|
413
|
+
}
|
|
414
|
+
for (const element of cell.querySelectorAll("img, svg, canvas, input, video")) boxes.push(element.getBoundingClientRect());
|
|
415
|
+
const drawn = boxes.filter((box) => box.width > 0 || box.height > 0);
|
|
416
|
+
if (drawn.length === 0) return null;
|
|
417
|
+
return {
|
|
418
|
+
left: Math.min(...drawn.map((box) => box.left)),
|
|
419
|
+
right: Math.max(...drawn.map((box) => box.right)),
|
|
420
|
+
top: Math.min(...drawn.map((box) => box.top)),
|
|
421
|
+
bottom: Math.max(...drawn.map((box) => box.bottom))
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
function tableHides(wrapper, table) {
|
|
425
|
+
const width = wrapper.clientWidth;
|
|
426
|
+
const height = wrapper.clientHeight;
|
|
427
|
+
const box = table.getBoundingClientRect();
|
|
428
|
+
const holds = (cell) => Boolean((cell.textContent ?? "").trim() || cell.querySelector("img, svg, canvas, input, video"));
|
|
429
|
+
const { columnOf, columns } = cellColumns(table);
|
|
430
|
+
const fixed = table.classList.contains("doc-table--sticky-first") || Boolean(table.querySelector(':scope > tbody > tr > th[scope="row"]:first-child'));
|
|
431
|
+
const before = /* @__PURE__ */ new Set();
|
|
432
|
+
const past = /* @__PURE__ */ new Set();
|
|
433
|
+
const names = [];
|
|
434
|
+
let reach = 0;
|
|
435
|
+
for (const row of table.rows) {
|
|
436
|
+
if (row.getClientRects().length === 0) continue;
|
|
437
|
+
for (const cell of row.cells) {
|
|
438
|
+
const column = columnOf.get(cell);
|
|
439
|
+
if (names[column] === void 0 && cell.colSpan <= 1 && holds(cell)) names[column] = (cell.textContent ?? "").replace(/\s+/g, " ").trim();
|
|
440
|
+
if (fixed && column === 0) continue;
|
|
441
|
+
if (cell.getBoundingClientRect().right - box.left <= width + 1) {
|
|
442
|
+
if (holds(cell)) before.add(column);
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
const found = wordsBox(cell);
|
|
446
|
+
if (!found) continue;
|
|
447
|
+
if (found.left - box.left < width - 1) before.add(column);
|
|
448
|
+
if (found.right - box.left > width + 1) {
|
|
449
|
+
past.add(column);
|
|
450
|
+
reach = Math.max(reach, found.right - box.left);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
const named = (column) => ({ column, name: names[column] ?? "" });
|
|
455
|
+
const away = [...past].filter((column) => !before.has(column)).sort((a, b) => a - b).map(named);
|
|
456
|
+
const cut = [...past].filter((column) => before.has(column)).sort((a, b) => a - b).map(named);
|
|
457
|
+
const quoted = (list) => `${list.slice(0, 4).map(({ column, name }) => name ? `"${name.length > 16 ? `${name.slice(0, 15)}\u2026` : name}"` : `column ${column + 1}`).join(", ")}${list.length > 4 ? ", \u2026" : ""}`;
|
|
458
|
+
const parts = [cut.length && `${cut.length} cut at the frame's edge (${quoted(cut)})`, away.length && `${away.length} out of sight (${quoted(away)})`].filter(Boolean);
|
|
459
|
+
const rows = [...table.tBodies].flatMap((body) => [...body.rows]).filter((row) => row.getClientRects().length > 0);
|
|
460
|
+
const shown = rows.filter((row) => {
|
|
461
|
+
const { top, bottom } = row.getBoundingClientRect();
|
|
462
|
+
if (bottom - box.top <= height + 1) return true;
|
|
463
|
+
if (top - box.top >= height - 1) return false;
|
|
464
|
+
return Math.max(-Infinity, ...[...row.cells].map(wordsBox).filter(Boolean).map((found) => found.bottom)) - box.top <= height + 1;
|
|
465
|
+
}).length;
|
|
466
|
+
return { columns, away, cut, said: parts.length ? `of ${columns} columns, ${parts.join(", ")}` : "", reach, rows: rows.length, shown };
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// src/render/kit/tables/sticky.js
|
|
470
|
+
function fixedFirstCell(table) {
|
|
471
|
+
return table.classList.contains("doc-table--sticky-first") ? table.rows[0]?.cells[0] ?? null : table.querySelector(':scope > tbody > tr > th[scope="row"]:first-child');
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// src/render/kit/tables/scrollbars.js
|
|
475
|
+
var global = globalThis;
|
|
476
|
+
var RAIL = 12;
|
|
477
|
+
var MIN_THUMB = 24;
|
|
478
|
+
var scrollbars = /* @__PURE__ */ new WeakMap();
|
|
479
|
+
var probe = globalThis.document?.createElement("div");
|
|
480
|
+
function setStyle(element, property, value) {
|
|
481
|
+
probe.style.setProperty(property, value);
|
|
482
|
+
if (element.style.getPropertyValue(property) !== probe.style.getPropertyValue(property)) element.style.setProperty(property, value);
|
|
483
|
+
}
|
|
484
|
+
function drawScrollbars(wrapper, table) {
|
|
485
|
+
if (scrollbars.has(wrapper)) return;
|
|
486
|
+
let node = wrapper.querySelector(":scope > .doc-scrollbars");
|
|
487
|
+
if (!node) {
|
|
488
|
+
node = document.createElement("div");
|
|
489
|
+
node.className = "doc-scrollbars";
|
|
490
|
+
node.setAttribute("aria-hidden", "true");
|
|
491
|
+
node.innerHTML = '<div class="doc-scrollbar doc-scrollbar--y"><div class="doc-scrollbar-thumb"></div></div><div class="doc-scrollbar doc-scrollbar--x"><div class="doc-scrollbar-thumb"></div></div>';
|
|
492
|
+
wrapper.prepend(node);
|
|
493
|
+
}
|
|
494
|
+
let frame = node.querySelector(":scope > .doc-scrollbars-frame");
|
|
495
|
+
if (!frame) {
|
|
496
|
+
frame = document.createElement("div");
|
|
497
|
+
frame.className = "doc-scrollbars-frame";
|
|
498
|
+
node.prepend(frame);
|
|
499
|
+
}
|
|
500
|
+
const bars = { node, table, frame, y: node.querySelector(".doc-scrollbar--y"), x: node.querySelector(".doc-scrollbar--x"), timer: 0, axes: {}, noted: "", reach: 0 };
|
|
501
|
+
scrollbars.set(wrapper, bars);
|
|
502
|
+
wrapper.addEventListener("scroll", () => {
|
|
503
|
+
placeScrollbars(wrapper);
|
|
504
|
+
bars.node.setAttribute("data-active", "");
|
|
505
|
+
clearTimeout(bars.timer);
|
|
506
|
+
bars.timer = setTimeout(() => bars.node.removeAttribute("data-active"), 900);
|
|
507
|
+
}, { passive: true });
|
|
508
|
+
wrapper.addEventListener("wheel", (event) => passOn(wrapper, event), { passive: true });
|
|
509
|
+
const observer = new ResizeObserver(() => placeScrollbars(wrapper));
|
|
510
|
+
observer.observe(wrapper);
|
|
511
|
+
observer.observe(table);
|
|
512
|
+
}
|
|
513
|
+
function placeScrollbars(wrapper, { renote = false } = {}) {
|
|
514
|
+
const bars = scrollbars.get(wrapper);
|
|
515
|
+
if (!bars) return;
|
|
516
|
+
const { table } = bars;
|
|
517
|
+
const { clientWidth: width, clientHeight: height, offsetWidth, offsetHeight } = wrapper;
|
|
518
|
+
const content = { width: Math.max(width, table.offsetWidth), height: Math.max(height, table.offsetHeight) };
|
|
519
|
+
setStyle(bars.frame, "width", `${offsetWidth}px`);
|
|
520
|
+
setStyle(bars.frame, "height", `${offsetHeight}px`);
|
|
521
|
+
const x = content.width - width > 1, y = content.height - height > 1;
|
|
522
|
+
const sizes = `${width}x${height}:${content.width}x${content.height}`;
|
|
523
|
+
if (width > 0 && (renote || sizes !== bars.noted)) {
|
|
524
|
+
bars.noted = sizes;
|
|
525
|
+
bars.reach = noteHidden(wrapper, table);
|
|
526
|
+
}
|
|
527
|
+
bars.node.toggleAttribute("data-more", x && wrapper.scrollLeft + width < bars.reach - 1);
|
|
528
|
+
const style = getComputedStyle(wrapper);
|
|
529
|
+
const corner = (radius, border) => Math.max(0, (parseFloat(style[radius]) || 0) - (parseFloat(style[border]) || 0));
|
|
530
|
+
const header = table.tHead?.getBoundingClientRect().height || 0;
|
|
531
|
+
const first = fixedFirstCell(table)?.getBoundingClientRect().width || 0;
|
|
532
|
+
const place = (rail, start, end, fixed, view, total2, at) => {
|
|
533
|
+
const track = Math.max(0, end - start);
|
|
534
|
+
const size = Math.min(track, Math.max(MIN_THUMB, track * Math.max(0, view - fixed) / (total2 - fixed)));
|
|
535
|
+
const range = total2 - view;
|
|
536
|
+
setStyle(rail, "--doc-scrollbar-track", `${track}px`);
|
|
537
|
+
setStyle(rail, "--doc-scrollbar-thumb-size", `${size}px`);
|
|
538
|
+
setStyle(rail, "--doc-scrollbar-thumb-at", `${(track - size) * Math.min(1, Math.max(0, at / range))}px`);
|
|
539
|
+
return { track, size, range };
|
|
540
|
+
};
|
|
541
|
+
bars.node.toggleAttribute("data-x", x);
|
|
542
|
+
bars.node.toggleAttribute("data-y", y);
|
|
543
|
+
if (y) {
|
|
544
|
+
const start = Math.max(header, corner("borderTopRightRadius", "borderTopWidth"));
|
|
545
|
+
const end = height - Math.max(corner("borderBottomRightRadius", "borderBottomWidth"), x ? RAIL : 0);
|
|
546
|
+
setStyle(bars.y, "left", `${width - RAIL}px`);
|
|
547
|
+
setStyle(bars.y, "top", `${start}px`);
|
|
548
|
+
bars.axes.y = place(bars.y, start, end, header, height, content.height, wrapper.scrollTop);
|
|
549
|
+
}
|
|
550
|
+
if (x) {
|
|
551
|
+
const start = Math.max(first, corner("borderBottomLeftRadius", "borderLeftWidth"));
|
|
552
|
+
const end = width - Math.max(corner("borderBottomRightRadius", "borderRightWidth"), y ? RAIL : 0);
|
|
553
|
+
setStyle(bars.x, "left", `${start}px`);
|
|
554
|
+
setStyle(bars.x, "top", `${height - RAIL}px`);
|
|
555
|
+
bars.axes.x = place(bars.x, start, end, first, width, content.width, wrapper.scrollLeft);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
function noteHidden(wrapper, table) {
|
|
559
|
+
const notes = [];
|
|
560
|
+
const hides = tableHides(wrapper, table);
|
|
561
|
+
if (hides.said) notes.push(`columns-hidden: ${hides.said} (scroll sideways)`);
|
|
562
|
+
if (hides.shown < hides.rows) notes.push(`rows-hidden: the frame shows ${hides.shown} of ${hides.rows} rows (scroll down)`);
|
|
563
|
+
const said = notes.join("\n");
|
|
564
|
+
if (said && wrapper.getAttribute("data-doc-layout") !== said) wrapper.setAttribute("data-doc-layout", said);
|
|
565
|
+
else if (!said && wrapper.hasAttribute("data-doc-layout")) wrapper.removeAttribute("data-doc-layout");
|
|
566
|
+
return hides.reach;
|
|
567
|
+
}
|
|
568
|
+
function passOn(wrapper, event) {
|
|
569
|
+
if (event.ctrlKey || !event.deltaY || getComputedStyle(wrapper).overscrollBehaviorBlock !== "none") return;
|
|
570
|
+
const atTop = wrapper.scrollTop <= 0;
|
|
571
|
+
const atEnd = wrapper.scrollTop + wrapper.clientHeight >= wrapper.scrollHeight - 1;
|
|
572
|
+
if (!(event.deltaY < 0 ? atTop : atEnd)) return;
|
|
573
|
+
const delta = event.deltaY * (event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? innerHeight : 1);
|
|
574
|
+
for (let node = wrapper.parentElement; node && node !== document.body; node = node.parentElement) {
|
|
575
|
+
const { overflowY } = getComputedStyle(node);
|
|
576
|
+
if ((overflowY === "auto" || overflowY === "scroll") && node.scrollHeight > node.clientHeight + 1) return node.scrollBy({ top: delta, behavior: "instant" });
|
|
577
|
+
}
|
|
578
|
+
global.scrollBy({ top: delta, behavior: "instant" });
|
|
579
|
+
}
|
|
580
|
+
global.addEventListener("pointerdown", (event) => {
|
|
581
|
+
const rail = event.button === 0 ? event.target.closest?.(".doc-scrollbar") : null;
|
|
582
|
+
const wrapper = rail?.parentElement.parentElement;
|
|
583
|
+
if (!scrollbars.has(wrapper) || document.documentElement.hasAttribute("data-ge-resize")) return;
|
|
584
|
+
event.preventDefault();
|
|
585
|
+
event.stopPropagation();
|
|
586
|
+
const vertical = rail.classList.contains("doc-scrollbar--y");
|
|
587
|
+
const property = vertical ? "scrollTop" : "scrollLeft";
|
|
588
|
+
const along = (pointer) => vertical ? pointer.clientY - rail.getBoundingClientRect().top : pointer.clientX - rail.getBoundingClientRect().left;
|
|
589
|
+
const { track = 0, size = 0, range = 0 } = scrollbars.get(wrapper).axes[vertical ? "y" : "x"] ?? {};
|
|
590
|
+
const perPixel = track > size ? range / (track - size) : 0;
|
|
591
|
+
if (event.target === rail) wrapper[property] = (along(event) - size / 2) * perPixel;
|
|
592
|
+
const start = { pointer: along(event), scroll: wrapper[property] };
|
|
593
|
+
rail.setAttribute("data-drag", "");
|
|
594
|
+
rail.setPointerCapture?.(event.pointerId);
|
|
595
|
+
const move = (moved) => {
|
|
596
|
+
wrapper[property] = start.scroll + (along(moved) - start.pointer) * perPixel;
|
|
597
|
+
};
|
|
598
|
+
const end = () => {
|
|
599
|
+
rail.removeAttribute("data-drag");
|
|
600
|
+
rail.removeEventListener("pointermove", move);
|
|
601
|
+
rail.removeEventListener("pointerup", end);
|
|
602
|
+
rail.removeEventListener("pointercancel", end);
|
|
603
|
+
};
|
|
604
|
+
rail.addEventListener("pointermove", move);
|
|
605
|
+
rail.addEventListener("pointerup", end);
|
|
606
|
+
rail.addEventListener("pointercancel", end);
|
|
607
|
+
}, true);
|
|
608
|
+
|
|
609
|
+
// src/render/kit/tables/whole.js
|
|
610
|
+
var WHOLE_ROWS = 20;
|
|
611
|
+
function shownWhole(rows, columns) {
|
|
612
|
+
if (rows <= WHOLE_ROWS) return true;
|
|
613
|
+
const all = columns.reduce((sum, column) => sum + column.width, 0);
|
|
614
|
+
const words = columns.reduce((sum, column) => sum + (column.words ? column.width : 0), 0);
|
|
615
|
+
return all > 0 && words * 2 >= all;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// src/render/kit/tables/layout.js
|
|
619
|
+
var COLUMN_FLOOR = 120;
|
|
620
|
+
var COLUMN_NATURAL_MAX = 240;
|
|
621
|
+
var NARROW = "(max-width: 420px)";
|
|
622
|
+
var CODE_RUN_MAX = 320;
|
|
623
|
+
var WIDE = "\u2014\u3000-\u30FF\u3400-\u9FFF\uAC00-\uD7AF\uF900-\uFAFF\uFF00-\uFFEF";
|
|
624
|
+
var NATIVE_BREAKS = new RegExp(`(?<=-)|(?<=[${WIDE}])|(?=[${WIDE}])`, "u");
|
|
625
|
+
var layouts = /* @__PURE__ */ new WeakMap();
|
|
626
|
+
var layoutObservers = /* @__PURE__ */ new WeakMap();
|
|
627
|
+
var pendingLayouts = /* @__PURE__ */ new Set();
|
|
628
|
+
var layoutFrame = 0;
|
|
629
|
+
var fontOf = (style) => `${style.fontStyle || "normal"} ${style.fontWeight || "400"} ${style.fontSize || "15px"} ${style.fontFamily || "system-ui"}`;
|
|
630
|
+
function fontFor(element) {
|
|
631
|
+
return fontOf(getComputedStyle(element));
|
|
632
|
+
}
|
|
633
|
+
var familyName = (name) => name.trim().replace(/^(["'])(.*)\1$/, "$2").toLowerCase();
|
|
634
|
+
var familiesOf = (list) => list.split(",").map(familyName).filter(Boolean);
|
|
635
|
+
var measurers = /* @__PURE__ */ new Map();
|
|
636
|
+
function measurerFor(font, family) {
|
|
637
|
+
let measurer = measurers.get(font);
|
|
638
|
+
if (!measurer) measurers.set(font, measurer = { measure: createTextMeasurer(font), families: familiesOf(family) });
|
|
639
|
+
return measurer.measure;
|
|
640
|
+
}
|
|
641
|
+
function forgetMeasurers(faces) {
|
|
642
|
+
if (!faces) return measurers.clear();
|
|
643
|
+
const loaded = new Set(faces.map((face) => familyName(String(face.family ?? ""))));
|
|
644
|
+
for (const [font, { families }] of [...measurers]) if (families.some((name) => loaded.has(name))) measurers.delete(font);
|
|
645
|
+
}
|
|
646
|
+
globalThis.document?.fonts?.addEventListener?.("loadingdone", (event) => forgetMeasurers([...event.fontfaces ?? []]));
|
|
647
|
+
globalThis.document?.fonts?.ready.then(() => forgetMeasurers());
|
|
648
|
+
var cellMeasures = /* @__PURE__ */ new WeakMap();
|
|
649
|
+
var measuredRatio = globalThis.devicePixelRatio;
|
|
650
|
+
function sameZoom() {
|
|
651
|
+
if (globalThis.devicePixelRatio === measuredRatio) return;
|
|
652
|
+
measuredRatio = globalThis.devicePixelRatio;
|
|
653
|
+
measurers.clear();
|
|
654
|
+
cellMeasures = /* @__PURE__ */ new WeakMap();
|
|
655
|
+
}
|
|
656
|
+
var measuredFamilies = /* @__PURE__ */ new WeakMap();
|
|
657
|
+
var forgetMeasures = (table) => cellMeasures.delete(table);
|
|
658
|
+
function fontsChange(table, faces) {
|
|
659
|
+
const families = measuredFamilies.get(table);
|
|
660
|
+
if (!faces || !families) return "words";
|
|
661
|
+
const names = faces.map((face) => familyName(String(face.family ?? "")));
|
|
662
|
+
if (names.some((name) => families.has(name))) return "words";
|
|
663
|
+
return names.some((name) => name.startsWith("katex")) && table.querySelector(".katex") ? "formulas" : "";
|
|
664
|
+
}
|
|
665
|
+
function cellPaddingFor(style) {
|
|
666
|
+
return (parseFloat(style.paddingLeft || "12px") || 0) + (parseFloat(style.paddingRight || "12px") || 0) + (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.borderRightWidth) || 0);
|
|
667
|
+
}
|
|
668
|
+
var tabularDigits = /* @__PURE__ */ new Map();
|
|
669
|
+
function tabularDigitWidth(font) {
|
|
670
|
+
if (!tabularDigits.has(font)) {
|
|
671
|
+
const probe2 = document.createElement("span");
|
|
672
|
+
probe2.style.cssText = `position:absolute;visibility:hidden;white-space:pre;font:${font};font-variant-numeric:tabular-nums`;
|
|
673
|
+
probe2.textContent = "0123456789";
|
|
674
|
+
document.body.append(probe2);
|
|
675
|
+
tabularDigits.set(font, probe2.getBoundingClientRect().width / 10);
|
|
676
|
+
probe2.remove();
|
|
677
|
+
}
|
|
678
|
+
return tabularDigits.get(font);
|
|
679
|
+
}
|
|
680
|
+
function codeEdges(style) {
|
|
681
|
+
return (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0) + (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.borderRightWidth) || 0);
|
|
682
|
+
}
|
|
683
|
+
function contextOf(table) {
|
|
684
|
+
const root = document.documentElement;
|
|
685
|
+
const classes = [...table.classList].filter((name) => name !== "doc-table--auto").join(" ");
|
|
686
|
+
return `${classes}${wrapperOf(table)?.className ?? ""}${root.getAttribute("data-doc-theme") ?? ""}|${root.getAttribute("data-doc-width") ?? ""}`;
|
|
687
|
+
}
|
|
688
|
+
function createCellMeasurer(table) {
|
|
689
|
+
sameZoom();
|
|
690
|
+
const styles = /* @__PURE__ */ new Map();
|
|
691
|
+
const kept = cellMeasures.get(table);
|
|
692
|
+
const measured = /* @__PURE__ */ new Map();
|
|
693
|
+
const families = /* @__PURE__ */ new Set();
|
|
694
|
+
const context = contextOf(table);
|
|
695
|
+
let using = null;
|
|
696
|
+
const styleOf = (element) => {
|
|
697
|
+
let style = styles.get(element);
|
|
698
|
+
if (!style) {
|
|
699
|
+
const computed = getComputedStyle(element);
|
|
700
|
+
style = { computed, font: fontOf(computed), family: computed.fontFamily || "system-ui", spacing: parseFloat(computed.letterSpacing) || 0, tabular: /tabular-nums/.test(computed.fontVariantNumeric || "") };
|
|
701
|
+
styles.set(element, style);
|
|
702
|
+
}
|
|
703
|
+
return style;
|
|
704
|
+
};
|
|
705
|
+
const widthOf = (text, parent) => {
|
|
706
|
+
const { font, family, spacing, tabular } = styleOf(parent);
|
|
707
|
+
using?.add(family);
|
|
708
|
+
const measureText = measurerFor(font, family);
|
|
709
|
+
const digits = tabular ? text.replace(/\D/g, "").length : 0;
|
|
710
|
+
return (digits ? measureText(text.replace(/\d/g, "")) + digits * tabularDigitWidth(font) : measureText(text)) + Math.max(0, text.length - 1) * spacing;
|
|
711
|
+
};
|
|
712
|
+
const cellKey = (cell) => {
|
|
713
|
+
if (cell.querySelector(".katex")) return null;
|
|
714
|
+
const { computed, font } = styleOf(cell);
|
|
715
|
+
return `${context}${cell.className}${cell.getAttribute("style") ?? ""}${font}|${computed.letterSpacing}|${computed.fontVariantNumeric}|${computed.paddingLeft}|${computed.paddingRight}|${computed.borderLeftWidth}|${computed.borderRightWidth}${cell.innerHTML}`;
|
|
716
|
+
};
|
|
717
|
+
const measureCell = (cell) => {
|
|
718
|
+
let entry = measured.get(cell);
|
|
719
|
+
if (!entry) {
|
|
720
|
+
const key = cellKey(cell);
|
|
721
|
+
const before = key === null ? null : kept?.get(cell);
|
|
722
|
+
if (before && before.key === key) entry = before;
|
|
723
|
+
else {
|
|
724
|
+
using = /* @__PURE__ */ new Set();
|
|
725
|
+
entry = { key, result: measureWords(cell), families: using };
|
|
726
|
+
using = null;
|
|
727
|
+
}
|
|
728
|
+
measured.set(cell, entry);
|
|
729
|
+
entry.families.forEach((family) => families.add(family));
|
|
730
|
+
}
|
|
731
|
+
return entry.result;
|
|
732
|
+
};
|
|
733
|
+
const measure = (cell) => measureCell(cell).width;
|
|
734
|
+
measure.least = (cell) => measureCell(cell).least;
|
|
735
|
+
measure.run = (cell) => measureCell(cell).run;
|
|
736
|
+
measure.word = (cell) => measureCell(cell).word;
|
|
737
|
+
measure.piece = (cell) => measureCell(cell).piece;
|
|
738
|
+
measure.done = () => {
|
|
739
|
+
if (measured.size === 0) return measuredFamilies.delete(table);
|
|
740
|
+
cellMeasures.set(table, new Map([...measured].filter(([, entry]) => entry.key !== null)));
|
|
741
|
+
measuredFamilies.set(table, new Set([...families].flatMap(familiesOf)));
|
|
742
|
+
};
|
|
743
|
+
return measure;
|
|
744
|
+
function measureWords(cell) {
|
|
745
|
+
let line = 0, widest = 0, lastSpace = true, run = 0;
|
|
746
|
+
const word = { now: 0, widest: 0 }, piece = { now: 0, widest: 0 };
|
|
747
|
+
const along = (part, width, restart) => {
|
|
748
|
+
part.now = (restart ? 0 : part.now) + width;
|
|
749
|
+
part.widest = Math.max(part.widest, part.now);
|
|
750
|
+
};
|
|
751
|
+
const content = cell;
|
|
752
|
+
const walk = (node) => {
|
|
753
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
754
|
+
let text = node.textContent.replace(/\s+/g, " ");
|
|
755
|
+
if (lastSpace) text = text.replace(/^ /, "");
|
|
756
|
+
if (!text) return;
|
|
757
|
+
const parent = node.parentElement;
|
|
758
|
+
const width = widthOf(text, parent);
|
|
759
|
+
line += width;
|
|
760
|
+
lastSpace = text.endsWith(" ");
|
|
761
|
+
if (parent.closest(".doc-range")) {
|
|
762
|
+
run = Math.max(run, width);
|
|
763
|
+
along(word, width, false);
|
|
764
|
+
along(piece, width, false);
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
text.split(WORD_BREAKS).forEach((part, index) => along(word, widthOf(part, parent), index > 0));
|
|
768
|
+
text.split(PIECE_BREAKS).forEach((part, index) => along(piece, widthOf(part, parent), index > 0));
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
if (node.nodeType !== Node.ELEMENT_NODE) return;
|
|
772
|
+
if (node.tagName === "BR") {
|
|
773
|
+
widest = Math.max(widest, line);
|
|
774
|
+
line = 0;
|
|
775
|
+
lastSpace = true;
|
|
776
|
+
word.now = piece.now = 0;
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
779
|
+
if (node.classList.contains("katex")) {
|
|
780
|
+
const drawn = [...node.getClientRects()].reduce((sum, rect) => sum + rect.width, 0);
|
|
781
|
+
line += drawn;
|
|
782
|
+
along(word, drawn, false);
|
|
783
|
+
along(piece, drawn, false);
|
|
784
|
+
lastSpace = false;
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
if (node.classList.contains("doc-link-mention-icon")) {
|
|
788
|
+
const { computed } = styleOf(node);
|
|
789
|
+
const drawn = (parseFloat(computed.width) || 0) + (parseFloat(computed.marginInlineEnd) || 0);
|
|
790
|
+
line += drawn;
|
|
791
|
+
along(word, drawn, false);
|
|
792
|
+
along(piece, drawn, false);
|
|
793
|
+
lastSpace = false;
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
796
|
+
if (node.tagName === "UL" || node.tagName === "OL") {
|
|
797
|
+
widest = Math.max(widest, line);
|
|
798
|
+
const indent = parseFloat(styleOf(node).computed.paddingInlineStart) || 0;
|
|
799
|
+
for (const item of node.children) {
|
|
800
|
+
line = word.now = piece.now = indent;
|
|
801
|
+
lastSpace = true;
|
|
802
|
+
item.childNodes.forEach(walk);
|
|
803
|
+
widest = Math.max(widest, line);
|
|
804
|
+
}
|
|
805
|
+
line = word.now = piece.now = 0;
|
|
806
|
+
lastSpace = true;
|
|
807
|
+
return;
|
|
808
|
+
}
|
|
809
|
+
if (node.tagName === "CODE") {
|
|
810
|
+
const edges = codeEdges(styleOf(node).computed);
|
|
811
|
+
const runs = node.querySelector(`.${CODE_RUN}`) ? codeRuns(node.textContent) : node.textContent.split(/\s+/).flatMap((part) => part.split(NATIVE_BREAKS));
|
|
812
|
+
for (const part of runs) if (part.trim()) run = Math.max(run, widthOf(part, node) + edges);
|
|
813
|
+
}
|
|
814
|
+
if (node !== content) {
|
|
815
|
+
const style = styleOf(node).computed;
|
|
816
|
+
line += (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
|
|
817
|
+
}
|
|
818
|
+
node.childNodes.forEach(walk);
|
|
819
|
+
};
|
|
820
|
+
walk(content);
|
|
821
|
+
const padding = cellPaddingFor(styleOf(cell).computed);
|
|
822
|
+
return {
|
|
823
|
+
width: Math.ceil(Math.max(widest, line) + padding),
|
|
824
|
+
least: run > 0 ? Math.ceil(Math.min(run, CODE_RUN_MAX) + padding) : 0,
|
|
825
|
+
run: run > 0 ? Math.ceil(run + padding) : 0,
|
|
826
|
+
word: Math.ceil(word.widest + padding),
|
|
827
|
+
piece: Math.ceil(piece.widest + padding)
|
|
828
|
+
};
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
function frameOf(table) {
|
|
832
|
+
const wrapper = wrapperOf(table);
|
|
833
|
+
const sized = Boolean(wrapper) && getComputedStyle(wrapper).getPropertyValue("--doc-span-width").trim() !== "";
|
|
834
|
+
const wider = sized ? Math.max(1, parseFloat(getComputedStyle(wrapper).getPropertyValue("--doc-span")) || 1) : 1;
|
|
835
|
+
return { wrapper, sized, wider, previousWidth: wrapper?.style.width };
|
|
836
|
+
}
|
|
837
|
+
function sizedInside({ wrapper, sized, wider }) {
|
|
838
|
+
if (!sized) return null;
|
|
839
|
+
wrapper.style.width = "";
|
|
840
|
+
const style = getComputedStyle(wrapper);
|
|
841
|
+
const inner = wrapper.clientWidth - (parseFloat(style.paddingLeft) || 0) - (parseFloat(style.paddingRight) || 0);
|
|
842
|
+
return inner > 0 ? { wider, inner } : null;
|
|
843
|
+
}
|
|
844
|
+
function frameEdges(wrapper) {
|
|
845
|
+
const style = getComputedStyle(wrapper);
|
|
846
|
+
return (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.borderRightWidth) || 0) + (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
|
|
847
|
+
}
|
|
848
|
+
var scratch = globalThis.document?.createElement("col");
|
|
849
|
+
function writeColgroup(table, columns) {
|
|
850
|
+
let colgroup = table.querySelector(":scope > colgroup[data-doc-columns]");
|
|
851
|
+
if (!colgroup) {
|
|
852
|
+
table.querySelectorAll(":scope > colgroup").forEach((node) => node.remove());
|
|
853
|
+
colgroup = document.createElement("colgroup");
|
|
854
|
+
colgroup.dataset.docColumns = "";
|
|
855
|
+
table.insertBefore(colgroup, table.firstElementChild?.tagName === "CAPTION" ? table.firstElementChild.nextSibling : table.firstElementChild);
|
|
856
|
+
}
|
|
857
|
+
const cols = colgroup.children;
|
|
858
|
+
const same = ({ width, key }, index) => {
|
|
859
|
+
const col = cols[index];
|
|
860
|
+
scratch.style.width = width;
|
|
861
|
+
return col.attributes.length === 2 && col.dataset.columnKey === key && col.style.width === scratch.style.width;
|
|
862
|
+
};
|
|
863
|
+
if (cols.length === columns.length && columns.every(same)) return;
|
|
864
|
+
colgroup.replaceChildren(...columns.map(({ width, key }) => {
|
|
865
|
+
const col = document.createElement("col");
|
|
866
|
+
col.style.width = width;
|
|
867
|
+
col.dataset.columnKey = key;
|
|
868
|
+
return col;
|
|
869
|
+
}));
|
|
870
|
+
}
|
|
871
|
+
function clearColumnMarks(table) {
|
|
872
|
+
table.querySelectorAll("[data-column-kind], [data-column-wrap], [data-run-wrap]").forEach((cell) => {
|
|
873
|
+
delete cell.dataset.columnKind;
|
|
874
|
+
cell.removeAttribute("data-column-wrap");
|
|
875
|
+
cell.removeAttribute("data-run-wrap");
|
|
876
|
+
});
|
|
877
|
+
}
|
|
878
|
+
var setAttribute = (element, name, value) => {
|
|
879
|
+
if (element.getAttribute(name) !== value) element.setAttribute(name, value);
|
|
880
|
+
};
|
|
881
|
+
var markRunWrap = (cell, width, measureCell) => cell.toggleAttribute("data-run-wrap", measureCell.run(cell) > width + 0.5);
|
|
882
|
+
function clearAuto(table, wrapper) {
|
|
883
|
+
table.classList.remove("doc-table--auto");
|
|
884
|
+
table.style.removeProperty("width");
|
|
885
|
+
table.querySelector("colgroup[data-doc-columns]")?.remove();
|
|
886
|
+
clearColumnMarks(table);
|
|
887
|
+
if (wrapper) {
|
|
888
|
+
wrapper.style.removeProperty("width");
|
|
889
|
+
delete wrapper.dataset.docMinWidth;
|
|
890
|
+
}
|
|
891
|
+
layouts.delete(table);
|
|
892
|
+
}
|
|
893
|
+
var tableSlots = (table) => slotsOf([...table.rows]);
|
|
894
|
+
var columnWidthOf = (cell) => {
|
|
895
|
+
const width = parseFloat(cell.style.getPropertyValue("--doc-column-width"));
|
|
896
|
+
return width > 0 ? width : null;
|
|
897
|
+
};
|
|
898
|
+
function manualWidths(table) {
|
|
899
|
+
const slots = tableSlots(table);
|
|
900
|
+
if (!slots) return null;
|
|
901
|
+
const widths = columnWidths(slots, columnWidthOf);
|
|
902
|
+
return widths.some((width) => width !== null) ? widths : null;
|
|
903
|
+
}
|
|
904
|
+
function manualLayout(table, frame, widths, measureCell) {
|
|
905
|
+
const { wrapper } = frame;
|
|
906
|
+
const slots = tableSlots(table);
|
|
907
|
+
const natural = widths.map((width, index) => width ?? Math.min(COLUMN_NATURAL_MAX, Math.max(COLUMN_FLOOR, ...columnCells(slots, index).map(measureCell))));
|
|
908
|
+
const frameSize = sizedInside(frame);
|
|
909
|
+
const scale = frameSize ? frameSize.inner * frameSize.wider / natural.reduce((sum, width) => sum + width, 0) : 1;
|
|
910
|
+
const sizes = natural.map((width) => width * scale);
|
|
911
|
+
const total2 = sizes.reduce((sum, width) => sum + width, 0);
|
|
912
|
+
table.classList.add("doc-table--auto");
|
|
913
|
+
table.style.width = `${total2}px`;
|
|
914
|
+
clearColumnMarks(table);
|
|
915
|
+
if (wrapper) {
|
|
916
|
+
const edges = frameEdges(wrapper);
|
|
917
|
+
setAttribute(wrapper, "data-doc-min-width", String(Math.min(total2, COLUMN_FLOOR) + edges));
|
|
918
|
+
if (!frameSize) {
|
|
919
|
+
wrapper.style.width = "100%";
|
|
920
|
+
const style = getComputedStyle(wrapper);
|
|
921
|
+
const available = wrapper.clientWidth - (parseFloat(style.paddingLeft) || 0) - (parseFloat(style.paddingRight) || 0);
|
|
922
|
+
wrapper.style.width = total2 < available ? `${total2 + edges}px` : "100%";
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
writeColgroup(table, sizes.map((width, index) => ({ width: `${width}px`, key: String(index) })));
|
|
926
|
+
layouts.set(table, sizes.map((width, index) => ({ key: String(index), kind: "compact", preferredWidth: width, softMinWidth: width, hardMinWidth: width, width, ratio: width / total2 })));
|
|
927
|
+
for (const [cell, { c, cols }] of slots?.places ?? []) markRunWrap(cell, sizes.slice(c, c + cols).reduce((sum, width) => sum + width, 0), measureCell);
|
|
928
|
+
}
|
|
929
|
+
function raiseNarrow(widths, room, floor) {
|
|
930
|
+
const low = widths.filter((width) => width < floor).sort((a, b) => a - b);
|
|
931
|
+
let level = floor;
|
|
932
|
+
if (low.reduce((sum, width) => sum + floor - width, 0) > room) {
|
|
933
|
+
let sum = 0;
|
|
934
|
+
for (let index = 0; index < low.length; index++) {
|
|
935
|
+
sum += low[index];
|
|
936
|
+
level = (room + sum) / (index + 1);
|
|
937
|
+
if (index === low.length - 1 || level <= low[index + 1]) break;
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
return widths.map((width) => Math.max(width, Math.min(level, floor)));
|
|
941
|
+
}
|
|
942
|
+
function refreshLayout(table) {
|
|
943
|
+
idleLayouts.delete(table);
|
|
944
|
+
const measure = createCellMeasurer(table);
|
|
945
|
+
layOut(table, measure);
|
|
946
|
+
measure.done();
|
|
947
|
+
markWhole(table);
|
|
948
|
+
const wrapper = wrapperOf(table);
|
|
949
|
+
if (wrapper) placeScrollbars(wrapper, { renote: true });
|
|
950
|
+
}
|
|
951
|
+
function layOut(table, measure) {
|
|
952
|
+
const headers = [...table.tHead?.rows[0]?.cells || []];
|
|
953
|
+
const rows = [...tableRows(table), ...footRows(table)];
|
|
954
|
+
const spanned = [...table.rows].some((row) => [...row.cells].some((cell) => cell.colSpan !== 1 || cell.rowSpan !== 1));
|
|
955
|
+
const frame = frameOf(table);
|
|
956
|
+
const manual = manualWidths(table);
|
|
957
|
+
if (manual) return manualLayout(table, frame, manual, measure);
|
|
958
|
+
const count = headers.length || rows[0]?.cells.length || 0;
|
|
959
|
+
if (!count || table.tHead && table.tHead.rows.length !== 1 || spanned) return nativeLayout(table, frame);
|
|
960
|
+
allocatedLayout(table, frame, headers, rows, count, measure);
|
|
961
|
+
}
|
|
962
|
+
var wholeTexts = /* @__PURE__ */ new WeakMap();
|
|
963
|
+
function markWhole(table) {
|
|
964
|
+
const wrapper = wrapperOf(table);
|
|
965
|
+
if (!wrapper) return;
|
|
966
|
+
const rows = bodyRows(table);
|
|
967
|
+
const whole = rows.length <= WHOLE_ROWS || mostlyWords(table, rows);
|
|
968
|
+
const was = wrapper.hasAttribute("data-doc-whole");
|
|
969
|
+
wrapper.toggleAttribute("data-doc-whole", whole);
|
|
970
|
+
if (was && !whole) keepCaret(wrapper);
|
|
971
|
+
}
|
|
972
|
+
function bodyRows(table) {
|
|
973
|
+
const rows = tableRows(table);
|
|
974
|
+
const headerCells = (row) => row.cells.length > 0 && [...row.cells].every((cell) => cell.tagName === "TH");
|
|
975
|
+
return !table.tHead && rows.length > 1 && headerCells(rows[0]) && !headerCells(rows[1]) ? rows.slice(1) : rows;
|
|
976
|
+
}
|
|
977
|
+
var textMeasurers = /* @__PURE__ */ new Map();
|
|
978
|
+
function mostlyWords(table, rows) {
|
|
979
|
+
const slots = slotsOf(rows);
|
|
980
|
+
const columns = [];
|
|
981
|
+
rows.forEach((row) => [...row.cells].forEach((cell, index) => {
|
|
982
|
+
const text2 = cellText(cell);
|
|
983
|
+
if (text2) (columns[slots ? slots.places.get(cell).c : index] ??= []).push(text2);
|
|
984
|
+
}));
|
|
985
|
+
const font = fontFor(rows[0]?.cells[0] || table);
|
|
986
|
+
const text = `${font}
|
|
987
|
+
${columns.map((texts) => texts?.join("\n") ?? "").join("\f")}`;
|
|
988
|
+
const kept = wholeTexts.get(table);
|
|
989
|
+
if (kept?.text === text) return kept.whole;
|
|
990
|
+
if (!textMeasurers.has(font)) textMeasurers.set(font, createTextMeasurer(font));
|
|
991
|
+
const measure = textMeasurers.get(font);
|
|
992
|
+
const whole = shownWhole(rows.length, columns.filter(Boolean).map((texts) => ({
|
|
993
|
+
words: columnKind("", texts, measure) === "narrative",
|
|
994
|
+
width: texts.reduce((sum, each) => sum + measure(each), 0)
|
|
995
|
+
})));
|
|
996
|
+
wholeTexts.set(table, { text, whole });
|
|
997
|
+
return whole;
|
|
998
|
+
}
|
|
999
|
+
function keepCaret(wrapper) {
|
|
1000
|
+
const node = globalThis.getSelection?.()?.focusNode;
|
|
1001
|
+
const cell = (node?.nodeType === Node.ELEMENT_NODE ? node : node?.parentElement)?.closest("td, th");
|
|
1002
|
+
if (!cell || !wrapper.contains(cell)) return;
|
|
1003
|
+
const frame = wrapper.getBoundingClientRect();
|
|
1004
|
+
const below = cell.getBoundingClientRect().bottom - (frame.top + wrapper.clientTop + wrapper.clientHeight);
|
|
1005
|
+
if (below > 0) wrapper.scrollTop += below;
|
|
1006
|
+
}
|
|
1007
|
+
function nativeLayout(table, frame) {
|
|
1008
|
+
if (table.classList.contains("doc-table--auto")) clearAuto(table, frame.wrapper);
|
|
1009
|
+
const frameSize = sizedInside(frame);
|
|
1010
|
+
if (frameSize) {
|
|
1011
|
+
table.dataset.docFilled = "";
|
|
1012
|
+
table.style.width = frameSize.wider > 1 ? `${frameSize.inner * frameSize.wider}px` : "100%";
|
|
1013
|
+
} else if (table.hasAttribute("data-doc-filled")) {
|
|
1014
|
+
table.removeAttribute("data-doc-filled");
|
|
1015
|
+
table.style.removeProperty("width");
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
function allocatedLayout(table, frame, headers, rows, count, measureCell) {
|
|
1019
|
+
table.removeAttribute("data-doc-filled");
|
|
1020
|
+
const { wrapper, sized, wider, previousWidth } = frame;
|
|
1021
|
+
const parent = wrapper || table.parentElement;
|
|
1022
|
+
if (!parent) return;
|
|
1023
|
+
if (wrapper) wrapper.style.width = sized ? "" : "100%";
|
|
1024
|
+
const style = getComputedStyle(parent);
|
|
1025
|
+
const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
|
|
1026
|
+
const border = (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.borderRightWidth) || 0);
|
|
1027
|
+
const available = (parent.clientWidth || parent.getBoundingClientRect().width - border) - padding;
|
|
1028
|
+
if (!(available > 0)) {
|
|
1029
|
+
if (wrapper) wrapper.style.width = previousWidth;
|
|
1030
|
+
return;
|
|
1031
|
+
}
|
|
1032
|
+
const font = fontFor(rows[0]?.cells[0] || table);
|
|
1033
|
+
const cellPadding = cellPaddingFor(getComputedStyle(rows[0]?.cells[0] || headers[0]));
|
|
1034
|
+
const measuredCells = /* @__PURE__ */ new Map();
|
|
1035
|
+
for (const cell of [...headers, ...rows.flatMap((row) => [...row.cells])]) measuredCells.set(cell, measureCell(cell));
|
|
1036
|
+
const narrow = Boolean(globalThis.matchMedia?.(NARROW).matches);
|
|
1037
|
+
const share = narrow ? available / 3 : Infinity;
|
|
1038
|
+
const runRoom = narrow ? Math.max(share, available - (count - 1) * share) : Infinity;
|
|
1039
|
+
const columns = Array.from({ length: count }, (_, index) => {
|
|
1040
|
+
const cells = [headers[index], ...rows.map((row) => row.cells[index])].filter(Boolean);
|
|
1041
|
+
const least = Math.min(runRoom, Math.max(0, ...cells.map(measureCell.least)));
|
|
1042
|
+
return {
|
|
1043
|
+
key: headers[index]?.dataset.columnKey || String(index),
|
|
1044
|
+
header: headers[index] ? cellText(headers[index]) : "",
|
|
1045
|
+
headerWidth: headers[index] ? measuredCells.get(headers[index]) : 0,
|
|
1046
|
+
// Include filtered-out rows so toggling a filter does not shift the columns.
|
|
1047
|
+
cells: rows.map((row) => row.cells[index] ? cellText(row.cells[index]) : ""),
|
|
1048
|
+
cellWidths: rows.map((row) => measuredCells.get(row.cells[index]) ?? 0),
|
|
1049
|
+
// Its longest words (WORD_BREAKS), for a short text column that wraps beside columns of prose.
|
|
1050
|
+
headerWordWidth: headers[index] ? measureCell.word(headers[index]) : 0,
|
|
1051
|
+
cellWordWidths: rows.map((row) => row.cells[index] ? measureCell.word(row.cells[index]) : 0),
|
|
1052
|
+
// Its widest pieces no line breaks in (PIECE_BREAKS), the least such a column is lowered to.
|
|
1053
|
+
cellPieceWidths: rows.map((row) => row.cells[index] ? measureCell.piece(row.cells[index]) : 0),
|
|
1054
|
+
// A numeric column (cells.js) keeps its floor on a narrow screen: a number never wraps.
|
|
1055
|
+
numeric: cells.some((cell) => cell.classList.contains("number")),
|
|
1056
|
+
...least > 0 ? { minWidth: least } : {}
|
|
1057
|
+
};
|
|
1058
|
+
});
|
|
1059
|
+
const target = available * wider;
|
|
1060
|
+
const result = allocateColumnWidths(columns, { totalWidth: target, font, cellPadding, ...share < Infinity ? { maxReadableFloor: share } : {} });
|
|
1061
|
+
let sum = result.reduce((value, column) => value + column.width, 0);
|
|
1062
|
+
if (!sized && sum < available) {
|
|
1063
|
+
const raised = raiseNarrow(result.map((column) => column.width), available - sum, COLUMN_FLOOR);
|
|
1064
|
+
result.forEach((column, index) => {
|
|
1065
|
+
column.width = raised[index];
|
|
1066
|
+
});
|
|
1067
|
+
sum = Math.min(available, raised.reduce((value, width) => value + width, 0));
|
|
1068
|
+
if (available - sum < 0.01) sum = available;
|
|
1069
|
+
result.forEach((column) => {
|
|
1070
|
+
column.ratio = column.width / sum;
|
|
1071
|
+
});
|
|
1072
|
+
}
|
|
1073
|
+
const tableWidth = sized ? Math.max(target, sum) : sum;
|
|
1074
|
+
table.classList.add("doc-table--auto");
|
|
1075
|
+
table.style.width = sized && tableWidth <= available + 4 ? "100%" : `${tableWidth}px`;
|
|
1076
|
+
if (wrapper) setAttribute(wrapper, "data-doc-min-width", String(Math.ceil(result.reduce((value, column) => value + column.softMinWidth, 0) + border + padding)));
|
|
1077
|
+
if (wrapper && !sized) wrapper.style.width = tableWidth >= available - 0.01 ? "100%" : `${tableWidth + border + padding}px`;
|
|
1078
|
+
writeColgroup(table, result.map((column) => ({ width: `${column.ratio * 100}%`, key: column.key })));
|
|
1079
|
+
result.forEach((column, index) => {
|
|
1080
|
+
for (const cell of [headers[index], ...rows.map((row) => row.cells[index])].filter(Boolean)) {
|
|
1081
|
+
setAttribute(cell, "data-column-kind", column.kind);
|
|
1082
|
+
const width = column.ratio * tableWidth;
|
|
1083
|
+
if (measuredCells.get(cell) > width + 0.5) setAttribute(cell, "data-column-wrap", (cell.tagName === "TH" || column.kind === "compact") && measureCell.word(cell) <= width + 0.5 ? "words" : "");
|
|
1084
|
+
else cell.removeAttribute("data-column-wrap");
|
|
1085
|
+
markRunWrap(cell, width, measureCell);
|
|
1086
|
+
}
|
|
1087
|
+
});
|
|
1088
|
+
layouts.set(table, result.map((column) => ({ ...column, width: column.ratio * tableWidth })));
|
|
1089
|
+
}
|
|
1090
|
+
function queueLayout(table) {
|
|
1091
|
+
pendingLayouts.add(table);
|
|
1092
|
+
if (layoutFrame) return;
|
|
1093
|
+
layoutFrame = requestAnimationFrame(() => {
|
|
1094
|
+
layoutFrame = 0;
|
|
1095
|
+
const tables = [...pendingLayouts];
|
|
1096
|
+
pendingLayouts.clear();
|
|
1097
|
+
tables.filter((table2) => table2.isConnected).forEach(refreshLayout);
|
|
1098
|
+
});
|
|
1099
|
+
}
|
|
1100
|
+
var idleLayouts = /* @__PURE__ */ new Set();
|
|
1101
|
+
var idleQueued = false;
|
|
1102
|
+
function idleLayout(table) {
|
|
1103
|
+
idleLayouts.add(table);
|
|
1104
|
+
if (idleQueued) return;
|
|
1105
|
+
idleQueued = true;
|
|
1106
|
+
const run = () => {
|
|
1107
|
+
idleQueued = false;
|
|
1108
|
+
const tables = [...idleLayouts];
|
|
1109
|
+
idleLayouts.clear();
|
|
1110
|
+
tables.forEach(queueLayout);
|
|
1111
|
+
};
|
|
1112
|
+
if (globalThis.requestIdleCallback) requestIdleCallback(run, { timeout: 1e3 });
|
|
1113
|
+
else setTimeout(run, 50);
|
|
1114
|
+
}
|
|
1115
|
+
function applyColumnWidths(table, { layout = true } = {}) {
|
|
1116
|
+
if (!layoutObservers.has(table)) {
|
|
1117
|
+
const previous = /* @__PURE__ */ new WeakMap();
|
|
1118
|
+
const observer = new ResizeObserver((entries) => {
|
|
1119
|
+
for (const { target, contentRect } of entries) {
|
|
1120
|
+
if (contentRect.width !== previous.get(target)) {
|
|
1121
|
+
previous.set(target, contentRect.width);
|
|
1122
|
+
queueLayout(table);
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
});
|
|
1126
|
+
const wrapper = wrapperOf(table);
|
|
1127
|
+
const parent = wrapper ? wrapper.parentElement : table.parentElement;
|
|
1128
|
+
if (parent) observer.observe(parent);
|
|
1129
|
+
if (wrapper) observer.observe(wrapper);
|
|
1130
|
+
layoutObservers.set(table, observer);
|
|
1131
|
+
if (wrapper) drawScrollbars(wrapper, table);
|
|
1132
|
+
}
|
|
1133
|
+
if (layout) queueLayout(table);
|
|
1134
|
+
}
|
|
1135
|
+
function applyLayoutDefaults(table, options) {
|
|
1136
|
+
applyColumnWidths(table, options);
|
|
1137
|
+
return table;
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
// src/render/kit/words.js
|
|
1141
|
+
var TABLES = {
|
|
1142
|
+
"sorted-ascending": { zh: "{0}\uFF1A\u5F53\u524D\u5347\u5E8F\uFF0C\u70B9\u51FB\u5207\u6362", en: "{0}: sorted ascending, click to switch" },
|
|
1143
|
+
"sorted-descending": { zh: "{0}\uFF1A\u5F53\u524D\u964D\u5E8F\uFF0C\u70B9\u51FB\u5207\u6362", en: "{0}: sorted descending, click to switch" },
|
|
1144
|
+
"sort-ascending": { zh: "{0}\uFF1A\u70B9\u51FB\u6309\u5347\u5E8F\u6392\u5E8F", en: "{0}: click to sort ascending" },
|
|
1145
|
+
"sort-descending": { zh: "{0}\uFF1A\u70B9\u51FB\u6309\u964D\u5E8F\u6392\u5E8F", en: "{0}: click to sort descending" },
|
|
1146
|
+
"status-ascending": { zh: "\u5F53\u524D\u6392\u5E8F\uFF1A{0} \xB7 \u5347\u5E8F", en: "Sorted by {0} \xB7 ascending" },
|
|
1147
|
+
"status-descending": { zh: "\u5F53\u524D\u6392\u5E8F\uFF1A{0} \xB7 \u964D\u5E8F", en: "Sorted by {0} \xB7 descending" },
|
|
1148
|
+
"original-order": { zh: "\u539F\u59CB\u987A\u5E8F", en: "Original order" }
|
|
1149
|
+
};
|
|
1150
|
+
var UI_LANGUAGE = "data-ge-language";
|
|
1151
|
+
function kitLanguage(root = globalThis.document?.documentElement) {
|
|
1152
|
+
const ui = root?.getAttribute(UI_LANGUAGE) ?? null;
|
|
1153
|
+
const english = ui !== null ? ui === "en" : /^en(?:-|$)/i.test(root?.getAttribute("lang") ?? "");
|
|
1154
|
+
return english ? "en" : "zh";
|
|
1155
|
+
}
|
|
1156
|
+
function wordIn(table, language, key, ...values) {
|
|
1157
|
+
const entry = table[key];
|
|
1158
|
+
if (!entry) throw new Error(`The kit has no word "${key}" here (src/render/kit/words.js).`);
|
|
1159
|
+
const text = entry[language] ?? entry.zh;
|
|
1160
|
+
return values.length === 0 ? text : text.replace(/\{(\d+)\}/g, (whole, index) => index < values.length ? String(values[index]) : whole);
|
|
1161
|
+
}
|
|
1162
|
+
var sayer = (table) => (key, ...values) => wordIn(table, kitLanguage(), key, ...values);
|
|
1163
|
+
var sayTables = /* @__PURE__ */ sayer(TABLES);
|
|
1164
|
+
var ENGLISH_ROOT = `:root[${UI_LANGUAGE}="en"], :root:not([${UI_LANGUAGE}])[lang|="en" i]`;
|
|
1165
|
+
|
|
1166
|
+
// src/render/kit/tables/sort.js
|
|
1167
|
+
var collator = new Intl.Collator("zh-CN", {
|
|
1168
|
+
numeric: true,
|
|
1169
|
+
sensitivity: "base"
|
|
1170
|
+
});
|
|
1171
|
+
var controllers = /* @__PURE__ */ new WeakMap();
|
|
1172
|
+
var heldOrder = () => document.documentElement.getAttribute("data-ge-order") === "file";
|
|
1173
|
+
function compareValues(left, right, direction) {
|
|
1174
|
+
if (left == null && right == null) return 0;
|
|
1175
|
+
if (left == null) return 1;
|
|
1176
|
+
if (right == null) return -1;
|
|
1177
|
+
const comparison = typeof left === "number" && typeof right === "number" ? left - right : collator.compare(String(left), String(right));
|
|
1178
|
+
return direction === "asc" ? comparison : -comparison;
|
|
1179
|
+
}
|
|
1180
|
+
function statusElement(table) {
|
|
1181
|
+
const selector = table.dataset.sortStatus;
|
|
1182
|
+
if (!selector) return null;
|
|
1183
|
+
try {
|
|
1184
|
+
return document.querySelector(selector);
|
|
1185
|
+
} catch {
|
|
1186
|
+
return null;
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
function controlFor(header) {
|
|
1190
|
+
const button = document.createElement("button");
|
|
1191
|
+
button.type = "button";
|
|
1192
|
+
button.className = "doc-table-sort-button";
|
|
1193
|
+
button.setAttribute("contenteditable", "false");
|
|
1194
|
+
header.append(button);
|
|
1195
|
+
return button;
|
|
1196
|
+
}
|
|
1197
|
+
function makeSortable(target) {
|
|
1198
|
+
const table = elementFor(target);
|
|
1199
|
+
const known = controllers.get(table);
|
|
1200
|
+
if (known) {
|
|
1201
|
+
known.sync();
|
|
1202
|
+
return table;
|
|
1203
|
+
}
|
|
1204
|
+
applyLayoutDefaults(table);
|
|
1205
|
+
inferColumnSemantics(table);
|
|
1206
|
+
const body = table.tBodies[0];
|
|
1207
|
+
if (!body || mergedCells(table) || sortableColumns(table).length === 0) return table;
|
|
1208
|
+
let columns = [];
|
|
1209
|
+
const originalOrder = /* @__PURE__ */ new WeakMap();
|
|
1210
|
+
let next = 0;
|
|
1211
|
+
const orderOf = (row) => {
|
|
1212
|
+
if (!originalOrder.has(row)) originalOrder.set(row, next++);
|
|
1213
|
+
return originalOrder.get(row);
|
|
1214
|
+
};
|
|
1215
|
+
Array.from(body.rows).forEach(orderOf);
|
|
1216
|
+
let current = null;
|
|
1217
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
1218
|
+
const getState = () => ({ sort: current ? { column: current.index, key: current.header.dataset.sortKey || null, direction: current.direction } : null });
|
|
1219
|
+
const notify = () => {
|
|
1220
|
+
for (const listener of listeners) listener(getState());
|
|
1221
|
+
table.dispatchEvent(new CustomEvent("doc-table-sort", { detail: getState().sort }));
|
|
1222
|
+
};
|
|
1223
|
+
function updateHeaders() {
|
|
1224
|
+
for (const column of columns) {
|
|
1225
|
+
const active = current?.header === column.header;
|
|
1226
|
+
const direction = active ? current.direction : column.defaultDirection;
|
|
1227
|
+
column.header.setAttribute(
|
|
1228
|
+
"aria-sort",
|
|
1229
|
+
active ? direction === "asc" ? "ascending" : "descending" : "none"
|
|
1230
|
+
);
|
|
1231
|
+
const ascending = direction === "asc";
|
|
1232
|
+
column.button.setAttribute(
|
|
1233
|
+
"aria-label",
|
|
1234
|
+
sayTables(active ? ascending ? "sorted-ascending" : "sorted-descending" : ascending ? "sort-ascending" : "sort-descending", column.label)
|
|
1235
|
+
);
|
|
1236
|
+
column.button.dataset.docSortArrow = direction;
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
function updateStatus(column, direction) {
|
|
1240
|
+
const status = statusElement(table);
|
|
1241
|
+
if (status) status.textContent = sayTables(direction === "asc" ? "status-ascending" : "status-descending", column.label);
|
|
1242
|
+
}
|
|
1243
|
+
function updateRanks() {
|
|
1244
|
+
Array.from(body.rows).forEach((row, index) => {
|
|
1245
|
+
const rank = row.querySelector("[data-sort-rank]");
|
|
1246
|
+
if (rank) rank.textContent = String(index + 1);
|
|
1247
|
+
});
|
|
1248
|
+
}
|
|
1249
|
+
function sortBy(column, requestedDirection) {
|
|
1250
|
+
if (mergedCells(table)) return;
|
|
1251
|
+
const direction = requestedDirection || (current?.header === column.header ? current.direction === "asc" ? "desc" : "asc" : column.defaultDirection);
|
|
1252
|
+
if (current?.header === column.header && current.direction === direction) return;
|
|
1253
|
+
const rows = Array.from(body.rows);
|
|
1254
|
+
rows.sort((leftRow, rightRow) => {
|
|
1255
|
+
const comparison = compareValues(
|
|
1256
|
+
parsedValue(leftRow.cells[column.index], column.type),
|
|
1257
|
+
parsedValue(rightRow.cells[column.index], column.type),
|
|
1258
|
+
direction
|
|
1259
|
+
);
|
|
1260
|
+
return comparison || orderOf(leftRow) - orderOf(rightRow);
|
|
1261
|
+
});
|
|
1262
|
+
const fragment = document.createDocumentFragment();
|
|
1263
|
+
rows.forEach((row) => fragment.appendChild(row));
|
|
1264
|
+
body.appendChild(fragment);
|
|
1265
|
+
current = { header: column.header, index: column.index, direction };
|
|
1266
|
+
updateHeaders();
|
|
1267
|
+
updateRanks();
|
|
1268
|
+
updateStatus(column, direction);
|
|
1269
|
+
notify();
|
|
1270
|
+
}
|
|
1271
|
+
function sync() {
|
|
1272
|
+
const wanted = mergedCells(table) ? [] : sortableColumns(table);
|
|
1273
|
+
for (const column of columns) {
|
|
1274
|
+
if (wanted.some((each) => each.header === column.header)) continue;
|
|
1275
|
+
column.header.removeAttribute("aria-sort");
|
|
1276
|
+
}
|
|
1277
|
+
columns = wanted.map((column) => {
|
|
1278
|
+
const kept = columns.find((each) => each.header === column.header);
|
|
1279
|
+
const button = kept?.button.isConnected && kept.button.parentElement === column.header ? kept.button : controlFor(column.header);
|
|
1280
|
+
if (button.nextSibling) column.header.append(button);
|
|
1281
|
+
return { ...column, button };
|
|
1282
|
+
});
|
|
1283
|
+
const buttons = new Set(columns.map((column) => column.button));
|
|
1284
|
+
table.querySelectorAll(".doc-table-sort-button").forEach((button) => {
|
|
1285
|
+
if (!buttons.has(button)) button.remove();
|
|
1286
|
+
});
|
|
1287
|
+
if (current) {
|
|
1288
|
+
const column = columns.find((each) => each.header === current.header);
|
|
1289
|
+
current = column ? { ...current, index: column.index } : null;
|
|
1290
|
+
}
|
|
1291
|
+
for (const column of columns) {
|
|
1292
|
+
if (column.type !== "number") continue;
|
|
1293
|
+
column.header.classList.add("number");
|
|
1294
|
+
Array.from(body.rows).forEach((row) => row.cells[column.index]?.classList.add("number"));
|
|
1295
|
+
}
|
|
1296
|
+
Array.from(body.rows).forEach(orderOf);
|
|
1297
|
+
updateHeaders();
|
|
1298
|
+
}
|
|
1299
|
+
table.addEventListener("click", (event) => {
|
|
1300
|
+
const button = event.target.closest?.(".doc-table-sort-button");
|
|
1301
|
+
const column = button && columns.find((each) => each.button === button);
|
|
1302
|
+
if (column) sortBy(column);
|
|
1303
|
+
});
|
|
1304
|
+
controllers.set(table, {
|
|
1305
|
+
getState,
|
|
1306
|
+
sync,
|
|
1307
|
+
setState(next2) {
|
|
1308
|
+
if (!next2 || !("sort" in next2)) throw new Error("Table state requires sort.");
|
|
1309
|
+
if (next2.sort === null) {
|
|
1310
|
+
if (!current) return;
|
|
1311
|
+
[...body.rows].sort((a, b) => orderOf(a) - orderOf(b)).forEach((row) => body.append(row));
|
|
1312
|
+
current = null;
|
|
1313
|
+
updateHeaders();
|
|
1314
|
+
updateRanks();
|
|
1315
|
+
const status = statusElement(table);
|
|
1316
|
+
if (status) status.textContent = sayTables("original-order");
|
|
1317
|
+
notify();
|
|
1318
|
+
return;
|
|
1319
|
+
}
|
|
1320
|
+
const column = columns.find((entry) => entry.index === next2.sort.column);
|
|
1321
|
+
if (!column || !["asc", "desc"].includes(next2.sort.direction)) throw new Error("Invalid table sort column or direction.");
|
|
1322
|
+
sortBy(column, next2.sort.direction);
|
|
1323
|
+
},
|
|
1324
|
+
subscribe(listener) {
|
|
1325
|
+
if (typeof listener !== "function") throw new Error("Table subscribe requires a function.");
|
|
1326
|
+
listeners.add(listener);
|
|
1327
|
+
return () => listeners.delete(listener);
|
|
1328
|
+
}
|
|
1329
|
+
});
|
|
1330
|
+
table.dataset.docSortableReady = "true";
|
|
1331
|
+
sync();
|
|
1332
|
+
const defaultColumn = columns.find((column) => column.header.hasAttribute("data-sort-default"));
|
|
1333
|
+
if (defaultColumn && !heldOrder()) sortBy(defaultColumn, defaultColumn.defaultDirection);
|
|
1334
|
+
return table;
|
|
1335
|
+
}
|
|
1336
|
+
function sortableColumns(table) {
|
|
1337
|
+
return Array.from(table.tHead?.rows[0]?.cells || []).map((header, index) => ({
|
|
1338
|
+
header,
|
|
1339
|
+
index,
|
|
1340
|
+
type: header.dataset.sortType,
|
|
1341
|
+
label: header.textContent.trim(),
|
|
1342
|
+
defaultDirection: header.dataset.sortDefault || (header.dataset.sortType === "text" ? "asc" : "desc")
|
|
1343
|
+
})).filter((column) => column.type && !column.header.hasAttribute("data-sort-ignore"));
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
// src/render/kit/tables/index.js
|
|
1347
|
+
var global2 = globalThis;
|
|
1348
|
+
function enhance(target, { layout = true } = {}) {
|
|
1349
|
+
const table = elementFor(target);
|
|
1350
|
+
splitCodeRuns(table);
|
|
1351
|
+
applyLayoutDefaults(table, { layout });
|
|
1352
|
+
inferColumnSemantics(table);
|
|
1353
|
+
if (table.hasAttribute("data-doc-table-static")) return table;
|
|
1354
|
+
return makeSortable(table);
|
|
1355
|
+
}
|
|
1356
|
+
function controllerFor(target) {
|
|
1357
|
+
const table = enhance(target);
|
|
1358
|
+
const controller = controllers.get(table);
|
|
1359
|
+
if (!controller) throw new Error("Table state requires a sortable table.");
|
|
1360
|
+
return controller;
|
|
1361
|
+
}
|
|
1362
|
+
global2.DocTables = Object.freeze({
|
|
1363
|
+
getState: (target) => controllerFor(target).getState(),
|
|
1364
|
+
setState: (target, state) => controllerFor(target).setState(state),
|
|
1365
|
+
subscribe: (target, listener) => controllerFor(target).subscribe(listener),
|
|
1366
|
+
allocateColumnWidths,
|
|
1367
|
+
/** Force measurement after custom content/layout changes; returns a detached snapshot. */
|
|
1368
|
+
layout(target) {
|
|
1369
|
+
const table = elementFor(target);
|
|
1370
|
+
enhance(table);
|
|
1371
|
+
forgetMeasures(table);
|
|
1372
|
+
refreshLayout(table);
|
|
1373
|
+
return (layouts.get(table) || []).map((column) => ({ ...column }));
|
|
1374
|
+
}
|
|
1375
|
+
});
|
|
1376
|
+
global2.ReportTables = global2.DocTables;
|
|
1377
|
+
if (!global2.DocKit) throw new Error("DocTables requires /kit/runtime.js to be loaded first.");
|
|
1378
|
+
function ownChange(record) {
|
|
1379
|
+
const element = record.target.nodeType === 1 ? record.target : record.target.parentElement;
|
|
1380
|
+
if (element?.closest("colgroup[data-doc-columns]")) return true;
|
|
1381
|
+
const nodes = [...record.addedNodes, ...record.removedNodes];
|
|
1382
|
+
return nodes.length > 0 && nodes.every((node) => node.nodeType === 1 && (node.tagName === "COLGROUP" || node.classList.contains("doc-table-sort-button")));
|
|
1383
|
+
}
|
|
1384
|
+
function bindSort(table, signal) {
|
|
1385
|
+
const key = table.getAttribute("data-doc-bind")?.trim();
|
|
1386
|
+
const controller = controllers.get(table);
|
|
1387
|
+
if (!key || !controller) return;
|
|
1388
|
+
const store = global2.DocKit.bindings;
|
|
1389
|
+
const show = () => {
|
|
1390
|
+
const value = store.get(key);
|
|
1391
|
+
controller.setState(value && typeof value === "object" ? value : { sort: null });
|
|
1392
|
+
};
|
|
1393
|
+
const stopTable = controller.subscribe((state) => store.set(key, state));
|
|
1394
|
+
const stopKey = store.subscribe((changed) => changed === key && show());
|
|
1395
|
+
signal.addEventListener("abort", () => {
|
|
1396
|
+
stopTable();
|
|
1397
|
+
stopKey();
|
|
1398
|
+
});
|
|
1399
|
+
if (!heldOrder()) show();
|
|
1400
|
+
}
|
|
1401
|
+
global2.DocKit.component({
|
|
1402
|
+
id: "table",
|
|
1403
|
+
selector: "table.doc-table, table[data-sortable-table]",
|
|
1404
|
+
on: ["content", "reveal", "layout", "viewport", "fonts"],
|
|
1405
|
+
mount(table, { signal }) {
|
|
1406
|
+
enhance(table);
|
|
1407
|
+
markEdges(table);
|
|
1408
|
+
bindSort(table, signal);
|
|
1409
|
+
const switched = new MutationObserver(() => {
|
|
1410
|
+
enhance(table);
|
|
1411
|
+
queueLayout(table);
|
|
1412
|
+
});
|
|
1413
|
+
for (const node of [table, wrapperOf(table)]) if (node) switched.observe(node, { attributes: true, attributeFilter: ["data-number-columns"] });
|
|
1414
|
+
signal.addEventListener("abort", () => switched.disconnect());
|
|
1415
|
+
return {
|
|
1416
|
+
update(reason, detail, { quiet = false } = {}) {
|
|
1417
|
+
if (reason === "layout") {
|
|
1418
|
+
if (layoutObservers.has(table)) queueLayout(table);
|
|
1419
|
+
} else if (reason === "fonts") {
|
|
1420
|
+
const change = fontsChange(table, detail);
|
|
1421
|
+
if (change === "words") forgetMeasures(table);
|
|
1422
|
+
if (change) queueLayout(table);
|
|
1423
|
+
} else if (reason !== "content" || detail.some((record) => !ownChange(record))) {
|
|
1424
|
+
if (reason === "content" && controllers.has(table)) enhance(table, { layout: false });
|
|
1425
|
+
if (reason === "content") markEdges(table);
|
|
1426
|
+
if (quiet) idleLayout(table);
|
|
1427
|
+
else queueLayout(table);
|
|
1428
|
+
}
|
|
1429
|
+
},
|
|
1430
|
+
destroy() {
|
|
1431
|
+
layoutObservers.get(table)?.disconnect();
|
|
1432
|
+
layoutObservers.delete(table);
|
|
1433
|
+
pendingLayouts.delete(table);
|
|
1434
|
+
}
|
|
1435
|
+
};
|
|
1436
|
+
},
|
|
1437
|
+
// An export of the view: the sort controls taken out (their headers' words are untouched), the widths the layout
|
|
1438
|
+
// set taken off (tables.js lays the copy out again), its cells' code joined from its runs.
|
|
1439
|
+
dehydrate(table) {
|
|
1440
|
+
if (table.classList.contains("doc-table--auto")) {
|
|
1441
|
+
table.style.removeProperty("width");
|
|
1442
|
+
wrapperOf(table)?.style.removeProperty("width");
|
|
1443
|
+
if (table.getAttribute("style") === "") table.removeAttribute("style");
|
|
1444
|
+
}
|
|
1445
|
+
table.querySelectorAll(".doc-table-sort-button").forEach((button) => button.remove());
|
|
1446
|
+
joinCodeRuns(table);
|
|
1447
|
+
}
|
|
1448
|
+
});
|
|
1449
|
+
})();
|