@forsion/unit 2.13.0 → 2.13.2
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/main.mjs +23 -3
- package/package.json +1 -1
- package/release.json +5 -5
- package/web/assets/{ArtificialView-BSv3Mx5C.js → ArtificialView-Bs_6B211.js} +1 -1
- package/web/assets/{AutomationBuilder-BuiHtVB-.js → AutomationBuilder-C-IFaaBp.js} +1 -1
- package/web/assets/CalendarConfigView-DEsNvVkD.js +1 -0
- package/web/assets/CalendarView-D7ZUE_dr.js +1 -0
- package/web/assets/{CapabilityMenu-kx1TIJYN.js → CapabilityMenu-CrsaTtDe.js} +1 -1
- package/web/assets/{CheckboxInput-eW7xdiRS.js → CheckboxInput-DVO2-1J7.js} +1 -1
- package/web/assets/{Chrome-B77-lQyh.js → Chrome-BvpbCvo1.js} +1 -1
- package/web/assets/{CodeView-Df3AiSIi.js → CodeView-CB4kG7Y6.js} +3 -3
- package/web/assets/DashboardGridView-hpRmBr9B.css +1 -0
- package/web/assets/DashboardGridView-tgaj9-SM.js +17 -0
- package/web/assets/{EventCard-CDmeCbI8.js → EventCard-c6s4uGBu.js} +1 -1
- package/web/assets/ExcalidrawCanvas-NdV86AR3.js +1 -0
- package/web/assets/{FloatingToc-tART_jC4.js → FloatingToc-ldOYWe2C.js} +1 -1
- package/web/assets/HomepageView-4joJWYlg.js +1 -0
- package/web/assets/HomepageView-Cxf3AWBu.css +1 -0
- package/web/assets/ImageStudioPanels-DgMYAsHj.js +3 -0
- package/web/assets/{ImageStudioView-KJhx0wJk.js → ImageStudioView-_CYHoOoG.js} +1 -1
- package/web/assets/InlineFiles-BIfsx3R-.js +1 -0
- package/web/assets/MarkdownBlock-wYEaBBOr.js +58 -0
- package/web/assets/ModelPill-DveHcLqq.js +2 -0
- package/web/assets/MuseLibraryView-Do9RnKiq.js +2 -0
- package/web/assets/{MuseView-Cb6R_l4i.js → MuseView-3GL4Ltoj.js} +2 -2
- package/web/assets/{PageHistoryPanel-BQs9IWTP.js → PageHistoryPanel-BMQC-V_l.js} +2 -2
- package/web/assets/{PdfAnnotator-BFTBkxvO.js → PdfAnnotator-CyAw8sgq.js} +1 -1
- package/web/assets/PenRow-BSB-h5Pb.js +1 -0
- package/web/assets/{ProductView-mB-S0j81.js → ProductView-B96OeHOP.js} +1 -1
- package/web/assets/{RightPanel-BVZeVO3c.js → RightPanel-BgSeCLnw.js} +3 -3
- package/web/assets/RunLocationPicker-CEmFio4n.css +1 -0
- package/web/assets/RunLocationPicker-M1UoJyjf.js +38 -0
- package/web/assets/{SketchCard-CAAr_cqF.js → SketchCard-DAD0jR0i.js} +212 -8
- package/web/assets/{StudioGuestSurface-DthpuVGg.js → StudioGuestSurface-DlUKXBXv.js} +1 -1
- package/web/assets/TodoListView-_yFkPUrw.js +1 -0
- package/web/assets/{Tooltip-D9Dt9ZTr.js → Tooltip-DXuy9-1_.js} +1 -1
- package/web/assets/UnifiedPage-EJNWKzxN.js +68 -0
- package/web/assets/{amadeus-manual.en-D5wZKuag.js → amadeus-manual.en-DzRWr4BL.js} +15 -15
- package/web/assets/{amadeus-manual.zh-Br5fidrj.js → amadeus-manual.zh-DW32DkL7.js} +15 -15
- package/web/assets/{appStore-B1ynyt42.js → appStore-CidPWYa0.js} +242 -134
- package/web/assets/appStore-DeaC1U32.css +1 -0
- package/web/assets/{arrow-up-right-R10mR2I6.js → arrow-up-right-KPFbRA41.js} +1 -1
- package/web/assets/{astryxBridge-CU_kQTEl.js → astryxBridge-Bupzouso.js} +3 -3
- package/web/assets/{automationListSource-B8EIRmDW.js → automationListSource-1aOVKBLw.js} +1 -1
- package/web/assets/boardSurface-BHuMoQN-.js +1 -0
- package/web/assets/{book-open-DBJ3dDpw.js → book-open-CBeNsIpo.js} +1 -1
- package/web/assets/{calendarNavStore-DGvUlU5N.js → calendarNavStore-Duyhbmm_.js} +1 -1
- package/web/assets/{canvasPrefs-DwL_OAAo.js → canvasPrefs-CxfyDTMT.js} +1 -1
- package/web/assets/{chatBoxSurface-Lq-2qfd3.js → chatBoxSurface-OBzO1Z5E.js} +1 -1
- package/web/assets/{circle-question-mark-HPZpZQxd.js → circle-question-mark-M8QUJJYk.js} +1 -1
- package/web/assets/{circle-x-BZfe7d6S.js → circle-x-Szwop5L_.js} +1 -1
- package/web/assets/{client-DxGbwZLy.js → client-CPUljePZ.js} +1 -1
- package/web/assets/{code-xml-joKQ-qGS.js → code-xml-n9mgGgkv.js} +1 -1
- package/web/assets/{codeStudioStore-C7rGKlOC.js → codeStudioStore-DXMQwRzG.js} +1 -1
- package/web/assets/codingNavigation-CCjs1kon.js +53 -0
- package/web/assets/codingNavigation-yp19w6uu.css +1 -0
- package/web/assets/{create-BjBRKATq.js → create-C19zqt5N.js} +2 -2
- package/web/assets/dashboardSurface-BwcH16Qc.js +1 -0
- package/web/assets/{deskCapture-DnGWk1iq.js → deskCapture-B_LKZSPt.js} +1 -1
- package/web/assets/{diff2html-Cd1rVi_Z.js → diff2html-DrCCWvpR.js} +1 -1
- package/web/assets/{docx-preview-CK0k1mUD.js → docx-preview-Bi7wekSM.js} +1 -1
- package/web/assets/{emoji-Cjm3bKiF.js → emoji-DczIG8SO.js} +1 -1
- package/web/assets/{floatingTocSurface-Dd1pT5j5.js → floatingTocSurface-rc1ZC7-I.js} +1 -1
- package/web/assets/foldActions-BGocXE-o.js +1 -0
- package/web/assets/{folder-CvZyHIgb.js → folder-CoOsfQ64.js} +1 -1
- package/web/assets/{folder-plus-BRScGQ9m.js → folder-plus-d5MwIMlf.js} +1 -1
- package/web/assets/{gestures-CZQVefU0.js → gestures-CXFaEydn.js} +1 -1
- package/web/assets/{hand-D3QspKYq.js → hand-fuehbnkI.js} +1 -1
- package/web/assets/{hard-drive-BQsHSala.js → hard-drive-Bh1DmZg0.js} +1 -1
- package/web/assets/i18n-DjziAw8r.css +1 -0
- package/web/assets/{i18n.generated-BZRHO2Nc.js → i18n.generated-BiQFRL2U.js} +1 -1
- package/web/assets/{imageStudio-Cy3_437s.js → imageStudio-Dgl1wZNB.js} +2 -2
- package/web/assets/{index-0AYHATDX.js → index-2tD0kijW.js} +1 -1
- package/web/assets/{index-DJLWTPtq.js → index-38xsQSS9.js} +1 -1
- package/web/assets/{index-B5GxvbNm.js → index-7kdR1oL8.js} +1 -1
- package/web/assets/index-B5UW6SaE.js +297 -0
- package/web/assets/{index-D6mpAJ9S.js → index-B8Co6KG3.js} +1 -1
- package/web/assets/{index-C9yo04Ck.js → index-BCG8Wnc4.js} +1 -1
- package/web/assets/{index-Bpc3R3DS.js → index-BPqoEOV_.js} +1 -1
- package/web/assets/{index-BaRySZ-M.js → index-BqGpbntz.js} +1 -1
- package/web/assets/{index-Dj-PygjB.js → index-CPLtf9Vc.js} +1 -1
- package/web/assets/{index-8ag1K7AZ.js → index-Ce1sNSS8.js} +1 -1
- package/web/assets/{index-BgDZGDqt.js → index-Ch0FIsJX.js} +1 -1
- package/web/assets/{index-CcOag8eb.js → index-CnDAYLti.js} +1 -1
- package/web/assets/{index-Dkd-nl1u.js → index-D4CSH-v1.js} +1 -1
- package/web/assets/{index-BnWj6ggb.js → index-Dc8iMctf.js} +1 -1
- package/web/assets/{index-D0FLFLfh.js → index-DcRyQ3eU.js} +1 -1
- package/web/assets/{index-DElrDw66.js → index-Df9jregv.js} +1 -1
- package/web/assets/{index-4E9nrhwf.js → index-Dff-DL1v.js} +1 -1
- package/web/assets/{index-BdZaheMZ.js → index-DvOrTnw2.js} +1 -1
- package/web/assets/{index-BPhwi4-v.js → index-Dx9aIoyo.js} +1 -1
- package/web/assets/{index-BcVGjCAJ.js → index-Dy07SBfH.js} +1 -1
- package/web/assets/{index-GjLSlygt.js → index-QjVOA7QM.js} +1 -1
- package/web/assets/{index-BgtO11q8.js → index-YRWOePBS.js} +1 -1
- package/web/assets/{index-9BmmlTjY.js → index-e-MxdHFO.js} +1 -1
- package/web/assets/{index-DNE_PBJt.js → index-fViJsYjM.js} +1 -1
- package/web/assets/{index-1FhRiJ_X.js → index-lfow5R3O.js} +1 -1
- package/web/assets/{invitePage-B4gMvEKi.js → invitePage-Dgl3-c_m.js} +1 -1
- package/web/assets/{ipc-CPhL3bPp.js → ipc-CNlIRMtU.js} +1 -1
- package/web/assets/{jszip.min-DAJT9RUA.js → jszip.min-tyV0GaJg.js} +1 -1
- package/web/assets/{layout-grid-DfUfnvDS.js → layout-grid-DFmwM9NU.js} +1 -1
- package/web/assets/linkFollow-iP2zfbA3.js +8 -0
- package/web/assets/{list-tree-DaGpnIYu.js → list-tree-i07HsP3D.js} +1 -1
- package/web/assets/{listFold-Q_8mh5ZG.js → listFold-Aea6I0Sa.js} +1 -1
- package/web/assets/{lock-DQ_yL4nF.js → lock-TSDKuCod.js} +1 -1
- package/web/assets/{log-out-DFwTeh2X.js → log-out-DK84lW5n.js} +1 -1
- package/web/assets/{main-NgUPPqDn.css → main-BiS_5wrB.css} +1 -1
- package/web/assets/main-D7CEGndC.js +20 -0
- package/web/assets/markdownEditorSurface-DISu_twy.js +3 -0
- package/web/assets/{message-square-plus-CEHkduIL.js → message-square-plus-3wFslIMY.js} +1 -1
- package/web/assets/{messages-CBtmbpur.js → messages-DEAGRsC3.js} +1 -1
- package/web/assets/minus-BBdfT_sc.js +1 -0
- package/web/assets/mobileEntry-5UaAITwY.js +13 -0
- package/web/assets/{nativeDownload-CziEyW_p.js → nativeDownload-B3JGkABw.js} +1 -1
- package/web/assets/pageChrome-BDHHmRnt.css +1 -0
- package/web/assets/{pageChrome-DFz_AAzZ.js → pageChrome-DFi9zs6F.js} +1 -1
- package/web/assets/{pageTree-yVO1_fSy.js → pageTree-DZ7Eiro-.js} +4 -4
- package/web/assets/{pen-tool-uxsFELYC.js → pen-tool-ChGmX6g_.js} +1 -1
- package/web/assets/{pencil-BSbra1Ra.js → pencil-CJsJD7M_.js} +1 -1
- package/web/assets/phoneList-DrxIwJxQ.js +9 -0
- package/web/assets/phoneList-DvpzD3zT.css +1 -0
- package/web/assets/pluginChat-0QI9a8Q1.js +2 -0
- package/web/assets/{redo-2-BK5LMNa5.js → redo-2-CI57sDFr.js} +1 -1
- package/web/assets/{rotate-ccw-HedfU4na.js → rotate-ccw-xgT_0UN9.js} +1 -1
- package/web/assets/{sharePage-CpzDpuU1.js → sharePage-C2Yqx0NQ.js} +2 -2
- package/web/assets/{shareViewer-BwzH2bIs.js → shareViewer-DKPWhTJv.js} +2 -2
- package/web/assets/{star-CgYon3z4.js → star-C9KTji9N.js} +1 -1
- package/web/assets/tableSurface-cYs6dX6B.js +1 -0
- package/web/assets/{terminal-krsPf1mc.js → terminal-DPZazOQ2.js} +1 -1
- package/web/assets/{terminalView-4e2_u5_I.js → terminalView-CsJmxE_m.js} +1 -1
- package/web/assets/{theme-C6D3tMGV.css → theme-Dgqst5S9.css} +1 -1
- package/web/assets/{type-GJYLEhY-.js → type-C5J875vb.js} +1 -1
- package/web/assets/{undo-2-DCTs4Ro4.js → undo-2-BOUt5qks.js} +1 -1
- package/web/assets/{unitAccount-D3xjX3cu.js → unitAccount-BIAIxKNp.js} +1 -1
- package/web/assets/unitBridge-b2C6zb3a.js +1 -0
- package/web/assets/{unitCloudTransport-B44L3x6M.js → unitCloudTransport-NGtDDKWo.js} +1 -1
- package/web/assets/{unitOwnerAccess-CRUHWGpf.js → unitOwnerAccess-CwH9ApZT.js} +1 -1
- package/web/assets/{unitShim-_VzxvdEG.js → unitShim-CY8EVkKD.js} +3 -3
- package/web/assets/{upload-MVVRQtkj.js → upload-CrbEAW8C.js} +1 -1
- package/web/assets/userSpaces-B_Njvel_.js +1 -0
- package/web/assets/viewportLock-Bi3orrUs.css +1 -0
- package/web/assets/viewportLock-DZ927PNz.js +629 -0
- package/web/assets/{workflow-DzeW9OXR.js → workflow-DY2Cnaei.js} +1 -1
- package/web/assets/{zoom-in-CovPsw4g.js → zoom-in-BcuPvIYd.js} +1 -1
- package/web/index.html +28 -11
- package/web/assets/CalendarConfigView-BJtG6cqN.js +0 -1
- package/web/assets/CalendarView-C-FX1RED.js +0 -1
- package/web/assets/DashboardGridView-Ck3LKkOb.css +0 -1
- package/web/assets/DashboardGridView-MlO1dpuo.js +0 -17
- package/web/assets/ExcalidrawCanvas-D9vkBh_5.js +0 -1
- package/web/assets/HomepageView-BNabJQfP.css +0 -1
- package/web/assets/HomepageView-Trqmd3RV.js +0 -1
- package/web/assets/ImageStudioPanels-BfCVTnKC.js +0 -3
- package/web/assets/InlineFiles-BHwivGbQ.js +0 -1
- package/web/assets/MarkdownBlock-D8LgHFYY.js +0 -58
- package/web/assets/ModelPill-DrW2cG0l.js +0 -2
- package/web/assets/MuseLibraryView-CW78Uivf.js +0 -2
- package/web/assets/RunLocationPicker-BE5mxnab.css +0 -1
- package/web/assets/RunLocationPicker-CyVa0RJa.js +0 -38
- package/web/assets/SidebarRow-CsWEqPKX.css +0 -1
- package/web/assets/SidebarRow-D77yrSLf.js +0 -9
- package/web/assets/TodoListView-C3ZkMIIf.js +0 -1
- package/web/assets/UnifiedPage-C75y-MKT.js +0 -68
- package/web/assets/appStore-BC_CQv-L.css +0 -1
- package/web/assets/codingNavigation-CZB4v1ZW.css +0 -1
- package/web/assets/codingNavigation-CjeWG4xm.js +0 -47
- package/web/assets/dashboardSurface-Cojgf_-U.js +0 -1
- package/web/assets/foldActions-Dm-uAt3L.js +0 -1
- package/web/assets/i18n-ecQQxiMQ.css +0 -1
- package/web/assets/index-Bh_nLVTc.js +0 -298
- package/web/assets/linkFollow-C6PHGUxk.js +0 -8
- package/web/assets/main-CwqZ_ymb.js +0 -19
- package/web/assets/markdownEditorSurface-e_oMhqx-.js +0 -3
- package/web/assets/mdMarkStore-DjN4bf1T.js +0 -2
- package/web/assets/mdMarks-cmL6vzR-.js +0 -1
- package/web/assets/minus-BUT48dAC.js +0 -1
- package/web/assets/mobileEntry-qR7BAROr.js +0 -13
- package/web/assets/pageChrome-CovzZPdb.css +0 -1
- package/web/assets/pluginChat-BMFnf_j2.js +0 -2
- package/web/assets/tableSurface-CmDwnKnd.js +0 -1
- package/web/assets/unitBridge-D5JcIkAP.js +0 -1
- package/web/assets/userSpaces-CI4eqEgh.js +0 -1
- package/web/assets/viewportLock-BH26xHQO.js +0 -611
- package/web/assets/viewportLock-IP1zaVkz.css +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{G}from"./appStore-CidPWYa0.js";import{j as l,u as J,d as a}from"./index-B5UW6SaE.js";const rt=[["path",{d:"M4 11V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-1",key:"1q9hii"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M2 15h10",key:"jfw4w8"}],["path",{d:"m9 18 3-3-3-3",key:"112psh"}]],Pt=G("file-input",rt);const it=[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]],Kt=G("scroll-text",it),ot="forsion-sketch";function Vt(t){const e=Math.max(0,...(t.match(/`+/g)??[]).map(s=>s.length)),n="`".repeat(Math.max(3,e+1));return`${n}${ot}
|
|
2
2
|
${t.replace(/\s+$/,"")}
|
|
3
|
-
${n}`}const
|
|
3
|
+
${n}`}const ct=`/* The sketch document is isolated. All colors inherit Forsion's current theme. */
|
|
4
4
|
html, body { margin: 0; padding: 0; }
|
|
5
5
|
*, *::before, *::after { box-sizing: border-box; }
|
|
6
6
|
body {
|
|
@@ -109,6 +109,24 @@ fs-chart + fs-flow, fs-flow + fs-chart, fs-chart + fs-chart { margin-top: 28px;
|
|
|
109
109
|
.fs-flow-steps--vertical .fs-flow-content { margin-top: 3px; }
|
|
110
110
|
.fs-flow-steps--vertical .fs-flow-step:not(:last-child)::after { left: 15px; top: 39px; width: 1px; height: calc(100% - 23px); }
|
|
111
111
|
.fs-flow-steps--vertical .fs-flow-step:not(:last-child)::before { top: calc(100% + 11px); left: 12px; transform: rotate(135deg); }
|
|
112
|
+
/* 直播补丁(10-09):新来的部件淡入;文字原地续写不动画。 */
|
|
113
|
+
[data-fs-new] { animation: fs-in .28s ease-out both; }
|
|
114
|
+
@keyframes fs-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }
|
|
115
|
+
/* 统一拼装部件(10-09,对标 Intelligent UI 的固定组件库):网格 / 选项 / 按钮行 / 提示块 / 对比 / 追问选择 / 勾选清单。 */
|
|
116
|
+
.fs-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(128px, 100%), 1fr)); gap: 12px; margin: 4px 0 12px; } /* 128:1200 宽的窗口里聊天栏卡内只有 ≈430px,要并排得下三个选项 */
|
|
117
|
+
.fs-option { display: grid; align-content: start; gap: 6px; min-width: 0; padding: 12px 14px; border-radius: var(--fs-radius); background: var(--fs-surface); }
|
|
118
|
+
.fs-option > h4 { margin: 0; font-size: 14px; }
|
|
119
|
+
.fs-points { margin: 0; padding-left: 18px; font-size: 13px; display: grid; gap: 3px; }
|
|
120
|
+
.fs-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
|
|
121
|
+
.fs-callout { padding: 10px 14px; border-left: 2px solid var(--fs-accent); background: var(--fs-surface); border-radius: 0 var(--fs-radius) var(--fs-radius) 0; font-size: 13px; }
|
|
122
|
+
fs-compare, fs-choice, fs-checklist { display: block; min-width: 0; }
|
|
123
|
+
fs-compare + fs-choice, fs-choice + fs-compare, fs-checklist + fs-choice, fs-chart + fs-compare, fs-compare + fs-chart, fs-flow + fs-checklist, fs-checklist + fs-flow { margin-top: 24px; }
|
|
124
|
+
.fs-choice-question { margin: 0 0 10px; font-size: 14px; font-weight: 500; }
|
|
125
|
+
.fs-choice-options { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
126
|
+
.fs-checklist-items { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
|
|
127
|
+
.fs-checklist-items .fs-check { align-items: start; }
|
|
128
|
+
.fs-checklist-items .fs-check input { margin-top: 4px; }
|
|
129
|
+
.fs-checklist-items .fs-check input:checked + span { color: var(--fs-muted); text-decoration: line-through; }
|
|
112
130
|
::selection { background: var(--fs-accent-soft); }
|
|
113
131
|
@media(max-width:480px) {
|
|
114
132
|
body { padding: 14px 12px; }
|
|
@@ -122,9 +140,18 @@ fs-chart + fs-flow, fs-flow + fs-chart, fs-chart + fs-chart { margin-top: 28px;
|
|
|
122
140
|
@media(prefers-reduced-motion:reduce) {
|
|
123
141
|
*, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
|
|
124
142
|
}
|
|
125
|
-
`,
|
|
143
|
+
`,lt=`/* Runs only inside the opaque-origin sandbox. No host capabilities or network. */
|
|
126
144
|
(() => {
|
|
127
145
|
let state = __SKETCH_INITIAL_STATE__
|
|
146
|
+
// 授权令牌(Codex 10-09 二轮 P1):宿主只认带这个 nonce 的 ask / copy。它只活在这个闭包里 —— 运行时跑完就把自己的 script 节点删掉
|
|
147
|
+
// (模型脚本读 outerHTML 也拿不到),模型 HTML 绕过运行时直接 postMessage 就没有它。真正的手势判定因此可以放在卡内:
|
|
148
|
+
// navigator.userActivation 是每个 window 各自的,父文档里敲键不会传进子帧,子帧里的真点击才会让它为真。getter 在模型脚本
|
|
149
|
+
// 跑之前就抓好,模型脚本改不了。
|
|
150
|
+
const NONCE = '__SKETCH_NONCE__'
|
|
151
|
+
const uaGet = typeof Navigator !== 'undefined' ? Object.getOwnPropertyDescriptor(Navigator.prototype, 'userActivation')?.get : undefined
|
|
152
|
+
const activeGet = typeof UserActivation !== 'undefined' ? Object.getOwnPropertyDescriptor(UserActivation.prototype, 'isActive')?.get : undefined
|
|
153
|
+
const gestureActive = () => { try { const ua = uaGet && uaGet.call(navigator); return !!(ua && activeGet && activeGet.call(ua)) } catch { return false } }
|
|
154
|
+
const send = (msg) => parent.postMessage({ ...msg, nonce: NONCE }, '*')
|
|
128
155
|
window.forsionSketch = Object.freeze({
|
|
129
156
|
get state() { return state },
|
|
130
157
|
setState(value) {
|
|
@@ -133,7 +160,23 @@ fs-chart + fs-flow, fs-flow + fs-chart, fs-chart + fs-chart { margin-top: 28px;
|
|
|
133
160
|
state = JSON.parse(json)
|
|
134
161
|
parent.postMessage({ type: 'sketch-state', state }, '*')
|
|
135
162
|
},
|
|
163
|
+
// 卡内按钮回头改答案:把这句话当用户的下一条消息发出去(宿主侧再核 nonce + 焦点、限频、限长,只在对话里接)。
|
|
164
|
+
// 手势检查在这里是**真闸**(见上):模型写的卡不能一加载 / 定时就替用户发话。
|
|
165
|
+
ask(text) {
|
|
166
|
+
if (!gestureActive()) throw new Error('forsionSketch.ask() must be called from a user gesture')
|
|
167
|
+
const t = String(text ?? '').trim().slice(0, 400)
|
|
168
|
+
if (!t) throw new Error('forsionSketch.ask() needs a non-empty text')
|
|
169
|
+
send({ type: 'sketch-ask', text: t })
|
|
170
|
+
},
|
|
171
|
+
// 复制到剪贴板(沙箱帧自己没有剪贴板权限,由宿主代写;同样要用户手势)。
|
|
172
|
+
copy(text) {
|
|
173
|
+
if (!gestureActive()) throw new Error('forsionSketch.copy() must be called from a user gesture')
|
|
174
|
+
const t = String(text ?? '')
|
|
175
|
+
if (!t) return
|
|
176
|
+
send({ type: 'sketch-copy', text: t.slice(0, 20000) })
|
|
177
|
+
},
|
|
136
178
|
})
|
|
179
|
+
document.currentScript?.remove()
|
|
137
180
|
|
|
138
181
|
// An href must never turn a sandbox frame into an external navigation surface.
|
|
139
182
|
document.addEventListener('click', (event) => {
|
|
@@ -141,10 +184,68 @@ fs-chart + fs-flow, fs-flow + fs-chart, fs-chart + fs-chart { margin-top: 28px;
|
|
|
141
184
|
}, true)
|
|
142
185
|
document.addEventListener('submit', (event) => event.preventDefault(), true)
|
|
143
186
|
|
|
187
|
+
// 直播补丁(10-09,对标 ChatGPT Intelligent UI 的流式组件):宿主把最新 html 发进来,这里**原地**打补丁 —— 不换 srcdoc、不重载。
|
|
188
|
+
// 同位置同标签的元素保留(只同步属性、递归子节点),文字节点原地续写,新节点标 data-fs-new 淡入;自定义元素(fs-*)内容一变整个换掉
|
|
189
|
+
// (它们从 JSON 子节点取数据,只在接入时解析)。终稿(sketch-final)再把惰性的 script 节点换成会执行的,并补发 DOMContentLoaded / load,
|
|
190
|
+
// 让「等 DOM 就绪再初始化」的两种写法都能跑。
|
|
191
|
+
function syncAttrs(live, next) {
|
|
192
|
+
for (const a of [...live.attributes]) if (a.name !== 'data-fs-new' && !next.hasAttribute(a.name)) live.removeAttribute(a.name)
|
|
193
|
+
for (const a of [...next.attributes]) if (live.getAttribute(a.name) !== a.value) live.setAttribute(a.name, a.value)
|
|
194
|
+
}
|
|
195
|
+
const markNew = (n) => {
|
|
196
|
+
if (n.nodeType !== 1) return
|
|
197
|
+
n.setAttribute('data-fs-new', '')
|
|
198
|
+
n.addEventListener('animationend', () => n.removeAttribute('data-fs-new'), { once: true })
|
|
199
|
+
}
|
|
200
|
+
function morph(live, next) {
|
|
201
|
+
if (live.nodeType === 1 && next.nodeType === 1) syncAttrs(live, next)
|
|
202
|
+
const a = [...live.childNodes], b = [...next.childNodes]
|
|
203
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
204
|
+
const x = a[i], y = b[i]
|
|
205
|
+
if (!y) { x.remove(); continue }
|
|
206
|
+
if (!x) { const n = document.importNode(y, true); markNew(n); live.appendChild(n); continue }
|
|
207
|
+
if (x.nodeType === 3 && y.nodeType === 3) { if (x.nodeValue !== y.nodeValue) x.nodeValue = y.nodeValue; continue }
|
|
208
|
+
const sameTag = x.nodeType === 1 && y.nodeType === 1 && x.tagName === y.tagName
|
|
209
|
+
// 自定义元素渲染后 innerHTML 已是画好的 DOM,比的是它接入时记下的原始源码(_fsSrc),不然每一拍都会被换掉重画。
|
|
210
|
+
if (sameTag && x.tagName.includes('-')) {
|
|
211
|
+
if ((x._fsSrc ?? x.innerHTML) !== y.innerHTML) { const n = document.importNode(y, true); markNew(n); x.replaceWith(n) }
|
|
212
|
+
else syncAttrs(x, y)
|
|
213
|
+
continue
|
|
214
|
+
}
|
|
215
|
+
if (sameTag) { morph(x, y); continue }
|
|
216
|
+
const n = document.importNode(y, true); markNew(n); x.replaceWith(n)
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// 会执行的 script type(HTML 标准的 JavaScript MIME 类型表 + module);其余(application/json、importmap …)是数据,原样留着
|
|
220
|
+
const JS_TYPES = /^(?:module|(?:text|application)\\/(?:x-)?(?:ecma|java)script|text\\/(?:javascript1\\.[0-5]|jscript|livescript))$/
|
|
221
|
+
function applyHtml(html, final) {
|
|
222
|
+
const t = document.createElement('template')
|
|
223
|
+
t.innerHTML = html
|
|
224
|
+
morph(document.body, t.content)
|
|
225
|
+
if (final) {
|
|
226
|
+
const pending = [] // module 脚本是异步执行的,等它们跑完再发就绪事件(Codex 10-09 P2)
|
|
227
|
+
for (const s of [...document.body.querySelectorAll('script')]) {
|
|
228
|
+
const type = (s.getAttribute('type') || '').trim().toLowerCase()
|
|
229
|
+
if (type && !JS_TYPES.test(type)) continue
|
|
230
|
+
const n = document.createElement('script')
|
|
231
|
+
for (const attr of [...s.attributes]) n.setAttribute(attr.name, attr.value)
|
|
232
|
+
n.textContent = s.textContent
|
|
233
|
+
if (type === 'module') pending.push(new Promise((r) => { n.addEventListener('load', r, { once: true }); n.addEventListener('error', r, { once: true }) }))
|
|
234
|
+
s.replaceWith(n)
|
|
235
|
+
}
|
|
236
|
+
const ready = () => { document.dispatchEvent(new Event('DOMContentLoaded')); window.dispatchEvent(new Event('load')); measure() }
|
|
237
|
+
if (pending.length) Promise.all(pending).then(ready)
|
|
238
|
+
else ready()
|
|
239
|
+
}
|
|
240
|
+
measure()
|
|
241
|
+
}
|
|
242
|
+
|
|
144
243
|
window.addEventListener('message', (event) => {
|
|
145
244
|
if (event.source !== parent) return
|
|
146
245
|
const data = event.data
|
|
147
|
-
if (!data
|
|
246
|
+
if (!data) return
|
|
247
|
+
if (data.type === 'sketch-draft' || data.type === 'sketch-final') { applyHtml(String(data.html ?? ''), data.type === 'sketch-final'); return }
|
|
248
|
+
if (data.type !== 'sketch-theme' || !data.vars) return
|
|
148
249
|
for (const [key, value] of Object.entries(data.vars)) {
|
|
149
250
|
if (key.startsWith('--fs-')) document.documentElement.style.setProperty(key, String(value))
|
|
150
251
|
else if (key === 'color-scheme') document.documentElement.style.colorScheme = String(value)
|
|
@@ -189,14 +290,16 @@ fs-chart + fs-flow, fs-flow + fs-chart, fs-chart + fs-chart { margin-top: 28px;
|
|
|
189
290
|
})
|
|
190
291
|
|
|
191
292
|
function ready() {
|
|
293
|
+
window.__fsLoadedAt = Date.now() // 台架用:整张卡只加载一次(草稿 → 终稿不重载)
|
|
192
294
|
if (window.ResizeObserver) new ResizeObserver(measure).observe(document.body)
|
|
193
295
|
measure()
|
|
194
296
|
}
|
|
195
|
-
|
|
297
|
+
// once:终稿(sketch-final)会补发一次合成的 DOMContentLoaded 给模型脚本,运行时自己的就绪只跑一次
|
|
298
|
+
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', ready, { once: true })
|
|
196
299
|
else ready()
|
|
197
300
|
window.addEventListener('load', measure)
|
|
198
301
|
})()
|
|
199
|
-
`,
|
|
302
|
+
`,dt=`/* Small, offline figure primitives. Text and data are never interpreted as HTML. */
|
|
200
303
|
(() => {
|
|
201
304
|
const svgNS = 'http://www.w3.org/2000/svg'
|
|
202
305
|
const number = (value) => new Intl.NumberFormat(undefined, {
|
|
@@ -225,11 +328,13 @@ fs-chart + fs-flow, fs-flow + fs-chart, fs-chart + fs-chart { margin-top: 28px;
|
|
|
225
328
|
queueMicrotask(() => {
|
|
226
329
|
if (!this.isConnected) return
|
|
227
330
|
if (!this.figureData) {
|
|
331
|
+
this._fsSrc = this.innerHTML // 直播补丁(sketchRuntime morph)拿它和新来的源码比,渲染后 innerHTML 就不是源码了
|
|
228
332
|
try { this.figureData = JSON.parse(this.querySelector('script[type="application/json"]')?.textContent || '{}') }
|
|
229
333
|
catch { this.figureData = {} }
|
|
230
334
|
}
|
|
231
335
|
this.render()
|
|
232
336
|
this.observer?.disconnect()
|
|
337
|
+
if (!window.ResizeObserver) return
|
|
233
338
|
this.observer = new ResizeObserver(() => {
|
|
234
339
|
const width = Math.round(this.clientWidth)
|
|
235
340
|
if (width && width !== this.lastWidth) { this.lastWidth = width; this.render() }
|
|
@@ -426,12 +531,111 @@ fs-chart + fs-flow, fs-flow + fs-chart, fs-chart + fs-chart { margin-top: 28px;
|
|
|
426
531
|
}
|
|
427
532
|
}
|
|
428
533
|
|
|
534
|
+
// 10-09(对标 ChatGPT Intelligent UI「只能拼固定组件库」):统一的拼装部件,模型只给 JSON,外观由宿主定。
|
|
535
|
+
const askOf = (text) => { try { window.forsionSketch.ask(String(text)) } catch (e) { console.warn(e) } }
|
|
536
|
+
const button = (label, onClick) => { const b = node('button', 'fs-button', label); b.type = 'button'; b.addEventListener('click', onClick); return b }
|
|
537
|
+
|
|
538
|
+
/** <fs-compare>:并排选项 {title?, caption?, options:[{label, summary?, points?:string[], ask?:{label?, text}}]}(2–6 项)。 */
|
|
539
|
+
class Compare extends Figure {
|
|
540
|
+
render() {
|
|
541
|
+
const d = this.figureData
|
|
542
|
+
const ok = d && Array.isArray(d.options) && d.options.length >= 2 && d.options.length <= 6 &&
|
|
543
|
+
d.options.every((o) => o && typeof o.label === 'string' &&
|
|
544
|
+
(o.points === undefined || (Array.isArray(o.points) && o.points.length <= 8 && o.points.every((p) => typeof p === 'string'))) &&
|
|
545
|
+
(o.ask === undefined || (o.ask && typeof o.ask.text === 'string')))
|
|
546
|
+
if (!ok) { this.error(); return }
|
|
547
|
+
this.replaceChildren()
|
|
548
|
+
const root = node('div', 'fs-compare')
|
|
549
|
+
heading(root, d)
|
|
550
|
+
const grid = node('div', 'fs-grid')
|
|
551
|
+
for (const o of d.options) {
|
|
552
|
+
const card = node('section', 'fs-option')
|
|
553
|
+
card.append(node('h4', '', o.label))
|
|
554
|
+
if (typeof o.summary === 'string' && o.summary) card.append(node('p', 'fs-muted', o.summary))
|
|
555
|
+
if (Array.isArray(o.points) && o.points.length) { const ul = node('ul', 'fs-points'); for (const p of o.points) ul.append(node('li', '', p)); card.append(ul) }
|
|
556
|
+
if (o.ask) { const act = node('div', 'fs-actions'); act.append(button(o.ask.label || o.label, () => askOf(o.ask.text))); card.append(act) }
|
|
557
|
+
grid.append(card)
|
|
558
|
+
}
|
|
559
|
+
root.append(grid); caption(root, d); this.append(root)
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/** <fs-choice>:追问选择题 {question, options:[{label, ask?}], multiple?, ask?("{choices}" 占位), submitLabel?, caption?}。
|
|
564
|
+
* 单选点了就把 ask(缺省 label)当用户消息发出;多选勾完按提交,把 ask 模板里的 {choices} 换成所选。 */
|
|
565
|
+
class Choice extends Figure {
|
|
566
|
+
render() {
|
|
567
|
+
const d = this.figureData
|
|
568
|
+
const ok = d && typeof d.question === 'string' && Array.isArray(d.options) && d.options.length >= 2 && d.options.length <= 8 &&
|
|
569
|
+
d.options.every((o) => o && typeof o.label === 'string' && (o.ask === undefined || typeof o.ask === 'string'))
|
|
570
|
+
if (!ok) { this.error(); return }
|
|
571
|
+
this.picked ||= new Set() // 宽度变化重绘时保住已勾的
|
|
572
|
+
for (const i of [...this.picked]) if (i >= d.options.length) this.picked.delete(i) // setData 换了更短的选项表:越界的勾作废(Codex 10-09)
|
|
573
|
+
this.replaceChildren()
|
|
574
|
+
const root = node('div', 'fs-choice')
|
|
575
|
+
root.setAttribute('role', 'group')
|
|
576
|
+
root.append(node('p', 'fs-choice-question', d.question))
|
|
577
|
+
const opts = node('div', 'fs-choice-options')
|
|
578
|
+
if (d.multiple) {
|
|
579
|
+
for (const [i, o] of d.options.entries()) {
|
|
580
|
+
const l = node('label', 'fs-check'); const c = node('input'); c.type = 'checkbox'; c.checked = this.picked.has(i)
|
|
581
|
+
c.addEventListener('change', () => { if (c.checked) this.picked.add(i); else this.picked.delete(i) })
|
|
582
|
+
l.append(c, node('span', '', o.label)); opts.append(l)
|
|
583
|
+
}
|
|
584
|
+
const act = node('div', 'fs-actions')
|
|
585
|
+
act.append(button(d.submitLabel || 'OK', () => {
|
|
586
|
+
const chosen = [...this.picked].sort((x, y) => x - y).map((i) => d.options[i]?.label).filter(Boolean)
|
|
587
|
+
if (chosen.length) askOf(String(d.ask || '{choices}').replace('{choices}', chosen.join(', ')))
|
|
588
|
+
}))
|
|
589
|
+
root.append(opts, act)
|
|
590
|
+
} else {
|
|
591
|
+
for (const o of d.options) opts.append(button(o.label, () => askOf(typeof o.ask === 'string' ? o.ask : o.label)))
|
|
592
|
+
root.append(opts)
|
|
593
|
+
}
|
|
594
|
+
caption(root, d); this.append(root)
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/** <fs-checklist>:勾选清单 {title?, caption?, items:[{label, detail?}]}(1–40 项);勾选状态经 forsionSketch.setState 存在本机
|
|
599
|
+
* (键 checklists[<元素 id 或 'checklist'>]),重开这张卡还在。 */
|
|
600
|
+
class Checklist extends Figure {
|
|
601
|
+
render() {
|
|
602
|
+
const d = this.figureData
|
|
603
|
+
const ok = d && Array.isArray(d.items) && d.items.length >= 1 && d.items.length <= 40 &&
|
|
604
|
+
d.items.every((it) => it && typeof it.label === 'string' && (it.detail === undefined || typeof it.detail === 'string'))
|
|
605
|
+
if (!ok) { this.error(); return }
|
|
606
|
+
const key = this.id || 'checklist'
|
|
607
|
+
const st = window.forsionSketch?.state
|
|
608
|
+
const saved = st && typeof st === 'object' && st.checklists ? st.checklists[key] : undefined
|
|
609
|
+
const done = new Set(Array.isArray(saved) ? saved.filter((i) => Number.isInteger(i)) : [])
|
|
610
|
+
this.replaceChildren()
|
|
611
|
+
const root = node('div', 'fs-checklist')
|
|
612
|
+
heading(root, d)
|
|
613
|
+
const ul = node('ul', 'fs-checklist-items')
|
|
614
|
+
for (const [i, it] of d.items.entries()) {
|
|
615
|
+
const li = node('li'); const l = node('label', 'fs-check'); const c = node('input'); c.type = 'checkbox'; c.checked = done.has(i)
|
|
616
|
+
c.addEventListener('change', () => {
|
|
617
|
+
if (c.checked) done.add(i); else done.delete(i)
|
|
618
|
+
const cur = window.forsionSketch.state
|
|
619
|
+
const base = cur && typeof cur === 'object' && !Array.isArray(cur) ? cur : {}
|
|
620
|
+
try { window.forsionSketch.setState({ ...base, checklists: { ...(base.checklists || {}), [key]: [...done].sort((x, y) => x - y) } }) } catch (e) { console.warn(e) }
|
|
621
|
+
})
|
|
622
|
+
const text = node('span', '', it.label)
|
|
623
|
+
if (it.detail) text.append(node('small', 'fs-muted', ' ' + it.detail))
|
|
624
|
+
l.append(c, text); li.append(l); ul.append(li)
|
|
625
|
+
}
|
|
626
|
+
root.append(ul); caption(root, d); this.append(root)
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
429
630
|
function register() {
|
|
430
631
|
if (!customElements.get('fs-chart')) customElements.define('fs-chart', Chart)
|
|
431
632
|
if (!customElements.get('fs-flow')) customElements.define('fs-flow', Flow)
|
|
633
|
+
if (!customElements.get('fs-compare')) customElements.define('fs-compare', Compare)
|
|
634
|
+
if (!customElements.get('fs-choice')) customElements.define('fs-choice', Choice)
|
|
635
|
+
if (!customElements.get('fs-checklist')) customElements.define('fs-checklist', Checklist)
|
|
432
636
|
}
|
|
433
637
|
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', register)
|
|
434
638
|
else register()
|
|
435
639
|
})()
|
|
436
|
-
`,
|
|
437
|
-
${
|
|
640
|
+
`,U=16384,q="forsion_sketch_state_v1",M=48;function S(t){try{const e=JSON.stringify(t);return e&&new TextEncoder().encode(e).length<=U?e:void 0}catch{return}}function ft(t,e,n){let s=2166136261;for(let i=0;i<n.length;i++)s=Math.imul(s^n.charCodeAt(i),16777619);return JSON.stringify([t,e,n.length,s>>>0])}function W(t){const e=t.getItem(q);if(!e||e.length>U*(M+4))return[];let n;try{n=JSON.parse(e)}catch{return[]}return Array.isArray(n)?n.filter(s=>!!s&&typeof s.key=="string"&&s.key.length<2048&&S(s.state)!==void 0).slice(-M):[]}function pt(t){try{return W(localStorage).find(e=>e.key===t)?.state??null}catch{return null}}function ut(t,e){const n=S(e);if(!(!n||t.length>=2048))try{const s=W(localStorage).filter(i=>i.key!==t);s.push({key:t,state:JSON.parse(n)}),localStorage.setItem(q,JSON.stringify(s.slice(-M)))}catch{}}const ht="default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data: blob:; media-src data: blob:; font-src data:",mt="allow-scripts",P=40,gt=2400,bt=220,vt={"--fs-bg":"transparent"},xt=[["--fs-surface","--overlay-subtle"],["--fs-text","--text"],["--fs-muted","--text-muted"],["--fs-faint","--text-faint"],["--fs-border","--border"],["--fs-rule","--overlay-medium"],["--fs-accent","--accent-ink"],["--fs-accent-soft","--accent-light"],["--fs-green","--green"],["--fs-danger","--danger"],["--fs-radius","--radius-sm"],["--fs-font","--font-ui"],["--fs-mono","--font-mono"]];function B(t){return String(t).replace(/[<>]/g,"").trim()}function K(t){const e=getComputedStyle(t),n={...vt};for(const[s,i]of xt){const c=B(e.getPropertyValue(i));c&&(n[s]=c)}return n["color-scheme"]=document.documentElement.getAttribute("data-mode")==="dark"?"dark":"light",n}const w=new Set;let g=null;function yt(t){return w.add(t),!g&&typeof MutationObserver<"u"&&(g=new MutationObserver(()=>{for(const e of w)e()}),g.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme","data-skin","data-bg","data-mode","data-flat","data-glass","class"]})),()=>{w.delete(t),!w.size&&g&&(g.disconnect(),g=null)}}const kt=":root{--fs-s1:var(--fs-accent);--fs-s2:color-mix(in srgb,var(--fs-text) 62%,transparent);--fs-s3:color-mix(in srgb,var(--fs-text) 42%,transparent);--fs-s4:color-mix(in srgb,var(--fs-text) 26%,transparent);--fs-s5:color-mix(in srgb,var(--fs-text) 14%,transparent)}";function wt(t){const e=Object.entries(t).map(([n,s])=>`${n.replace(/[^a-z-]/gi,"")}:${B(s)}`).join(";");return e?`:root{${e}}`:""}function St(t,e={},n=null,s=""){const i=(S(n)??"null").replace(/</g,"\\u003c").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029"),c=lt.replace("__SKETCH_INITIAL_STATE__",()=>i).replace("__SKETCH_NONCE__",()=>s.replace(/[^A-Za-z0-9-]/g,""));return`<!doctype html><html><head><meta http-equiv="Content-Security-Policy" content="${ht}"><meta name="viewport" content="width=device-width, initial-scale=1"><style>${wt(e)}${kt}${ct}</style><script>${c};
|
|
641
|
+
${dt}<\/script></head><body>${t}</body></html>`}const X=`(?![^>]*\\stype\\s*=\\s*["']?application/json\\b)`,At=new RegExp(`<script\\b${X}[^>]*>[\\s\\S]*?<\/script\\s*>`,"gi"),Et=new RegExp(`<script\\b${X}[^>]*>[\\s\\S]*$`,"i"),Mt=/<script\b[^>]*$/i,Tt=/<[a-zA-Z][^>]*(?:>|$)/g,Nt=/\son[a-z]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi,Ct=/<(fs-[a-z]+)\b(?![\s\S]*<\/\1\s*>)[\s\S]*$/i;function V(t){return t.replace(At,"").replace(Et,"").replace(Mt,"").replace(Ct,"").replace(Tt,e=>e.replace(Nt,""))}const _t=400,Lt=1500,Rt=2e4,zt=150;function Ot(){try{const t=window.Capacitor;return!!(t&&typeof t.isNativePlatform=="function"&&t.isNativePlatform())}catch{return!1}}function Ht(t){return!t||document.activeElement!==t?!1:navigator.userActivation?.isActive===!0}const It=()=>crypto.randomUUID?crypto.randomUUID():Array.from(crypto.getRandomValues(new Uint8Array(16)),t=>t.toString(16).padStart(2,"0")).join(""),$t=({item:t,actions:e,stateScope:n,onAsk:s})=>{const{t:i}=J(),c=a.useMemo(()=>n&&!t.draft?ft(n,t.callId,t.html):null,[n,t.callId,t.html,t.draft]),u=a.useRef(s);u.current=s;const x=a.useRef(!!t.draft);x.current=!!t.draft;const T=a.useRef(0),Y=a.useRef(t.draft?V(t.html):t.html),Z=a.useRef(c?pt(c):null),N=a.useRef(It()),y=a.useRef(null),C=a.useRef(null),h=a.useRef(null),[_,Q]=a.useState(t.draft?P:bt),[b,tt]=a.useState(!1),[L,et]=a.useState(!1),[k,nt]=a.useState(null);a.useLayoutEffect(()=>{y.current&&nt(K(y.current))},[]),a.useEffect(()=>yt(()=>{const r=y.current,d=h.current?.contentWindow;r&&d&&d.postMessage({type:"sketch-theme",vars:K(r)},"*")}),[]);const A=a.useRef(!1),E=a.useRef(!1),v=a.useRef(null),m=a.useRef(void 0),R=r=>{h.current?.contentWindow?.postMessage(r,"*")},z=()=>{if(m.current=void 0,!A.current)return;const r=v.current;v.current=null,r!==null&&x.current&&!E.current&&R({type:"sketch-draft",html:r})},O=()=>{!A.current||E.current||(E.current=!0,clearTimeout(m.current),m.current=void 0,v.current=null,R({type:"sketch-final",html:t.html}))},H=a.useRef(!!t.draft);a.useEffect(()=>{t.draft?(v.current=V(t.html),m.current||(m.current=setTimeout(z,zt))):H.current&&O()},[t.html,t.draft]),a.useEffect(()=>()=>clearTimeout(m.current),[]);const at=()=>{A.current=!0,!x.current&&H.current?O():v.current!==null&&z()};a.useEffect(()=>{let r,d;const p=()=>{c&&r!==void 0&&ut(c,JSON.parse(r)),r=void 0,d=void 0},$=j=>{if(!h.current||j.source!==h.current.contentWindow)return;const o=j.data;if(o?.type==="sketch-state"&&c){const f=S(o.state);f!==void 0&&(r=f,d||(d=setTimeout(p,200)))}o&&o.type==="sketch-height"&&Number.isFinite(Number(o.height))&&Q(Math.min(gt,Math.max(P,Math.ceil(Number(o.height)))));const D=o&&o.nonce===N.current&&!x.current&&Ht(h.current);if(D&&o.type==="sketch-ask"&&typeof o.text=="string"&&u.current){const f=Date.now(),F=o.text.trim().slice(0,_t);F&&f-T.current>=Lt&&(T.current=f,u.current(F))}if(D&&o.type==="sketch-copy"&&typeof o.text=="string"){const f=o.text.slice(0,Rt);f&&navigator.clipboard?.writeText(f).catch(()=>{})}};return window.addEventListener("message",$),window.addEventListener("pagehide",p),()=>{window.removeEventListener("message",$),window.removeEventListener("pagehide",p),clearTimeout(d),p()}},[c]),a.useEffect(()=>{const r=C.current;if(!r||b)return;const d=()=>et(r.scrollHeight>r.clientHeight+1);d();const p=new ResizeObserver(d);return p.observe(r),()=>p.disconnect()},[_,b]);const st=a.useMemo(()=>k?St(Y.current,k,Z.current,N.current):"",[k]),I=t.draft?void 0:e;return l.jsxs("div",{className:"sketch-card",ref:y,"data-sketch-call-id":t.callId,"data-sketch-draft":t.draft?"":void 0,children:[(t.title||I)&&l.jsxs("div",{className:"sketch-card-head",children:[t.title&&l.jsx("div",{className:"sketch-card-title",children:t.title}),I?.(t)]}),l.jsx("div",{ref:C,className:`sketch-clip${b?" open":""}${L&&!b?" faded":""}`,children:k&&l.jsx("iframe",{ref:h,className:"sketch-frame",sandbox:mt,srcDoc:st,style:{height:_},title:t.title||"sketch",onLoad:at})}),L&&l.jsx("button",{type:"button",className:"sketch-card-toggle",onClick:()=>tt(r=>!r),children:i(b?"sketch.collapse":"sketch.expand")})]})},jt=({item:t})=>{const{t:e}=J();return l.jsxs("div",{className:"sketch-card","data-sketch-call-id":t.callId,children:[t.title&&l.jsx("div",{className:"sketch-card-title",children:t.title}),l.jsx("div",{className:"sketch-card-note",children:e("sketch.mobileUnavailable")})]})},Gt=({items:t,actions:e,stateScope:n,onAsk:s})=>{const i=Ot(),c=i?jt:$t;return l.jsx(l.Fragment,{children:t.map(u=>l.jsx(c,{item:u,actions:i?void 0:e,stateScope:n,onAsk:i?void 0:s},`${n||""}:${u.callId}`))})};export{Pt as F,Kt as S,Gt as a,ot as b,Vt as s};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as v}from"./index-
|
|
1
|
+
import{d as v}from"./index-B5UW6SaE.js";import{ej as J,bq as ne,ah as re}from"./appStore-CidPWYa0.js";const K=/^(auto|scroll|hidden|clip)$/,M=(l,p=1)=>Number.isFinite(l)&&l>0?l:p,m=l=>`${Math.round(l*1e3)/1e3}px`;function ae({anchorRef:l,enabled:p=!0,onActivate:X,children:Q}){const[t]=v.useState(()=>{const d=document.createElement("div");return d.className="csu-guest-surface",d.setAttribute("aria-hidden","true"),d.inert=!0,Object.assign(d.style,{position:"absolute",display:"flex",flexDirection:"column",minWidth:"0",minHeight:"0",overflow:"hidden",boxSizing:"border-box",visibility:"hidden",pointerEvents:"none",zIndex:"1"}),d}),E=v.useRef(p);E.current=p;const Y=v.useRef(X);Y.current=X;const $=v.useRef(0),I=v.useRef(null);return v.useLayoutEffect(()=>{$.current++;let d=!1,b=0,r=t.parentElement,x=null,N=!1,R=!1;const n=t.ownerDocument,a=n.defaultView,o=(i,e)=>{t.style[i]!==e&&(t.style[i]=e)},f=()=>{o("visibility","hidden"),o("pointerEvents","none"),t.inert||(t.inert=!0),t.getAttribute("aria-hidden")!=="true"&&t.setAttribute("aria-hidden","true")},D=()=>{const i=t.style.visibility==="visible"&&E.current&&!N&&!n.documentElement.hasAttribute("data-dv-dragging");o("pointerEvents",i?"auto":"none"),t.inert===i&&(t.inert=!i);const e=i?"false":"true";t.getAttribute("aria-hidden")!==e&&t.setAttribute("aria-hidden",e)},y=()=>{d||!E.current||n.hidden||t.inert||t.style.visibility!=="visible"||!l.current?.isConnected||l.current.closest('[hidden], [inert], [aria-hidden="true"]')||n.documentElement.hasAttribute("data-dv-dragging")||(R=t.contains(n.activeElement),Y.current?.())},j=()=>{t.contains(n.activeElement)||(R=!1)},ee=()=>{const i=l.current;if(!i?.isConnected||(r||(r=i.closest(".shell-work")??i.closest(".shell-host")??n.body,(r===n.body||a.getComputedStyle(r).position==="static")&&o("position","fixed"),r.appendChild(t),A?.observe(r)),x!==i&&(x&&A?.unobserve(x),A?.observe(i),x=i),!E.current||n.hidden||!r.isConnected))return f(),!1;const e=i.getBoundingClientRect();if(e.width<=0||e.height<=0)return f(),!1;let g=Math.max(0,e.left),C=Math.max(0,e.top),z=Math.min(a.innerWidth,e.right),O=Math.min(a.innerHeight,e.bottom),W=1,k="";N=!1;for(let s=i;s;s=s.parentElement){const u=a.getComputedStyle(s);if(s.hidden||u.display==="none"||u.visibility==="hidden"||u.visibility==="collapse")return f(),!1;(s.inert||s.getAttribute("aria-hidden")==="true")&&(N=!0),s!==r&&!s.contains(r)&&(W*=Number.parseFloat(u.opacity||"1"));const P=/\b(paint|strict|content)\b/.test(u.contain),q=P||K.test(u.overflowX||u.overflow),B=P||K.test(u.overflowY||u.overflow);if(!q&&!B)continue;const h=s.getBoundingClientRect(),V=M(h.width/s.offsetWidth),Z=M(h.height/s.offsetHeight),_=h.left+s.clientLeft*V,U=h.top+s.clientTop*Z,te=_+s.clientWidth*V,ie=U+s.clientHeight*Z;q&&(g=Math.max(g,_),z=Math.min(z,te)),B&&(C=Math.max(C,U),O=Math.min(O,ie)),!k&&q&&B&&Math.abs(h.left-e.left)<1&&Math.abs(h.top-e.top)<1&&Math.abs(h.right-e.right)<1&&Math.abs(h.bottom-e.bottom)<1&&(k=u.borderRadius)}if(z<=g||O<=C)return f(),!1;if(W<=0)return f(),!0;const S=r.getBoundingClientRect(),F=M(re(t)),H=t.style.position==="absolute",L=H?M(S.width/r.offsetWidth,F):F,w=H?M(S.height/r.offsetHeight,F):F;return o("left",m(H?(e.left-S.left)/L-r.clientLeft+r.scrollLeft:e.left/L)),o("top",m(H?(e.top-S.top)/w-r.clientTop+r.scrollTop:e.top/w)),o("width",m(e.width/L)),o("height",m(e.height/w)),o("clipPath",`inset(${m((C-e.top)/w)} ${m((e.right-z)/L)} ${m((e.bottom-O)/w)} ${m((g-e.left)/L)})`),o("borderRadius",k),o("opacity",String(W)),o("visibility","visible"),D(),!0},T=()=>{if(b=0,d)return;const i=ee(),e=t.contains(n.activeElement),g=e&&!R;R=e,g&&y(),i&&(b=a.requestAnimationFrame(T))},c=()=>{!d&&!b&&(b=a.requestAnimationFrame(T))},A=typeof ResizeObserver>"u"?null:new ResizeObserver(c),G=new MutationObserver(i=>{i.some(e=>e.target===n.documentElement&&e.attributeName==="data-dv-dragging")&&D(),i.some(e=>!t.contains(e.target))&&c()});return G.observe(n.documentElement,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["style","class","hidden","inert","aria-hidden","data-dv-dragging"]}),a.addEventListener("resize",c),n.addEventListener("scroll",c,!0),n.addEventListener("visibilitychange",c),a.addEventListener(J,c),t.addEventListener("focus",y,!0),t.addEventListener("pointerdown",y,!0),n.addEventListener("focus",j,!0),I.current=()=>{E.current||f(),c()},T(),()=>{d=!0,b&&a.cancelAnimationFrame(b),A?.disconnect(),G.disconnect(),a.removeEventListener("resize",c),n.removeEventListener("scroll",c,!0),n.removeEventListener("visibilitychange",c),a.removeEventListener(J,c),t.removeEventListener("focus",y,!0),t.removeEventListener("pointerdown",y,!0),n.removeEventListener("focus",j,!0),I.current=null,f();const i=++$.current;queueMicrotask(()=>{$.current===i&&t.remove()})}},[l,t]),v.useLayoutEffect(()=>{I.current?.()},[p]),ne.createPortal(Q,t)}export{ae as S};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as B,d as c,j as o,r as O}from"./index-B5UW6SaE.js";import{A as P}from"./astryxBridge-Bupzouso.js";import{jj as R,jR as U,jS as _,ju as F,jT as K,jU as z,dm as V,jV as Y,jW as W,ar as J,c6 as Q,jX as X,jQ as Z,jY as q,aE as G,jJ as ee,jD as te,jZ as oe,ah as se}from"./appStore-CidPWYa0.js";import{E as ne}from"./EventCard-c6s4uGBu.js";import"./client-CPUljePZ.js";import{C as E}from"./CheckboxInput-DVO2-1J7.js";import"./nativeDownload-B3JGkABw.js";import"./ipc-CNlIRMtU.js";import"./Tooltip-DXuy9-1_.js";O({"todolist.title":{zh:"待办",en:"To-dos"},"todolist.untitled":{zh:"未命名",en:"Untitled"},"todolist.done":{zh:"已完成",en:"Completed"},"todolist.openInNote":{zh:"在笔记中打开",en:"Open in note"},"todolist.clickToEdit":{zh:"点击编辑",en:"Click to edit"},"todolist.addPlaceholder":{zh:"新建待办",en:"New to-do"},"todolist.allDone":{zh:"全部完成了。",en:"All done."},"todolist.emptyTitle":{zh:"还没有待办。",en:"No to-dos yet."},"todolist.emptyHintA":{zh:"在笔记里写 ",en:"Write "},"todolist.emptyExample":{zh:"- [ ] 事项 @2026-09-01",en:"- [ ] Task @2026-09-01"},"todolist.emptyHintB":{zh:"(打 ",en:" in a note (type "},"todolist.emptyHintC":{zh:" 有候选),或在下面直接加一条。",en:" for suggestions), or add one below."},"todolist.emptyHintCNoAdd":{zh:" 有候选)。",en:" for suggestions)."}});const M="done";function ae(h){const l=i=>typeof i=="string"?i:typeof i=="number"?String(i):"",a=l(h?.src);return{db:l(h?.db)||void 0,src:a==="db"||a==="md"?a:"all"}}function xe({params:h}={}){const l=ae(h),{t:a}=B(),i=R(),C=U(),[T,I]=c.useState(new Set([..._,M])),[m,N]=c.useState(null),[k,j]=c.useState(""),x=c.useMemo(()=>F(new Date),[]),u=c.useMemo(()=>i.filter(e=>e.checkboxCol&&(!l.db||e.db.path===l.db)),[i,l.db]),r=c.useMemo(()=>{const e=[];if(l.src!=="md")for(const t of u){const s=t.checkboxCol;for(const n of t.db.rows){const d=typeof n.cells[t.dateCol]=="string"?n.cells[t.dateCol]:"";e.push({key:`db:${t.db.path}:${n.rowId}`,name:n.name||a("todolist.untitled"),checked:n.cells[s]===!0,raw:d,source:t.db.name,db:t,rowId:n.rowId})}}if(l.src!=="db"&&!l.db)for(const t of C.filter(s=>s.isTask))e.push({key:`md:${t.path}:${t.line}`,name:t.text,checked:t.checked,raw:t.due,source:t.heading?`${t.title} › ${t.heading}`:t.title,note:{path:t.path,heading:t.heading},mark:t});return e},[u,C,l.src,l.db,a]),f=c.useMemo(()=>r.filter(e=>e.checked),[r]),D=c.useMemo(()=>{const e=new Map;for(const t of r){if(t.checked)continue;const s=K(t.raw,x),n=e.get(s);n?n.push(t):e.set(s,[t])}for(const t of e.values())t.sort((s,n)=>{const d=z(s.raw),v=z(n.raw);return(d===v?0:d<v?-1:1)||s.source.localeCompare(n.source,"zh")||s.name.localeCompare(n.name,"zh")});return e},[r,x]),b=r.length-f.length,A=e=>I(t=>{const s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s}),w=c.useMemo(()=>{if(!m)return null;const e=u.find(n=>n.db.path===m.dbPath),t=e?.db.rows.find(n=>n.rowId===m.rowId);if(!e||!t)return null;const s=typeof t.cells[e.dateCol]=="string"?t.cells[e.dateCol]:"";return{db:e.db,row:t,colId:e.dateCol,title:t.name,raw:s}},[m,u]),p=c.useMemo(()=>u.find(e=>!e.db.readonly&&!e.db.isNoteView),[u]),H=()=>{const e=k.trim();!e||!p||(ee(p.db,p.dateCol,te(x,!0),e),j(""))},S=(e,t)=>{if(e.note){oe(e.note.path,e.note.heading);return}if(!e.db||!e.rowId)return;const s=t.currentTarget.getBoundingClientRect();N({dbPath:e.db.db.path,rowId:e.rowId,at:{left:s.left,top:s.top,right:s.right,bottom:s.bottom,zoom:se(t.currentTarget)||1}})},$=!!V?.patchMark,g=e=>{const t=X(e.raw,x);return o.jsxs("li",{className:"amx-todo-item",children:[e.db&&e.rowId?o.jsx(E,{label:e.name,isLabelHidden:!0,size:"sm",value:e.checked,onChange:s=>Z(e.db.db,e.rowId,e.db.checkboxCol,s?!0:void 0)}):e.mark&&$?o.jsx(E,{label:e.name,isLabelHidden:!0,size:"sm",value:e.checked,onChange:s=>q(e.mark,{checked:s})}):o.jsx("span",{className:`amx-todo-box${e.checked?" on":""}`,"aria-hidden":"true"}),o.jsxs("button",{className:"amx-todo-main",title:e.note?a("todolist.openInNote"):a("todolist.clickToEdit"),onClick:s=>S(e,s),children:[o.jsx("span",{className:`amx-todo-name${e.checked?" done":""}`,children:e.name}),e.raw?o.jsx("span",{className:`amx-todo-due ${t.tone}`,children:t.label}):null,e.note?o.jsx(G,{className:"amx-todo-jump",size:12}):null]})]},e.key)},L=(e,t)=>{if(e!=="undated")return o.jsx("ul",{className:"amx-todo-list",children:t.map(g)});const s=[];for(const n of t){const d=s[s.length-1];d&&d.source===n.source?d.items.push(n):s.push({source:n.source,items:[n]})}return o.jsx(o.Fragment,{children:s.map(n=>o.jsxs("div",{children:[o.jsxs("div",{className:"amx-todo-src",children:[n.source,o.jsx("span",{className:"amx-todo-srcn",children:n.items.length})]}),o.jsx("ul",{className:"amx-todo-list",children:n.items.map(g)})]},n.source))})},y=(e,t,s,n)=>{const d=!T.has(e);return o.jsxs("section",{className:"amx-todo-group",children:[o.jsxs("button",{className:`amx-todo-ghead${d?" is-open":""}`,onClick:()=>A(e),"aria-expanded":d,children:[o.jsx(Q,{className:"amx-todo-caret",size:12}),o.jsx("span",{className:"amx-todo-gname",children:t}),o.jsx("span",{className:"amx-todo-gcount",children:s.length})]}),o.jsx("div",{className:`amx-todo-reveal${d?" is-open":""}`,children:o.jsx("div",{className:"amx-todo-reveal-in",children:n})})]},e)};return o.jsx(P,{children:o.jsxs("div",{className:"amx-todo",children:[o.jsxs("div",{className:"amx-todo-bar",children:[o.jsx("span",{className:"amx-todo-title",children:a("todolist.title")}),b>0&&o.jsx("span",{className:"amx-todo-total",children:b})]}),r.length===0&&o.jsxs("div",{className:"amx-todo-empty",children:[a("todolist.emptyTitle"),!h?.miniSurface&&o.jsxs(o.Fragment,{children:[o.jsx("br",{}),a("todolist.emptyHintA"),o.jsx("code",{children:a("todolist.emptyExample")}),a("todolist.emptyHintB"),o.jsx("code",{children:"@"}),a(p?"todolist.emptyHintC":"todolist.emptyHintCNoAdd")]})]}),r.length>0&&b===0&&o.jsx("div",{className:"amx-todo-empty",children:a("todolist.allDone")}),Y.map(e=>{const t=D.get(e);return t&&t.length?y(e,W[e],t,L(e,t)):null}),f.length>0&&y(M,a("todolist.done"),f,o.jsx("ul",{className:"amx-todo-list",children:f.map(g)})),p&&o.jsxs("div",{className:"amx-todo-add",children:[o.jsx(J,{className:"amx-todo-addicon",size:13}),o.jsx("input",{className:"amx-todo-addinput",placeholder:a("todolist.addPlaceholder"),value:k,onChange:e=>j(e.target.value),onKeyDown:e=>{e.nativeEvent.isComposing||(e.key==="Enter"&&(e.preventDefault(),H()),e.key==="Escape"&&j(""))}})]}),w&&m&&o.jsx(ne,{ev:w,at:m.at,onClose:()=>N(null)})]})})}export{xe as TodoListView,ae as readTodoParams};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as l,j as o}from"./index-
|
|
1
|
+
import{d as l,j as o}from"./index-B5UW6SaE.js";import{u as E,c as f}from"./astryxBridge-Bupzouso.js";import"./appStore-CidPWYa0.js";import"./nativeDownload-B3JGkABw.js";import"./ipc-CNlIRMtU.js";import"./client-CPUljePZ.js";function N(r){return typeof r=="string"||typeof r=="number"}function p(...r){const i=r.filter(Boolean);return i.length>0?i.join(" "):void 0}function F({children:r,anchorRef:i,content:n,placement:y="above",alignment:m="center",delay:x=200,hideDelay:j=0,focusTrigger:g="auto",isEnabled:A=!0,onOpenChange:d,hasHoverIndication:b="auto",isOpen:B,isDefaultOpen:T}){const c=l.useRef(null),u=r!=null?N(r):!1,v=b===!0||b==="auto"&&u,w=l.useCallback(()=>{d?.(!0)},[d]),k=l.useCallback(()=>{d?.(!1)},[d]),e=E({placement:y,alignment:m,delay:x,hideDelay:j,focusTrigger:g,isEnabled:A,isOpen:B,isDefaultOpen:T,onShow:w,onHide:k});return f(()=>{if(!i)return;const s=i.current;if(!s)return;e.ref(s);const t=s.getAttribute("aria-describedby");return s.setAttribute("aria-describedby",p(t,e.describedBy)??""),()=>{e.ref(null),t?s.setAttribute("aria-describedby",t):s.removeAttribute("aria-describedby")}},[i,e.ref,e.describedBy]),f(()=>{if(i||u)return;const s=c.current;if(!s)return;const t=s.firstElementChild;if(!t)return;e.ref(t);const a=t.getAttribute("aria-describedby");return t.setAttribute("aria-describedby",p(a,e.describedBy)??""),()=>{e.ref(null),a?t.setAttribute("aria-describedby",a):t.removeAttribute("aria-describedby")}},[i,u,e.ref,e.describedBy]),i&&r==null?o.jsx(o.Fragment,{children:e.renderTooltip(n)}):u?o.jsxs(o.Fragment,{children:[o.jsx("span",{ref:e.ref,tabIndex:0,"aria-describedby":e.describedBy,...{0:{className:"xt0psk2"},1:{className:"xt0psk2 xujl8zx xev0dqp xycaml9 xrys4gj"}}[!!v<<0],children:r}),e.renderTooltip(n)]}):o.jsxs(o.Fragment,{children:[o.jsx("div",{ref:c,className:"xjp7ctv",children:r}),e.renderTooltip(n)]})}F.displayName="Tooltip";export{F as Tooltip};
|