@panphora/clayjs 1.16.0 → 1.18.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/dist/all.js +1 -1
- package/dist/clay-dom.js +1 -1
- package/dist/clay-events.js +1 -1
- package/dist/clay-internals.js +1 -1
- package/dist/clay-options.js +1 -1
- package/dist/clay-router.js +1 -1
- package/dist/clay-ui.js +1 -1
- package/dist/clay-utils.js +1 -1
- package/dist/clay.js +1 -1
- package/dist/clay.standalone.js +72519 -59839
- package/dist/m/attrs/refetch-on-save-ZUE7PSCI.js +1 -0
- package/dist/m/attrs/save-freeze-LWGF6XUN.js +1 -0
- package/dist/m/c-2GRUM77Q.js +30 -0
- package/dist/m/c-2KIEGNC4.js +1 -0
- package/dist/m/{c-5R4PTRG2.js → c-2KL3BD52.js} +1 -1
- package/dist/m/c-2YYDMLNZ.js +1 -0
- package/dist/m/c-2ZZBC45O.js +1 -0
- package/dist/m/c-372N6H3B.js +1 -0
- package/dist/m/{c-4WKFKEKF.js → c-3G2DGZUP.js} +1 -1
- package/dist/m/c-3LDGIBMN.js +1 -0
- package/dist/m/c-3O7OBDCM.js +1 -0
- package/dist/m/c-4ASQPRQL.js +1 -0
- package/dist/m/c-4TXNLX4K.js +6 -0
- package/dist/m/c-4YU3BR4D.js +6 -0
- package/dist/m/c-5734MF2P.js +1 -0
- package/dist/m/c-57XDY6HC.js +1 -0
- package/dist/m/{c-VFX45IZQ.js → c-5B4YBZXC.js} +1 -1
- package/dist/m/c-5ONTYIUI.js +1 -0
- package/dist/m/c-5OOVFCJM.js +1 -0
- package/dist/m/c-5T6NZHNM.js +1 -0
- package/dist/m/{c-YDH7Q3NY.js → c-5ZQV7KC4.js} +1 -1
- package/dist/m/{c-Z36J63PP.js → c-6DB2OLRJ.js} +1 -1
- package/dist/m/c-6DNRCPNM.js +1 -0
- package/dist/m/c-6UGWFMQC.js +2 -0
- package/dist/m/c-7K4SCQB7.js +1 -0
- package/dist/m/c-7MG5RU63.js +1 -0
- package/dist/m/c-7PRJCA3E.js +1 -0
- package/dist/m/c-A6L3FMUS.js +1 -0
- package/dist/m/c-AMU3BPPR.js +4 -0
- package/dist/m/c-AMYEFA2E.js +1 -0
- package/dist/m/c-AQYCG7QW.js +1 -0
- package/dist/m/c-ATKAOH23.js +1 -0
- package/dist/m/c-B3JM5ZXC.js +1 -0
- package/dist/m/c-B5CS55WR.js +1 -0
- package/dist/m/c-B5UJQT7W.js +1 -0
- package/dist/m/c-B7J4K2AE.js +3 -0
- package/dist/m/c-BHZYSHW4.js +1 -0
- package/dist/m/c-BIJALSRD.js +1 -0
- package/dist/m/c-BJ7YQ5QZ.js +1 -0
- package/dist/m/c-BPF2NSPV.js +1 -0
- package/dist/m/{c-KIPQJX4B.js → c-BRLCTNMC.js} +1 -1
- package/dist/m/c-BUAYFEV5.js +1 -0
- package/dist/m/c-C6IPRG34.js +1 -0
- package/dist/m/{c-2JL6E75N.js → c-CAS3NND4.js} +1 -1
- package/dist/m/{c-4DRMS4QG.js → c-CCQ25GFY.js} +1 -1
- package/dist/m/c-CJFDLD43.js +1 -0
- package/dist/m/c-COPTL5WB.js +1 -0
- package/dist/m/c-D3E4WJ4M.js +166 -0
- package/dist/m/c-D5IKEKXW.js +7 -0
- package/dist/m/c-DHBRA6DL.js +1 -0
- package/dist/m/c-DKLS74XB.js +72 -0
- package/dist/m/c-DVYGFTSK.js +3 -0
- package/dist/m/c-E3ZXARWA.js +1 -0
- package/dist/m/c-EK63G3CG.js +1 -0
- package/dist/m/c-ERQSNR6K.js +13 -0
- package/dist/m/c-EVYAISP3.js +1 -0
- package/dist/m/c-EXKHPOVC.js +3 -0
- package/dist/m/{c-7VGZ7RU5.js → c-FWKHM4E7.js} +1 -1
- package/dist/m/{c-4Q2XTQ2N.js → c-GBKB5WDL.js} +1 -1
- package/dist/m/c-GNDL3TKB.js +1 -0
- package/dist/m/c-GRWMD6O5.js +1 -0
- package/dist/m/c-GRXHHFPO.js +1 -0
- package/dist/m/{c-OYTFP5QN.js → c-GY422N3Q.js} +1 -1
- package/dist/m/c-HAWFNBYG.js +1 -0
- package/dist/m/c-HG2C77BM.js +4 -0
- package/dist/m/c-HHGJBU4D.js +1 -0
- package/dist/m/c-HMV6P4RX.js +1 -0
- package/dist/m/c-HMYWIHFG.js +1 -0
- package/dist/m/c-HT2DKBV2.js +1 -0
- package/dist/m/c-I2SCCUEW.js +1 -0
- package/dist/m/{c-HRDCD3WN.js → c-ICJYHABF.js} +2 -2
- package/dist/m/c-IMZCWYHR.js +7 -0
- package/dist/m/c-IVMD3FEM.js +1 -0
- package/dist/m/c-IVTRVENZ.js +1 -0
- package/dist/m/c-IW6GGOU2.js +1 -0
- package/dist/m/c-JKZJIUIP.js +1 -0
- package/dist/m/{c-NZMNXVF6.js → c-JNLX3RJB.js} +1 -1
- package/dist/m/c-JRKY44DK.js +1 -0
- package/dist/m/c-K3ADYNLU.js +1 -0
- package/dist/m/c-KBS3UV6B.js +1 -0
- package/dist/m/c-KGHVFRR3.js +1 -0
- package/dist/m/c-KJJPV77R.js +1 -0
- package/dist/m/{c-CZUSOB7V.js → c-KNPDOMDY.js} +1 -1
- package/dist/m/{c-5Y6TNX5W.js → c-KP64LT2A.js} +2 -2
- package/dist/m/c-KQ7E3PYY.js +1 -0
- package/dist/m/c-L3F5ZLIV.js +1 -0
- package/dist/m/{c-LR4CGEPT.js → c-L42OLXWM.js} +3 -2
- package/dist/m/c-L5VFATT6.js +1 -0
- package/dist/m/c-L7JL5TL3.js +3 -0
- package/dist/m/c-LKSL4AUJ.js +1 -0
- package/dist/m/c-M6FNQCTQ.js +1 -0
- package/dist/m/c-MCOOHCSG.js +1 -0
- package/dist/m/c-MHI3GYKF.js +1 -0
- package/dist/m/c-MWXFLW4J.js +1 -0
- package/dist/m/c-NEL7HQW3.js +1 -0
- package/dist/m/c-NQJRVJ56.js +1 -0
- package/dist/m/c-NWX3MFT4.js +1 -0
- package/dist/m/{c-HPURYVZS.js → c-OJYM642Q.js} +1 -1
- package/dist/m/c-OKXI52N7.js +1 -0
- package/dist/m/{c-MMUIUUZG.js → c-OPLUZR3A.js} +1 -1
- package/dist/m/{c-J7CA54IP.js → c-OTMKN2OO.js} +1 -1
- package/dist/m/{c-LTGMXXKO.js → c-OYRZ7XG2.js} +1 -1
- package/dist/m/c-P3OFYUMA.js +1 -0
- package/dist/m/c-PLN76GF3.js +6 -0
- package/dist/m/c-PLP4JKFC.js +1 -0
- package/dist/m/c-Q26MME6N.js +1 -0
- package/dist/m/{c-S7H2DRCB.js → c-Q3XOWZEV.js} +1 -1
- package/dist/m/{c-SWRJFCNN.js → c-QIKT6SKM.js} +1 -1
- package/dist/m/c-QIXT3Q7C.js +28 -0
- package/dist/m/c-QO4HNGCQ.js +1 -0
- package/dist/m/c-R27DWQKX.js +1 -0
- package/dist/m/{c-HVYXIS72.js → c-R2XUODVY.js} +1 -1
- package/dist/m/{c-QNKREOL6.js → c-R7LBFMF5.js} +1 -1
- package/dist/m/c-RND3G2S2.js +1 -0
- package/dist/m/c-S2U6NJU4.js +1 -0
- package/dist/m/c-SPZPGD3R.js +1 -0
- package/dist/m/c-SW4YEG2D.js +8 -0
- package/dist/m/c-SZGYW5HT.js +1 -0
- package/dist/m/c-T637T7SN.js +1 -0
- package/dist/m/c-TJAXGIRV.js +1 -0
- package/dist/m/{c-KKWLDOPM.js → c-TNEM3RNM.js} +1 -1
- package/dist/m/c-TTB5EK4S.js +32 -0
- package/dist/m/c-U7SHNWDH.js +1 -0
- package/dist/m/c-UDHIVLYH.js +20 -0
- package/dist/m/{c-BBVGTQG7.js → c-UGNV5MFB.js} +1 -1
- package/dist/m/{c-TQZ2JYHD.js → c-UORXLSD3.js} +1 -1
- package/dist/m/c-UPD33ZPE.js +1 -0
- package/dist/m/c-URSMSFCB.js +1 -0
- package/dist/m/c-UY4QX42B.js +1 -0
- package/dist/m/c-V44KWI2L.js +4 -0
- package/dist/m/c-VG5XIN4T.js +1 -0
- package/dist/m/c-VILENZTD.js +1 -0
- package/dist/m/{c-33HUYEDI.js → c-VJYEVRYK.js} +1 -1
- package/dist/m/c-VR2BJ4AN.js +1 -0
- package/dist/m/c-W4JCVLAB.js +1 -0
- package/dist/m/c-W6DQSHXI.js +135 -0
- package/dist/m/c-WBGWGOM7.js +1 -0
- package/dist/m/{c-4L3BTFRK.js → c-WCXLG3MV.js} +1 -1
- package/dist/m/c-WGW764WX.js +1 -0
- package/dist/m/c-WMRJKQ2V.js +5 -0
- package/dist/m/c-WNTYKCDG.js +1 -0
- package/dist/m/c-WQWIRWO3.js +72 -0
- package/dist/m/c-X5LNHET5.js +1 -0
- package/dist/m/c-X5TSXZYJ.js +2 -0
- package/dist/m/c-XGH4GS2T.js +1 -0
- package/dist/m/c-Y6F2FORL.js +1 -0
- package/dist/m/c-YBKHUAK7.js +10 -0
- package/dist/m/c-YBSS55KU.js +20 -0
- package/dist/m/c-YCLU4UNT.js +2 -0
- package/dist/m/c-YVZ2L7CE.js +1 -0
- package/dist/m/c-ZK4GIZH2.js +1 -0
- package/dist/m/c-ZRXJD4G6.js +1 -0
- package/dist/m/c-ZWBI4HYK.js +1 -0
- package/dist/m/{c-HT33EQRN.js → c-ZWIOJGMT.js} +1 -1
- package/dist/m/core/admin-attrs-YY7T5FGU.js +1 -0
- package/dist/m/core/autosave-S6OMNDCK.js +1 -0
- package/dist/m/core/conflict-notice-IWHMHH43.js +1 -0
- package/dist/m/core/host-permission-6EVJGNPL.js +1 -0
- package/dist/m/core/is-edit-mode-GCX6767E.js +1 -0
- package/dist/m/core/{persist-HKHA66IY.js → persist-UKXV5KLA.js} +1 -1
- package/dist/m/core/recovery-DRFZRJED.js +1 -0
- package/dist/m/core/save-LYY7K6U7.js +1 -0
- package/dist/m/core/save-core-MKRPSEEO.js +1 -0
- package/dist/m/core/snapshot-NU3YM6GR.js +1 -0
- package/dist/m/core/unsaved-warning-7QTKEN7Z.js +1 -0
- package/dist/m/events/index-RN2JNGBV.js +1 -0
- package/dist/m/internals/index-TGLQINN3.js +1 -0
- package/dist/m/lib/cache-bust-MUMFXZK6.js +1 -0
- package/dist/m/loader-3BBNZZGM.js +1 -0
- package/dist/m/manifest-F449FF98.js +1 -0
- package/dist/m/manifest-edit-4396A009.js +1 -0
- package/dist/m/manifest.json +2509 -1474
- package/dist/m/options/options-EJMS3K24.js +1 -0
- package/dist/m/page/editor-6LRB3GE4.js +304 -0
- package/dist/m/plugins/ai-edit-UTV7YO2I.js +6 -0
- package/dist/m/plugins/{cms-HP3LSTPN.js → cms-LRAOZHT7.js} +9 -9
- package/dist/m/plugins/demo-OYO5GCAO.js +1 -0
- package/dist/m/plugins/{derive-UAAA4V4S.js → derive-FRE5JJQE.js} +1 -1
- package/dist/m/plugins/indicator-4VDXWYTD.js +1 -0
- package/dist/m/plugins/live-AD4H6XSL.js +1 -0
- package/dist/m/plugins/menu-M5WW7DBF.js +1 -0
- package/dist/m/plugins/page-MD3T2ZX3.js +2 -0
- package/dist/m/plugins/page-view-PAWVZNFY.js +1 -0
- package/dist/m/plugins/people-JCHVPF7P.js +1 -0
- package/dist/m/plugins/quickcrop-BQ5YYFCH.js +26 -0
- package/dist/m/plugins/{richclay-RC3L2F6X.js → richclay-KLGETK77.js} +2 -2
- package/dist/m/plugins/sortable-4S6SQC3D.js +1 -0
- package/dist/m/plugins/source-TJXOIOYY.js +1 -0
- package/dist/m/plugins/undo-NLPGCJQY.js +1 -0
- package/dist/m/plugins/{unsent-HJFLQJ2O.js → unsent-OA4RGBUT.js} +1 -1
- package/dist/m/plugins/upgrade-HSUNDNJD.js +1 -0
- package/dist/m/plugins/upload-NHGJXZK2.js +1 -0
- package/dist/m/plugins/visitor-drafts-BW43DGY3.js +20 -0
- package/dist/m/plugins/visitor-drafts-owner-7ODQG7JX.js +1 -0
- package/dist/m/plugins/wire-VBWXEXU2.js +1 -0
- package/dist/m/reader-core-4W2KYEWQ.js +77 -0
- package/dist/m/route/route-62CHXL5B.js +1 -0
- package/dist/m/sync/live-sync-MO5DH33W.js +1 -0
- package/dist/m/ui/index-IVWN2QC4.js +1 -0
- package/dist/m/vendor/sap-core.vendor-RN4ZVY4X.js +6 -0
- package/dist/offline-manifest.json +1560 -889
- package/dist/page/themes/light-1.css +33 -8
- package/dist/server/core.cjs +1554 -311
- package/dist/server/offline-runtime.cjs +63 -63
- package/dist/server/offline-runtime.mjs +63 -63
- package/dist/server/page-compaction-worker.cjs +3710 -0
- package/dist/server/rooms.mjs +5 -0
- package/docs/guide.md +653 -101
- package/entries/sap.js +5 -5
- package/package.json +1 -1
- package/src/core/admin-contenteditable.js +5 -2
- package/src/core/admin-inputs.js +1 -0
- package/src/core/admin-onclick.js +2 -1
- package/src/core/boot-phase.js +2 -1
- package/src/core/conflict-download.js +3 -29
- package/src/core/conflict-notice-ui.js +4 -7
- package/src/core/download.js +32 -0
- package/src/core/host-meta.js +56 -0
- package/src/core/is-edit-mode.js +17 -1
- package/src/core/mode-key.js +125 -19
- package/src/core/mode-support.js +5 -0
- package/src/core/mode-transition.js +20 -6
- package/src/core/preserve-authored.js +4 -4
- package/src/core/recovery.js +121 -33
- package/src/core/save-accepted.js +33 -0
- package/src/core/save-core.js +111 -32
- package/src/core/save-job.js +108 -0
- package/src/core/save-prepare.js +53 -0
- package/src/core/save-size-notice.js +3 -1
- package/src/core/save-slices.js +15 -0
- package/src/core/save.js +557 -127
- package/src/core/serialize-steps.js +109 -0
- package/src/core/snapshot.js +209 -40
- package/src/core/source-map.js +83 -38
- package/src/core/stale-host-notice.js +1 -0
- package/src/core/upgrade-run.js +59 -8
- package/src/dom/active-element.js +5 -0
- package/src/lib/assets.js +1 -0
- package/src/lib/autosave-scheduler.js +3 -4
- package/src/lib/slice.js +65 -0
- package/src/lib/uimotion.js +774 -0
- package/src/lib/unsaved-state.js +2 -2
- package/src/live/fast-lane.js +10 -3
- package/src/live/local-lane.js +202 -11
- package/src/live/ops.js +16 -0
- package/src/live/page-compaction.js +162 -0
- package/src/live/server-lane.js +1 -0
- package/src/live/store.js +11 -3
- package/src/loader-logic.js +3 -1
- package/src/loader.js +14 -4
- package/src/page/adopt-boot.js +2 -1
- package/src/page/awareness.js +33 -2
- package/src/page/blocks.js +122 -27
- package/src/page/board-views.js +2 -16
- package/src/page/boot-pack.js +1 -1
- package/src/page/chart-tables.js +29 -0
- package/src/page/chart.js +411 -72
- package/src/page/checklist.js +10 -135
- package/src/page/checkpoint-proof.js +295 -0
- package/src/page/chrome.js +257 -40
- package/src/page/clipboard-shape.js +126 -0
- package/src/page/document-title-dom.js +12 -0
- package/src/page/document-title-runtime.js +15 -1
- package/src/page/document-title.js +4 -1
- package/src/page/drag.js +33 -3
- package/src/page/editor.js +207 -31
- package/src/page/emoji-data.js +162 -0
- package/src/page/export-assets.js +357 -0
- package/src/page/export-html.js +209 -0
- package/src/page/export-markdown.js +361 -0
- package/src/page/features/board.js +12 -3
- package/src/page/features/chart.js +11 -0
- package/src/page/features/checklist.js +428 -0
- package/src/page/features/dates.js +180 -0
- package/src/page/features/emoji.js +187 -0
- package/src/page/features/export-html.js +189 -0
- package/src/page/features/export-markdown.js +169 -0
- package/src/page/features/import-markdown.js +349 -0
- package/src/page/features/media.js +61 -5
- package/src/page/features/mentions.js +188 -0
- package/src/page/features/registry.js +24 -1
- package/src/page/features/table.js +375 -85
- package/src/page/features/title-cover.js +331 -0
- package/src/page/features/title-icon.js +213 -0
- package/src/page/features/toc.js +87 -0
- package/src/page/format-command.js +33 -0
- package/src/page/format-gate.js +68 -18
- package/src/page/format-host.js +71 -0
- package/src/page/format-native-commands.js +158 -0
- package/src/page/format-native.js +42 -0
- package/src/page/image-actions.js +64 -0
- package/src/page/import-markdown.js +262 -0
- package/src/page/inline.js +32 -8
- package/src/page/items.js +141 -11
- package/src/page/markdown.js +30 -2
- package/src/page/media.js +35 -119
- package/src/page/mention-picker.js +99 -0
- package/src/page/merge.js +1 -1
- package/src/page/placeholder.js +14 -1
- package/src/page/projection.js +156 -25
- package/src/page/recover.js +10 -12
- package/src/page/recovery-ui.js +464 -0
- package/src/page/rich/chart.js +63 -7
- package/src/page/save-projection.js +67 -0
- package/src/page/save-states.js +14 -4
- package/src/page/schema.js +52 -3
- package/src/page/table-paste.js +3 -1
- package/src/page/table-style.js +4 -4
- package/src/page/table.js +44 -2
- package/src/page/themes/content.css +25 -1
- package/src/page/themes/light-1.css +33 -8
- package/src/page/themes/light-1.source.css +8 -7
- package/src/page/toc-link.js +31 -0
- package/src/page/toc.js +5 -0
- package/src/page/view-hooks.js +58 -0
- package/src/page/view.js +13 -0
- package/src/page/ybind/binding.js +116 -6
- package/src/page/ybind/bridge.js +187 -20
- package/src/page/ybind/containment.js +162 -0
- package/src/page/ybind/doc.js +17 -9
- package/src/page/ybind/file-debt.js +63 -0
- package/src/page/ybind/layout.js +7 -2
- package/src/page/ybind/marks.js +2 -1
- package/src/page/ybind/moves.js +5 -4
- package/src/page/ybind/origins.js +106 -4
- package/src/page/ybind/parts.js +8 -1
- package/src/page/ybind/provider.js +125 -18
- package/src/page/ybind/recovery-proof.js +32 -9
- package/src/page/ybind/recovery-replay.js +905 -4
- package/src/page/ybind/recovery.js +174 -45
- package/src/page/ybind/table.js +67 -11
- package/src/page/ybind/walk-delta.js +258 -0
- package/src/page/ybind/walk.js +54 -29
- package/src/page/ybind/writer.js +1 -1
- package/src/plugins/ai-edit.js +13 -9
- package/src/plugins/indicator-chip.js +91 -0
- package/src/plugins/indicator.js +13 -80
- package/src/plugins/live.js +126 -15
- package/src/plugins/menu/actions.js +196 -0
- package/src/plugins/menu/people.js +279 -0
- package/src/plugins/menu/placement.js +121 -0
- package/src/plugins/menu/preferences.js +9 -0
- package/src/plugins/menu/seo.js +316 -397
- package/src/plugins/menu/style.js +171 -0
- package/src/plugins/menu/variants.js +296 -0
- package/src/plugins/menu.js +186 -183
- package/src/plugins/page-view.js +3 -2
- package/src/plugins/page.js +362 -43
- package/src/plugins/sortable.js +8 -1
- package/src/plugins/source.js +6 -0
- package/src/plugins/upgrade.js +51 -17
- package/src/plugins/upload-ui.js +12 -17
- package/src/plugins/visitor-drafts/bottom-ui.js +12 -4
- package/src/plugins/visitor-drafts/intro-style.js +7 -2
- package/src/plugins/visitor-drafts/intro.js +7 -4
- package/src/plugins/visitor-drafts/owner-chip.js +8 -12
- package/src/plugins/visitor-drafts/prompt.js +11 -9
- package/src/plugins/visitor-drafts/source.js +4 -3
- package/src/plugins/visitor-drafts/store.js +138 -9
- package/src/plugins/visitor-drafts/ui-memory.js +2 -2
- package/src/plugins/visitor-drafts-owner.js +4 -6
- package/src/plugins/visitor-drafts.js +5 -3
- package/src/recovery/store.js +1 -1
- package/src/route/route.js +4 -0
- package/src/server/checkpoint/index.js +2 -2
- package/src/server/rooms/index.js +5 -1
- package/src/server/rooms/live-data-rooms.js +302 -50
- package/src/server/rooms/page-compaction-worker.js +12 -0
- package/src/server/rooms/page-compactor.js +92 -0
- package/src/server/rooms/page-room-conformance.js +461 -0
- package/src/source/parse-steps.js +94 -0
- package/src/source/session.js +233 -57
- package/src/sync/editing-sender.js +12 -0
- package/src/sync/live-sync-edit.js +22 -2
- package/src/sync/live-sync.js +150 -23
- package/src/sync/page-relay.js +52 -0
- package/src/sync/presence-store.js +44 -4
- package/src/sync/presence.js +6 -3
- package/src/sync/saved-stream.js +28 -14
- package/src/ui/bevel-controls.js +1 -0
- package/src/ui/bevel-dialog.js +5 -2
- package/src/ui/editor-ui.js +77 -0
- package/src/ui/page-colour.js +281 -0
- package/src/ui/toast.js +16 -7
- package/src/vendor/hyper-html-api-upgrade.vendor.js +2 -2
- package/src/vendor/hyper-undo.vendor.js +1 -1
- package/src/vendor/hypercms.vendor.js +9 -9
- package/src/vendor/parse5.vendor.js +2 -2
- package/src/vendor/sap-core.vendor.js +5 -5
- package/dist/m/attrs/refetch-on-save-NWPPXOCZ.js +0 -1
- package/dist/m/attrs/save-freeze-FUP4Q4X3.js +0 -1
- package/dist/m/c-2M73252O.js +0 -1
- package/dist/m/c-2SPVQSHC.js +0 -1
- package/dist/m/c-35NBGMZB.js +0 -1
- package/dist/m/c-3IQRECYS.js +0 -1
- package/dist/m/c-4B6H4G5V.js +0 -1
- package/dist/m/c-4FFHZM32.js +0 -1
- package/dist/m/c-4YSCRICO.js +0 -1
- package/dist/m/c-54RCDCBU.js +0 -1
- package/dist/m/c-5M4YEKCX.js +0 -4
- package/dist/m/c-5V3MOVJT.js +0 -1
- package/dist/m/c-66O32MV3.js +0 -28
- package/dist/m/c-6HMB24EV.js +0 -1
- package/dist/m/c-7O6AFR65.js +0 -1
- package/dist/m/c-ANQTJ3B5.js +0 -2
- package/dist/m/c-AYVOREBE.js +0 -1
- package/dist/m/c-B2ZXPOS3.js +0 -3
- package/dist/m/c-BMIZKMPV.js +0 -1
- package/dist/m/c-BTDI4Y23.js +0 -1
- package/dist/m/c-CJZSLMVQ.js +0 -1
- package/dist/m/c-DBE6ORSI.js +0 -1
- package/dist/m/c-EDHUR4MX.js +0 -1
- package/dist/m/c-EY6UOM54.js +0 -1
- package/dist/m/c-F3CKJTJS.js +0 -1
- package/dist/m/c-F7Y6FLPY.js +0 -1
- package/dist/m/c-FA4DZVTC.js +0 -1
- package/dist/m/c-G2BUZITR.js +0 -1
- package/dist/m/c-GB3JTV6E.js +0 -1
- package/dist/m/c-GBGWXTX4.js +0 -1
- package/dist/m/c-GHBCCVG4.js +0 -1
- package/dist/m/c-GJAEGGXY.js +0 -1
- package/dist/m/c-GOWBDM6J.js +0 -1
- package/dist/m/c-IB52R237.js +0 -1
- package/dist/m/c-IKWNE4R4.js +0 -1
- package/dist/m/c-IU3IYEU6.js +0 -1
- package/dist/m/c-IZ2EBRAJ.js +0 -1
- package/dist/m/c-KR4UW4KW.js +0 -1
- package/dist/m/c-KY3VJGUA.js +0 -8
- package/dist/m/c-LFPHCXY3.js +0 -1
- package/dist/m/c-LRPUO2MX.js +0 -1
- package/dist/m/c-LXENEBV7.js +0 -1
- package/dist/m/c-NMJRXKPC.js +0 -8
- package/dist/m/c-OIBUTDXI.js +0 -1
- package/dist/m/c-PPOSCAQD.js +0 -1
- package/dist/m/c-QIX5BJYN.js +0 -1
- package/dist/m/c-QQHEX6HA.js +0 -1
- package/dist/m/c-R7RMANJI.js +0 -9
- package/dist/m/c-RI4NT75Y.js +0 -1
- package/dist/m/c-RM7J7BV2.js +0 -1
- package/dist/m/c-RUJKSUQW.js +0 -1
- package/dist/m/c-SGCCC4FW.js +0 -25
- package/dist/m/c-T4VO4OCB.js +0 -1
- package/dist/m/c-TQEMVJCS.js +0 -1
- package/dist/m/c-TR6RMDQ7.js +0 -3
- package/dist/m/c-UKHTLWUW.js +0 -1
- package/dist/m/c-UNN7LWCT.js +0 -1
- package/dist/m/c-UXBMRDZB.js +0 -235
- package/dist/m/c-V7PZZRG7.js +0 -1
- package/dist/m/c-VL52ADDR.js +0 -1
- package/dist/m/c-WNYBLIOZ.js +0 -1
- package/dist/m/c-WWDBYXLK.js +0 -1
- package/dist/m/c-XNNW2CWK.js +0 -1
- package/dist/m/c-Y6USGTS5.js +0 -5
- package/dist/m/c-YG2NJYS6.js +0 -135
- package/dist/m/c-Z4VRC7GU.js +0 -7
- package/dist/m/c-Z6K52OLP.js +0 -19
- package/dist/m/c-ZDY2MDAA.js +0 -21
- package/dist/m/c-ZUCOKOHT.js +0 -1
- package/dist/m/core/admin-attrs-VGNLAUDK.js +0 -1
- package/dist/m/core/autosave-E4PEFPZ6.js +0 -1
- package/dist/m/core/conflict-notice-VQ6Y64PH.js +0 -1
- package/dist/m/core/host-permission-XN3K2IW3.js +0 -1
- package/dist/m/core/is-edit-mode-JXHDVGUL.js +0 -1
- package/dist/m/core/recovery-TBBSICE2.js +0 -1
- package/dist/m/core/save-WUCHTQBE.js +0 -1
- package/dist/m/core/save-core-FJVHT5M3.js +0 -1
- package/dist/m/core/snapshot-F3SWDZMM.js +0 -1
- package/dist/m/core/unsaved-warning-STKBHE6G.js +0 -1
- package/dist/m/events/index-23DPTUT4.js +0 -1
- package/dist/m/internals/index-WOVAP3RU.js +0 -1
- package/dist/m/lib/cache-bust-CGWT6ZJI.js +0 -1
- package/dist/m/loader-HXX6YNH5.js +0 -1
- package/dist/m/manifest-F22DEDAC.js +0 -1
- package/dist/m/manifest-edit-C3C7376B.js +0 -1
- package/dist/m/options/options-2LH76JQ3.js +0 -1
- package/dist/m/page/editor-XUTB2HB2.js +0 -189
- package/dist/m/plugins/ai-edit-ZQ4CGWIP.js +0 -6
- package/dist/m/plugins/demo-ZIBFAA3R.js +0 -1
- package/dist/m/plugins/indicator-PV4YW2ID.js +0 -1
- package/dist/m/plugins/live-NUTTXSBS.js +0 -1
- package/dist/m/plugins/menu-HCKO3DSP.js +0 -138
- package/dist/m/plugins/page-KSUH7G6J.js +0 -2
- package/dist/m/plugins/page-view-W73OW7WI.js +0 -1
- package/dist/m/plugins/people-AJJ32YCG.js +0 -1
- package/dist/m/plugins/quickcrop-QNY3PKLD.js +0 -26
- package/dist/m/plugins/sortable-YRMQX3ZU.js +0 -1
- package/dist/m/plugins/source-KHK5UUSK.js +0 -1
- package/dist/m/plugins/undo-OF2L3CXU.js +0 -1
- package/dist/m/plugins/upgrade-ZNYODP5Y.js +0 -1
- package/dist/m/plugins/upload-XSGNILUY.js +0 -1
- package/dist/m/plugins/visitor-drafts-XK5GW55Q.js +0 -21
- package/dist/m/plugins/visitor-drafts-owner-KSSH75EV.js +0 -1
- package/dist/m/plugins/wire-ZWVWKF76.js +0 -1
- package/dist/m/reader-core-ILWLXVMP.js +0 -68
- package/dist/m/route/route-KOCZSEGN.js +0 -1
- package/dist/m/sync/live-sync-4AUVXVJU.js +0 -1
- package/dist/m/ui/index-EVHKMKBL.js +0 -1
- package/dist/m/vendor/sap-core.vendor-A7BMUYZT.js +0 -6
- /package/dist/m/{c-FILLTJA7.js → c-QTTJYJMA.js} +0 -0
- /package/dist/m/plugins/{quickcrop-QNY3PKLD.js.LEGAL.txt → quickcrop-BQ5YYFCH.js.LEGAL.txt} +0 -0
- /package/dist/m/plugins/{richclay-RC3L2F6X.js.LEGAL.txt → richclay-KLGETK77.js.LEGAL.txt} +0 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
// Who's here: a menu item and, on a page that opts in with `<html clay-menu-roster>`, a
|
|
2
|
+
// roster beside the capsule. Either opens the people panel, which lists the people on
|
|
3
|
+
// this page and lets you change the name your edits are signed with when this browser
|
|
4
|
+
// chose it. The roster comes from the presence store; nothing here is ever saved.
|
|
5
|
+
import { initialsOf, personColor } from "../../lib/person-face.js";
|
|
6
|
+
|
|
7
|
+
const CROSS =
|
|
8
|
+
'<svg viewBox="0 0 256 256" aria-hidden="true" focusable="false"><path d="M205.66 194.34a8 8 0 0 1-11.32 11.32L128 139.31l-66.34 66.35a8 8 0 0 1-11.32-11.32L116.69 128 50.34 61.66a8 8 0 0 1 11.32-11.32L128 116.69l66.34-66.35a8 8 0 0 1 11.32 11.32L139.31 128Z"/></svg>';
|
|
9
|
+
const ROSTER_FACES = 3;
|
|
10
|
+
|
|
11
|
+
const plural = (n, one, many) => `${n} ${n === 1 ? one : many}`;
|
|
12
|
+
|
|
13
|
+
function face(person) {
|
|
14
|
+
const el = document.createElement("span");
|
|
15
|
+
el.className = "clay-avatar";
|
|
16
|
+
el.setAttribute("aria-hidden", "true");
|
|
17
|
+
const color = personColor(person.id);
|
|
18
|
+
el.style.setProperty("color", color);
|
|
19
|
+
el.style.setProperty("border-color", color);
|
|
20
|
+
el.style.setProperty("background", "var(--bevel-surface)");
|
|
21
|
+
el.textContent = initialsOf(person.name);
|
|
22
|
+
return el;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function attachPeople({ root, capsule, addItem, removeItem, closeMenu, note }) {
|
|
26
|
+
let snapshot = { supported: false, people: [], anonymous: 0 };
|
|
27
|
+
let panel = null;
|
|
28
|
+
let opener = null;
|
|
29
|
+
let roster = null;
|
|
30
|
+
let renaming = false;
|
|
31
|
+
|
|
32
|
+
const people = () => window.clay && window.clay.people;
|
|
33
|
+
const me = () => (window.clay && window.clay.me) || null;
|
|
34
|
+
const canRename = () => {
|
|
35
|
+
try {
|
|
36
|
+
return !!people()?.canRename?.();
|
|
37
|
+
} catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const total = () => snapshot.people.length + snapshot.anonymous;
|
|
42
|
+
const wantsRoster = () => document.documentElement.hasAttribute("clay-menu-roster");
|
|
43
|
+
|
|
44
|
+
function closePanel({ restore = true } = {}) {
|
|
45
|
+
if (!panel) return;
|
|
46
|
+
panel.remove();
|
|
47
|
+
panel = null;
|
|
48
|
+
renaming = false;
|
|
49
|
+
roster?.setAttribute("aria-expanded", "false");
|
|
50
|
+
if (restore && opener && opener.isConnected) opener.focus();
|
|
51
|
+
opener = null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function meSection() {
|
|
55
|
+
const mine = me();
|
|
56
|
+
if (!mine || !mine.name) return null;
|
|
57
|
+
const section = document.createElement("div");
|
|
58
|
+
section.className = "clay-people-me";
|
|
59
|
+
const label = document.createElement("span");
|
|
60
|
+
label.className = "clay-people-me-label";
|
|
61
|
+
label.textContent = "Your edits are signed as";
|
|
62
|
+
const row = document.createElement("div");
|
|
63
|
+
row.className = "clay-people-me-row";
|
|
64
|
+
section.append(label, row);
|
|
65
|
+
|
|
66
|
+
if (renaming) {
|
|
67
|
+
const input = document.createElement("input");
|
|
68
|
+
input.className = "clay-people-input";
|
|
69
|
+
input.type = "text";
|
|
70
|
+
input.value = mine.name;
|
|
71
|
+
input.setAttribute("aria-label", "Your name");
|
|
72
|
+
input.maxLength = 120;
|
|
73
|
+
const save = document.createElement("button");
|
|
74
|
+
save.type = "button";
|
|
75
|
+
save.className = "clay-menu-btn clay-menu-btn-small clay-menu-btn-primary";
|
|
76
|
+
save.textContent = "Save";
|
|
77
|
+
const commit = () => {
|
|
78
|
+
try {
|
|
79
|
+
people().rename(input.value);
|
|
80
|
+
} catch (err) {
|
|
81
|
+
note(err && err.code === "not-renamable" ? "This name comes from your account, so it can't be changed here." : "Use a name of 1 to 120 characters that isn't an email address.");
|
|
82
|
+
input.focus();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
renaming = false;
|
|
86
|
+
draw();
|
|
87
|
+
panel?.querySelector(".clay-people-me .clay-menu-btn")?.focus();
|
|
88
|
+
};
|
|
89
|
+
save.addEventListener("click", commit);
|
|
90
|
+
input.addEventListener("keydown", (event) => {
|
|
91
|
+
if (event.key === "Enter") {
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
commit();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
row.append(input, save);
|
|
97
|
+
queueMicrotask(() => {
|
|
98
|
+
if (!input.isConnected) return;
|
|
99
|
+
input.focus();
|
|
100
|
+
input.select();
|
|
101
|
+
});
|
|
102
|
+
} else {
|
|
103
|
+
const name = document.createElement("span");
|
|
104
|
+
name.className = "clay-people-me-name";
|
|
105
|
+
name.textContent = mine.name;
|
|
106
|
+
row.append(face(mine), name);
|
|
107
|
+
if (canRename()) {
|
|
108
|
+
const change = document.createElement("button");
|
|
109
|
+
change.type = "button";
|
|
110
|
+
change.className = "clay-menu-btn clay-menu-btn-small";
|
|
111
|
+
change.textContent = "Change";
|
|
112
|
+
change.addEventListener("click", () => {
|
|
113
|
+
renaming = true;
|
|
114
|
+
draw();
|
|
115
|
+
});
|
|
116
|
+
row.append(change);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return section;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function draw() {
|
|
123
|
+
if (!panel) return;
|
|
124
|
+
const count = total();
|
|
125
|
+
panel.textContent = "";
|
|
126
|
+
|
|
127
|
+
const head = document.createElement("div");
|
|
128
|
+
head.className = "clay-people-head";
|
|
129
|
+
const title = document.createElement("h3");
|
|
130
|
+
title.className = "clay-people-title";
|
|
131
|
+
title.textContent = "Who's here";
|
|
132
|
+
const sum = document.createElement("span");
|
|
133
|
+
sum.className = "clay-people-sum";
|
|
134
|
+
sum.textContent = plural(count, "person", "people");
|
|
135
|
+
const x = document.createElement("button");
|
|
136
|
+
x.type = "button";
|
|
137
|
+
x.className = "clay-people-close";
|
|
138
|
+
x.setAttribute("aria-label", "Close");
|
|
139
|
+
x.innerHTML = CROSS;
|
|
140
|
+
x.addEventListener("click", () => closePanel());
|
|
141
|
+
head.append(title, sum, x);
|
|
142
|
+
panel.append(head);
|
|
143
|
+
|
|
144
|
+
if (snapshot.people.length) {
|
|
145
|
+
const list = document.createElement("ul");
|
|
146
|
+
list.className = "clay-people-list";
|
|
147
|
+
for (const person of snapshot.people) {
|
|
148
|
+
const row = document.createElement("li");
|
|
149
|
+
row.className = "clay-people-row";
|
|
150
|
+
const who = document.createElement("span");
|
|
151
|
+
who.className = "clay-people-who";
|
|
152
|
+
const name = document.createElement("strong");
|
|
153
|
+
name.textContent = person.name;
|
|
154
|
+
if (person.you) {
|
|
155
|
+
const you = document.createElement("span");
|
|
156
|
+
you.textContent = "(you)";
|
|
157
|
+
name.append(you);
|
|
158
|
+
}
|
|
159
|
+
who.append(name);
|
|
160
|
+
row.append(face(person), who);
|
|
161
|
+
list.append(row);
|
|
162
|
+
}
|
|
163
|
+
panel.append(list);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (snapshot.anonymous > 0) {
|
|
167
|
+
const anon = document.createElement("p");
|
|
168
|
+
anon.className = "clay-people-anon";
|
|
169
|
+
anon.textContent =
|
|
170
|
+
snapshot.anonymous === 1
|
|
171
|
+
? "1 other person is here without a shared name."
|
|
172
|
+
: `${snapshot.anonymous} others are here without a shared name.`;
|
|
173
|
+
panel.append(anon);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const mine = meSection();
|
|
177
|
+
if (mine) panel.append(mine);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function openPanel(from) {
|
|
181
|
+
closeMenu();
|
|
182
|
+
if (panel) {
|
|
183
|
+
closePanel();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
opener = from;
|
|
187
|
+
panel = document.createElement("div");
|
|
188
|
+
panel.className = "clay-people";
|
|
189
|
+
panel.setAttribute("role", "dialog");
|
|
190
|
+
panel.setAttribute("aria-label", "Who's here");
|
|
191
|
+
panel.addEventListener("keydown", (event) => {
|
|
192
|
+
if (event.key !== "Escape") return;
|
|
193
|
+
event.preventDefault();
|
|
194
|
+
event.stopPropagation();
|
|
195
|
+
if (renaming) {
|
|
196
|
+
renaming = false;
|
|
197
|
+
draw();
|
|
198
|
+
panel.querySelector(".clay-people-me .clay-menu-btn")?.focus();
|
|
199
|
+
} else {
|
|
200
|
+
closePanel();
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
draw();
|
|
204
|
+
root.append(panel);
|
|
205
|
+
roster?.setAttribute("aria-expanded", from === roster ? "true" : "false");
|
|
206
|
+
panel.querySelector(".clay-people-close").focus();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function drawRoster() {
|
|
210
|
+
const show = wantsRoster() && snapshot.supported && total() > 1;
|
|
211
|
+
if (!show) {
|
|
212
|
+
roster?.remove();
|
|
213
|
+
roster = null;
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (!roster) {
|
|
217
|
+
roster = document.createElement("button");
|
|
218
|
+
roster.type = "button";
|
|
219
|
+
roster.className = "clay-roster";
|
|
220
|
+
roster.setAttribute("aria-haspopup", "dialog");
|
|
221
|
+
roster.setAttribute("aria-expanded", panel ? "true" : "false");
|
|
222
|
+
roster.addEventListener("click", () => openPanel(roster));
|
|
223
|
+
root.insertBefore(roster, capsule);
|
|
224
|
+
}
|
|
225
|
+
const shown = snapshot.people.slice(0, ROSTER_FACES);
|
|
226
|
+
const rest = total() - shown.length;
|
|
227
|
+
const faces = document.createElement("span");
|
|
228
|
+
faces.className = "clay-roster-faces";
|
|
229
|
+
for (const person of shown) faces.append(face(person));
|
|
230
|
+
roster.textContent = "";
|
|
231
|
+
roster.append(faces);
|
|
232
|
+
if (rest > 0) roster.append(plural(rest, "other", "others"));
|
|
233
|
+
const names = shown.map((person) => person.name);
|
|
234
|
+
roster.setAttribute("aria-label", `Who's here: ${names.join(", ")}${rest > 0 ? `${names.length ? " and " : ""}${plural(rest, "other", "others")}` : ""}`);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
let itemLabel = null;
|
|
238
|
+
|
|
239
|
+
function update() {
|
|
240
|
+
const count = total();
|
|
241
|
+
if (snapshot.supported && (count > 1 || canRename())) {
|
|
242
|
+
const label = count > 1 ? `Who's here (${plural(count, "person", "people")})` : "Who's here";
|
|
243
|
+
// Re-adding redraws the open menu, so only a changed label does it.
|
|
244
|
+
if (label !== itemLabel) {
|
|
245
|
+
itemLabel = label;
|
|
246
|
+
addItem({ id: "clay.people", label, run: () => openPanel(capsule.querySelector(".clay-menu-goo")) });
|
|
247
|
+
}
|
|
248
|
+
} else {
|
|
249
|
+
if (itemLabel !== null) removeItem("clay.people");
|
|
250
|
+
itemLabel = null;
|
|
251
|
+
closePanel({ restore: false });
|
|
252
|
+
}
|
|
253
|
+
drawRoster();
|
|
254
|
+
if (panel && !renaming) {
|
|
255
|
+
const active = root.getRootNode().activeElement;
|
|
256
|
+
const focused = active && panel.contains(active) ? active.classList[0] : null;
|
|
257
|
+
draw();
|
|
258
|
+
if (focused) panel.querySelector(`.${focused}`)?.focus();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
document.addEventListener("click", (event) => {
|
|
263
|
+
if (panel && !event.composedPath().includes(root)) closePanel({ restore: false });
|
|
264
|
+
});
|
|
265
|
+
document.addEventListener("clay:people", () => {
|
|
266
|
+
if (!renaming) update();
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
import("../../sync/presence-store.js")
|
|
270
|
+
.then(({ presence }) => {
|
|
271
|
+
presence.subscribe((next) => {
|
|
272
|
+
snapshot = next || snapshot;
|
|
273
|
+
update();
|
|
274
|
+
});
|
|
275
|
+
})
|
|
276
|
+
.catch(() => {});
|
|
277
|
+
|
|
278
|
+
return { close: closePanel };
|
|
279
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Where the dock sits: one of four corners, chosen by dragging the grip or with its
|
|
2
|
+
// arrow keys, and remembered for this document in this browser.
|
|
3
|
+
const CORNERS = new Set(["top-left", "top-right", "bottom-left", "bottom-right"]);
|
|
4
|
+
const DRAG_START = 4;
|
|
5
|
+
const KEY = "menu-corner";
|
|
6
|
+
|
|
7
|
+
export function nearestCorner(x, y, width, height) {
|
|
8
|
+
return `${y < height / 2 ? "top" : "bottom"}-${x < width / 2 ? "left" : "right"}`;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function cornerAfterKey(corner, key) {
|
|
12
|
+
let [v, h] = corner.split("-");
|
|
13
|
+
if (key === "ArrowUp") v = "top";
|
|
14
|
+
else if (key === "ArrowDown") v = "bottom";
|
|
15
|
+
else if (key === "ArrowLeft") h = "left";
|
|
16
|
+
else if (key === "ArrowRight") h = "right";
|
|
17
|
+
else return null;
|
|
18
|
+
return `${v}-${h}`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function savedCorner(storage) {
|
|
22
|
+
let value = null;
|
|
23
|
+
try {
|
|
24
|
+
value = storage ? storage.get(KEY) : null;
|
|
25
|
+
} catch {}
|
|
26
|
+
return CORNERS.has(value) ? value : "top-right";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function makeSpots(container) {
|
|
30
|
+
const spots = document.createElement("div");
|
|
31
|
+
spots.className = "clay-menu-spots";
|
|
32
|
+
spots.setAttribute("clay", "editor-ui");
|
|
33
|
+
spots.setAttribute("aria-hidden", "true");
|
|
34
|
+
for (const to of CORNERS) {
|
|
35
|
+
const spot = document.createElement("span");
|
|
36
|
+
spot.className = "clay-menu-spot";
|
|
37
|
+
spot.dataset.to = to;
|
|
38
|
+
spots.append(spot);
|
|
39
|
+
}
|
|
40
|
+
container.append(spots);
|
|
41
|
+
return spots;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function attachPlacement({ dock, container = document.body, grip, storage, onMove, onDragStart }) {
|
|
45
|
+
function setCorner(corner, { remember = true } = {}) {
|
|
46
|
+
dock.dataset.corner = corner;
|
|
47
|
+
if (remember) {
|
|
48
|
+
try {
|
|
49
|
+
if (storage) storage.set(KEY, corner);
|
|
50
|
+
} catch {}
|
|
51
|
+
}
|
|
52
|
+
if (onMove) onMove(corner);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
setCorner(savedCorner(storage), { remember: false });
|
|
56
|
+
|
|
57
|
+
grip.addEventListener("keydown", (event) => {
|
|
58
|
+
const next = cornerAfterKey(dock.dataset.corner, event.key);
|
|
59
|
+
if (!next) return;
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
if (next !== dock.dataset.corner) setCorner(next);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
let drag = null;
|
|
65
|
+
|
|
66
|
+
grip.addEventListener("pointerdown", (event) => {
|
|
67
|
+
if (event.button !== 0 || event.isPrimary === false) return;
|
|
68
|
+
const rect = dock.getBoundingClientRect();
|
|
69
|
+
drag = {
|
|
70
|
+
id: event.pointerId,
|
|
71
|
+
x: event.clientX,
|
|
72
|
+
y: event.clientY,
|
|
73
|
+
dx: event.clientX - rect.left,
|
|
74
|
+
dy: event.clientY - rect.top,
|
|
75
|
+
w: rect.width,
|
|
76
|
+
h: rect.height,
|
|
77
|
+
moving: false,
|
|
78
|
+
spots: null,
|
|
79
|
+
near: null,
|
|
80
|
+
};
|
|
81
|
+
if (grip.setPointerCapture) {
|
|
82
|
+
try {
|
|
83
|
+
grip.setPointerCapture(event.pointerId);
|
|
84
|
+
} catch {}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
grip.addEventListener("pointermove", (event) => {
|
|
89
|
+
if (!drag || event.pointerId !== drag.id) return;
|
|
90
|
+
if (!drag.moving) {
|
|
91
|
+
if (Math.hypot(event.clientX - drag.x, event.clientY - drag.y) < DRAG_START) return;
|
|
92
|
+
drag.moving = true;
|
|
93
|
+
dock.setAttribute("data-dragging", "");
|
|
94
|
+
drag.spots = makeSpots(container);
|
|
95
|
+
drag.spots.style.setProperty("color-scheme", getComputedStyle(dock).colorScheme);
|
|
96
|
+
if (onDragStart) onDragStart();
|
|
97
|
+
}
|
|
98
|
+
const left = event.clientX - drag.dx;
|
|
99
|
+
const top = event.clientY - drag.dy;
|
|
100
|
+
Object.assign(dock.style, { left: `${left}px`, top: `${top}px`, right: "auto", bottom: "auto" });
|
|
101
|
+
drag.near = nearestCorner(left + drag.w / 2, top + drag.h / 2, window.innerWidth, window.innerHeight);
|
|
102
|
+
for (const spot of drag.spots.children) spot.toggleAttribute("data-near", spot.dataset.to === drag.near);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const finish = (commit) => (event) => {
|
|
106
|
+
if (!drag || event.pointerId !== drag.id) return;
|
|
107
|
+
const { moving, near, spots } = drag;
|
|
108
|
+
drag = null;
|
|
109
|
+
if (!moving) return;
|
|
110
|
+
spots.remove();
|
|
111
|
+
dock.removeAttribute("data-dragging");
|
|
112
|
+
for (const side of ["left", "top", "right", "bottom"]) dock.style.removeProperty(side);
|
|
113
|
+
if (commit && near) setCorner(near);
|
|
114
|
+
else setCorner(dock.dataset.corner, { remember: false });
|
|
115
|
+
};
|
|
116
|
+
grip.addEventListener("pointerup", finish(true));
|
|
117
|
+
grip.addEventListener("pointercancel", finish(false));
|
|
118
|
+
grip.addEventListener("lostpointercapture", finish(false));
|
|
119
|
+
|
|
120
|
+
return { setCorner };
|
|
121
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const isMac = () =>
|
|
2
|
+
/mac|iphone|ipad|ipod/i.test((navigator.userAgentData && navigator.userAgentData.platform) || navigator.platform || navigator.userAgent || "");
|
|
3
|
+
|
|
4
|
+
const isWindows = () =>
|
|
5
|
+
/Win/.test((navigator.userAgentData && navigator.userAgentData.platform) || navigator.platform || navigator.userAgent || "");
|
|
6
|
+
|
|
7
|
+
export const revealLabel = () => (isMac() ? "Show in Finder" : isWindows() ? "Show in Explorer" : "Show in folder");
|
|
8
|
+
|
|
9
|
+
export const keys = (mac, other) => (isMac() ? mac : other);
|