@heycys/gallery 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +50 -2
- package/THIRD-PARTY-NOTICES.md +3303 -0
- package/assets/writing-preferences.md +107 -0
- package/bin/gallery.mjs +10 -0
- package/browser/editor/components/bookmark/icons.mjs +6 -0
- package/browser/editor/components/bookmark/index.mjs +80 -0
- package/browser/editor/components/bookmark/page.mjs +147 -0
- package/browser/editor/components/builders.mjs +19 -0
- package/browser/editor/components/callout/index.mjs +64 -0
- package/browser/editor/components/code/index.mjs +327 -0
- package/browser/editor/components/code/page.mjs +561 -0
- package/browser/editor/components/colors.mjs +50 -0
- package/browser/editor/components/columns/index.mjs +104 -0
- package/browser/editor/components/columns/page.mjs +310 -0
- package/browser/editor/components/details/index.mjs +73 -0
- package/browser/editor/components/details/page.mjs +86 -0
- package/browser/editor/components/dialog/index.mjs +84 -0
- package/browser/editor/components/dialog/page.mjs +201 -0
- package/browser/editor/components/divider/index.mjs +48 -0
- package/browser/editor/components/embed/icons.mjs +11 -0
- package/browser/editor/components/embed/index.mjs +123 -0
- package/browser/editor/components/embed/page.mjs +309 -0
- package/browser/editor/components/figure/index.mjs +87 -0
- package/browser/editor/components/figure/page.mjs +42 -0
- package/browser/editor/components/file/icons.mjs +14 -0
- package/browser/editor/components/file/index.mjs +77 -0
- package/browser/editor/components/file/page.mjs +114 -0
- package/browser/editor/components/flowchart/add.mjs +123 -0
- package/browser/editor/components/flowchart/index.mjs +246 -0
- package/browser/editor/components/flowchart/page.mjs +453 -0
- package/browser/editor/components/heading/index.mjs +53 -0
- package/browser/editor/components/heading/page.mjs +6 -0
- package/browser/editor/components/highlight/index.mjs +63 -0
- package/browser/editor/components/icon/index.mjs +57 -0
- package/browser/editor/components/icon/page.mjs +286 -0
- package/browser/editor/components/icons.mjs +48 -0
- package/browser/editor/components/image/crop.mjs +189 -0
- package/browser/editor/components/image/index.mjs +104 -0
- package/browser/editor/components/image/page.mjs +385 -0
- package/browser/editor/components/image/viewer.mjs +213 -0
- package/browser/editor/components/installed/index.mjs +179 -0
- package/browser/editor/components/installed/page.mjs +523 -0
- package/browser/editor/components/installed/served.mjs +35 -0
- package/browser/editor/components/kit.mjs +67 -0
- package/browser/editor/components/list/index.mjs +194 -0
- package/browser/editor/components/list/join.mjs +68 -0
- package/browser/editor/components/list/numbers.mjs +107 -0
- package/browser/editor/components/list/page.mjs +632 -0
- package/browser/editor/components/math/index.mjs +88 -0
- package/browser/editor/components/math/page.mjs +236 -0
- package/browser/editor/components/math/tex-logo.mjs +6 -0
- package/browser/editor/components/media/icons.mjs +19 -0
- package/browser/editor/components/media/page.mjs +192 -0
- package/browser/editor/components/media/parts.mjs +60 -0
- package/browser/editor/components/media/size.mjs +20 -0
- package/browser/editor/components/media/toolbar.mjs +37 -0
- package/browser/editor/components/media/write.mjs +7 -0
- package/browser/editor/components/pages.mjs +46 -0
- package/browser/editor/components/paragraph/index.mjs +43 -0
- package/browser/editor/components/paragraph/page.mjs +52 -0
- package/browser/editor/components/placeholder-bar.mjs +17 -0
- package/browser/editor/components/placeholder.mjs +128 -0
- package/browser/editor/components/quote/index.mjs +33 -0
- package/browser/editor/components/registry.mjs +859 -0
- package/browser/editor/components/rows.mjs +16 -0
- package/browser/editor/components/section/index.mjs +42 -0
- package/browser/editor/components/section/page.mjs +141 -0
- package/browser/editor/components/set-apart.mjs +24 -0
- package/browser/editor/components/sheets/index.mjs +137 -0
- package/browser/editor/components/sheets/page.mjs +227 -0
- package/browser/editor/components/sheets/pills.mjs +226 -0
- package/browser/editor/components/table/grid.mjs +73 -0
- package/browser/editor/components/table/index.mjs +308 -0
- package/browser/editor/components/table/page.mjs +683 -0
- package/browser/editor/components/table/slots.mjs +41 -0
- package/browser/editor/components/widget/index.mjs +50 -0
- package/browser/editor/page/annotate/anchors.mjs +230 -0
- package/browser/editor/page/annotate/card.mjs +102 -0
- package/browser/editor/page/annotate/index.mjs +1656 -0
- package/browser/editor/page/at-menu/index.mjs +317 -0
- package/browser/editor/page/autosave.mjs +1023 -0
- package/browser/editor/page/beside.mjs +21 -0
- package/browser/editor/page/block-info.mjs +63 -0
- package/browser/editor/page/block-menu/colors.mjs +84 -0
- package/browser/editor/page/block-menu/index.mjs +217 -0
- package/browser/editor/page/blocks.mjs +255 -0
- package/browser/editor/page/caret.mjs +682 -0
- package/browser/editor/page/changes/bar.mjs +102 -0
- package/browser/editor/page/changes/ghost.mjs +206 -0
- package/browser/editor/page/changes/gone-words.mjs +94 -0
- package/browser/editor/page/changes/index.mjs +447 -0
- package/browser/editor/page/changes/words.mjs +27 -0
- package/browser/editor/page/chip-fills.mjs +126 -0
- package/browser/editor/page/clipboard/import/colors.mjs +192 -0
- package/browser/editor/page/clipboard/import/html.mjs +792 -0
- package/browser/editor/page/clipboard/import/inline.mjs +232 -0
- package/browser/editor/page/clipboard/import/languages.mjs +42 -0
- package/browser/editor/page/clipboard/import/markdown.mjs +760 -0
- package/browser/editor/page/clipboard/import/math.mjs +100 -0
- package/browser/editor/page/clipboard/import/office.mjs +245 -0
- package/browser/editor/page/clipboard/import/read.mjs +120 -0
- package/browser/editor/page/clipboard/import/rich.mjs +29 -0
- package/browser/editor/page/clipboard/import/to-blocks.mjs +290 -0
- package/browser/editor/page/clipboard/index.mjs +816 -0
- package/browser/editor/page/clipboard/own/blocks.mjs +211 -0
- package/browser/editor/page/clipboard/own/chart-keys.mjs +58 -0
- package/browser/editor/page/clipboard/own/describe.mjs +124 -0
- package/browser/editor/page/clipboard/own/export.mjs +167 -0
- package/browser/editor/page/clipboard/own/ids.mjs +39 -0
- package/browser/editor/page/clipboard/own/index.mjs +13 -0
- package/browser/editor/page/clipboard/own/rules.mjs +44 -0
- package/browser/editor/page/clipboard/own/selection.mjs +159 -0
- package/browser/editor/page/clipboard/own/writers.mjs +315 -0
- package/browser/editor/page/columns/index.mjs +360 -0
- package/browser/editor/page/commit.mjs +1813 -0
- package/browser/editor/page/conflicts.mjs +249 -0
- package/browser/editor/page/convert.mjs +831 -0
- package/browser/editor/page/core.mjs +1693 -0
- package/browser/editor/page/drag/drop.mjs +307 -0
- package/browser/editor/page/drag/index.mjs +351 -0
- package/browser/editor/page/drag/preview.mjs +126 -0
- package/browser/editor/page/edge-scroll.mjs +50 -0
- package/browser/editor/page/editor.mjs +1780 -0
- package/browser/editor/page/emoji-picker/emoji-tab.mjs +287 -0
- package/browser/editor/page/emoji-picker/glyph-html.mjs +26 -0
- package/browser/editor/page/emoji-picker/grid.mjs +81 -0
- package/browser/editor/page/emoji-picker/icon-tab.mjs +217 -0
- package/browser/editor/page/emoji-picker/icons.mjs +31 -0
- package/browser/editor/page/emoji-picker/index.mjs +166 -0
- package/browser/editor/page/emoji-picker/styles.mjs +161 -0
- package/browser/editor/page/emoji-picker/support.mjs +204 -0
- package/browser/editor/page/emoji-picker/upload.mjs +236 -0
- package/browser/editor/page/export-report.mjs +23 -0
- package/browser/editor/page/fills.mjs +62 -0
- package/browser/editor/page/find/index.mjs +107 -0
- package/browser/editor/page/flags.mjs +70 -0
- package/browser/editor/page/fold/index.mjs +348 -0
- package/browser/editor/page/fold/rule.mjs +125 -0
- package/browser/editor/page/folded.mjs +23 -0
- package/browser/editor/page/format-bar/bar.mjs +449 -0
- package/browser/editor/page/format-bar/brush.mjs +77 -0
- package/browser/editor/page/format-bar/colors.mjs +46 -0
- package/browser/editor/page/format-bar/index.mjs +404 -0
- package/browser/editor/page/formula/index.mjs +236 -0
- package/browser/editor/page/formula/panel.mjs +336 -0
- package/browser/editor/page/formula/symbols.mjs +156 -0
- package/browser/editor/page/frame.mjs +74 -0
- package/browser/editor/page/frames.mjs +196 -0
- package/browser/editor/page/geometry.mjs +402 -0
- package/browser/editor/page/gesture.mjs +45 -0
- package/browser/editor/page/handle/index.mjs +650 -0
- package/browser/editor/page/handle-sizes.mjs +14 -0
- package/browser/editor/page/hints/index.mjs +84 -0
- package/browser/editor/page/history.mjs +401 -0
- package/browser/editor/page/insert/index.mjs +256 -0
- package/browser/editor/page/kept.mjs +38 -0
- package/browser/editor/page/links/address.mjs +40 -0
- package/browser/editor/page/links/index.mjs +866 -0
- package/browser/editor/page/links/pages.mjs +131 -0
- package/browser/editor/page/links/views.mjs +369 -0
- package/browser/editor/page/long-runs.mjs +75 -0
- package/browser/editor/page/look.mjs +77 -0
- package/browser/editor/page/made.mjs +24 -0
- package/browser/editor/page/margin.mjs +373 -0
- package/browser/editor/page/markdown/index.mjs +88 -0
- package/browser/editor/page/markdown/rules.mjs +33 -0
- package/browser/editor/page/marks.mjs +377 -0
- package/browser/editor/page/media-menu/index.mjs +158 -0
- package/browser/editor/page/menu.mjs +544 -0
- package/browser/editor/page/merge.mjs +124 -0
- package/browser/editor/page/notices.mjs +142 -0
- package/browser/editor/page/offered.mjs +32 -0
- package/browser/editor/page/outline/folds.mjs +53 -0
- package/browser/editor/page/outline/index.mjs +783 -0
- package/browser/editor/page/outline/list.mjs +184 -0
- package/browser/editor/page/outline/read.mjs +201 -0
- package/browser/editor/page/outline/strip.mjs +287 -0
- package/browser/editor/page/outline/tree.mjs +248 -0
- package/browser/editor/page/overlay-layer.mjs +227 -0
- package/browser/editor/page/overlays.mjs +205 -0
- package/browser/editor/page/own.mjs +28 -0
- package/browser/editor/page/pads.mjs +71 -0
- package/browser/editor/page/page-objects.mjs +105 -0
- package/browser/editor/page/panel.mjs +65 -0
- package/browser/editor/page/placement.mjs +58 -0
- package/browser/editor/page/post.mjs +41 -0
- package/browser/editor/page/present-links.mjs +50 -0
- package/browser/editor/page/quiet.mjs +48 -0
- package/browser/editor/page/resize/index.mjs +327 -0
- package/browser/editor/page/select-all/index.mjs +262 -0
- package/browser/editor/page/selection/delete.mjs +61 -0
- package/browser/editor/page/selection/index.mjs +164 -0
- package/browser/editor/page/selection/marquee.mjs +174 -0
- package/browser/editor/page/session.mjs +168 -0
- package/browser/editor/page/slash-menu/index.mjs +291 -0
- package/browser/editor/page/storage.mjs +48 -0
- package/browser/editor/page/sync-state.mjs +267 -0
- package/browser/editor/page/table/aligns.mjs +29 -0
- package/browser/editor/page/table/cell-bar.mjs +141 -0
- package/browser/editor/page/table/cells.mjs +527 -0
- package/browser/editor/page/table/icons.mjs +40 -0
- package/browser/editor/page/table/index.mjs +990 -0
- package/browser/editor/page/table/lists.mjs +187 -0
- package/browser/editor/page/table/widths.mjs +313 -0
- package/browser/editor/page/tex.mjs +32 -0
- package/browser/editor/page/text-select/index.mjs +671 -0
- package/browser/editor/page/tooltip.mjs +98 -0
- package/browser/editor/page/type-grid.mjs +83 -0
- package/browser/editor/page/typing/code-edges.mjs +274 -0
- package/browser/editor/page/typing/index.mjs +282 -0
- package/browser/editor/page/typing/leave.mjs +68 -0
- package/browser/editor/page/ui.mjs +160 -0
- package/browser/shared/annotations.mjs +569 -0
- package/browser/shared/code-folds.mjs +14 -0
- package/browser/shared/code-languages.mjs +70 -0
- package/browser/shared/code-lines.mjs +30 -0
- package/browser/shared/colors.mjs +30 -0
- package/browser/shared/component-catalog.mjs +573 -0
- package/browser/shared/components/bookmark.mjs +26 -0
- package/browser/shared/components/callout.mjs +9 -0
- package/browser/shared/components/chart.mjs +20 -0
- package/browser/shared/components/code.mjs +37 -0
- package/browser/shared/components/columns.mjs +16 -0
- package/browser/shared/components/details.mjs +15 -0
- package/browser/shared/components/dialog.mjs +28 -0
- package/browser/shared/components/diff.mjs +18 -0
- package/browser/shared/components/divider.mjs +6 -0
- package/browser/shared/components/embed.mjs +25 -0
- package/browser/shared/components/figure.mjs +14 -0
- package/browser/shared/components/file.mjs +23 -0
- package/browser/shared/components/heading.mjs +6 -0
- package/browser/shared/components/highlight.mjs +9 -0
- package/browser/shared/components/icon.mjs +18 -0
- package/browser/shared/components/image.mjs +39 -0
- package/browser/shared/components/index.mjs +396 -0
- package/browser/shared/components/installed.mjs +232 -0
- package/browser/shared/components/list.mjs +146 -0
- package/browser/shared/components/math.mjs +49 -0
- package/browser/shared/components/mention.mjs +33 -0
- package/browser/shared/components/page.mjs +46 -0
- package/browser/shared/components/paragraph.mjs +9 -0
- package/browser/shared/components/quote.mjs +6 -0
- package/browser/shared/components/section.mjs +8 -0
- package/browser/shared/components/sheets.mjs +80 -0
- package/browser/shared/components/state.mjs +20 -0
- package/browser/shared/components/table.mjs +49 -0
- package/browser/shared/components/text.mjs +14 -0
- package/browser/shared/components/widget.mjs +10 -0
- package/browser/shared/copy-ids.mjs +72 -0
- package/browser/shared/css-references.mjs +110 -0
- package/browser/shared/document-look.mjs +178 -0
- package/browser/shared/emoji/custom.mjs +91 -0
- package/browser/shared/emoji/data/LICENSE-lucide.txt +43 -0
- package/browser/shared/emoji/data/LICENSE-mingcute.txt +202 -0
- package/browser/shared/emoji/data/LICENSE-tabler.txt +21 -0
- package/browser/shared/emoji/data/README.md +28 -0
- package/browser/shared/emoji/data/categories.json +1 -0
- package/browser/shared/emoji/data/icons.json +1 -0
- package/browser/shared/emoji/data/keywords-en.json +1 -0
- package/browser/shared/emoji/data/keywords-zh.json +1 -0
- package/browser/shared/emoji/data/names.json +1 -0
- package/browser/shared/emoji/data/positions.json +1 -0
- package/browser/shared/emoji/data/twemoji-index.json +1 -0
- package/browser/shared/emoji/data/twemoji-svg.bin +0 -0
- package/browser/shared/emoji/data.mjs +194 -0
- package/browser/shared/emoji/emoji.mjs +38 -0
- package/browser/shared/emoji/glyphs.mjs +134 -0
- package/browser/shared/emoji/icon-value.mjs +91 -0
- package/browser/shared/escape.mjs +20 -0
- package/browser/shared/export-wrap.mjs +89 -0
- package/browser/shared/files.mjs +33 -0
- package/browser/shared/html-tree.mjs +59 -0
- package/browser/shared/http.mjs +22 -0
- package/browser/shared/i18n/en.mjs +1223 -0
- package/browser/shared/i18n/index.mjs +132 -0
- package/browser/shared/ids.mjs +24 -0
- package/browser/shared/import-types.mjs +23 -0
- package/browser/shared/inline-spacing.mjs +97 -0
- package/browser/shared/layers.mjs +42 -0
- package/browser/shared/long-runs.mjs +39 -0
- package/browser/shared/media.mjs +162 -0
- package/browser/shared/new-names.mjs +67 -0
- package/browser/shared/number-reading.mjs +92 -0
- package/browser/shared/old-names.mjs +143 -0
- package/browser/shared/outline.mjs +194 -0
- package/browser/shared/page-address.mjs +140 -0
- package/browser/shared/page-links.mjs +86 -0
- package/browser/shared/paths.mjs +73 -0
- package/browser/shared/preferences.mjs +116 -0
- package/browser/shared/preview-server.mjs +247 -0
- package/browser/shared/qa-levels.mjs +93 -0
- package/browser/shared/reading-place.mjs +91 -0
- package/browser/shared/renamed-storage.mjs +220 -0
- package/browser/shared/reports.mjs +46 -0
- package/browser/shared/search.mjs +85 -0
- package/browser/shared/session.mjs +77 -0
- package/browser/shared/table-chart.mjs +113 -0
- package/browser/shared/table-hides.mjs +120 -0
- package/browser/shared/table-slots.mjs +75 -0
- package/browser/shared/words.mjs +23 -0
- package/browser/shared/workspace-look.mjs +91 -0
- package/browser/shared/workspace.mjs +535 -0
- package/browser/shared/writing-preferences.mjs +68 -0
- package/browser/shared/zoom.mjs +57 -0
- package/dist/chunk-2B5E4CDJ.mjs +2 -0
- package/dist/chunk-342HXE3Q.mjs +2 -0
- package/dist/chunk-3HIRPVLU.mjs +2 -0
- package/dist/chunk-43B75J5T.mjs +2 -0
- package/dist/chunk-4FS7Z7WR.mjs +2 -0
- package/dist/chunk-4K5KC6V2.mjs +2 -0
- package/dist/chunk-5L7RYZCL.mjs +2 -0
- package/dist/chunk-5MHMDLZD.mjs +4 -0
- package/dist/chunk-5ZKJ3H4P.mjs +8 -0
- package/dist/chunk-64K7IPLO.mjs +255 -0
- package/dist/chunk-6QXGZM36.mjs +8 -0
- package/dist/chunk-6RGJOMJP.mjs +16 -0
- package/dist/chunk-742D2WWJ.mjs +19 -0
- package/dist/chunk-7DTINW6U.mjs +48 -0
- package/dist/chunk-A55HN5OK.mjs +2 -0
- package/dist/chunk-AGDILNWB.mjs +2 -0
- package/dist/chunk-AJ73XJF3.mjs +2 -0
- package/dist/chunk-AUZGSZJH.mjs +13 -0
- package/dist/chunk-BFE45AKL.mjs +2 -0
- package/dist/chunk-BGGDRNYQ.mjs +10 -0
- package/dist/chunk-BXO2ZY5P.mjs +2 -0
- package/dist/chunk-C564NU2H.mjs +77 -0
- package/dist/chunk-CEH4MRCC.mjs +2 -0
- package/dist/chunk-CY2FNNAB.mjs +16 -0
- package/dist/chunk-DFUDV4LX.mjs +2 -0
- package/dist/chunk-DKXG4XDG.mjs +2 -0
- package/dist/chunk-E7LWZRXY.mjs +4 -0
- package/dist/chunk-EZQ34M3F.mjs +124 -0
- package/dist/chunk-EZY3WC6Z.mjs +15 -0
- package/dist/chunk-FDLXYYG4.mjs +4 -0
- package/dist/chunk-FUKQNOQS.mjs +9 -0
- package/dist/chunk-GB5SOYQJ.mjs +7 -0
- package/dist/chunk-GRAXKKG4.mjs +2 -0
- package/dist/chunk-HYMEEXKN.mjs +4 -0
- package/dist/chunk-IVDLMMBD.mjs +2 -0
- package/dist/chunk-JPOSLGOC.mjs +6 -0
- package/dist/chunk-JVHHHGEA.mjs +3 -0
- package/dist/chunk-L3QKH4OK.mjs +26 -0
- package/dist/chunk-LAE5NQ4B.mjs +2 -0
- package/dist/chunk-LCTHTZIL.mjs +960 -0
- package/dist/chunk-LEF6DRCK.mjs +59 -0
- package/dist/chunk-LKX55H76.mjs +2 -0
- package/dist/chunk-LS4F7JUM.mjs +2 -0
- package/dist/chunk-MAFIGVXY.mjs +2 -0
- package/dist/chunk-NO5NJCHO.mjs +2 -0
- package/dist/chunk-NQPVAU63.mjs +2 -0
- package/dist/chunk-NSKUTQ5J.mjs +5 -0
- package/dist/chunk-O35FIXRB.mjs +2 -0
- package/dist/chunk-P2CAZPDP.mjs +3 -0
- package/dist/chunk-PL6GHLGD.mjs +15 -0
- package/dist/chunk-QAIHRH3I.mjs +13 -0
- package/dist/chunk-QJIR2BLP.mjs +6 -0
- package/dist/chunk-QR6A54KJ.mjs +3 -0
- package/dist/chunk-QUPLVPB2.mjs +7 -0
- package/dist/chunk-R7BNENLY.mjs +4 -0
- package/dist/chunk-S6O4UHLC.mjs +2 -0
- package/dist/chunk-SGJWQKEI.mjs +2 -0
- package/dist/chunk-SYGN7GLU.mjs +2 -0
- package/dist/chunk-TMYZB6AV.mjs +2 -0
- package/dist/chunk-TX6JH7TR.mjs +2 -0
- package/dist/chunk-TYK6VNAB.mjs +10 -0
- package/dist/chunk-U3SSPL4K.mjs +8 -0
- package/dist/chunk-U6KNPJPR.mjs +2 -0
- package/dist/chunk-UALRNVSE.mjs +4 -0
- package/dist/chunk-UH4SIXTR.mjs +2 -0
- package/dist/chunk-UMHUSOPJ.mjs +2 -0
- package/dist/chunk-V3HXVQEM.mjs +2 -0
- package/dist/chunk-V5JTW2LH.mjs +27 -0
- package/dist/chunk-V5VXUJKG.mjs +2 -0
- package/dist/chunk-V6XZ4VIR.mjs +2 -0
- package/dist/chunk-VBXMADMP.mjs +2 -0
- package/dist/chunk-VNV55RUA.mjs +2 -0
- package/dist/chunk-VPD2PS35.mjs +2 -0
- package/dist/chunk-W3BGBJQW.mjs +2 -0
- package/dist/chunk-W4VKN3GF.mjs +7 -0
- package/dist/chunk-W5BXXPDJ.mjs +3 -0
- package/dist/chunk-W7XHE4CT.mjs +2 -0
- package/dist/chunk-XNROSH2T.mjs +4 -0
- package/dist/chunk-XUNHRCOG.mjs +6 -0
- package/dist/chunk-Y34NR5JL.mjs +2 -0
- package/dist/chunk-Y6RLRPG3.mjs +3 -0
- package/dist/chunk-YEY3RSFQ.mjs +2 -0
- package/dist/cli.mjs +2 -0
- package/dist/server.mjs +2 -0
- package/dist/worker.mjs +5 -0
- package/kit/charts.js +355 -0
- package/kit/code.js +164 -0
- package/kit/dialogs.js +157 -0
- package/kit/math.js +2004 -0
- package/kit/report.css +2932 -0
- package/kit/runtime.js +1782 -0
- package/kit/sheets.js +123 -0
- package/kit/state.js +217 -0
- package/kit/tables.js +1499 -0
- package/kit/tokens.js +29 -0
- package/kit/ui.js +658 -0
- package/package.json +41 -4
- package/release.json +25 -0
- package/sdk/column-widths.d.ts +56 -0
- package/sdk/doc-charts.d.ts +82 -0
- package/sdk/doc-code.d.ts +28 -0
- package/sdk/doc-dialogs.d.ts +4 -0
- package/sdk/doc-kit.d.ts +147 -0
- package/sdk/doc-math.d.ts +3 -0
- package/sdk/doc-sheets.d.ts +15 -0
- package/sdk/doc-state.d.ts +41 -0
- package/sdk/doc-tables.d.ts +24 -0
- package/sdk/doc-tokens.d.ts +22 -0
- package/sdk/index.d.ts +30 -0
- package/skill/SKILL.md +150 -0
- package/skill/agents/openai.yaml +5 -0
- package/skill/references/building-components.md +367 -0
- package/skill/references/example-report.html +356 -0
- package/skill/references/writing-html.md +187 -0
- package/skill/sdk/column-widths.d.ts +56 -0
- package/skill/sdk/doc-charts.d.ts +82 -0
- package/skill/sdk/doc-code.d.ts +28 -0
- package/skill/sdk/doc-dialogs.d.ts +4 -0
- package/skill/sdk/doc-kit.d.ts +147 -0
- package/skill/sdk/doc-math.d.ts +3 -0
- package/skill/sdk/doc-sheets.d.ts +15 -0
- package/skill/sdk/doc-state.d.ts +41 -0
- package/skill/sdk/doc-tables.d.ts +24 -0
- package/skill/sdk/doc-tokens.d.ts +22 -0
- package/skill/sdk/index.d.ts +30 -0
- package/starter/doc.html +21 -0
- package/starter/doc.json +5 -0
- package/vendor/d3.v7.9.0.min.js +2 -0
- package/vendor/katex/auto-render.min.js +1 -0
- package/vendor/katex/contrib/mhchem.min.js +1 -0
- package/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/vendor/katex/katex.min.css +1 -0
- package/vendor/katex/katex.min.js +1 -0
- package/vendor/pdfjs/LICENSE +177 -0
- package/vendor/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Add-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5pc-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/B5pc-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS1-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS1-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/CNS2-V.bcmap +3 -0
- package/vendor/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
- package/vendor/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Ext-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GB-H.bcmap +4 -0
- package/vendor/pdfjs/cmaps/GB-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBT-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Hankaku.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Hiragana.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Katakana.bcmap +0 -0
- package/vendor/pdfjs/cmaps/LICENSE +36 -0
- package/vendor/pdfjs/cmaps/NWP-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/NWP-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/Roman.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
- package/vendor/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/V.bcmap +0 -0
- package/vendor/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
- package/vendor/pdfjs/legacy/build/pdf.min.mjs +27 -0
- package/vendor/pdfjs/legacy/build/pdf.worker.min.mjs +27 -0
- package/vendor/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
- package/vendor/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
- package/vendor/pdfjs/standard_fonts/LICENSE_LIBERATION +363 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
- package/vendor/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
- package/vendor/types/@types/d3/LICENSE +21 -0
- package/vendor/types/@types/d3/index.d.ts +39 -0
- package/vendor/types/@types/d3/package.json +81 -0
- package/vendor/types/@types/d3-array/LICENSE +21 -0
- package/vendor/types/@types/d3-array/index.d.ts +1118 -0
- package/vendor/types/@types/d3-array/package.json +56 -0
- package/vendor/types/@types/d3-axis/LICENSE +21 -0
- package/vendor/types/@types/d3-axis/index.d.ts +293 -0
- package/vendor/types/@types/d3-axis/package.json +47 -0
- package/vendor/types/@types/d3-brush/LICENSE +21 -0
- package/vendor/types/@types/d3-brush/index.d.ts +255 -0
- package/vendor/types/@types/d3-brush/package.json +42 -0
- package/vendor/types/@types/d3-chord/LICENSE +21 -0
- package/vendor/types/@types/d3-chord/index.d.ts +471 -0
- package/vendor/types/@types/d3-chord/package.json +40 -0
- package/vendor/types/@types/d3-color/LICENSE +21 -0
- package/vendor/types/@types/d3-color/index.d.ts +669 -0
- package/vendor/types/@types/d3-color/package.json +55 -0
- package/vendor/types/@types/d3-contour/LICENSE +21 -0
- package/vendor/types/@types/d3-contour/index.d.ts +222 -0
- package/vendor/types/@types/d3-contour/package.json +38 -0
- package/vendor/types/@types/d3-delaunay/LICENSE +21 -0
- package/vendor/types/@types/d3-delaunay/index.d.ts +316 -0
- package/vendor/types/@types/d3-delaunay/package.json +30 -0
- package/vendor/types/@types/d3-dispatch/LICENSE +21 -0
- package/vendor/types/@types/d3-dispatch/index.d.ts +96 -0
- package/vendor/types/@types/d3-dispatch/package.json +51 -0
- package/vendor/types/@types/d3-drag/LICENSE +21 -0
- package/vendor/types/@types/d3-drag/index.d.ts +395 -0
- package/vendor/types/@types/d3-drag/package.json +42 -0
- package/vendor/types/@types/d3-dsv/LICENSE +21 -0
- package/vendor/types/@types/d3-dsv/index.d.ts +482 -0
- package/vendor/types/@types/d3-dsv/package.json +45 -0
- package/vendor/types/@types/d3-ease/LICENSE +21 -0
- package/vendor/types/@types/d3-ease/index.d.ts +316 -0
- package/vendor/types/@types/d3-ease/package.json +40 -0
- package/vendor/types/@types/d3-fetch/LICENSE +21 -0
- package/vendor/types/@types/d3-fetch/index.d.ts +282 -0
- package/vendor/types/@types/d3-fetch/package.json +37 -0
- package/vendor/types/@types/d3-force/LICENSE +21 -0
- package/vendor/types/@types/d3-force/index.d.ts +899 -0
- package/vendor/types/@types/d3-force/package.json +45 -0
- package/vendor/types/@types/d3-format/LICENSE +21 -0
- package/vendor/types/@types/d3-format/index.d.ts +337 -0
- package/vendor/types/@types/d3-format/package.json +45 -0
- package/vendor/types/@types/d3-geo/LICENSE +21 -0
- package/vendor/types/@types/d3-geo/index.d.ts +1371 -0
- package/vendor/types/@types/d3-geo/package.json +48 -0
- package/vendor/types/@types/d3-hierarchy/LICENSE +21 -0
- package/vendor/types/@types/d3-hierarchy/index.d.ts +928 -0
- package/vendor/types/@types/d3-hierarchy/package.json +50 -0
- package/vendor/types/@types/d3-interpolate/LICENSE +21 -0
- package/vendor/types/@types/d3-interpolate/index.d.ts +387 -0
- package/vendor/types/@types/d3-interpolate/package.json +47 -0
- package/vendor/types/@types/d3-path/LICENSE +21 -0
- package/vendor/types/@types/d3-path/index.d.ts +108 -0
- package/vendor/types/@types/d3-path/package.json +41 -0
- package/vendor/types/@types/d3-polygon/LICENSE +21 -0
- package/vendor/types/@types/d3-polygon/index.d.ts +41 -0
- package/vendor/types/@types/d3-polygon/package.json +40 -0
- package/vendor/types/@types/d3-quadtree/LICENSE +21 -0
- package/vendor/types/@types/d3-quadtree/index.d.ts +204 -0
- package/vendor/types/@types/d3-quadtree/package.json +45 -0
- package/vendor/types/@types/d3-random/LICENSE +21 -0
- package/vendor/types/@types/d3-random/index.d.ts +313 -0
- package/vendor/types/@types/d3-random/package.json +41 -0
- package/vendor/types/@types/d3-scale/LICENSE +21 -0
- package/vendor/types/@types/d3-scale/index.d.ts +2669 -0
- package/vendor/types/@types/d3-scale/package.json +53 -0
- package/vendor/types/@types/d3-scale-chromatic/LICENSE +21 -0
- package/vendor/types/@types/d3-scale-chromatic/index.d.ts +520 -0
- package/vendor/types/@types/d3-scale-chromatic/package.json +46 -0
- package/vendor/types/@types/d3-selection/LICENSE +21 -0
- package/vendor/types/@types/d3-selection/index.d.ts +1210 -0
- package/vendor/types/@types/d3-selection/package.json +56 -0
- package/vendor/types/@types/d3-shape/LICENSE +21 -0
- package/vendor/types/@types/d3-shape/index.d.ts +2792 -0
- package/vendor/types/@types/d3-shape/package.json +53 -0
- package/vendor/types/@types/d3-time/LICENSE +21 -0
- package/vendor/types/@types/d3-time/index.d.ts +697 -0
- package/vendor/types/@types/d3-time/package.json +46 -0
- package/vendor/types/@types/d3-time-format/LICENSE +21 -0
- package/vendor/types/@types/d3-time-format/index.d.ts +202 -0
- package/vendor/types/@types/d3-time-format/package.json +40 -0
- package/vendor/types/@types/d3-timer/LICENSE +21 -0
- package/vendor/types/@types/d3-timer/index.d.ts +68 -0
- package/vendor/types/@types/d3-timer/package.json +45 -0
- package/vendor/types/@types/d3-transition/LICENSE +21 -0
- package/vendor/types/@types/d3-transition/index.d.ts +664 -0
- package/vendor/types/@types/d3-transition/package.json +47 -0
- package/vendor/types/@types/d3-zoom/LICENSE +21 -0
- package/vendor/types/@types/d3-zoom/index.d.ts +611 -0
- package/vendor/types/@types/d3-zoom/package.json +48 -0
- package/vendor/types/@types/geojson/LICENSE +21 -0
- package/vendor/types/@types/geojson/index.d.ts +202 -0
- package/vendor/types/@types/geojson/package.json +46 -0
- package/vendor/typescript/LICENSE.txt +55 -0
- package/vendor/typescript/lib.decorators.d.ts +384 -0
- package/vendor/typescript/lib.decorators.legacy.d.ts +22 -0
- package/vendor/typescript/lib.dom.d.ts +39429 -0
- package/vendor/typescript/lib.dom.iterable.d.ts +571 -0
- package/vendor/typescript/lib.es2015.collection.d.ts +147 -0
- package/vendor/typescript/lib.es2015.core.d.ts +597 -0
- package/vendor/typescript/lib.es2015.d.ts +28 -0
- package/vendor/typescript/lib.es2015.generator.d.ts +77 -0
- package/vendor/typescript/lib.es2015.iterable.d.ts +605 -0
- package/vendor/typescript/lib.es2015.promise.d.ts +81 -0
- package/vendor/typescript/lib.es2015.proxy.d.ts +128 -0
- package/vendor/typescript/lib.es2015.reflect.d.ts +144 -0
- package/vendor/typescript/lib.es2015.symbol.d.ts +46 -0
- package/vendor/typescript/lib.es2015.symbol.wellknown.d.ts +326 -0
- package/vendor/typescript/lib.es2016.array.include.d.ts +116 -0
- package/vendor/typescript/lib.es2016.d.ts +21 -0
- package/vendor/typescript/lib.es2016.intl.d.ts +31 -0
- package/vendor/typescript/lib.es2017.arraybuffer.d.ts +21 -0
- package/vendor/typescript/lib.es2017.d.ts +26 -0
- package/vendor/typescript/lib.es2017.date.d.ts +31 -0
- package/vendor/typescript/lib.es2017.intl.d.ts +44 -0
- package/vendor/typescript/lib.es2017.object.d.ts +49 -0
- package/vendor/typescript/lib.es2017.sharedmemory.d.ts +135 -0
- package/vendor/typescript/lib.es2017.string.d.ts +45 -0
- package/vendor/typescript/lib.es2017.typedarrays.d.ts +53 -0
- package/vendor/typescript/lib.es2018.asyncgenerator.d.ts +77 -0
- package/vendor/typescript/lib.es2018.asynciterable.d.ts +53 -0
- package/vendor/typescript/lib.es2018.d.ts +24 -0
- package/vendor/typescript/lib.es2018.intl.d.ts +83 -0
- package/vendor/typescript/lib.es2018.promise.d.ts +30 -0
- package/vendor/typescript/lib.es2018.regexp.d.ts +37 -0
- package/vendor/typescript/lib.es2019.array.d.ts +79 -0
- package/vendor/typescript/lib.es2019.d.ts +24 -0
- package/vendor/typescript/lib.es2019.intl.d.ts +23 -0
- package/vendor/typescript/lib.es2019.object.d.ts +33 -0
- package/vendor/typescript/lib.es2019.string.d.ts +37 -0
- package/vendor/typescript/lib.es2019.symbol.d.ts +24 -0
- package/vendor/typescript/lib.es2020.bigint.d.ts +765 -0
- package/vendor/typescript/lib.es2020.d.ts +27 -0
- package/vendor/typescript/lib.es2020.date.d.ts +42 -0
- package/vendor/typescript/lib.es2020.intl.d.ts +474 -0
- package/vendor/typescript/lib.es2020.number.d.ts +28 -0
- package/vendor/typescript/lib.es2020.promise.d.ts +47 -0
- package/vendor/typescript/lib.es2020.sharedmemory.d.ts +99 -0
- package/vendor/typescript/lib.es2020.string.d.ts +44 -0
- package/vendor/typescript/lib.es2020.symbol.wellknown.d.ts +41 -0
- package/vendor/typescript/lib.es2021.d.ts +23 -0
- package/vendor/typescript/lib.es2021.intl.d.ts +166 -0
- package/vendor/typescript/lib.es2021.promise.d.ts +48 -0
- package/vendor/typescript/lib.es2021.string.d.ts +33 -0
- package/vendor/typescript/lib.es2021.weakref.d.ts +78 -0
- package/vendor/typescript/lib.es2022.array.d.ts +121 -0
- package/vendor/typescript/lib.es2022.d.ts +25 -0
- package/vendor/typescript/lib.es2022.error.d.ts +75 -0
- package/vendor/typescript/lib.es2022.intl.d.ts +145 -0
- package/vendor/typescript/lib.es2022.object.d.ts +26 -0
- package/vendor/typescript/lib.es2022.regexp.d.ts +39 -0
- package/vendor/typescript/lib.es2022.string.d.ts +25 -0
- package/vendor/typescript/lib.es5.d.ts +4601 -0
- package/vendor/typescript/package.json +4 -0
- package/vendor/typescript/typescript.js +446 -0
- package/web/assets/index-Bh74DfsV.css +1 -0
- package/web/assets/index-UW0RyFFt.js +13 -0
- package/web/index.html +14 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { FACE_ICON, PHOTO_ICON, svg } from "../../components/icons.mjs";
|
|
2
|
+
|
|
3
|
+
// The icons the icon picker shows: the editor's own line drawings (components/icons.mjs svg) on 20
|
|
4
|
+
// units, no color of their own. icon(name, size) sets the size they show at; the picker's styles
|
|
5
|
+
// (styles.mjs) set their line and color.
|
|
6
|
+
|
|
7
|
+
const ICONS = {
|
|
8
|
+
clock: svg('<circle cx="10" cy="10" r="7.25"/><path d="M10 5.75V10l3 1.75"/>'),
|
|
9
|
+
emojiFace: FACE_ICON,
|
|
10
|
+
leaf: svg('<path d="M16.25 3.75C9 3.75 4.25 7.4 4.25 12.4c0 1.3.4 2.4 1.1 3.35 6 .2 10.9-3.4 10.9-12z"/><path d="M5.25 15.5 11 9.25"/>'),
|
|
11
|
+
carrot: svg('<path d="M3.75 16.25 7.9 8.1c.5-1 1.8-1.2 2.6-.4l1.9 1.9c.8.8.6 2.1-.4 2.6z"/><path d="M10.2 7.3C9.9 5.2 10.6 3.6 12.3 2.6M11.3 8.4l3.4-3.4M12.6 9.8c2.1-.4 3.6-.1 4.7 1.2"/>'),
|
|
12
|
+
soccerBall: svg('<circle cx="10" cy="10" r="7.5"/><path d="m10 7.4 2.5 1.8-.95 2.95h-3.1L7.5 9.2z"/><path d="M10 7.4V2.5M12.5 9.2l4.6-1.5M11.55 12.15l2.9 4M8.45 12.15l-2.9 4M7.5 9.2 2.9 7.7"/>'),
|
|
13
|
+
airplane: svg('<path d="M17.25 10c0-.9-.8-1.5-1.7-1.5H11L7.5 3.5H5.75l1.75 5H4.25L3 7H2l.75 3L2 13h1l1.25-1.5H7.5l-1.75 5H7.5L11 11.5h4.55c.9 0 1.7-.6 1.7-1.5z"/>'),
|
|
14
|
+
lightBulbBright: svg('<path d="M10 2.75a5 5 0 0 0-3 9c.6.5 1 1.2 1 2v.5h4v-.5c0-.8.4-1.5 1-2a5 5 0 0 0-3-9z"/><path d="M8.25 16.5h3.5"/>'),
|
|
15
|
+
checkmarkCircle: svg('<circle cx="10" cy="10" r="7.25"/><path d="m6.75 10.25 2.4 2.4 4.1-4.9"/>'),
|
|
16
|
+
squareGrid2X2: svg('<rect x="3.5" y="3.5" width="5" height="5" rx="1.25"/><rect x="11.5" y="3.5" width="5" height="5" rx="1.25"/><rect x="3.5" y="11.5" width="5" height="5" rx="1.25"/><rect x="11.5" y="11.5" width="5" height="5" rx="1.25"/>'),
|
|
17
|
+
plusCircle: svg('<circle cx="10" cy="10" r="7.25"/><path d="M10 6.75v6.5M6.75 10h6.5"/>'),
|
|
18
|
+
xMarkCircle: svg('<circle cx="10" cy="10" r="7.25"/><path d="m7.75 7.75 4.5 4.5m0-4.5-4.5 4.5"/>'),
|
|
19
|
+
photo: PHOTO_ICON,
|
|
20
|
+
plusSmall: svg('<path d="M10 4.5v11M4.5 10h11"/>'),
|
|
21
|
+
magnifyingGlassSmall: svg('<circle cx="9" cy="9" r="5.5"/><path d="m13.25 13.25 3.75 3.75"/>'),
|
|
22
|
+
// Two lines crossing, each ending in an arrow: 随机.
|
|
23
|
+
arrowIntersectRightSmall: svg('<path d="M3 6h2.4c2 0 3.3 1.3 4.6 3.1M11.3 10.9c1.3 1.8 2.6 3.1 4.6 3.1H17M14.75 11.75 17 14l-2.25 2.25"/><path d="M3 14h2.4c2 0 3.3-1.3 4.6-3.1M11.3 9.1C12.6 7.3 13.9 6 15.9 6H17M14.75 3.75 17 6l-2.25 2.25"/>'),
|
|
24
|
+
// A ring with an arrowhead at its open end: 替换.
|
|
25
|
+
arrowCircleLoopBackwardSmall: svg('<path d="M15.5 10a5.5 5.5 0 1 1-1.9-4.15"/><path d="M15.5 4.25v3.25h-3.25"/>'),
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** The icon `name` as an svg of `size` px (its own size when none). */
|
|
29
|
+
export function icon(name, size = 20) {
|
|
30
|
+
return ICONS[name].replace("<svg ", `<svg width="${size}" height="${size}" `);
|
|
31
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// Taken over from notion-lite (its src/ui/media-picker/index.js): its structure and behaviour as there,
|
|
2
|
+
// what it imports Gallery's own (support.mjs, src/shared/emoji/), and since 2026-11 (the user's word) its
|
|
3
|
+
// look Gallery's own (styles.mjs: the editor's palette, text tabs as the formula editor's, no blue). Its
|
|
4
|
+
// notes, below, are notion-lite's, the look's changed.
|
|
5
|
+
/* 图标选择器(Notion 485357 MediaPicker,页签由 569553 m 给:表情符号 / 图标 / 上传;尺寸、颜色是线上实测):标注图标、选项卡图标、页面图标共用。
|
|
6
|
+
* 宽 408(569553 popupWidth);“表情符号”“图标”页签高 390(tabHeight),“上传”页签没给高度,随内容。
|
|
7
|
+
* 页签栏(eU):上下 6、左右 8、底下一条 --ge-line;“表情符号 / 图标 / 上传”是文字页签,当前的一块灰底(没有下划线);右边“移除”(灰色文字按钮)。
|
|
8
|
+
* 打开时当前图标是 Notion 图标就在“图标”页签,否则在“表情符号”(569553 d;Notion 的当前页签只记在内存里)
|
|
9
|
+
* 筛选行(ec):只有“表情符号”“图标”页签有。8 12 6:输入框(放大镜、“筛选…”、有字时的清除按钮;聚焦时灰色内框)
|
|
10
|
+
* + “随机”(28×28,无框)+ 页签自己的按钮(表情:选肤色;图标:选图标颜色),两个页签共用同一个筛选词(onFilterChange 同时改两边)
|
|
11
|
+
* “上传”页签(569553 custom → 963369,./upload.js):上传 / 拖进来 / 粘贴一张图片或图片链接,“保存”就用它当图标;
|
|
12
|
+
* 勾上“添加到表情符号库”再起个名字,就同时存成自定义表情(以后在“表情符号”页签的“自定义”里)
|
|
13
|
+
* 随机:选上但不关菜单(keepVisible)
|
|
14
|
+
* 键盘:焦点一直在输入框,方向键在格子间移动,回车选中,Esc 先关小浮层、再关菜单;“上传”页签里 Esc 关菜单,Ctrl+V 粘贴图片 / 链接
|
|
15
|
+
* 上传、存自定义表情:一开始就关菜单(569553 p:onStart 关掉选择器),存好以后再换图标
|
|
16
|
+
* openMediaPicker({ origin, value, isCallout, onPick(value | null, { keepVisible }) })——null 是“移除”。
|
|
17
|
+
* 依赖:ui(popup、icons、tooltip)、src/shared/emoji/icon-value(图标的值)、./emoji-tab、./icon-tab、./upload
|
|
18
|
+
*/
|
|
19
|
+
import { openPopup, closePopup } from './support.mjs';
|
|
20
|
+
import { icon } from './support.mjs';
|
|
21
|
+
import { hoverTooltip, hideTooltip } from './support.mjs';
|
|
22
|
+
import { iconKind } from '../../../shared/emoji/icon-value.mjs';
|
|
23
|
+
import { createEmojiTab } from './emoji-tab.mjs';
|
|
24
|
+
import { createIconTab } from './icon-tab.mjs';
|
|
25
|
+
import { createUploadForm } from './upload.mjs';
|
|
26
|
+
import { t } from "../../../shared/i18n/index.mjs";
|
|
27
|
+
|
|
28
|
+
const WIDTH = 408, TAB_HEIGHT = 390;
|
|
29
|
+
let current = null;
|
|
30
|
+
|
|
31
|
+
/* “上传”页签:963369 showTitle false、largeEmoji、allowUrlPaste、confirmToAdd */
|
|
32
|
+
function createUploadTab(env) {
|
|
33
|
+
const form = createUploadForm({
|
|
34
|
+
largeEmoji: true, allowUrlPaste: true, confirmToAdd: true,
|
|
35
|
+
onCancel: env.close,
|
|
36
|
+
onStart: env.close,
|
|
37
|
+
onDone: env.uploaded,
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
el: form.el, right: null, noFilter: true,
|
|
41
|
+
load: () => Promise.resolve(),
|
|
42
|
+
render() {}, move() {}, activateFocused() {}, random() {}, destroy() {},
|
|
43
|
+
focus: form.focus,
|
|
44
|
+
paste: form.paste,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function openMediaPicker({ origin, value, isCallout = false, onPick, only = null }) {
|
|
49
|
+
if (current && !current.popup.closed) closePopup(current.popup);
|
|
50
|
+
const el = document.createElement('div');
|
|
51
|
+
el.className = 'notion-media-menu';
|
|
52
|
+
el.tabIndex = -1;
|
|
53
|
+
el.style.width = `${WIDTH}px`;
|
|
54
|
+
el.innerHTML =
|
|
55
|
+
`<div class="nmm-header">` +
|
|
56
|
+
`<div class="nmm-tabbar">` +
|
|
57
|
+
`<div role="tablist" class="nmm-tabs">` +
|
|
58
|
+
`<div class="nmm-tab-wrap"><div role="tab" class="nmm-tab" data-tab="emoji">${t("表情符号")}</div></div>` +
|
|
59
|
+
`<div class="nmm-tab-wrap"><div role="tab" class="nmm-tab" data-tab="icon">${t("图标")}</div></div>` +
|
|
60
|
+
`<div class="nmm-tab-wrap"><div role="tab" class="nmm-tab" data-tab="upload">${t("上传")}</div></div>` +
|
|
61
|
+
`</div>` +
|
|
62
|
+
`<div class="nmm-tabbar-right"><div role="button" tabindex="0" class="nmm-text-button" data-act="remove">${t("移除")}</div></div>` +
|
|
63
|
+
`</div>` +
|
|
64
|
+
`<div class="nmm-filter-row"><div class="nmm-filter">` +
|
|
65
|
+
`<div class="nmm-input"><div class="nmm-input-icon">${icon('magnifyingGlassSmall', 16)}</div>` +
|
|
66
|
+
`<input type="text" role="combobox" placeholder="${t("筛选…")}" autocomplete="off" spellcheck="false" aria-autocomplete="list" aria-haspopup="grid" aria-expanded="true">` +
|
|
67
|
+
`<div role="button" tabindex="0" aria-label="${t("清除输入")}" class="nmm-clear" data-act="clear" hidden>${icon('xMarkCircle', 20)}</div></div>` +
|
|
68
|
+
`<div class="nmm-filter-right"><div class="nmm-tab-left"></div><div role="button" tabindex="0" aria-label="${t("随机")}" class="nmm-random" data-act="random">${icon('arrowIntersectRightSmall', 16)}</div><div class="nmm-tab-button"></div></div>` +
|
|
69
|
+
`</div></div>` +
|
|
70
|
+
`</div>` +
|
|
71
|
+
`<div class="nmm-content"></div>`;
|
|
72
|
+
|
|
73
|
+
const input = el.querySelector('input'), clear = el.querySelector('.nmm-clear'), filterRow = el.querySelector('.nmm-filter-row');
|
|
74
|
+
const content = el.querySelector('.nmm-content'), tabButton = el.querySelector('.nmm-tab-button'), tabLeft = el.querySelector('.nmm-tab-left');
|
|
75
|
+
let sub = null;
|
|
76
|
+
|
|
77
|
+
const close = () => { if (!popup.closed) closePopup(popup); };
|
|
78
|
+
const env = {
|
|
79
|
+
isCallout,
|
|
80
|
+
filter: () => input.value,
|
|
81
|
+
close,
|
|
82
|
+
submit(v) { close(); onPick(v, {}); },
|
|
83
|
+
keepOpenPick(v) { onPick(v, { keepVisible: true }); },
|
|
84
|
+
/* 上传完、存好自定义表情(569553 u:关掉选择器,换图标) */
|
|
85
|
+
uploaded(v) { close(); onPick(v, {}); },
|
|
86
|
+
refocus() { if (!popup.closed) (active.noFilter ? active.focus() : input.focus({ preventScroll: true })); },
|
|
87
|
+
/* 菜单上面的一层小浮层(肤色变体、选肤色、图标颜色、选颜色菜单);onKey 接管输入框的按键 */
|
|
88
|
+
openSub(anchor, node, onKey, { gap = 4 } = {}) {
|
|
89
|
+
env.closeSub();
|
|
90
|
+
node.addEventListener('mousedown', e => e.preventDefault());
|
|
91
|
+
sub = { popup: openPopup({ origin: anchor.getBoundingClientRect(), placement: 'bottom', align: 'start', gap, content: node, onClose: () => { sub = null; } }), onKey };
|
|
92
|
+
},
|
|
93
|
+
closeSub() {
|
|
94
|
+
if (sub && !sub.popup.closed) closePopup(sub.popup);
|
|
95
|
+
sub = null;
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
const tabs = { emoji: createEmojiTab(env), icon: createIconTab(env), upload: createUploadTab(env) };
|
|
99
|
+
// Some tabs only (`only`: a Sheet tab's icon is an emoji): the others go from the tab bar.
|
|
100
|
+
if (only) el.querySelectorAll('.nmm-tab-wrap').forEach(wrap => { if (!only.includes(wrap.querySelector('[data-tab]').dataset.tab)) wrap.remove(); });
|
|
101
|
+
let active = null;
|
|
102
|
+
|
|
103
|
+
function show(name) {
|
|
104
|
+
env.closeSub();
|
|
105
|
+
active = tabs[name];
|
|
106
|
+
for (const tab of el.querySelectorAll('.nmm-tab[data-tab]')) {
|
|
107
|
+
const on = tab.dataset.tab === name;
|
|
108
|
+
tab.classList.toggle('selected', on);
|
|
109
|
+
tab.setAttribute('aria-selected', String(on));
|
|
110
|
+
tab.parentElement.classList.toggle('selected', on);
|
|
111
|
+
}
|
|
112
|
+
filterRow.hidden = !!active.noFilter; // 485357 ec:只有表情 / 图标页签有筛选行
|
|
113
|
+
el.style.height = active.noFilter ? '' : `${TAB_HEIGHT}px`;
|
|
114
|
+
content.replaceChildren(active.el);
|
|
115
|
+
tabButton.replaceChildren(...(active.right ? [active.right] : []));
|
|
116
|
+
tabLeft.replaceChildren(...(active.left ? [active.left] : [])); // the 图标 tab's set (icon-tab.mjs)
|
|
117
|
+
hideTooltip();
|
|
118
|
+
active.render(input.value);
|
|
119
|
+
active.load().then(() => { if (!popup.closed && active === tabs[name]) active.render(input.value); });
|
|
120
|
+
if (popup) popup.place();
|
|
121
|
+
if (active.noFilter) active.focus(); else input.focus({ preventScroll: true });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const onInput = () => { clear.hidden = !input.value; active.render(input.value); };
|
|
125
|
+
input.addEventListener('input', onInput);
|
|
126
|
+
input.addEventListener('keydown', e => {
|
|
127
|
+
if (sub) return sub.onKey(e);
|
|
128
|
+
if (e.isComposing) return;
|
|
129
|
+
if (e.key.startsWith('Arrow')) { e.preventDefault(); active.move(e.key); }
|
|
130
|
+
else if (e.key === 'Enter') { e.preventDefault(); active.activateFocused(); }
|
|
131
|
+
else if (e.key === 'Escape') { e.preventDefault(); e.stopPropagation(); close(); }
|
|
132
|
+
});
|
|
133
|
+
/* 上传页签里(焦点不在筛选框):Esc 关菜单 */
|
|
134
|
+
el.addEventListener('keydown', e => {
|
|
135
|
+
if (e.target === input || e.key !== 'Escape' || e.isComposing) return;
|
|
136
|
+
e.preventDefault(); e.stopPropagation(); close();
|
|
137
|
+
});
|
|
138
|
+
/* 上传页签:Ctrl+V 粘贴图片 / 图片链接(963369 onPaste) */
|
|
139
|
+
const onPaste = e => { if (active.paste && !popup.closed && !sub) active.paste(e); };
|
|
140
|
+
document.addEventListener('paste', onPaste, true);
|
|
141
|
+
// 焦点留在输入框(上传页签里的输入框、按钮照常)
|
|
142
|
+
el.addEventListener('mousedown', e => { if (e.target !== input && !e.target.closest('.nmm-upload input')) e.preventDefault(); });
|
|
143
|
+
el.addEventListener('click', e => {
|
|
144
|
+
const tab = e.target.closest('.nmm-tab[data-tab]');
|
|
145
|
+
if (tab && !tab.classList.contains('selected')) return show(tab.dataset.tab);
|
|
146
|
+
const act = e.target.closest('[data-act]')?.dataset.act;
|
|
147
|
+
if (act === 'remove') { close(); onPick(null, {}); }
|
|
148
|
+
else if (act === 'clear') { input.value = ''; onInput(); input.focus(); }
|
|
149
|
+
else if (act === 'random') active.random();
|
|
150
|
+
});
|
|
151
|
+
hoverTooltip(el.querySelector('.nmm-random'), t("随机"), { placement: 'bottom' });
|
|
152
|
+
|
|
153
|
+
let popup = null;
|
|
154
|
+
popup = openPopup({
|
|
155
|
+
origin, placement: 'bottom', align: 'start', gap: 4, content: el,
|
|
156
|
+
onClose: () => {
|
|
157
|
+
env.closeSub(); hideTooltip();
|
|
158
|
+
document.removeEventListener('paste', onPaste, true);
|
|
159
|
+
for (const tab of Object.values(tabs)) tab.destroy();
|
|
160
|
+
current = null;
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
current = { popup };
|
|
164
|
+
show(iconKind(value) === 'glyph' ? 'icon' : 'emoji');
|
|
165
|
+
return popup;
|
|
166
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// The icon picker's look (index.mjs, emoji-tab.mjs, icon-tab.mjs, upload.mjs, grid.mjs), Gallery's own
|
|
2
|
+
// since 2026-11 (the user's word: notion-lite's media-picker.css, which it was, gave way): the editor's
|
|
3
|
+
// palette (page/look.mjs, --ge-*), text tabs and gray fills as the formula editor's symbol bar
|
|
4
|
+
// (formula/panel.mjs), buttons without a frame, nothing in blue or any other bright color. Its structure,
|
|
5
|
+
// its class names (.notion-media-menu, .nmm-*: the scenarios read them) and its sizes (408 x 390, 4px
|
|
6
|
+
// under the icon) as before. support.mjs style() adds it to the popups' layer.
|
|
7
|
+
export const PICKER_CSS = `
|
|
8
|
+
.notion-media-menu { display: flex; flex-direction: column; max-height: calc(100vh - 24px); border-radius: 10px; background: var(--ge-bg); box-shadow: var(--ge-shadow-pop); overflow: hidden; color: var(--ge-tx); font-size: 14px; line-height: 1.2; }
|
|
9
|
+
|
|
10
|
+
/* The tab bar: 6 8, a --ge-line under it. A tab 26 high, 8 each side, 13px, rounded 6, --ge-tx2; the one
|
|
11
|
+
shown the only gray block (--ge-hover) in --ge-tx, another darkening its words alone under the pointer.
|
|
12
|
+
移除 at its right end, a text button of the same size (as the formula editor's 完成). */
|
|
13
|
+
.nmm-header { flex-shrink: 0; }
|
|
14
|
+
.nmm-tabbar { display: flex; align-items: center; gap: 2px; padding: 6px 8px; border-bottom: 1px solid var(--ge-line); overflow: auto hidden; scrollbar-width: none; }
|
|
15
|
+
.nmm-tabs { display: flex; gap: 2px; }
|
|
16
|
+
.nmm-tab-wrap { display: flex; }
|
|
17
|
+
.nmm-tab { display: inline-flex; align-items: center; height: 26px; padding: 0 8px; border-radius: 6px; font-size: 13px; white-space: nowrap; color: var(--ge-tx2); cursor: pointer; user-select: none; transition: color 20ms ease-in, background 20ms ease-in; }
|
|
18
|
+
.nmm-tab:hover { color: var(--ge-tx); }
|
|
19
|
+
.nmm-tab.selected { background: var(--ge-hover); color: var(--ge-tx); }
|
|
20
|
+
.nmm-tabbar-right { display: flex; align-items: center; margin-inline-start: auto; }
|
|
21
|
+
.nmm-text-button { display: flex; align-items: center; height: 26px; padding: 0 8px; border-radius: 6px; font-size: 13px; color: var(--ge-tx2); white-space: nowrap; cursor: pointer; user-select: none; }
|
|
22
|
+
.nmm-text-button:hover { background: var(--ge-hover); color: var(--ge-tx); }
|
|
23
|
+
|
|
24
|
+
/* The filter row: 8 12 6. The field 28 high on --ge-field, a 1px --ge-edge inside it, which focus only
|
|
25
|
+
deepens (to --ge-ico3, no blue ring). The buttons right of it (随机, the skin tone, the icon color, the
|
|
26
|
+
set) 28 x 28 without a frame, their icons --ge-ico2; --ge-hover under the pointer, --ge-press pressed. */
|
|
27
|
+
.nmm-filter-row { padding: 8px 12px 6px; }
|
|
28
|
+
.nmm-filter { display: flex; align-items: center; gap: 4px; }
|
|
29
|
+
.nmm-input { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; height: 28px; box-sizing: border-box; margin-inline-end: 4px; padding: 0 4px 0 8px; border-radius: 6px; background: var(--ge-field); box-shadow: inset 0 0 0 1px var(--ge-edge); cursor: text; }
|
|
30
|
+
.nmm-input:focus-within { box-shadow: inset 0 0 0 1px var(--ge-ico3); }
|
|
31
|
+
.nmm-input-icon { display: flex; width: 16px; height: 16px; margin-inline-end: 6px; --nmm-icon: var(--ge-ico2); }
|
|
32
|
+
.nmm-input input { flex: 1; min-width: 0; height: 20px; border: none; outline: none; background: transparent; padding: 0; font: inherit; font-size: 14px; line-height: 20px; color: var(--ge-tx); }
|
|
33
|
+
.nmm-input input::placeholder { color: var(--ge-tx3); }
|
|
34
|
+
.nmm-clear { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 20px; height: 20px; border-radius: 50%; --nmm-icon: var(--ge-ico3); cursor: pointer; }
|
|
35
|
+
.nmm-clear[hidden] { display: none; }
|
|
36
|
+
.nmm-clear:hover { --nmm-icon: var(--ge-ico2); }
|
|
37
|
+
.nmm-filter-right { display: flex; flex: 0 0 auto; align-items: center; gap: 2px; }
|
|
38
|
+
.nmm-tab-left { display: flex; }
|
|
39
|
+
.nmm-tab-left:empty { display: none; }
|
|
40
|
+
.nmm-skin-wrap { display: flex; }
|
|
41
|
+
.nmm-random, .nmm-color-button, .nmm-skin { display: flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 28px; height: 28px; box-sizing: border-box; border-radius: 6px; --nmm-icon: var(--ge-ico2); cursor: pointer; user-select: none; }
|
|
42
|
+
.nmm-skin img, .nmm-skin .ge-emoji-pending { display: block; width: 18px; height: 18px; }
|
|
43
|
+
/* The 图标 tab: left of 随机 the set shown (MingCute / Tabler), a click the other one (icon-tab.mjs); 72 wide at least, so a new name moves nothing */
|
|
44
|
+
.nmm-set-toggle { display: flex; align-items: center; justify-content: center; min-width: 72px; height: 28px; box-sizing: border-box; padding: 0 8px; border-radius: 6px; color: var(--ge-tx2); font-size: 12px; font-weight: 500; white-space: nowrap; cursor: pointer; user-select: none; }
|
|
45
|
+
.nmm-random:hover, .nmm-color-button:hover, .nmm-skin:hover, .nmm-set-toggle:hover { background: var(--ge-hover); color: var(--ge-tx); --nmm-icon: var(--ge-ico); }
|
|
46
|
+
.nmm-random:active, .nmm-color-button:active, .nmm-skin:active, .nmm-set-toggle:active { background: var(--ge-press); }
|
|
47
|
+
|
|
48
|
+
/* The list: in the 表情符号 tab above the category bar, in the 图标 tab all the rest. The scroller is
|
|
49
|
+
positioned, so a group's offsetTop counts from it (a category's button scrolls its group to the top). */
|
|
50
|
+
.nmm-content { display: flex; flex-direction: column; flex: 1; min-height: 0; }
|
|
51
|
+
.nmm-body { display: flex; flex-direction: column; flex: 1; min-height: 0; }
|
|
52
|
+
.nmm-scroller { position: relative; flex: 1 1 auto; min-height: 0; padding-bottom: 6px; overflow: hidden auto; }
|
|
53
|
+
.nmm-section { display: flex; flex-direction: column; }
|
|
54
|
+
/* A group's title sticks to the list's top as it scrolls (the next one pushes it away): 28 high, 12px / 500,
|
|
55
|
+
--ge-tx2, on the card's own color; 16 from the left, where the first column's emoji and the tabs' words start
|
|
56
|
+
(the rows' 12 and a cell's 4) */
|
|
57
|
+
.nmm-section-title { position: sticky; top: 0; z-index: 1; display: flex; align-items: flex-end; height: 28px; box-sizing: border-box; padding: 0 16px 6px; background: var(--ge-bg); font-size: 12px; font-weight: 500; line-height: 16px; color: var(--ge-tx2); user-select: none; }
|
|
58
|
+
.nmm-section-title-text { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
59
|
+
.nmm-rows { display: flex; flex-direction: column; padding: 0 12px; }
|
|
60
|
+
.nmm-row { display: flex; }
|
|
61
|
+
/* A cell 32 x 32, rounded 6, its emoji or icon 24: --ge-hover under the pointer, --ge-press where the keys moved to (no blue ring) */
|
|
62
|
+
.nmm-cell { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 32px; height: 32px; border-radius: 6px; font-size: 24px; line-height: 1; cursor: pointer; user-select: none; }
|
|
63
|
+
.nmm-cell.focused { background: var(--ge-hover); }
|
|
64
|
+
.nmm-cell.focus-visible { background: var(--ge-press); }
|
|
65
|
+
.nmm-cell img { display: block; }
|
|
66
|
+
.nmm-cell img.notion-custom-emoji { object-fit: contain; color: transparent; }
|
|
67
|
+
/* 添加表情符号: the custom group's first cell, a round plus (26, 3 around, a 1px --ge-edge inside, the plus
|
|
68
|
+
--ge-ico3); with no result, a button (28 high, a 1px --ge-edge inside, 13px / 500) */
|
|
69
|
+
.nmm-cell.nmm-add-cell { width: 26px; height: 26px; margin: 3px; box-sizing: border-box; border-radius: 50%; box-shadow: inset 0 0 0 1px var(--ge-edge); --nmm-icon: var(--ge-ico3); }
|
|
70
|
+
.nmm-cell.nmm-add-cell.focused { --nmm-icon: var(--ge-ico); }
|
|
71
|
+
.nmm-empty { padding: 8px 12px; }
|
|
72
|
+
.nmm-empty-caption { display: flex; align-items: center; height: 20px; padding: 0 4px; font-size: 12px; font-weight: 500; color: var(--ge-tx3); }
|
|
73
|
+
.nmm-empty.with-add { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
|
|
74
|
+
.nmm-cell.nmm-add-button { justify-content: flex-start; gap: 6px; width: max-content; height: 28px; padding: 0 10px 0 8px; box-sizing: border-box; border-radius: 6px; box-shadow: inset 0 0 0 1px var(--ge-edge); font-size: 13px; font-weight: 500; line-height: 1; color: var(--ge-tx); white-space: nowrap; --nmm-icon: var(--ge-ico2); }
|
|
75
|
+
|
|
76
|
+
/* The category bar: a --ge-line above it, 6 12 8; buttons 28 x 28, icons 18 in --ge-ico3; the group scrolled
|
|
77
|
+
to on --ge-hover, its icon --ge-ico; a group with no emoji faded to .35 and not to be clicked (自定义 and
|
|
78
|
+
添加 always can) */
|
|
79
|
+
.nmm-categories { display: flex; justify-content: space-between; flex-shrink: 0; padding: 6px 12px 8px; border-top: 1px solid var(--ge-line); }
|
|
80
|
+
.nmm-categories[hidden] { display: none; }
|
|
81
|
+
.nmm-category { display: flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 6px; --nmm-icon: var(--ge-ico3); cursor: pointer; }
|
|
82
|
+
.nmm-category:hover { background: var(--ge-hover); --nmm-icon: var(--ge-ico2); }
|
|
83
|
+
.nmm-category.focused { background: var(--ge-hover); --nmm-icon: var(--ge-ico); }
|
|
84
|
+
.nmm-category.disabled { opacity: .35; cursor: default; background: none; }
|
|
85
|
+
|
|
86
|
+
/* The small popups: the skin tones of an emoji or to choose (one row), an icon's colors (two rows of 5), the
|
|
87
|
+
icon color's menu; the card's color, shadow and corners */
|
|
88
|
+
.nmm-variations, .nmm-icon-variations, .nmm-color-menu { border-radius: 10px; background: var(--ge-bg); box-shadow: var(--ge-shadow-pop); }
|
|
89
|
+
.nmm-variations { display: flex; gap: 2px; padding: 4px; }
|
|
90
|
+
.nmm-icon-variations { padding: 4px; }
|
|
91
|
+
.nmm-icon-variations-row { display: flex; gap: 2px; }
|
|
92
|
+
.nmm-color-menu { width: 160px; box-sizing: border-box; padding: 6px; }
|
|
93
|
+
.nmm-color-row { display: flex; justify-content: space-between; padding: 2px 0; }
|
|
94
|
+
.nmm-color-row.dim { opacity: .5; }
|
|
95
|
+
.nmm-color-swatch { display: flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 6px; opacity: .45; cursor: pointer; }
|
|
96
|
+
.nmm-color-swatch.selected, .nmm-color-swatch:hover { opacity: 1; background: var(--ge-hover); }
|
|
97
|
+
.nmm-color-ask { display: flex; margin: 6px -6px 0; padding: 6px 6px 0; border-top: 1px solid var(--ge-line); }
|
|
98
|
+
.nmm-color-ask-item { display: flex; align-items: center; gap: 8px; width: 100%; height: 28px; padding: 0 6px; border-radius: 6px; font-size: 13px; color: var(--ge-tx); cursor: pointer; user-select: none; }
|
|
99
|
+
.nmm-color-ask-item:hover { background: var(--ge-hover); }
|
|
100
|
+
.nmm-color-ask-label { flex: 1; white-space: nowrap; }
|
|
101
|
+
/* 每次询问's switch: off --ge-line-strong, on --ge-tx2 (a neutral gray, not the blue), its knob white */
|
|
102
|
+
.nmm-switch { display: flex; flex-shrink: 0; width: 26px; height: 14px; padding: 2px; box-sizing: content-box; border-radius: 44px; background: var(--ge-line-strong); transition: background 200ms; }
|
|
103
|
+
.nmm-switch.on { background: var(--ge-tx2); }
|
|
104
|
+
.nmm-switch-knob { width: 14px; height: 14px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgb(15 15 15 / 20%); transition: transform 200ms ease-out; }
|
|
105
|
+
.nmm-switch.on .nmm-switch-knob { transform: translateX(12px); }
|
|
106
|
+
|
|
107
|
+
/* The 上传 tab and the 添加表情符号 popup (upload.mjs): the zone an image goes in on --ge-field, a 1px
|
|
108
|
+
--ge-edge inside it, rounded 8, deeper while a file is dragged over it (--ge-hover, --ge-ico3), never blue;
|
|
109
|
+
保存 a text button (--ge-tx, 500, --ge-hover under the pointer, --ge-tx3 while it cannot be clicked), 取消 /
|
|
110
|
+
返回 --ge-tx2; the checkbox checked --ge-tx2 with a white tick; an error --ge-red */
|
|
111
|
+
.nmm-upload { display: flex; flex-direction: column; padding: 0 16px; font-size: 14px; color: var(--ge-tx); }
|
|
112
|
+
.nmm-upload-title { margin-top: 14px; font-size: 14px; font-weight: 600; }
|
|
113
|
+
.nmm-upload-description { margin-top: 2px; font-size: 12px; color: var(--ge-tx2); }
|
|
114
|
+
.nmm-upload-zone-wrap { display: flex; flex-direction: column; align-items: stretch; margin-top: 16px; }
|
|
115
|
+
.nmm-upload-zone { border-radius: 8px; background: var(--ge-field); box-shadow: inset 0 0 0 1px var(--ge-edge); }
|
|
116
|
+
.nmm-upload-zone-wrap.dragover .nmm-upload-zone { background: var(--ge-hover); box-shadow: inset 0 0 0 1px var(--ge-ico3); }
|
|
117
|
+
.nmm-upload-button { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 18px 14px; border-radius: 8px; font-weight: 500; line-height: 1.2; white-space: nowrap; color: var(--ge-tx2); --nmm-icon: var(--ge-ico2); cursor: pointer; user-select: none; }
|
|
118
|
+
.nmm-upload-button:hover { background: var(--ge-hover); color: var(--ge-tx); }
|
|
119
|
+
.nmm-upload-preview { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 12px; }
|
|
120
|
+
.nmm-upload.large .nmm-upload-preview { padding: 16px; }
|
|
121
|
+
.nmm-upload-preview.with-replace { padding-bottom: 4px; }
|
|
122
|
+
.nmm-upload-preview-label { margin-bottom: 4px; font-size: 12px; color: var(--ge-tx2); }
|
|
123
|
+
.nmm-upload-preview-row { display: flex; align-items: center; gap: 6px; }
|
|
124
|
+
.nmm-upload-preview-row img { width: 48px; height: 48px; padding: 8px; box-sizing: border-box; border: 1px solid var(--ge-edge); border-radius: 8px; object-fit: cover; }
|
|
125
|
+
.nmm-upload.large .nmm-upload-preview-row img { width: 80px; height: 80px; padding: 6px; }
|
|
126
|
+
.nmm-upload-zone.contain .nmm-upload-preview-row img { object-fit: contain; }
|
|
127
|
+
.nmm-upload-preview-row img.light { background: #fff; }
|
|
128
|
+
.nmm-upload-preview-row img.dark { background: #191919; }
|
|
129
|
+
.nmm-upload-replace { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 8px; border-radius: 6px; font-size: 12px; font-weight: 500; color: var(--ge-tx2); --nmm-icon: var(--ge-ico2); cursor: pointer; user-select: none; }
|
|
130
|
+
.nmm-upload-replace:hover { background: var(--ge-hover); }
|
|
131
|
+
.nmm-upload-paste { margin-top: 10px; font-size: 12px; color: var(--ge-tx3); text-align: center; }
|
|
132
|
+
.nmm-upload-error { margin-top: 10px; font-size: 12px; color: var(--ge-red); text-align: center; }
|
|
133
|
+
.nmm-upload-confirm { display: flex; align-items: center; gap: 8px; margin-top: 12px; font-size: 14px; cursor: pointer; user-select: none; }
|
|
134
|
+
.nmm-upload-checkbox { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 14px; height: 14px; box-sizing: border-box; border: 1px solid var(--ge-ico3); border-radius: 3px; cursor: pointer; transition: background .2s ease-out; }
|
|
135
|
+
.nmm-upload-checkbox[aria-checked="true"] { border-color: transparent; background: var(--ge-tx2); }
|
|
136
|
+
.nmm-upload-name { display: block; margin-top: 20px; }
|
|
137
|
+
.nmm-upload-name-label { margin-bottom: 6px; font-size: 12px; font-weight: 500; color: var(--ge-tx2); }
|
|
138
|
+
.nmm-upload-input { display: flex; align-items: center; height: 28px; box-sizing: border-box; padding: 0 8px; border-radius: 6px; background: var(--ge-field); box-shadow: inset 0 0 0 1px var(--ge-edge); cursor: text; }
|
|
139
|
+
.nmm-upload-input:focus-within { box-shadow: inset 0 0 0 1px var(--ge-ico3); }
|
|
140
|
+
.nmm-upload-input input { flex: 1; min-width: 0; height: 20px; border: none; outline: none; background: transparent; padding: 0; font: inherit; font-size: 14px; line-height: 20px; color: var(--ge-tx); }
|
|
141
|
+
.nmm-upload-input input::placeholder { color: var(--ge-tx3); }
|
|
142
|
+
.nmm-upload-name-error { margin-top: 10px; font-size: 12px; color: var(--ge-red); }
|
|
143
|
+
.nmm-upload-name-error[hidden], .nmm-upload [hidden] { display: none; }
|
|
144
|
+
.nmm-upload-footer { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin: 16px 0 12px; }
|
|
145
|
+
.nmm-upload-secondary, .nmm-upload-save { display: inline-flex; align-items: center; justify-content: center; height: 28px; padding: 0 10px; border-radius: 6px; font-size: 14px; line-height: 1.2; white-space: nowrap; cursor: pointer; user-select: none; }
|
|
146
|
+
.nmm-upload-secondary { color: var(--ge-tx2); }
|
|
147
|
+
.nmm-upload-secondary:hover { background: var(--ge-hover); color: var(--ge-tx); }
|
|
148
|
+
.nmm-upload-save { color: var(--ge-tx); font-weight: 500; }
|
|
149
|
+
.nmm-upload-save:not(.disabled):hover { background: var(--ge-hover); }
|
|
150
|
+
.nmm-upload-save.disabled { color: var(--ge-tx3); cursor: default; }
|
|
151
|
+
.nmm-custom-emoji-popup { min-width: 280px; border-radius: 10px; background: var(--ge-bg); box-shadow: var(--ge-shadow-pop); }
|
|
152
|
+
|
|
153
|
+
/* A button reached by Tab: a gray fill, not the browser's dark or blue ring; the checkbox a gray ring */
|
|
154
|
+
.notion-media-menu [role="button"]:focus-visible, .nmm-custom-emoji-popup [role="button"]:focus-visible { outline: none; background: var(--ge-hover); }
|
|
155
|
+
.nmm-upload-checkbox:focus-visible { outline: 1px solid var(--ge-ico3); outline-offset: 2px; }
|
|
156
|
+
|
|
157
|
+
/* Icons: the editor's own line drawings (icons.mjs), in the color --nmm-icon gives where they are (the media menu's are in this layer too) */
|
|
158
|
+
.notion-popup-layer svg:not(.ge-glyph) { fill: none; stroke: var(--nmm-icon, currentColor); stroke-width: 1.4; stroke-linecap: round; stroke-linejoin: round; }
|
|
159
|
+
.nmm-upload-checkbox { --nmm-icon: #fff; }
|
|
160
|
+
.nmm-upload-checkbox svg { stroke-width: 2; }
|
|
161
|
+
`;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { Z } from "../../../shared/layers.mjs";
|
|
2
|
+
import { escapeMarkup } from "../../../shared/escape.mjs";
|
|
3
|
+
import { icon } from "./icons.mjs";
|
|
4
|
+
import { setEmojiLibraryStorage } from "../../../shared/emoji/custom.mjs";
|
|
5
|
+
import { UPLOAD_LIMITS, sizeLimit } from "../../../shared/media.mjs";
|
|
6
|
+
import { blobBase64, failure, postAnswer } from "../post.mjs";
|
|
7
|
+
import { hideTooltip as hideBubble, showTooltipAt } from "../tooltip.mjs";
|
|
8
|
+
import { placeBox } from "../placement.mjs";
|
|
9
|
+
import { addStyle, mount } from "../ui.mjs";
|
|
10
|
+
import { PICKER_CSS } from "./styles.mjs";
|
|
11
|
+
import { t } from "../../../shared/i18n/index.mjs";
|
|
12
|
+
|
|
13
|
+
// What notion-lite's icon picker (its ui/media-picker/, taken over as they are: index, emoji-tab,
|
|
14
|
+
// icon-tab, upload, grid) stands on, made here: its popups (ui/popup.js: placed by an origin, a
|
|
15
|
+
// side and an alignment, flipped where they do not fit, kept 12px inside the window, fading in;
|
|
16
|
+
// a press outside every one closes them all, one inside closes those above it), its tooltip
|
|
17
|
+
// (ui/tooltip.js: the editor's own, tooltip.mjs), its snackbar (the editor's status line), the storage its uploads and custom
|
|
18
|
+
// emojis go to (this Gallery's server: the report's own folder, the workspace's library) and its
|
|
19
|
+
// styles. The picker's own (styles.mjs) read the editor's palette (page/look.mjs, since 2026-11); Notion's
|
|
20
|
+
// tokens (--c-*, --ca-*, light and dark) stay on the layer for the media menu (media-menu/) and the image's
|
|
21
|
+
// alignment bar (components/image/page.mjs), which still read them. Everything drawn carries data-doc-dev.
|
|
22
|
+
|
|
23
|
+
export const esc = (s) => escapeMarkup(String(s ?? "")).replaceAll("'", "'");
|
|
24
|
+
export { icon };
|
|
25
|
+
|
|
26
|
+
// ---------- styles ----------
|
|
27
|
+
|
|
28
|
+
// Notion's tokens (notion-lite's view/theme/notion-vars.css), light and dark: the media menu's and the image's alignment bar's (the picker reads --ge-*).
|
|
29
|
+
const TOKENS = `
|
|
30
|
+
--ca-bacIntTra: light-dark(rgba(33,27,23,.05), rgba(255,255,255,.055));
|
|
31
|
+
--ca-bacSecTra: light-dark(rgba(66,35,3,.03), rgba(252,252,252,.03));
|
|
32
|
+
--ca-bluBacSecTra: light-dark(rgba(0,124,215,.094), rgba(67,155,255,.24));
|
|
33
|
+
--ca-borPriTra: light-dark(rgba(28,19,1,.11), rgba(255,255,235,.1));
|
|
34
|
+
--ca-borSecTra: light-dark(rgba(42,28,0,.07), rgba(255,255,243,.082));
|
|
35
|
+
--ca-borStrTra: light-dark(rgba(27,21,0,.19), rgba(255,252,235,.306));
|
|
36
|
+
--ca-graBacIntTra: light-dark(rgba(33,27,23,.05), rgba(255,255,255,.055));
|
|
37
|
+
--ca-graBacPriTra: light-dark(rgba(66,35,3,.03), rgba(252,252,252,.03));
|
|
38
|
+
--ca-swiTogDesTraBgVar: light-dark(rgba(206,205,202,.3), rgba(202,204,206,.3));
|
|
39
|
+
--c-bacAccPri: #2c2c2b; --c-bluBacAccPri: #2783de; --c-graTexAccPri: #8e8b86; --c-redTexAccPri: #e56458;
|
|
40
|
+
--c-texInvPri: #f0efed; --c-texInvSec: #ada9a3;
|
|
41
|
+
--c-borPri: light-dark(#e6e5e3, #383836); --c-borSec: light-dark(#f0efed, #2c2c2b);
|
|
42
|
+
--c-butBluFocRin: light-dark(0px 0px 0px 2px #f8f8f7, 0px 0px 0px 2px #191919), 0px 0px 0px 4px #2383e2;
|
|
43
|
+
--c-icoPri: light-dark(#383836, #e6e5e3); --c-icoSec: light-dark(#8e8b86, #ada9a3); --c-icoTer: light-dark(#ada9a3, #7d7a75);
|
|
44
|
+
--c-inpBluFocRin: 0px 0px 0px 1px #2383e2 inset, 0px 0px 0px 1px #2383e2;
|
|
45
|
+
--c-popBac: light-dark(#fff, #252525); --c-priBla: light-dark(#000, #fff); --c-whi: light-dark(#fff, #000);
|
|
46
|
+
--c-shaOutLg: 0px 20px 24px 0px light-dark(rgba(25,25,25,.05), rgba(25,25,25,.2)), 0px 5px 8px 0px light-dark(rgba(25,25,25,.027), rgba(25,25,25,.118)), 0px 0px 0px 1px light-dark(rgba(42,28,0,.07), #383836);
|
|
47
|
+
--c-texPri: light-dark(#2c2c2b, #f0efed); --c-texSec: light-dark(#7d7a75, #ada9a3); --c-texTer: light-dark(#a19e99, #7d7a75);
|
|
48
|
+
`;
|
|
49
|
+
const FONT = `ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "PingFang SC", "Microsoft YaHei", Arial, sans-serif`;
|
|
50
|
+
|
|
51
|
+
/** The popups' layer (notion-lite's popup.css) and the picker's styles (styles.mjs), added once. */
|
|
52
|
+
export function style() {
|
|
53
|
+
addStyle(`
|
|
54
|
+
.notion-popup-layer { ${TOKENS} }
|
|
55
|
+
.notion-popup-layer { position: fixed; inset: 0; pointer-events: none; z-index: ${Z.menu}; font: 14px/1.2 ${FONT}; color: var(--c-texPri); }
|
|
56
|
+
.notion-popup { position: fixed; pointer-events: auto; opacity: 0; transition: opacity 200ms; }
|
|
57
|
+
.notion-popup.shown { opacity: 1; }
|
|
58
|
+
.notion-popup-layer .notion-scroller { scrollbar-width: thin; scrollbar-color: var(--ge-edge) transparent; }
|
|
59
|
+
${PICKER_CSS}
|
|
60
|
+
`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ---------- popups ----------
|
|
64
|
+
|
|
65
|
+
const MARGIN = 12;
|
|
66
|
+
const stack = [];
|
|
67
|
+
let layer = null;
|
|
68
|
+
|
|
69
|
+
function ensureLayer() {
|
|
70
|
+
style();
|
|
71
|
+
if (!layer?.isConnected) {
|
|
72
|
+
layer = document.createElement("div");
|
|
73
|
+
layer.className = "notion-popup-layer";
|
|
74
|
+
mount(layer);
|
|
75
|
+
}
|
|
76
|
+
return layer;
|
|
77
|
+
}
|
|
78
|
+
document.addEventListener("mousedown", (event) => {
|
|
79
|
+
if (!stack.length) return;
|
|
80
|
+
const inside = stack.findLastIndex((popup) => popup.el.contains(event.target));
|
|
81
|
+
if (inside === stack.length - 1) return;
|
|
82
|
+
closePopup(stack[inside + 1]);
|
|
83
|
+
}, true);
|
|
84
|
+
|
|
85
|
+
/** Whether a popup is open (a press outside it closes it). */
|
|
86
|
+
export const popupOpen = () => stack.length > 0;
|
|
87
|
+
|
|
88
|
+
/** A popup holding `content`: { el, closed, close(), place(origin) }. */
|
|
89
|
+
export function openPopup({ origin, placement = "bottom", align = "start", gap = 0, content, onClose, className = "" }) {
|
|
90
|
+
const el = document.createElement("div");
|
|
91
|
+
el.className = "notion-popup" + (className ? ` ${className}` : "");
|
|
92
|
+
el.append(content);
|
|
93
|
+
ensureLayer().append(el);
|
|
94
|
+
const popup = { el, closed: false, close: () => closePopup(popup), place: (next) => place(popup, next || popup.origin), origin, placement, align, gap, onClose };
|
|
95
|
+
stack.push(popup);
|
|
96
|
+
place(popup, origin);
|
|
97
|
+
requestAnimationFrame(() => el.classList.add("shown"));
|
|
98
|
+
return popup;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function closePopup(popup) {
|
|
102
|
+
const at = stack.indexOf(popup);
|
|
103
|
+
if (at < 0) return;
|
|
104
|
+
for (const each of stack.splice(at).reverse()) { // those above it go with it
|
|
105
|
+
each.closed = true;
|
|
106
|
+
each.el.remove();
|
|
107
|
+
each.onClose?.();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function place(popup, origin) {
|
|
112
|
+
popup.origin = origin;
|
|
113
|
+
const { el, placement, align, gap } = popup;
|
|
114
|
+
const { left, top } = placeBox(origin, { width: el.offsetWidth, height: el.offsetHeight }, { placement, align, gap, margin: MARGIN });
|
|
115
|
+
el.style.top = `${top}px`;
|
|
116
|
+
el.style.left = `${left}px`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ---------- the tooltip ----------
|
|
120
|
+
|
|
121
|
+
// The editor's own (tooltip.mjs): the picker only decides when it shows (a pause of 150ms, never
|
|
122
|
+
// while the keys move) and where (below, left edge or centered).
|
|
123
|
+
let timer = 0;
|
|
124
|
+
let keyboardMode = false;
|
|
125
|
+
addEventListener("keydown", () => { keyboardMode = true; }, true);
|
|
126
|
+
addEventListener("mousemove", () => { keyboardMode = false; }, true);
|
|
127
|
+
|
|
128
|
+
export function showTooltip(origin, text, { placement = "bottom", align = "center" } = {}) {
|
|
129
|
+
showTooltipAt(origin, text, { placement, align });
|
|
130
|
+
}
|
|
131
|
+
export const isKeyboardMode = () => keyboardMode;
|
|
132
|
+
export function hideTooltip() {
|
|
133
|
+
clearTimeout(timer);
|
|
134
|
+
hideBubble();
|
|
135
|
+
}
|
|
136
|
+
export function hoverTooltip(target, content, { placement = "top", align, delay = 150 } = {}) {
|
|
137
|
+
target.addEventListener("mouseenter", () => {
|
|
138
|
+
clearTimeout(timer);
|
|
139
|
+
if (keyboardMode) return;
|
|
140
|
+
timer = setTimeout(() => {
|
|
141
|
+
if (target.isConnected) showTooltip(target.getBoundingClientRect(), typeof content === "function" ? content() : content, { placement, align });
|
|
142
|
+
}, delay);
|
|
143
|
+
});
|
|
144
|
+
target.addEventListener("mouseleave", hideTooltip);
|
|
145
|
+
target.addEventListener("mousedown", hideTooltip);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// ---------- the snackbar, the storage ----------
|
|
149
|
+
|
|
150
|
+
let say = (text) => console.info(text);
|
|
151
|
+
/** The editor's status line, for what the picker tells the reader. */
|
|
152
|
+
export const showSnackbar = (text) => say(text);
|
|
153
|
+
|
|
154
|
+
const MAX_SIDE = 512; // px: an icon shows at 56; a larger image is made this size before it is sent
|
|
155
|
+
const MAX_BYTES = UPLOAD_LIMITS.icon; // what the server keeps of an icon's image (shared/media.mjs)
|
|
156
|
+
|
|
157
|
+
// An image as the server takes it: a raster image larger than MAX_SIDE made that size (PNG), others as they are.
|
|
158
|
+
async function shrink(blob) {
|
|
159
|
+
if (!/^image\/(png|jpeg|webp|avif)$/.test(blob.type)) return blob;
|
|
160
|
+
const bitmap = await createImageBitmap(blob).catch(() => null);
|
|
161
|
+
if (!bitmap || Math.max(bitmap.width, bitmap.height) <= MAX_SIDE) return blob;
|
|
162
|
+
const scale = MAX_SIDE / Math.max(bitmap.width, bitmap.height);
|
|
163
|
+
const canvas = new OffscreenCanvas(Math.round(bitmap.width * scale), Math.round(bitmap.height * scale));
|
|
164
|
+
canvas.getContext("2d").drawImage(bitmap, 0, 0, canvas.width, canvas.height);
|
|
165
|
+
return canvas.convertToBlob({ type: "image/png" });
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
let server = null; // { slug, token }
|
|
169
|
+
async function post(route, body) {
|
|
170
|
+
const answer = await postAnswer(`/__gallery/edit/${route}`, server.token, { slug: server.slug, ...body });
|
|
171
|
+
if (!answer.ok) throw new Error(failure(answer, t("请求失败")));
|
|
172
|
+
return answer;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Where uploads go: the report's own folder (assets/), and the workspace's emoji library. */
|
|
176
|
+
export const uiStorage = {
|
|
177
|
+
/** An image the reader chose: stored in the report's folder; its path there (assets/<file>). */
|
|
178
|
+
async saveFile(blob, name) {
|
|
179
|
+
const image = await shrink(blob);
|
|
180
|
+
if (image.size > MAX_BYTES) throw new Error(t("图片太大(最多 {0})", sizeLimit("icon")));
|
|
181
|
+
return (await post("upload", { name, type: image.type, data: await blobBase64(image) })).path;
|
|
182
|
+
},
|
|
183
|
+
/** An image from a link: downloaded by the server into the report's folder; its path, or null. */
|
|
184
|
+
async importImage(url, name) {
|
|
185
|
+
try {
|
|
186
|
+
return (await post("upload", { name, url })).path;
|
|
187
|
+
} catch {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* The page's: `slug` and `token` (the edit service's), and `notify(text)`, the status line. The
|
|
195
|
+
* emoji library answers through the same server (custom.mjs).
|
|
196
|
+
*/
|
|
197
|
+
export function connectPicker({ slug, token, notify }) {
|
|
198
|
+
server = { slug, token };
|
|
199
|
+
say = notify;
|
|
200
|
+
setEmojiLibraryStorage({
|
|
201
|
+
loadEmojiLibrary: () => fetch(`/__gallery/edit/emoji-library`).then((response) => response.json()).then((answer) => answer.list ?? []).catch(() => []),
|
|
202
|
+
addEmoji: async ({ name, url }) => (await post("emoji-library", { name, url })).entry,
|
|
203
|
+
});
|
|
204
|
+
}
|