@panphora/clayjs 1.17.0 → 1.18.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/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 +72474 -62090
- package/dist/m/attrs/{save-freeze-MYNVXREN.js → save-freeze-LWGF6XUN.js} +1 -1
- package/dist/m/c-2GRUM77Q.js +30 -0
- package/dist/m/c-2KIEGNC4.js +1 -0
- package/dist/m/{c-AMSNPOCX.js → c-2KL3BD52.js} +1 -1
- 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-KAU6E43D.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-3XIRD4NU.js → c-5T6NZHNM.js} +1 -1
- package/dist/m/{c-74MGYWZF.js → c-5ZQV7KC4.js} +1 -1
- package/dist/m/{c-7OLLJPWP.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-Y5HBBIQ4.js → c-AMYEFA2E.js} +1 -1
- package/dist/m/c-AQYCG7QW.js +1 -0
- package/dist/m/c-ATKAOH23.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-VHM5XQHK.js → c-BIJALSRD.js} +1 -1
- package/dist/m/c-BJ7YQ5QZ.js +1 -0
- package/dist/m/{c-KIPQJX4B.js → c-BRLCTNMC.js} +1 -1
- package/dist/m/{c-VE6ZMYMC.js → c-BUAYFEV5.js} +1 -1
- package/dist/m/c-C6IPRG34.js +1 -0
- package/dist/m/{c-KU3ZFADW.js → c-CAS3NND4.js} +1 -1
- package/dist/m/{c-PS5ARVWR.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-QJ4OM3G6.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-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-TJ6WOJL3.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-WDC5GVKU.js → c-IVTRVENZ.js} +1 -1
- package/dist/m/c-JKZJIUIP.js +1 -0
- package/dist/m/{c-UDUUJPFZ.js → c-JNLX3RJB.js} +1 -1
- package/dist/m/c-K3ADYNLU.js +1 -0
- package/dist/m/c-KGHVFRR3.js +1 -0
- package/dist/m/{c-5QWQ7A5L.js → c-KJJPV77R.js} +1 -1
- package/dist/m/{c-CZUSOB7V.js → c-KNPDOMDY.js} +1 -1
- package/dist/m/{c-EZU56NQV.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-3RUU4TPX.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-5RJFTLSF.js → c-NEL7HQW3.js} +1 -1
- package/dist/m/{c-DCXOXBF3.js → c-NQJRVJ56.js} +1 -1
- 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-R3L7ZJGB.js → c-OPLUZR3A.js} +1 -1
- package/dist/m/{c-GSFIGKOP.js → c-OTMKN2OO.js} +1 -1
- package/dist/m/{c-6NC5I2TV.js → c-OYRZ7XG2.js} +1 -1
- package/dist/m/{c-EVCQ3BKA.js → c-P3OFYUMA.js} +1 -1
- 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-FRLHSY7E.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-JU3NK25H.js → c-R27DWQKX.js} +1 -1
- package/dist/m/{c-RSMOODDU.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-Q622NS2Y.js → c-S2U6NJU4.js} +1 -1
- package/dist/m/c-SPZPGD3R.js +1 -0
- package/dist/m/c-SW4YEG2D.js +8 -0
- package/dist/m/c-T637T7SN.js +1 -0
- package/dist/m/c-TJAXGIRV.js +1 -0
- package/dist/m/{c-RYUXUUBX.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-QICP2YR5.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-VILENZTD.js +1 -0
- package/dist/m/{c-HDDEEL77.js → c-VJYEVRYK.js} +1 -1
- package/dist/m/{c-SMBZG5X4.js → c-VR2BJ4AN.js} +1 -1
- 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-I2ZATQCD.js → c-X5TSXZYJ.js} +2 -2
- 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/core/{admin-attrs-QHOKPJ7W.js → admin-attrs-YY7T5FGU.js} +1 -1
- 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-FNXVEFNE.js → host-permission-6EVJGNPL.js} +1 -1
- package/dist/m/core/is-edit-mode-GCX6767E.js +1 -0
- package/dist/m/core/{persist-JFYRHMRJ.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/internals/{index-PVXGPUDA.js → index-TGLQINN3.js} +1 -1
- package/dist/m/loader-3BBNZZGM.js +1 -0
- package/dist/m/manifest-26C55578.js +1 -0
- package/dist/m/manifest-edit-4396A009.js +1 -0
- package/dist/m/manifest.json +2111 -1573
- package/dist/m/page/{editor-NNJA4OKD.js → editor-6LRB3GE4.js} +123 -21
- 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-RM5IR6AO.js → demo-OYO5GCAO.js} +1 -1
- 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-SGPJKANK.js → people-JCHVPF7P.js} +1 -1
- package/dist/m/plugins/quickcrop-BQ5YYFCH.js +26 -0
- package/dist/m/plugins/{richclay-NRQDSWX6.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-WLYKK6TL.js → upload-NHGJXZK2.js} +1 -1
- 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-4N6GYAF6.js → wire-VBWXEXU2.js} +1 -1
- 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 +1367 -930
- package/dist/page/themes/light-1.css +8 -7
- package/dist/server/core.cjs +1440 -288
- 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/conflict-notice-ui.js +4 -7
- package/src/core/download.js +2 -2
- package/src/core/host-meta.js +38 -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 +106 -31
- 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 +170 -39
- 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/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 +89 -27
- package/src/page/boot-pack.js +1 -1
- package/src/page/chart-tables.js +21 -3
- package/src/page/chart.js +406 -63
- package/src/page/checklist.js +10 -135
- package/src/page/checkpoint-proof.js +7 -1
- package/src/page/chrome.js +250 -51
- package/src/page/clipboard-shape.js +126 -0
- package/src/page/drag.js +33 -3
- package/src/page/editor.js +136 -25
- 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/checklist.js +428 -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/registry.js +18 -0
- package/src/page/features/table.js +373 -83
- 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 +25 -1
- package/src/page/format-gate.js +68 -18
- package/src/page/format-host.js +17 -0
- package/src/page/format-native-commands.js +21 -5
- package/src/page/image-actions.js +64 -0
- package/src/page/import-markdown.js +262 -0
- package/src/page/items.js +135 -17
- package/src/page/markdown.js +6 -2
- package/src/page/media.js +35 -119
- package/src/page/placeholder.js +14 -1
- package/src/page/projection.js +98 -10
- 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 +28 -0
- package/src/page/save-states.js +13 -3
- package/src/page/schema.js +19 -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/light-1.css +8 -7
- 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 +38 -12
- package/src/page/view.js +13 -0
- package/src/page/ybind/binding.js +88 -5
- 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 +1 -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 +113 -17
- package/src/page/ybind/recovery-proof.js +32 -9
- package/src/page/ybind/recovery-replay.js +558 -15
- 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 +89 -14
- 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 +249 -44
- 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 +5 -3
- 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/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 +11 -6
- 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/c-2SPVQSHC.js +0 -1
- package/dist/m/c-336SGU5W.js +0 -1
- package/dist/m/c-3H6BZDNJ.js +0 -6
- package/dist/m/c-4DFEJ2PO.js +0 -3
- package/dist/m/c-56QRZTZH.js +0 -1
- package/dist/m/c-5J4E7O4Y.js +0 -4
- package/dist/m/c-5LKDWQTL.js +0 -19
- package/dist/m/c-5V3MOVJT.js +0 -1
- package/dist/m/c-6AZOGAPE.js +0 -1
- package/dist/m/c-6CRUUXOX.js +0 -5
- package/dist/m/c-6HMB24EV.js +0 -1
- package/dist/m/c-6KEVEQ7L.js +0 -1
- package/dist/m/c-A3E3NIMC.js +0 -1
- package/dist/m/c-BQ6LOBEE.js +0 -1
- package/dist/m/c-BTDI4Y23.js +0 -1
- package/dist/m/c-CJ3A7ZKE.js +0 -1
- package/dist/m/c-CQHPGKX2.js +0 -1
- package/dist/m/c-DFS4XZJV.js +0 -2
- package/dist/m/c-DNENWY4O.js +0 -1
- package/dist/m/c-E4LIR5X5.js +0 -1
- package/dist/m/c-FDNHHZY5.js +0 -1
- package/dist/m/c-FROJUZMV.js +0 -1
- package/dist/m/c-G2JPKCTP.js +0 -1
- package/dist/m/c-GB6TU7WV.js +0 -1
- package/dist/m/c-GFJJEBTU.js +0 -1
- package/dist/m/c-GJAEGGXY.js +0 -1
- package/dist/m/c-GOWBDM6J.js +0 -1
- package/dist/m/c-HFKUVACH.js +0 -1
- package/dist/m/c-HHDFCNHV.js +0 -1
- package/dist/m/c-IEM4NTCS.js +0 -1
- package/dist/m/c-JDCX26UP.js +0 -25
- package/dist/m/c-KGVGROZT.js +0 -1
- package/dist/m/c-KQ6TYJAP.js +0 -135
- package/dist/m/c-LFPHCXY3.js +0 -1
- package/dist/m/c-LRPUO2MX.js +0 -1
- package/dist/m/c-LWLBHLVC.js +0 -3
- package/dist/m/c-M2L47S2X.js +0 -7
- package/dist/m/c-MFP2ZWD4.js +0 -1
- package/dist/m/c-MKSQ4Y57.js +0 -1
- package/dist/m/c-NUFFJVVJ.js +0 -1
- package/dist/m/c-NUHSPT5P.js +0 -1
- package/dist/m/c-O72HVYSA.js +0 -1
- package/dist/m/c-OIBUTDXI.js +0 -1
- package/dist/m/c-OW5QIGG3.js +0 -1
- package/dist/m/c-PGRCK73F.js +0 -1
- package/dist/m/c-Q7NQD65V.js +0 -1
- package/dist/m/c-QH63LQOS.js +0 -1
- package/dist/m/c-R7IWVINQ.js +0 -1
- package/dist/m/c-RM7J7BV2.js +0 -1
- package/dist/m/c-S4ZEH46B.js +0 -9
- package/dist/m/c-SDAXDM2D.js +0 -1
- package/dist/m/c-SMGU7RT3.js +0 -235
- package/dist/m/c-SPIORRYS.js +0 -1
- package/dist/m/c-SWLRT66R.js +0 -1
- package/dist/m/c-TCJTVAFN.js +0 -1
- package/dist/m/c-TQEMVJCS.js +0 -1
- package/dist/m/c-TYLXX4NF.js +0 -21
- package/dist/m/c-U62OB4BT.js +0 -1
- package/dist/m/c-U6YWUAR3.js +0 -8
- package/dist/m/c-UDCSU5G5.js +0 -2
- package/dist/m/c-VI5RMSVY.js +0 -1
- package/dist/m/c-VRZN56XY.js +0 -1
- package/dist/m/c-W5MCHEGA.js +0 -1
- package/dist/m/c-WNYBLIOZ.js +0 -1
- package/dist/m/c-WWXIDH4O.js +0 -28
- package/dist/m/c-XCNTK76U.js +0 -1
- package/dist/m/c-XMS6DPBR.js +0 -1
- package/dist/m/c-ZUCOKOHT.js +0 -1
- package/dist/m/c-ZVPVXTJF.js +0 -4
- package/dist/m/c-ZVRKXKM7.js +0 -1
- package/dist/m/core/autosave-HRYGUWV6.js +0 -1
- package/dist/m/core/conflict-notice-6MROJN2L.js +0 -1
- package/dist/m/core/is-edit-mode-KTWA3O5N.js +0 -1
- package/dist/m/core/recovery-FLTCC2OC.js +0 -1
- package/dist/m/core/save-HQZ4S667.js +0 -1
- package/dist/m/core/save-core-KGQWFUNH.js +0 -1
- package/dist/m/core/snapshot-EGQZNT45.js +0 -1
- package/dist/m/core/unsaved-warning-IDJLD66H.js +0 -1
- package/dist/m/loader-S4I7GKXR.js +0 -1
- package/dist/m/manifest-4C419D67.js +0 -1
- package/dist/m/manifest-edit-B077F288.js +0 -1
- package/dist/m/plugins/ai-edit-QN4PMMNL.js +0 -6
- package/dist/m/plugins/indicator-URDBBOQO.js +0 -1
- package/dist/m/plugins/live-HFWD4OIH.js +0 -1
- package/dist/m/plugins/menu-3HIEQSI6.js +0 -138
- package/dist/m/plugins/page-JOKB6XPR.js +0 -2
- package/dist/m/plugins/page-view-NXOJHNW6.js +0 -1
- package/dist/m/plugins/quickcrop-QNY3PKLD.js +0 -26
- package/dist/m/plugins/sortable-GWT4PWDV.js +0 -1
- package/dist/m/plugins/source-4ZRSAIYM.js +0 -1
- package/dist/m/plugins/undo-VDA5P7FH.js +0 -1
- package/dist/m/plugins/upgrade-W7FG5VFG.js +0 -1
- package/dist/m/plugins/visitor-drafts-LIDY7NH6.js +0 -21
- package/dist/m/plugins/visitor-drafts-owner-ZXCKBZE7.js +0 -1
- package/dist/m/reader-core-DXYCURFF.js +0 -68
- package/dist/m/route/route-KOCZSEGN.js +0 -1
- package/dist/m/sync/live-sync-J7VMYTKS.js +0 -1
- package/dist/m/ui/index-3JLVI27O.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-NRQDSWX6.js.LEGAL.txt → richclay-KLGETK77.js.LEGAL.txt} +0 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// The menu's look: Bevel tokens scoped to the menu family, solid surfaces, one soft
|
|
2
|
+
// shadow, light or dark by the scheme ui/page-colour.js reads from the page behind it.
|
|
3
|
+
// The surface and muted ink below, per scheme, for ui/page-colour.js's tint.
|
|
4
|
+
export const MENU_SURFACE = { light: [0xFF, 0xFC, 0xF6], dark: [0x1A, 0x1D, 0x2C], mutedLight: [0x6B, 0x59, 0x42], mutedDark: [0xA3, 0xA9, 0xC2] };
|
|
5
|
+
|
|
6
|
+
export default `.clay-menu-dock, .clay-menu-spots, .clay-seo {
|
|
7
|
+
--bevel-font-sans: system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
8
|
+
--bevel-font-serif: Newsreader, Georgia, "Times New Roman", serif;
|
|
9
|
+
--bevel-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
10
|
+
--bevel-ground: light-dark(#FDF8F0, #0B0C13);
|
|
11
|
+
--bevel-surface: light-dark(#FFFCF6, #1A1D2C);
|
|
12
|
+
--bevel-sunk: light-dark(#F4ECDF, #22263A);
|
|
13
|
+
--bevel-ink: light-dark(#2B241B, #ECEAF2);
|
|
14
|
+
--bevel-ink-2: light-dark(#4A4033, #C9CDE0);
|
|
15
|
+
--bevel-muted: light-dark(#6B5942, #A3A9C2);
|
|
16
|
+
--bevel-faint: light-dark(#9A8A70, #6A7090);
|
|
17
|
+
--bevel-line: light-dark(#E8DCC6, #2C3149);
|
|
18
|
+
--bevel-line-2: light-dark(#D8C8AF, #3A4058);
|
|
19
|
+
--bevel-line-3: light-dark(#C4B192, #4A536F);
|
|
20
|
+
--bevel-brass: light-dark(#8F6310, #D9A445);
|
|
21
|
+
--bevel-brass-soft: light-dark(#F0E4CC, #3A2F17);
|
|
22
|
+
--bevel-ox: light-dark(#A83A2C, #FF6B79);
|
|
23
|
+
--bevel-ox-soft: light-dark(#F6DED6, #3A2226);
|
|
24
|
+
--bevel-teal: light-dark(#256056, #4E9C8C);
|
|
25
|
+
--bevel-teal-soft: light-dark(#DCEBE7, #17332E);
|
|
26
|
+
--bevel-face: light-dark(#F1E7D4, #2A2F48);
|
|
27
|
+
--bevel-edge-hi: light-dark(#FFF9ED, #454C6C);
|
|
28
|
+
--bevel-edge-lo: light-dark(#D6C3A5, #171B2C);
|
|
29
|
+
--bevel-face-in: light-dark(#E3D0B3, #20253B);
|
|
30
|
+
--bevel-edge-in: light-dark(#B89F7B, #12152A);
|
|
31
|
+
--bevel-edge-in-hi: light-dark(#F0E1C9, #4D587A);
|
|
32
|
+
--bevel-knob: light-dark(#FCF8F1, #5A6286);
|
|
33
|
+
--bevel-knob-hi: light-dark(#FFF9ED, #7A83A8);
|
|
34
|
+
--clay-shadow: 0 1px 2px light-dark(rgb(43 36 27 / .07), rgb(0 0 0 / .35)), 0 10px 28px -10px light-dark(rgb(43 36 27 / .32), rgb(0 0 0 / .7));
|
|
35
|
+
--clay-sheet-shadow: 0 16px 30px -22px light-dark(rgb(43 36 27 / .45), rgb(0 0 0 / .85));
|
|
36
|
+
color-scheme: inherit;
|
|
37
|
+
font-family: var(--bevel-font-sans);
|
|
38
|
+
color: var(--bevel-ink);
|
|
39
|
+
-webkit-text-size-adjust: 100%;
|
|
40
|
+
text-size-adjust: 100%;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* The dock: the roster (when a page opts in) and the capsule, fixed in one corner. */
|
|
44
|
+
.clay-menu-dock { position: fixed; z-index: 2147482000; top: max(12px, env(safe-area-inset-top)); right: max(12px, env(safe-area-inset-right)); display: flex; align-items: center; gap: 6px; font-size: 13px; line-height: 1.4; }
|
|
45
|
+
.clay-menu-dock[data-corner$="left"] { right: auto; left: max(12px, env(safe-area-inset-left)); flex-direction: row-reverse; }
|
|
46
|
+
.clay-menu-dock[data-corner^="bottom"] { top: auto; bottom: max(12px, env(safe-area-inset-bottom)); }
|
|
47
|
+
.clay-menu-dock[hidden], .clay-menu-spots[hidden], .clay-menu-dock [hidden], .clay-seo [hidden] { display: none !important; }
|
|
48
|
+
|
|
49
|
+
.clay-menu { box-sizing: border-box; display: inline-flex; align-items: center; gap: 2px; height: 34px; padding: 0 4px 0 2px; border: 1px solid var(--bevel-line-3); background: var(--bevel-surface); box-shadow: var(--clay-shadow); user-select: none; -webkit-user-select: none; }
|
|
50
|
+
.clay-menu-dock[data-dragging] .clay-menu { border-color: var(--bevel-brass); cursor: grabbing; }
|
|
51
|
+
|
|
52
|
+
.clay-menu-grip { position: relative; display: inline-grid; place-items: center; width: 18px; height: 28px; margin: 0; padding: 0; border: 0; background: none; color: var(--bevel-faint); cursor: grab; touch-action: none; }
|
|
53
|
+
.clay-menu-grip::before { content: ""; position: absolute; inset: -8px -2px -8px -10px; }
|
|
54
|
+
.clay-menu-grip:hover { color: var(--bevel-ink-2); }
|
|
55
|
+
.clay-menu-grip svg { display: block; width: 6px; height: 12px; fill: currentColor; }
|
|
56
|
+
|
|
57
|
+
.clay-menu-edit { position: relative; display: inline-flex; align-items: center; gap: 8px; height: 28px; margin: 0; padding: 0 8px 0 5px; border: 0; background: none; font: 500 13px/1 var(--bevel-font-sans); color: var(--bevel-ink); cursor: pointer; }
|
|
58
|
+
.clay-menu-edit::before { content: ""; position: absolute; inset: -8px 0; }
|
|
59
|
+
.clay-menu-track { position: relative; display: block; box-sizing: border-box; width: 36px; height: 20px; border: 1px solid var(--bevel-line-2); background: var(--bevel-sunk); transition: background-color .14s, border-color .14s; }
|
|
60
|
+
.clay-menu-thumb { position: absolute; top: 2px; left: 2px; box-sizing: border-box; width: 14px; height: 14px; border: 2px solid; border-color: var(--bevel-knob-hi) var(--bevel-edge-lo) var(--bevel-edge-lo) var(--bevel-knob-hi); background: var(--bevel-knob); transition: translate .15s cubic-bezier(.4, 0, .2, 1); }
|
|
61
|
+
.clay-menu-edit:hover .clay-menu-track { border-color: var(--bevel-faint); }
|
|
62
|
+
.clay-menu-edit[aria-checked="true"] .clay-menu-track { background: #256056; border-color: light-dark(#256056, #3C7E72); }
|
|
63
|
+
.clay-menu-edit[aria-checked="true"] .clay-menu-thumb { translate: 16px 0; background: light-dark(var(--bevel-knob), #8EDCC5); border-color: light-dark(var(--bevel-knob-hi), #C2F0E2) light-dark(var(--bevel-edge-lo), #4F9C86) light-dark(var(--bevel-edge-lo), #4F9C86) light-dark(var(--bevel-knob-hi), #C2F0E2); }
|
|
64
|
+
.clay-menu-edit[aria-busy="true"] { cursor: progress; color: var(--bevel-muted); }
|
|
65
|
+
.clay-menu-edit[aria-busy="true"] .clay-menu-track { background: var(--bevel-line); border-color: var(--bevel-line-2); }
|
|
66
|
+
.clay-menu-edit[aria-busy="true"] .clay-menu-thumb { translate: 8px 0; opacity: .7; }
|
|
67
|
+
.clay-menu-label { white-space: nowrap; }
|
|
68
|
+
|
|
69
|
+
.clay-menu-divider { width: 1px; height: 18px; margin: 0 2px; background: var(--bevel-line-2); }
|
|
70
|
+
|
|
71
|
+
.clay-menu-goo { position: relative; display: inline-grid; place-items: center; box-sizing: border-box; width: 28px; height: 28px; min-height: 0; border-radius: 0; margin: 0; padding: 0; border: 2px solid transparent; background: none; color: var(--bevel-ink); cursor: pointer; }
|
|
72
|
+
.clay-menu-goo::before { content: ""; position: absolute; inset: -8px -8px -8px -4px; }
|
|
73
|
+
.clay-menu-goo svg { display: block; width: 18px; height: auto; fill: currentColor; }
|
|
74
|
+
.clay-menu-goo:hover svg { translate: 0 -1px; }
|
|
75
|
+
.clay-menu-goo:active, .clay-menu-goo[aria-expanded="true"] { background: var(--bevel-face-in); border-color: var(--bevel-edge-in) var(--bevel-edge-in-hi) var(--bevel-edge-in-hi) var(--bevel-edge-in); }
|
|
76
|
+
.clay-menu-goo:active svg, .clay-menu-goo[aria-expanded="true"] svg { translate: 1px 1px; }
|
|
77
|
+
.clay-menu-dot { position: absolute; top: -1px; right: -2px; width: 8px; height: 8px; border-radius: 50%; background: var(--bevel-brass); box-shadow: 0 0 0 2px var(--bevel-surface); }
|
|
78
|
+
|
|
79
|
+
.clay-menu :focus-visible, .clay-roster:focus-visible { outline: 2px solid var(--bevel-brass); outline-offset: 2px; }
|
|
80
|
+
.clay-menu-edit:focus-visible { outline: none; }
|
|
81
|
+
.clay-menu-edit:focus-visible .clay-menu-track { outline: 2px solid var(--bevel-brass); outline-offset: 2px; }
|
|
82
|
+
|
|
83
|
+
/* The roster, beside the capsule, only on a page that opts in. Flat, like the capsule. */
|
|
84
|
+
.clay-roster { box-sizing: border-box; display: inline-flex; align-items: center; gap: 8px; height: 34px; margin: 0; padding: 0 10px 0 5px; border: 1px solid var(--bevel-line-3); background: var(--bevel-surface); box-shadow: var(--clay-shadow); font: 400 12px/1 var(--bevel-font-mono); color: var(--bevel-muted); cursor: pointer; }
|
|
85
|
+
.clay-roster:hover, .clay-roster[aria-expanded="true"] { background: var(--bevel-sunk); }
|
|
86
|
+
.clay-roster-faces { display: inline-flex; }
|
|
87
|
+
.clay-variants { box-sizing: border-box; display: inline-flex; align-items: center; gap: 2px; height: 34px; margin: 0; padding: 0 4px; border: 1px solid var(--bevel-line-3); background: var(--bevel-surface); box-shadow: var(--clay-shadow); font: 400 12px/1 var(--bevel-font-mono); color: var(--bevel-muted); user-select: none; -webkit-user-select: none; }
|
|
88
|
+
.clay-variants-step { display: inline-grid; place-items: center; width: 22px; height: 28px; margin: 0; padding: 0; border: 0; background: none; color: var(--bevel-faint); cursor: pointer; }
|
|
89
|
+
.clay-variants-step:hover { color: var(--bevel-ink-2); }
|
|
90
|
+
.clay-variants-step svg { display: block; width: 6px; height: 10px; fill: currentColor; }
|
|
91
|
+
.clay-variants-step:focus-visible { outline: 2px solid var(--bevel-brass); outline-offset: 2px; }
|
|
92
|
+
.clay-variants-name { min-width: 72px; text-align: center; color: var(--bevel-ink-2); white-space: nowrap; }
|
|
93
|
+
.clay-variants-name small { color: var(--bevel-faint); font-size: 11px; }
|
|
94
|
+
.clay-variants .clay-menu-btn { margin-left: 4px; }
|
|
95
|
+
.clay-roster-faces .clay-avatar + .clay-avatar { margin-left: -2px; box-shadow: -2px 0 0 var(--bevel-surface); }
|
|
96
|
+
.clay-avatar { display: inline-grid; place-items: center; flex: none; width: 22px; height: 22px; font: 500 10px/1 var(--bevel-font-mono); letter-spacing: .02em; border: 1px solid var(--bevel-ink); background: var(--bevel-ink); color: var(--bevel-ground); }
|
|
97
|
+
.clay-avatar[data-tone="brass"] { background: var(--bevel-brass-soft); color: var(--bevel-brass); border-color: color-mix(in srgb, var(--bevel-brass) 35%, var(--bevel-brass-soft)); }
|
|
98
|
+
.clay-avatar[data-tone="teal"] { background: var(--bevel-teal-soft); color: var(--bevel-teal); border-color: color-mix(in srgb, var(--bevel-teal) 35%, var(--bevel-teal-soft)); }
|
|
99
|
+
|
|
100
|
+
/* Popovers: the menu, the people panel, the status note. Below the dock, above it in a bottom corner. */
|
|
101
|
+
.clay-menu-list, .clay-people, .clay-menu-note { position: absolute; z-index: 1; top: calc(100% + 8px); right: 0; box-sizing: border-box; margin: 0; border: 1px solid var(--bevel-line-2); background: var(--bevel-surface); box-shadow: var(--clay-shadow); color: var(--bevel-ink); text-align: left; }
|
|
102
|
+
.clay-menu-dock[data-corner$="left"] :is(.clay-menu-list, .clay-people, .clay-menu-note) { right: auto; left: 0; }
|
|
103
|
+
.clay-menu-dock[data-corner^="bottom"] :is(.clay-menu-list, .clay-people, .clay-menu-note) { top: auto; bottom: calc(100% + 8px); }
|
|
104
|
+
|
|
105
|
+
.clay-menu-list { width: max-content; min-width: 284px; max-width: calc(100vw - 24px); max-height: calc(100dvh - 72px); overflow-y: auto; overscroll-behavior: contain; padding: 6px; }
|
|
106
|
+
.clay-menu-list [role="menuitem"] { box-sizing: border-box; display: flex; align-items: center; justify-content: space-between; gap: 12px; width: 100%; min-height: 32px; margin: 0; padding: 5px 9px; border: 0; background: none; font: 400 13px/1.35 var(--bevel-font-sans); color: var(--bevel-ink); text-align: left; text-decoration: none; cursor: pointer; }
|
|
107
|
+
.clay-menu-list [role="menuitem"]:hover:not([aria-disabled="true"]), .clay-menu-list [role="menuitem"]:focus-visible { outline: none; background: var(--bevel-sunk); }
|
|
108
|
+
.clay-menu-list [role="menuitem"][aria-disabled="true"] { color: var(--bevel-faint); cursor: default; }
|
|
109
|
+
.clay-menu-list [role="menuitem"][aria-disabled="true"] kbd { opacity: .6; }
|
|
110
|
+
.clay-menu-pair { display: flex; gap: 12px; padding: 3px 9px; }
|
|
111
|
+
.clay-menu-list .clay-menu-pair [role="menuitem"] { flex: none; width: auto; min-height: 30px; justify-content: flex-start; gap: 9px; padding: 4px 6px 4px 9px; border: 1px solid var(--bevel-line); }
|
|
112
|
+
.clay-menu-list kbd { flex: none; font: 500 11px/1 var(--bevel-font-mono); padding: 3px 5px; border: 1px solid var(--bevel-line-2); background: var(--bevel-sunk); color: var(--bevel-muted); white-space: nowrap; }
|
|
113
|
+
.clay-menu-sep { height: 1px; margin: 4px 2px; background: var(--bevel-line); }
|
|
114
|
+
.clay-menu-upgrade { display: inline-flex; align-items: center; gap: 8px; }
|
|
115
|
+
.clay-menu-upgrade::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--bevel-brass); }
|
|
116
|
+
.clay-menu-version { margin: 0; padding: 6px 9px 4px; font: 400 11.5px/1.4 var(--bevel-font-mono); color: var(--bevel-muted); }
|
|
117
|
+
|
|
118
|
+
.clay-menu-note { z-index: 2; width: max-content; max-width: 264px; padding: 8px 12px; font-size: 13px; line-height: 1.45; }
|
|
119
|
+
|
|
120
|
+
/* The people panel: no lines between people, one line between sections. */
|
|
121
|
+
.clay-people { width: 300px; max-width: calc(100vw - 24px); padding: 0; }
|
|
122
|
+
.clay-people-head { display: flex; align-items: center; gap: 10px; padding: 10px 8px 10px 14px; border-bottom: 1px solid var(--bevel-line); }
|
|
123
|
+
.clay-people-title { flex: 1; margin: 0; font: 500 16px/1.2 var(--bevel-font-serif); }
|
|
124
|
+
.clay-people-sum { font: 400 11px/1 var(--bevel-font-mono); color: var(--bevel-muted); white-space: nowrap; }
|
|
125
|
+
.clay-people-close { display: inline-grid; place-items: center; width: 26px; height: 26px; margin: 0; padding: 0; border: 0; background: none; color: var(--bevel-muted); cursor: pointer; }
|
|
126
|
+
.clay-people-close:hover { color: var(--bevel-ink); background: var(--bevel-sunk); }
|
|
127
|
+
.clay-people-close svg { width: 12px; height: 12px; fill: currentColor; }
|
|
128
|
+
.clay-people-list { list-style: none; margin: 0; padding: 8px 14px; }
|
|
129
|
+
.clay-people-row { display: flex; align-items: center; gap: 10px; padding: 6px 0; }
|
|
130
|
+
.clay-people-row .clay-avatar { width: 28px; height: 28px; font-size: 11px; }
|
|
131
|
+
.clay-people-who { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
|
|
132
|
+
.clay-people-who strong { font-size: 13px; font-weight: 500; line-height: 1.25; }
|
|
133
|
+
.clay-people-who strong span { font: 400 11px/1 var(--bevel-font-mono); color: var(--bevel-muted); margin-left: 4px; }
|
|
134
|
+
.clay-people-who > span { display: flex; align-items: center; gap: 6px; font-size: 12px; line-height: 1.3; color: var(--bevel-muted); }
|
|
135
|
+
.clay-people-live { width: 6px; height: 6px; border-radius: 50%; background: var(--bevel-teal); }
|
|
136
|
+
.clay-people-anon { margin: 0; padding: 10px 14px; border-top: 1px solid var(--bevel-line); font-size: 12px; line-height: 1.4; color: var(--bevel-muted); }
|
|
137
|
+
.clay-people-me { padding: 10px 14px 12px; border-top: 1px solid var(--bevel-line); }
|
|
138
|
+
.clay-people-me-label { display: block; margin-bottom: 6px; font-size: 12px; color: var(--bevel-muted); }
|
|
139
|
+
.clay-people-me-row { display: flex; align-items: center; gap: 8px; min-height: 30px; }
|
|
140
|
+
.clay-people-me-name { flex: 1; min-width: 0; font-size: 13px; font-weight: 500; }
|
|
141
|
+
.clay-people-input { flex: 1; min-width: 0; box-sizing: border-box; height: 30px; padding: 0 8px; border: 1px solid var(--bevel-line-2); background: var(--bevel-ground); color: var(--bevel-ink); font: 400 13px/1.4 var(--bevel-font-sans); }
|
|
142
|
+
.clay-people-input:focus-visible { outline: 2px solid var(--bevel-brass); outline-offset: 1px; border-color: var(--bevel-brass); }
|
|
143
|
+
|
|
144
|
+
/* Bevel buttons, at the sizes this UI uses. */
|
|
145
|
+
.clay-menu-btn { display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; height: 30px; margin: 0; padding: 0 12px; border: 2px solid; border-color: var(--bevel-edge-hi) var(--bevel-edge-lo) var(--bevel-edge-lo) var(--bevel-edge-hi); background: var(--bevel-face); color: var(--bevel-ink); font: 500 13px/1 var(--bevel-font-sans); white-space: nowrap; cursor: pointer; }
|
|
146
|
+
.clay-menu-btn:hover { background: color-mix(in srgb, var(--bevel-face), var(--bevel-edge-hi) 45%); }
|
|
147
|
+
.clay-menu-btn:active { border-color: var(--bevel-edge-lo) var(--bevel-edge-hi) var(--bevel-edge-hi) var(--bevel-edge-lo); }
|
|
148
|
+
.clay-menu-btn:focus-visible { outline: 2px solid var(--bevel-brass); outline-offset: 2px; }
|
|
149
|
+
.clay-menu-btn-small { height: 26px; padding: 0 9px; font-size: 12px; }
|
|
150
|
+
.clay-menu-btn-primary { --bevel-face: var(--bevel-ink); --bevel-edge-hi: color-mix(in srgb, var(--bevel-ink), light-dark(#FFFCF6, #FFFFFF) 22%); --bevel-edge-lo: color-mix(in srgb, var(--bevel-ink), light-dark(#0B0C13, #6A7090) 34%); color: var(--bevel-ground); }
|
|
151
|
+
.clay-menu-btn-primary:hover { background: color-mix(in srgb, var(--bevel-ink), var(--bevel-ground) 12%); }
|
|
152
|
+
|
|
153
|
+
/* Drop spots while dragging. */
|
|
154
|
+
.clay-menu-spots { position: fixed; inset: 0; z-index: 2147481999; pointer-events: none; }
|
|
155
|
+
.clay-menu-spot { position: absolute; width: 132px; height: 34px; border: 1px dashed var(--bevel-line-3); background: var(--bevel-sunk); }
|
|
156
|
+
.clay-menu-spot[data-to^="top"] { top: 12px; }
|
|
157
|
+
.clay-menu-spot[data-to^="bottom"] { bottom: 12px; }
|
|
158
|
+
.clay-menu-spot[data-to$="left"] { left: 12px; }
|
|
159
|
+
.clay-menu-spot[data-to$="right"] { right: 12px; }
|
|
160
|
+
.clay-menu-spot[data-near] { border: 2px solid var(--bevel-brass); background: var(--bevel-brass-soft); }
|
|
161
|
+
|
|
162
|
+
@media (pointer: coarse), (max-width: 680px) {
|
|
163
|
+
.clay-menu-list [role="menuitem"] { min-height: 44px; font-size: 15px; }
|
|
164
|
+
.clay-menu-list .clay-menu-pair [role="menuitem"] { min-height: 44px; }
|
|
165
|
+
:is(.clay-menu-dock, .clay-seo) :is(input, textarea, select) { font-size: 16px; }
|
|
166
|
+
.clay-seo-input, .clay-people-input { min-height: 40px; }
|
|
167
|
+
.clay-menu-btn { min-height: 40px; }
|
|
168
|
+
}
|
|
169
|
+
@media (prefers-reduced-motion: reduce) {
|
|
170
|
+
.clay-menu-track, .clay-menu-thumb { transition: none; }
|
|
171
|
+
}`;
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
// Style variants: a document can carry several looks for the same markup, each a
|
|
2
|
+
// <style clay-variant="A">. The saved choice is the one block without media="not all",
|
|
3
|
+
// so it paints with no JavaScript. The pill in the dock lets an editor step through
|
|
4
|
+
// them: in edit mode a step is the saved choice, in view mode it previews this tab
|
|
5
|
+
// only. Keep deletes every other look, after which the page is an ordinary one-look
|
|
6
|
+
// document. A choice and Keep are undo entries and saves, like the SEO panel's Done.
|
|
7
|
+
import { modeRefusalText } from "../../core/mode-refusal.js";
|
|
8
|
+
|
|
9
|
+
const OFF = "not all";
|
|
10
|
+
const RECEIPT = "variants-choose";
|
|
11
|
+
const KEEP_ID = "clay.variants.keep";
|
|
12
|
+
const CHOOSE_LABEL = "Change the page look";
|
|
13
|
+
const KEEP_LABEL = "Keep one page look";
|
|
14
|
+
|
|
15
|
+
const PREV =
|
|
16
|
+
'<svg viewBox="0 0 6 10" aria-hidden="true" focusable="false"><rect x="4" width="2" height="2"/><rect x="2" y="2" width="2" height="2"/>' +
|
|
17
|
+
'<rect y="4" width="2" height="2"/><rect x="2" y="6" width="2" height="2"/><rect x="4" y="8" width="2" height="2"/></svg>';
|
|
18
|
+
const NEXT =
|
|
19
|
+
'<svg viewBox="0 0 6 10" aria-hidden="true" focusable="false"><rect width="2" height="2"/><rect x="2" y="2" width="2" height="2"/>' +
|
|
20
|
+
'<rect x="4" y="4" width="2" height="2"/><rect x="2" y="6" width="2" height="2"/><rect y="8" width="2" height="2"/></svg>';
|
|
21
|
+
|
|
22
|
+
export const looks = () => [...document.querySelectorAll("head style[clay-variant]")];
|
|
23
|
+
const nameOf = (style) => style.getAttribute("clay-variant");
|
|
24
|
+
const names = () => looks().map(nameOf);
|
|
25
|
+
|
|
26
|
+
// The first block without media="not all" is the saved choice. A merge or a hand edit
|
|
27
|
+
// can leave none or several; this tab paints the first one either way, and the next
|
|
28
|
+
// choice writes a clean state.
|
|
29
|
+
function savedName() {
|
|
30
|
+
const all = looks();
|
|
31
|
+
const on = all.find((style) => style.getAttribute("media") !== OFF);
|
|
32
|
+
return on ? nameOf(on) : all.length ? nameOf(all[0]) : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// `<head>` changes are undo entries only inside a commit; outside one the history skips
|
|
36
|
+
// them and Cmd+Z takes back an earlier edit instead. A page without autosave saves its
|
|
37
|
+
// markup only when asked, so the choice is saved here.
|
|
38
|
+
function writeHead(label, change) {
|
|
39
|
+
const undo = window.clay && window.clay.undo;
|
|
40
|
+
if (undo && typeof undo.commit === "function") undo.commit(label, change);
|
|
41
|
+
else change();
|
|
42
|
+
if (!document.documentElement.hasAttribute("autosave") && typeof window.clay?.save === "function") window.clay.save();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Until the boot baseline settles, a change to the document counts as load-time churn and
|
|
46
|
+
// becomes the saved state without ever being sent.
|
|
47
|
+
async function afterBaseline() {
|
|
48
|
+
const save = await import("../../core/save.js");
|
|
49
|
+
while (!save.baselineSettled()) {
|
|
50
|
+
await new Promise((resolve) => document.addEventListener("clay:baseline-settled", resolve, { once: true }));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function joinNames(list) {
|
|
55
|
+
const named = list.map((name) => `Variant ${name}`);
|
|
56
|
+
return named.length < 2 ? named.join("") : `${named.slice(0, -1).join(", ")} and ${named[named.length - 1]}`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function attachVariants({ root, capsule, addItem, removeItem, note, currentMode }) {
|
|
60
|
+
let previewing = null;
|
|
61
|
+
let pending = null;
|
|
62
|
+
let copy = null;
|
|
63
|
+
let pill = null;
|
|
64
|
+
let drawn = null;
|
|
65
|
+
|
|
66
|
+
const isEdit = () => currentMode() === "edit";
|
|
67
|
+
const shown = () => previewing ?? savedName();
|
|
68
|
+
const storage = () => window.clay && window.clay.storage && window.clay.storage.session;
|
|
69
|
+
|
|
70
|
+
// Nothing here writes the file: the preview is an editor-ui copy of the previewed
|
|
71
|
+
// look, and the saved look and any extra active look are switched off through the
|
|
72
|
+
// CSSOM `disabled` flag, which is not an attribute.
|
|
73
|
+
function paint() {
|
|
74
|
+
const saved = savedName();
|
|
75
|
+
if (previewing !== null && previewing === saved) previewing = null;
|
|
76
|
+
copy?.remove();
|
|
77
|
+
copy = null;
|
|
78
|
+
for (const style of looks()) {
|
|
79
|
+
if (!style.sheet) continue;
|
|
80
|
+
const active = style.getAttribute("media") !== OFF;
|
|
81
|
+
style.sheet.disabled = active && (nameOf(style) !== saved || previewing !== null);
|
|
82
|
+
}
|
|
83
|
+
if (previewing === null) return;
|
|
84
|
+
const source = looks().find((style) => nameOf(style) === previewing);
|
|
85
|
+
if (!source) {
|
|
86
|
+
previewing = null;
|
|
87
|
+
return paint();
|
|
88
|
+
}
|
|
89
|
+
copy = document.createElement("style");
|
|
90
|
+
copy.setAttribute("clay", "editor-ui");
|
|
91
|
+
copy.dataset.clayVariantPreview = previewing;
|
|
92
|
+
copy.textContent = source.textContent;
|
|
93
|
+
source.after(copy);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function announce() {
|
|
97
|
+
document.dispatchEvent(new CustomEvent("clay:variant-change", { detail: { active: savedName(), shown: shown() } }));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function choose(name) {
|
|
101
|
+
if (!isEdit()) return { ok: false, code: "not-editing" };
|
|
102
|
+
if (!names().includes(name)) return { ok: false, code: "unknown-variant" };
|
|
103
|
+
pending = previewing = null;
|
|
104
|
+
writeHead(CHOOSE_LABEL, () => {
|
|
105
|
+
for (const style of looks()) {
|
|
106
|
+
if (nameOf(style) === name) style.removeAttribute("media");
|
|
107
|
+
else if (style.getAttribute("media") !== OFF) style.setAttribute("media", OFF);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
refresh();
|
|
111
|
+
return { ok: true };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function preview(name) {
|
|
115
|
+
if (name !== null && !names().includes(name)) return { ok: false, code: "unknown-variant" };
|
|
116
|
+
previewing = name;
|
|
117
|
+
refresh();
|
|
118
|
+
return { ok: true };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function keepNow(name) {
|
|
122
|
+
pending = previewing = null;
|
|
123
|
+
writeHead(KEEP_LABEL, () => {
|
|
124
|
+
for (const style of looks()) {
|
|
125
|
+
if (nameOf(style) === name) {
|
|
126
|
+
style.removeAttribute("clay-variant");
|
|
127
|
+
style.removeAttribute("media");
|
|
128
|
+
if (style.sheet) style.sheet.disabled = false;
|
|
129
|
+
} else {
|
|
130
|
+
style.remove();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
refresh();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function keep() {
|
|
138
|
+
if (!isEdit()) return Promise.resolve({ ok: false, code: "not-editing" });
|
|
139
|
+
const name = savedName();
|
|
140
|
+
const others = names().filter((other) => other !== name);
|
|
141
|
+
if (!others.length) return Promise.resolve({ ok: false, code: "unknown-variant" });
|
|
142
|
+
const text = `Keep Variant ${name} and delete ${joinNames(others)}? The switcher goes away. Version history still has them.`;
|
|
143
|
+
return import("../../ui/dialogs.js")
|
|
144
|
+
.then((m) => m.consent(text))
|
|
145
|
+
.then(
|
|
146
|
+
() => {
|
|
147
|
+
keepNow(name);
|
|
148
|
+
return { ok: true };
|
|
149
|
+
},
|
|
150
|
+
() => ({ ok: false, code: "cancelled" })
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function useShown() {
|
|
155
|
+
const name = previewing;
|
|
156
|
+
const clay = window.clay;
|
|
157
|
+
if (name === null || !clay || typeof clay.setMode !== "function") return;
|
|
158
|
+
// The receipt carries the choice across the reload into edit; a live entry never
|
|
159
|
+
// leaves the page, so the mode change below picks it up and clears it.
|
|
160
|
+
storage()?.set(RECEIPT, name);
|
|
161
|
+
let result;
|
|
162
|
+
try {
|
|
163
|
+
result = await clay.setMode("edit");
|
|
164
|
+
} catch (err) {
|
|
165
|
+
result = { ok: false, message: err && err.message };
|
|
166
|
+
}
|
|
167
|
+
if (result && result.reloading) return;
|
|
168
|
+
if (result && result.ok === false) {
|
|
169
|
+
storage()?.remove(RECEIPT);
|
|
170
|
+
const text = modeRefusalText(result);
|
|
171
|
+
if (text) note(text);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// The chosen look paints at once as a preview, and becomes the saved choice once the
|
|
176
|
+
// boot baseline has settled, so it is sent as an edit.
|
|
177
|
+
async function applyReceipt() {
|
|
178
|
+
const store = storage();
|
|
179
|
+
const name = store?.get(RECEIPT);
|
|
180
|
+
if (name == null) return;
|
|
181
|
+
store.remove(RECEIPT);
|
|
182
|
+
if (!isEdit() || !names().includes(name)) return;
|
|
183
|
+
pending = previewing = name;
|
|
184
|
+
refresh();
|
|
185
|
+
await afterBaseline();
|
|
186
|
+
if (pending !== name || !current()) return;
|
|
187
|
+
pending = null;
|
|
188
|
+
if (isEdit() && names().includes(name)) choose(name);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function step(by) {
|
|
192
|
+
const all = names();
|
|
193
|
+
const target = all[(all.indexOf(shown()) + by + all.length) % all.length];
|
|
194
|
+
if (isEdit()) choose(target);
|
|
195
|
+
else preview(target);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function buildPill() {
|
|
199
|
+
const node = document.createElement("div");
|
|
200
|
+
node.className = "clay-variants";
|
|
201
|
+
node.setAttribute("role", "group");
|
|
202
|
+
node.setAttribute("aria-label", "Page look");
|
|
203
|
+
node.innerHTML =
|
|
204
|
+
`<button type="button" class="clay-variants-step" data-step="-1" aria-label="Previous look">${PREV}</button>` +
|
|
205
|
+
`<span class="clay-variants-name" aria-live="polite"></span>` +
|
|
206
|
+
`<button type="button" class="clay-variants-step" data-step="1" aria-label="Next look">${NEXT}</button>` +
|
|
207
|
+
`<button type="button" class="clay-menu-btn clay-menu-btn-small clay-menu-btn-primary clay-variants-use" hidden>Use this look</button>` +
|
|
208
|
+
`<button type="button" class="clay-menu-btn clay-menu-btn-small clay-variants-keep" hidden>Keep</button>`;
|
|
209
|
+
for (const button of node.querySelectorAll(".clay-variants-step")) {
|
|
210
|
+
button.addEventListener("click", () => step(Number(button.dataset.step)));
|
|
211
|
+
}
|
|
212
|
+
node.querySelector(".clay-variants-use").addEventListener("click", useShown);
|
|
213
|
+
node.querySelector(".clay-variants-keep").addEventListener("click", () => keep());
|
|
214
|
+
return node;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function draw() {
|
|
218
|
+
const all = names();
|
|
219
|
+
drawn = state();
|
|
220
|
+
if (all.length < 2) {
|
|
221
|
+
pill?.remove();
|
|
222
|
+
pill = null;
|
|
223
|
+
removeItem(KEEP_ID);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (!pill) pill = buildPill();
|
|
227
|
+
if (!pill.isConnected) root.insertBefore(pill, root.querySelector(".clay-roster") ?? capsule);
|
|
228
|
+
const name = shown();
|
|
229
|
+
const label = pill.querySelector(".clay-variants-name");
|
|
230
|
+
label.textContent = `Variant ${name} `;
|
|
231
|
+
const count = document.createElement("small");
|
|
232
|
+
count.textContent = `(${all.indexOf(name) + 1}/${all.length})`;
|
|
233
|
+
label.append(count);
|
|
234
|
+
pill.querySelector(".clay-variants-use").hidden = isEdit() || previewing === null;
|
|
235
|
+
pill.querySelector(".clay-variants-keep").hidden = !isEdit();
|
|
236
|
+
if (isEdit()) addItem({ id: KEEP_ID, label: `Keep Variant ${savedName()}, remove the others…`, run: () => keep() });
|
|
237
|
+
else removeItem(KEEP_ID);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function refresh() {
|
|
241
|
+
paint();
|
|
242
|
+
draw();
|
|
243
|
+
announce();
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const state = () => `${names().join(",")}|${savedName()}|${shown()}`;
|
|
247
|
+
|
|
248
|
+
// Only the switcher behind the current clay.variants answers page events; one left from
|
|
249
|
+
// an earlier boot of the same document would read and clear this tab's receipt.
|
|
250
|
+
let api = null;
|
|
251
|
+
const current = () => window.clay?.variants === api;
|
|
252
|
+
|
|
253
|
+
document.addEventListener("clay:modechange", () => {
|
|
254
|
+
if (!current()) return;
|
|
255
|
+
if (isEdit()) {
|
|
256
|
+
previewing = pending;
|
|
257
|
+
applyReceipt();
|
|
258
|
+
} else {
|
|
259
|
+
pending = null;
|
|
260
|
+
}
|
|
261
|
+
refresh();
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// A merge can rebuild a look block, which clears its CSSOM flag, or bring a peer's
|
|
265
|
+
// choice or Keep; painting again settles all three.
|
|
266
|
+
document.addEventListener("clay:sync-applied", () => {
|
|
267
|
+
if (current()) refresh();
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
// An undo or redo of a choice or of Keep brings the blocks back or moves the saved one.
|
|
271
|
+
// Every other entry leaves the looks alone, so only a change redraws and announces.
|
|
272
|
+
document.addEventListener("clay:undo-change", () => {
|
|
273
|
+
if (current() && state() !== drawn) refresh();
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
api = window.clay.variants = {
|
|
277
|
+
list: () => {
|
|
278
|
+
const active = savedName();
|
|
279
|
+
return names().map((name) => ({ name, label: `Variant ${name}`, active: name === active }));
|
|
280
|
+
},
|
|
281
|
+
get active() {
|
|
282
|
+
return savedName();
|
|
283
|
+
},
|
|
284
|
+
get shown() {
|
|
285
|
+
return shown();
|
|
286
|
+
},
|
|
287
|
+
preview,
|
|
288
|
+
choose,
|
|
289
|
+
keep,
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
if (names().length >= 2) {
|
|
293
|
+
if (isEdit()) applyReceipt();
|
|
294
|
+
refresh();
|
|
295
|
+
}
|
|
296
|
+
}
|