zcw-shared 2.25.0 → 2.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/README.md +73 -13
  2. package/dist/functions/ai/buildResolvedLlmToolsList.d.ts +0 -1
  3. package/dist/functions/ai/buildResolvedLlmToolsList.js +0 -1
  4. package/dist/functions/ai/buildResolvedLlmToolsList.js.map +1 -1
  5. package/dist/functions/array/filterListExcludingIds.d.ts +0 -1
  6. package/dist/functions/array/filterListExcludingIds.js +0 -1
  7. package/dist/functions/array/filterListExcludingIds.js.map +1 -1
  8. package/dist/functions/browser/readBrowserAppendToBodyDeps.d.ts +3 -0
  9. package/dist/functions/browser/readBrowserAppendToBodyDeps.js +8 -0
  10. package/dist/functions/browser/readBrowserAppendToBodyDeps.js.map +1 -0
  11. package/dist/functions/browser/readBrowserDetectDeps.d.ts +2 -0
  12. package/dist/functions/browser/readBrowserDetectDeps.js +8 -5
  13. package/dist/functions/browser/readBrowserDetectDeps.js.map +1 -1
  14. package/dist/functions/browser/readBrowserHost.d.ts +57 -0
  15. package/dist/functions/browser/readBrowserHost.js +61 -0
  16. package/dist/functions/browser/readBrowserHost.js.map +1 -0
  17. package/dist/functions/browser/readBrowserImageCompressDeps.d.ts +2 -0
  18. package/dist/functions/browser/readBrowserImageCompressDeps.js +13 -10
  19. package/dist/functions/browser/readBrowserImageCompressDeps.js.map +1 -1
  20. package/dist/functions/browser/readBrowserLassoSelectionEnvironment.d.ts +4 -0
  21. package/dist/functions/browser/readBrowserLassoSelectionEnvironment.js +23 -0
  22. package/dist/functions/browser/readBrowserLassoSelectionEnvironment.js.map +1 -0
  23. package/dist/functions/browser/readBrowserVueHookDeps.d.ts +14 -0
  24. package/dist/functions/browser/readBrowserVueHookDeps.js +85 -0
  25. package/dist/functions/browser/readBrowserVueHookDeps.js.map +1 -0
  26. package/dist/functions/browser/requireBrowserLocalStorage.d.ts +2 -1
  27. package/dist/functions/browser/requireBrowserLocalStorage.js +3 -6
  28. package/dist/functions/browser/requireBrowserLocalStorage.js.map +1 -1
  29. package/dist/functions/chat/chatAppearancePrefs.d.ts +6 -1
  30. package/dist/functions/chat/chatAppearancePrefs.js +6 -4
  31. package/dist/functions/chat/chatAppearancePrefs.js.map +1 -1
  32. package/dist/functions/chat/createBrowserChatAppearanceModeAccess.d.ts +2 -1
  33. package/dist/functions/chat/createBrowserChatAppearanceModeAccess.js +8 -11
  34. package/dist/functions/chat/createBrowserChatAppearanceModeAccess.js.map +1 -1
  35. package/dist/functions/chat/createBrowserChatDownloadDirectoryPrefAccess.d.ts +2 -1
  36. package/dist/functions/chat/createBrowserChatDownloadDirectoryPrefAccess.js +12 -12
  37. package/dist/functions/chat/createBrowserChatDownloadDirectoryPrefAccess.js.map +1 -1
  38. package/dist/functions/chat/createBrowserChatFileMessageLocalPathAccess.d.ts +2 -1
  39. package/dist/functions/chat/createBrowserChatFileMessageLocalPathAccess.js +7 -14
  40. package/dist/functions/chat/createBrowserChatFileMessageLocalPathAccess.js.map +1 -1
  41. package/dist/functions/chat/createBrowserChatRootFontSizeAccess.d.ts +2 -1
  42. package/dist/functions/chat/createBrowserChatRootFontSizeAccess.js +14 -13
  43. package/dist/functions/chat/createBrowserChatRootFontSizeAccess.js.map +1 -1
  44. package/dist/functions/cloudDisk/collectElementIdsInContentLassoBox.d.ts +1 -19
  45. package/dist/functions/cloudDisk/collectElementIdsInContentLassoBox.js +1 -34
  46. package/dist/functions/cloudDisk/collectElementIdsInContentLassoBox.js.map +1 -1
  47. package/dist/functions/cloudDisk/createBrowserCloudDiskPrivacyStorageAccess.d.ts +2 -1
  48. package/dist/functions/cloudDisk/createBrowserCloudDiskPrivacyStorageAccess.js +11 -19
  49. package/dist/functions/cloudDisk/createBrowserCloudDiskPrivacyStorageAccess.js.map +1 -1
  50. package/dist/functions/cloudDisk/createBrowserCloudDiskQuickAccessStorageAccess.d.ts +2 -1
  51. package/dist/functions/cloudDisk/createBrowserCloudDiskQuickAccessStorageAccess.js +7 -11
  52. package/dist/functions/cloudDisk/createBrowserCloudDiskQuickAccessStorageAccess.js.map +1 -1
  53. package/dist/functions/dom/appTheme.d.ts +10 -0
  54. package/dist/functions/dom/appTheme.js +11 -0
  55. package/dist/functions/dom/appTheme.js.map +1 -0
  56. package/dist/functions/dom/copyHtmlAndPlainToClipboard.d.ts +3 -1
  57. package/dist/functions/dom/copyHtmlAndPlainToClipboard.js +14 -10
  58. package/dist/functions/dom/copyHtmlAndPlainToClipboard.js.map +1 -1
  59. package/dist/functions/dom/copyTextToClipboard.d.ts +3 -1
  60. package/dist/functions/dom/copyTextToClipboard.js +5 -4
  61. package/dist/functions/dom/copyTextToClipboard.js.map +1 -1
  62. package/dist/functions/dom/createTooltipLongPressHandlers.d.ts +24 -0
  63. package/dist/functions/dom/createTooltipLongPressHandlers.js +84 -0
  64. package/dist/functions/dom/createTooltipLongPressHandlers.js.map +1 -0
  65. package/dist/functions/dom/domDocumentSelection.d.ts +4 -0
  66. package/dist/functions/dom/domDocumentSelection.js +39 -0
  67. package/dist/functions/dom/domDocumentSelection.js.map +1 -0
  68. package/dist/functions/dom/domSelectionInElement.d.ts +4 -3
  69. package/dist/functions/dom/domSelectionInElement.js +10 -10
  70. package/dist/functions/dom/domSelectionInElement.js.map +1 -1
  71. package/dist/functions/dom/fetchBlobFromUrl.d.ts +7 -1
  72. package/dist/functions/dom/fetchBlobFromUrl.js +7 -5
  73. package/dist/functions/dom/fetchBlobFromUrl.js.map +1 -1
  74. package/dist/functions/dom/fileDrag.d.ts +11 -0
  75. package/dist/functions/dom/fileDrag.js +14 -0
  76. package/dist/functions/dom/fileDrag.js.map +1 -0
  77. package/dist/functions/dom/imageBlobToPng.d.ts +5 -4
  78. package/dist/functions/dom/imageBlobToPng.js +23 -16
  79. package/dist/functions/dom/imageBlobToPng.js.map +1 -1
  80. package/dist/functions/dom/lassoSelection.d.ts +84 -0
  81. package/dist/functions/dom/lassoSelection.js +199 -0
  82. package/dist/functions/dom/lassoSelection.js.map +1 -0
  83. package/dist/functions/dom/readBrowserDomDeps.d.ts +41 -0
  84. package/dist/functions/dom/readBrowserDomDeps.js +63 -0
  85. package/dist/functions/dom/readBrowserDomDeps.js.map +1 -0
  86. package/dist/functions/dom/resolveOverlayTeleportParent.d.ts +7 -0
  87. package/dist/functions/dom/resolveOverlayTeleportParent.js +11 -0
  88. package/dist/functions/dom/resolveOverlayTeleportParent.js.map +1 -0
  89. package/dist/functions/dom/safeBrowserDom.d.ts +17 -0
  90. package/dist/functions/dom/safeBrowserDom.js +42 -0
  91. package/dist/functions/dom/safeBrowserDom.js.map +1 -0
  92. package/dist/functions/dom/writeImageBlobToClipboard.d.ts +5 -1
  93. package/dist/functions/dom/writeImageBlobToClipboard.js +8 -5
  94. package/dist/functions/dom/writeImageBlobToClipboard.js.map +1 -1
  95. package/dist/functions/download/createBrowserDownloadDepsFromGlobalThis.d.ts +2 -0
  96. package/dist/functions/download/createBrowserDownloadDepsFromGlobalThis.js +9 -10
  97. package/dist/functions/download/createBrowserDownloadDepsFromGlobalThis.js.map +1 -1
  98. package/dist/functions/file/isJpegImageFile.d.ts +0 -1
  99. package/dist/functions/file/isJpegImageFile.js +0 -1
  100. package/dist/functions/file/isJpegImageFile.js.map +1 -1
  101. package/dist/functions/im/assignChatConversationToWindowLocation.d.ts +5 -1
  102. package/dist/functions/im/assignChatConversationToWindowLocation.js +5 -4
  103. package/dist/functions/im/assignChatConversationToWindowLocation.js.map +1 -1
  104. package/dist/functions/im/copyUsingClonedRangesOrMessagePlainText.d.ts +5 -1
  105. package/dist/functions/im/copyUsingClonedRangesOrMessagePlainText.js +11 -8
  106. package/dist/functions/im/copyUsingClonedRangesOrMessagePlainText.js.map +1 -1
  107. package/dist/functions/im/executeCopyChatMessageContent.d.ts +4 -1
  108. package/dist/functions/im/executeCopyChatMessageContent.js +6 -3
  109. package/dist/functions/im/executeCopyChatMessageContent.js.map +1 -1
  110. package/dist/functions/im/imBubbleSelectionClipboard.d.ts +2 -1
  111. package/dist/functions/im/imBubbleSelectionClipboard.js +10 -11
  112. package/dist/functions/im/imBubbleSelectionClipboard.js.map +1 -1
  113. package/dist/functions/im/imChatMessagePagination.d.ts +0 -1
  114. package/dist/functions/im/imChatMessagePagination.js +0 -1
  115. package/dist/functions/im/imChatMessagePagination.js.map +1 -1
  116. package/dist/functions/im/imImagePixelExtra.d.ts +0 -1
  117. package/dist/functions/im/imImagePixelExtra.js +0 -1
  118. package/dist/functions/im/imImagePixelExtra.js.map +1 -1
  119. package/dist/functions/im/imOrchestrationTypes.d.ts +5 -0
  120. package/dist/functions/im/imOrchestrationTypes.js +2 -0
  121. package/dist/functions/im/imOrchestrationTypes.js.map +1 -0
  122. package/dist/functions/im/imOutboundMediaHelpers.d.ts +7 -1
  123. package/dist/functions/im/imOutboundMediaHelpers.js +15 -7
  124. package/dist/functions/im/imOutboundMediaHelpers.js.map +1 -1
  125. package/dist/functions/im/index.d.ts +2 -2
  126. package/dist/functions/im/index.js +2 -2
  127. package/dist/functions/im/index.js.map +1 -1
  128. package/dist/functions/im/newImClientMessageIdFromBrowser.d.ts +4 -3
  129. package/dist/functions/im/newImClientMessageIdFromBrowser.js +7 -15
  130. package/dist/functions/im/newImClientMessageIdFromBrowser.js.map +1 -1
  131. package/dist/functions/number/clampIndex.d.ts +1 -0
  132. package/dist/functions/number/clampIndex.js +6 -0
  133. package/dist/functions/number/clampIndex.js.map +1 -0
  134. package/dist/functions/release/capacitorOtaReleaseManifestFetch.d.ts +2 -1
  135. package/dist/functions/release/capacitorOtaReleaseManifestFetch.js +3 -2
  136. package/dist/functions/release/capacitorOtaReleaseManifestFetch.js.map +1 -1
  137. package/dist/functions/release/capacitorReleaseManifestFetch.d.ts +2 -1
  138. package/dist/functions/release/capacitorReleaseManifestFetch.js +3 -2
  139. package/dist/functions/release/capacitorReleaseManifestFetch.js.map +1 -1
  140. package/dist/functions/release/capacitorUpdateDefaults.d.ts +4 -0
  141. package/dist/functions/release/capacitorUpdateDefaults.js +10 -10
  142. package/dist/functions/release/capacitorUpdateDefaults.js.map +1 -1
  143. package/dist/functions/release/createCapacitorUpdateFetchDeps.js +13 -7
  144. package/dist/functions/release/createCapacitorUpdateFetchDeps.js.map +1 -1
  145. package/dist/functions/release/createReleaseManifestFetchDeps.d.ts +1 -2
  146. package/dist/functions/release/createReleaseManifestFetchDeps.js +5 -10
  147. package/dist/functions/release/createReleaseManifestFetchDeps.js.map +1 -1
  148. package/dist/functions/release/electronReleaseManifestFetch.d.ts +4 -1
  149. package/dist/functions/release/electronReleaseManifestFetch.js +12 -7
  150. package/dist/functions/release/electronReleaseManifestFetch.js.map +1 -1
  151. package/dist/functions/release/isCapacitorWebViewOnViteDevServer.js +4 -4
  152. package/dist/functions/release/isCapacitorWebViewOnViteDevServer.js.map +1 -1
  153. package/dist/functions/release/readBrowserReleaseDeps.d.ts +14 -0
  154. package/dist/functions/release/readBrowserReleaseDeps.js +19 -0
  155. package/dist/functions/release/readBrowserReleaseDeps.js.map +1 -0
  156. package/dist/functions/release/releaseUpdateDismissSession.d.ts +3 -2
  157. package/dist/functions/release/releaseUpdateDismissSession.js +10 -7
  158. package/dist/functions/release/releaseUpdateDismissSession.js.map +1 -1
  159. package/dist/functions/release/verifyHttpContentLength.d.ts +2 -0
  160. package/dist/functions/release/verifyHttpContentLength.js +4 -1
  161. package/dist/functions/release/verifyHttpContentLength.js.map +1 -1
  162. package/dist/functions/storage/createBrowserSessionStorageKit.d.ts +12 -0
  163. package/dist/functions/storage/createBrowserSessionStorageKit.js +16 -0
  164. package/dist/functions/storage/createBrowserSessionStorageKit.js.map +1 -0
  165. package/dist/functions/storage/createBrowserStringStorageKit.d.ts +12 -0
  166. package/dist/functions/storage/createBrowserStringStorageKit.js +14 -0
  167. package/dist/functions/storage/createBrowserStringStorageKit.js.map +1 -0
  168. package/dist/functions/wallet/createBrowserWalletPayPasswordSessionAccess.d.ts +2 -1
  169. package/dist/functions/wallet/createBrowserWalletPayPasswordSessionAccess.js +5 -9
  170. package/dist/functions/wallet/createBrowserWalletPayPasswordSessionAccess.js.map +1 -1
  171. package/dist/permissions/catalog.d.ts +4 -0
  172. package/dist/permissions/catalog.js +22 -0
  173. package/dist/permissions/catalog.js.map +1 -1
  174. package/dist/vue-hooks/browser/useBrowserFileObjectUrlMap.d.ts +7 -0
  175. package/dist/vue-hooks/browser/useBrowserFileObjectUrlMap.js +7 -0
  176. package/dist/vue-hooks/browser/useBrowserFileObjectUrlMap.js.map +1 -0
  177. package/dist/vue-hooks/browser/useFileObjectUrlMap.d.ts +19 -0
  178. package/dist/vue-hooks/browser/useFileObjectUrlMap.js +46 -0
  179. package/dist/vue-hooks/browser/useFileObjectUrlMap.js.map +1 -0
  180. package/dist/vue-hooks/dom/useBrowserFocusVisible.d.ts +9 -0
  181. package/dist/vue-hooks/dom/useBrowserFocusVisible.js +8 -0
  182. package/dist/vue-hooks/dom/useBrowserFocusVisible.js.map +1 -0
  183. package/dist/vue-hooks/dom/useBrowserLassoSelection.d.ts +16 -0
  184. package/dist/vue-hooks/dom/useBrowserLassoSelection.js +7 -0
  185. package/dist/vue-hooks/dom/useBrowserLassoSelection.js.map +1 -0
  186. package/dist/vue-hooks/dom/useFocusVisible.d.ts +17 -0
  187. package/dist/vue-hooks/dom/useFocusVisible.js +53 -0
  188. package/dist/vue-hooks/dom/useFocusVisible.js.map +1 -0
  189. package/dist/vue-hooks/dom/useLassoSelection.d.ts +53 -0
  190. package/dist/vue-hooks/dom/useLassoSelection.js +244 -0
  191. package/dist/vue-hooks/dom/useLassoSelection.js.map +1 -0
  192. package/dist/vue-hooks/time/useBrowserDelayedTrue.d.ts +2 -0
  193. package/dist/vue-hooks/time/useBrowserDelayedTrue.js +7 -0
  194. package/dist/vue-hooks/time/useBrowserDelayedTrue.js.map +1 -0
  195. package/dist/vue-hooks/time/useDelayedTrue.d.ts +11 -0
  196. package/dist/vue-hooks/time/useDelayedTrue.js +29 -0
  197. package/dist/vue-hooks/time/useDelayedTrue.js.map +1 -0
  198. package/package.json +29 -2
  199. package/types/component-material.d.ts +40 -0
  200. package/types/lowcode.d.ts +63 -0
  201. package/types/rbac.d.ts +0 -3
  202. package/types/vue.d.ts +9 -1
  203. package/dist/functions/file/extractVideoCover.d.ts +0 -6
  204. package/dist/functions/file/extractVideoCover.js +0 -57
  205. package/dist/functions/file/extractVideoCover.js.map +0 -1
  206. package/dist/functions/im/imInlineContentTokens.d.ts +0 -49
  207. package/dist/functions/im/imInlineContentTokens.js +0 -185
  208. package/dist/functions/im/imInlineContentTokens.js.map +0 -1
  209. package/dist/functions/im/materializeUploadFileFromMediaBlobRecord.d.ts +0 -7
  210. package/dist/functions/im/materializeUploadFileFromMediaBlobRecord.js +0 -10
  211. package/dist/functions/im/materializeUploadFileFromMediaBlobRecord.js.map +0 -1
  212. package/dist/functions/im/parseImMentionSegments.d.ts +0 -19
  213. package/dist/functions/im/parseImMentionSegments.js +0 -92
  214. package/dist/functions/im/parseImMentionSegments.js.map +0 -1
  215. package/dist/functions/image/compressImageToWidth.d.ts +0 -12
  216. package/dist/functions/image/compressImageToWidth.js +0 -44
  217. package/dist/functions/image/compressImageToWidth.js.map +0 -1
  218. package/dist/functions/image/compressJpgToTargetSize.d.ts +0 -13
  219. package/dist/functions/image/compressJpgToTargetSize.js +0 -132
  220. package/dist/functions/image/compressJpgToTargetSize.js.map +0 -1
  221. package/dist/functions/image/compressToTargetSize.d.ts +0 -13
  222. package/dist/functions/image/compressToTargetSizeJpg.d.ts +0 -13
  223. package/dist/functions/image/compressToTargetSizeJpg.js +0 -132
  224. package/dist/functions/image/compressToTargetSizeJpg.js.map +0 -1
  225. package/dist/permissions/allPermissionCode.js.map +0 -1
  226. package/dist/permissions/definePermissionGroup.js.map +0 -1
  227. package/dist/permissions/groups.js.map +0 -1
package/README.md CHANGED
@@ -167,15 +167,6 @@ export interface MyFunctionDeps {
167
167
  import type { Ref } from '../../references/vue.d' // Vue 没有 references 文件
168
168
  ```
169
169
 
170
- #### 规则 7:存储能力统一通过 `useStorage`
171
-
172
- - 不允许直接依赖 `localStorage` / `sessionStorage` 等同步 API
173
- - 必须组合 `useStorage` 与具体适配器(如 `useLocalStorage`、`useSessionStorage`、`useStorageWithIndexedDB`)创建 `storage` 对象
174
- - Env 类型统一定义为 `ReturnType<typeof useStorage<string>>`(或自定义 value 类型)
175
- - 在实现中仅使用 `storage.get/set/remove/clear` 等 Promise API,避免混用同步方法
176
- - 文档站中的 VitePress 交互示例同样需要使用 `useStorage` 与适配器,确保行为与生产代码一致
177
- - **多表结构化 IndexedDB**(多 object store、复合索引、`transaction`)可使用 **`useDexieShortcuts`**:将 `Dexie` 构造器与 `indexedDB` 注入 `deps`,应用侧安装 peer 依赖 **`dexie`**(版本范围见 `package.json` 的 `peerDependencies`)。详见 `docs/api/storage/useDexieShortcuts.md`。
178
-
179
170
  #### 规则 5:每个函数维护自己完整的依赖,不要分散
180
171
 
181
172
  ```typescript
@@ -270,6 +261,71 @@ export interface DeployTCBDeps {
270
261
  }
271
262
  ```
272
263
 
264
+ #### 规则 7:存储能力统一通过 `useStorage`
265
+
266
+ - 不允许直接依赖 `localStorage` / `sessionStorage` 等同步 API
267
+ - 必须组合 `useStorage` 与具体适配器(如 `useLocalStorage`、`useSessionStorage`、`useStorageWithIndexedDB`)创建 `storage` 对象
268
+ - Env 类型统一定义为 `ReturnType<typeof useStorage<string>>`(或自定义 value 类型)
269
+ - 在实现中仅使用 `storage.get/set/remove/clear` 等 Promise API,避免混用同步方法
270
+ - 文档站中的 VitePress 交互示例同样需要使用 `useStorage` 与适配器,确保行为与生产代码一致
271
+ - **多表结构化 IndexedDB**(多 object store、复合索引、`transaction`)可使用 **`useDexieShortcuts`**:将 `Dexie` 构造器与 `indexedDB` 注入 `deps`,应用侧安装 peer 依赖 **`dexie`**(版本范围见 `package.json` 的 `peerDependencies`)。详见 `docs/api/storage/useDexieShortcuts.md`。
272
+
273
+ #### 规则 8:浏览器宿主绑定层统一通过 `readBrowserHost`
274
+
275
+ - 库内函数**不得**直接访问 `globalThis` / `window` / `document` / `localStorage`
276
+ - 应用边界通过 `readBrowserHostFromGlobalThis()` 读取宿主,组装为 `ReadBrowserHostDeps` 后向下传递
277
+ - `readBrowser*` / `createBrowser*` / `useBrowser*` 系列是**唯一**允许在内部调用 `readBrowserHostFromGlobalThis()` 的便捷封装,供 Web 宿主直引
278
+ - `useBrowser*` Hook 可在绑定层直接 `import { ref, watch } from 'vue'`(与 Vue SFC 同级,属于应用边界)
279
+ - 浏览器存储统一经 `createBrowserStringStorageKit` / `createBrowserSessionStorageKit` 组合 `useStorage` + 适配器;写入只用 `storage.set/remove`,同步 bootstrap 读可经 `backingStorage`
280
+ - 新增浏览器绑定逻辑时,优先在 `src/functions/browser/readBrowserHost.ts` 扩展 `BrowserHostSnapshot`,不要在业务模块重复读取全局对象
281
+
282
+ ```typescript
283
+ import {
284
+ readBrowserHostDepsFromGlobalThis,
285
+ requireBrowserHostLocalStorage,
286
+ type ReadBrowserHostDeps,
287
+ } from '../browser/readBrowserHost'
288
+
289
+ export function createBrowserExampleAccess(
290
+ hostDeps: ReadBrowserHostDeps = readBrowserHostDepsFromGlobalThis(),
291
+ ) {
292
+ return {
293
+ read(): string {
294
+ return requireBrowserHostLocalStorage(hostDeps).getItem('key') ?? ''
295
+ },
296
+ }
297
+ }
298
+ ```
299
+
300
+ #### 规则 9:编排类函数拆分 `{Name}Input` 与 `{Name}Deps`
301
+
302
+ 面向业务流程的编排函数(如 IM 复制、转发、媒体出站)允许将参数拆为两层:
303
+
304
+ - **`{Name}Input`**:业务数据 + 由调用方实现的 I/O 回调(如 `copyImagePixels`)
305
+ - **`{Name}Deps`**:环境能力(`document`、`setTimeout`、`URL` 等),第二参数传入;Web 宿主可使用 `readBrowserHost*` 默认注入
306
+
307
+ ```typescript
308
+ export type ExecuteExampleInput = {
309
+ messageId: string
310
+ persist: (id: string) => Promise<void>
311
+ }
312
+
313
+ export interface ExecuteExampleDeps {
314
+ document?: Document
315
+ }
316
+
317
+ export async function executeExample(
318
+ input: ExecuteExampleInput,
319
+ deps: ExecuteExampleDeps = {
320
+ document: readBrowserHostDocument(readBrowserHostDepsFromGlobalThis()),
321
+ },
322
+ ) {
323
+ // input 承载业务数据与回调,deps 承载环境 API
324
+ }
325
+ ```
326
+
327
+ 纯数据变换函数可只使用 `{Name}Deps` 或单一 `options`;命名与约定见 `src/functions/im/imOrchestrationTypes.ts`。
328
+
273
329
  #### 完整示例
274
330
 
275
331
  ```typescript
@@ -703,15 +759,15 @@ npm run publish:major # 主要版本
703
759
 
704
760
  1. **不导入第三方库运行时函数**:不直接 `import { ref } from 'vue'`,而是通过 `env` 对象传入
705
761
  2. **Vue 类型特殊规则**:Vue 类型只能使用 `import type {} from 'vue'` 导入,不能从 `references/` 导入
706
- 3. **不依赖全局对象**:不直接使用 `window`、`document`、`global`
707
- 4. **接口命名规范**:`{FunctionName}Deps`,例如 `BuildProjectDeps`、`ModifyManifestDeps`
762
+ 3. **不依赖全局对象**:不直接使用 `window`、`document`、`global`;浏览器宿主统一经 `readBrowserHost`(规则 8)
763
+ 4. **接口命名规范**:`{FunctionName}Deps` 或编排函数的 `{FunctionName}Input` + `{FunctionName}Deps`
708
764
  5. **使用 deps. 前缀**:所有依赖访问都使用 `deps.methodName()`,不解构
709
765
 
710
766
  ### 快速检查清单
711
767
 
712
768
  在编写新函数或修改现有函数时,快速检查以下要点:
713
769
 
714
- **✅ 6大核心规则:**
770
+ **✅ 9 大核心规则:**
715
771
  1. ❌ 不直接导入第三方库运行时函数 → ✅ 从 `references/` 导入类型(Vue 类型除外)
716
772
  2. ❌ Vue 类型不能从 `references/` 导入 → ✅ 只能使用 `import type {} from 'vue'`
717
773
  3. ❌ 不传入整个模块对象 → ✅ 只传入实际使用的函数
@@ -719,10 +775,14 @@ npm run publish:major # 主要版本
719
775
  5. ❌ 不重复定义类型 → ✅ 使用 `Interface['method']` 提取
720
776
  6. ❌ 不分散依赖到多个参数 → ✅ 统一的 `Deps` 接口
721
777
  7. ❌ 第三方 SDK 也不能整个传入 → ✅ Vue、Wx 等也要拆分
778
+ 8. ❌ 业务代码不直接读 `globalThis` → ✅ 经 `readBrowserHost` / `readBrowser*` 绑定层注入
779
+ 9. ❌ 编排函数混用环境与业务参数 → ✅ `{Name}Input` + `{Name}Deps` 分层(见规则 9)
722
780
 
723
781
  **✅ 命名规范:**
724
782
  - 函数依赖接口:`{FunctionName}Deps`
783
+ - 编排函数业务入参:`{FunctionName}Input`
725
784
  - Hook 环境接口:`{HookName}Environment`
785
+ - 浏览器绑定便捷函数:`readBrowser*` / `createBrowser*` / `useBrowser*`
726
786
  - Playground 组件:`{FunctionName}Playground.vue`
727
787
 
728
788
  **✅ 文档完整性:**
@@ -1519,7 +1579,7 @@ p {
1519
1579
  添加新函数后,必须确认:
1520
1580
 
1521
1581
  - [ ] 函数文档已创建(`docs/api/category/functionName.md`)
1522
- - [ ] 文档包含所有必需部分(Playground、导入、类型、说明、示例、注意事项)
1582
+ - [ ] 文档包含所有必需部分(函数描述、函数签名、参数表、返回值、工作原理;有 deps 时含前置依赖)
1523
1583
  - [ ] Playground 组件已创建(浏览器端函数)
1524
1584
  - [ ] 组件正确导入实际函数(不是 mock)
1525
1585
  - [ ] 侧边栏配置已更新
@@ -11,4 +11,3 @@ export declare function buildResolvedLlmToolsList(params: {
11
11
  rowToOpenAiTool: (row: AiToolCatalogRowForLlmResolve) => unknown;
12
12
  rowToOpenAiMcpTool: (row: AiMcpCatalogRowForLlmResolve, wire: McpToolsWireFormat) => Record<string, unknown>;
13
13
  }): unknown[];
14
- export declare const buildResolvedLlmToolsListPure: typeof buildResolvedLlmToolsList;
@@ -25,5 +25,4 @@ export function buildResolvedLlmToolsList(params) {
25
25
  }
26
26
  return out;
27
27
  }
28
- export const buildResolvedLlmToolsListPure = buildResolvedLlmToolsList;
29
28
  //# sourceMappingURL=buildResolvedLlmToolsList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildResolvedLlmToolsList.js","sourceRoot":"","sources":["../../../src/functions/ai/buildResolvedLlmToolsList.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,MAAM,UAAU,yBAAyB,CAAC,MAazC;IACC,MAAM,GAAG,GAAc,EAAE,CAAA;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,SAAQ;QACxB,IACE,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,EAC1E,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAAE,SAAQ;QAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,SAAQ;QACxB,IACE,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,EACxE,CAAC;YACD,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACzD,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;YAAE,SAAQ;QAC9D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAGD,MAAM,CAAC,MAAM,6BAA6B,GAAG,yBAAyB,CAAA"}
1
+ {"version":3,"file":"buildResolvedLlmToolsList.js","sourceRoot":"","sources":["../../../src/functions/ai/buildResolvedLlmToolsList.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAGvE,MAAM,UAAU,yBAAyB,CAAC,MAazC;IACC,MAAM,GAAG,GAAc,EAAE,CAAA;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,SAAQ;QACxB,IACE,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,EAC1E,CAAC;YACD,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAAE,SAAQ;QAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,SAAQ;QACxB,IACE,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,EACxE,CAAC;YACD,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACzD,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;YAAE,SAAQ;QAC9D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -1,4 +1,3 @@
1
1
  export declare function filterListExcludingIds<T extends {
2
2
  id: string | number;
3
3
  }>(list: readonly T[], deletedIds: readonly (string | number)[] | undefined | null): T[];
4
- export declare const removeMessagesByIds: typeof filterListExcludingIds;
@@ -4,5 +4,4 @@ export function filterListExcludingIds(list, deletedIds) {
4
4
  const set = new Set(deletedIds.map((id) => String(id)));
5
5
  return list.filter((m) => !set.has(String(m.id)));
6
6
  }
7
- export const removeMessagesByIds = filterListExcludingIds;
8
7
  //# sourceMappingURL=filterListExcludingIds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterListExcludingIds.js","sourceRoot":"","sources":["../../../src/functions/array/filterListExcludingIds.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,sBAAsB,CACpC,IAAkB,EAClB,UAA2D;IAE3D,IAAI,CAAC,UAAU,EAAE,MAAM;QAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;IACzC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACvD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AACnD,CAAC;AAGD,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAA"}
1
+ {"version":3,"file":"filterListExcludingIds.js","sourceRoot":"","sources":["../../../src/functions/array/filterListExcludingIds.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,sBAAsB,CACpC,IAAkB,EAClB,UAA2D;IAE3D,IAAI,CAAC,UAAU,EAAE,MAAM;QAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;IACzC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACvD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AACnD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { UseAppendToBodyDeps } from '../../vue-hooks/dom/useAppendToBody';
2
+ import { type ReadBrowserHostDeps } from './readBrowserHost';
3
+ export declare function readBrowserAppendToBodyDeps(vue: Pick<Required<UseAppendToBodyDeps['vue']>, 'watch' | 'onBeforeUnmount' | 'toValue'>, hostDeps?: ReadBrowserHostDeps): UseAppendToBodyDeps;
@@ -0,0 +1,8 @@
1
+ import { readBrowserHostDepsFromGlobalThis, } from './readBrowserHost.js';
2
+ export function readBrowserAppendToBodyDeps(vue, hostDeps = readBrowserHostDepsFromGlobalThis()) {
3
+ return {
4
+ vue,
5
+ getDefaultParent: () => (hostDeps.host.document?.body ?? null),
6
+ };
7
+ }
8
+ //# sourceMappingURL=readBrowserAppendToBodyDeps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readBrowserAppendToBodyDeps.js","sourceRoot":"","sources":["../../../src/functions/browser/readBrowserAppendToBodyDeps.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,iCAAiC,GAElC,MAAM,mBAAmB,CAAA;AAK1B,MAAM,UAAU,2BAA2B,CACzC,GAAwF,EACxF,WAAgC,iCAAiC,EAAE;IAEnE,OAAO;QACL,GAAG;QACH,gBAAgB,EAAE,GAAG,EAAE,CACrB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAsB;KAC9D,CAAA;AACH,CAAC"}
@@ -1,2 +1,4 @@
1
1
  import type { DetectBrowserDeps } from './detectBrowser';
2
+ import { type ReadBrowserHostDeps } from './readBrowserHost';
3
+ export declare function readBrowserDetectDeps(deps: ReadBrowserHostDeps): DetectBrowserDeps;
2
4
  export declare function readBrowserDetectDepsFromWindow(): DetectBrowserDeps;
@@ -1,12 +1,15 @@
1
- export function readBrowserDetectDepsFromWindow() {
2
- const nav = globalThis.navigator;
3
- const win = globalThis;
1
+ import { readBrowserHostDepsFromGlobalThis, } from './readBrowserHost.js';
2
+ export function readBrowserDetectDeps(deps) {
3
+ const nav = deps.host.navigator;
4
4
  if (!nav)
5
5
  return { userAgent: '' };
6
6
  return {
7
7
  userAgent: nav.userAgent,
8
- innerWidth: win.innerWidth,
9
- innerHeight: win.innerHeight,
8
+ innerWidth: deps.host.innerWidth,
9
+ innerHeight: deps.host.innerHeight,
10
10
  };
11
11
  }
12
+ export function readBrowserDetectDepsFromWindow() {
13
+ return readBrowserDetectDeps(readBrowserHostDepsFromGlobalThis());
14
+ }
12
15
  //# sourceMappingURL=readBrowserDetectDeps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"readBrowserDetectDeps.js","sourceRoot":"","sources":["../../../src/functions/browser/readBrowserDetectDeps.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,+BAA+B;IAC7C,MAAM,GAAG,GAAI,UAA+D,CAAC,SAAS,CAAA;IACtF,MAAM,GAAG,GAAG,UAAsE,CAAA;IAClF,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;IAClC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"readBrowserDetectDeps.js","sourceRoot":"","sources":["../../../src/functions/browser/readBrowserDetectDeps.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iCAAiC,GAElC,MAAM,mBAAmB,CAAA;AAG1B,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAA;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;IAClC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;QAChC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;KACnC,CAAA;AACH,CAAC;AAGD,MAAM,UAAU,+BAA+B;IAC7C,OAAO,qBAAqB,CAAC,iCAAiC,EAAE,CAAC,CAAA;AACnE,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { Storage } from '../../../references/storage.d';
2
+ import type { Document, Selection } from '../../../references/dom.d';
3
+ import type { Window } from '../../../references/browser.d';
4
+ import type { Blob } from '../../../references/blob.d';
5
+ import type { setTimeout, clearTimeout } from '../../../references/timer.d';
6
+ import type { FetchFunction } from '../../../references/fetch.d';
7
+ import type { URL as URLConstructor } from '../../../references/url.d';
8
+ export type BrowserHostCrypto = {
9
+ randomUUID?: () => string;
10
+ };
11
+ export type BrowserHostLocation = {
12
+ href: string;
13
+ protocol?: string;
14
+ port?: string;
15
+ };
16
+ export type DomClipboardItemConstructor = new (items: Record<string, Blob>) => unknown;
17
+ export type DomMutableSelection = Selection & {
18
+ removeAllRanges(): void;
19
+ addRange(range: unknown): void;
20
+ };
21
+ export type BrowserHostSnapshot = {
22
+ navigator?: Window['navigator'];
23
+ innerWidth?: number;
24
+ innerHeight?: number;
25
+ localStorage?: Storage;
26
+ sessionStorage?: Storage;
27
+ document?: Document;
28
+ window?: Window;
29
+ location?: BrowserHostLocation;
30
+ crypto?: BrowserHostCrypto;
31
+ fetch?: FetchFunction;
32
+ URL?: Window['URL'];
33
+ URLConstructor?: typeof URLConstructor;
34
+ setTimeout?: typeof setTimeout;
35
+ clearTimeout?: typeof clearTimeout;
36
+ queueMicrotask?: (callback: () => void) => void;
37
+ open?: (url: string, target?: string, features?: string) => unknown;
38
+ Image?: Window['Image'];
39
+ File?: Window['File'];
40
+ Blob?: Window['Blob'];
41
+ ClipboardItem?: DomClipboardItemConstructor;
42
+ getSelection?: () => Selection | null;
43
+ createImageBitmap?: Window['createImageBitmap'];
44
+ matchMedia?: (query: string) => {
45
+ matches: boolean;
46
+ };
47
+ };
48
+ export interface ReadBrowserHostDeps {
49
+ host: BrowserHostSnapshot;
50
+ }
51
+ export declare function readBrowserHostFromGlobalThis(): BrowserHostSnapshot;
52
+ export declare function readBrowserHostDepsFromGlobalThis(): ReadBrowserHostDeps;
53
+ export declare function readOptionalBrowserHostLocalStorage(deps: ReadBrowserHostDeps): Storage | undefined;
54
+ export declare function requireBrowserHostLocalStorage(deps: ReadBrowserHostDeps): Storage;
55
+ export declare function readOptionalBrowserHostSessionStorage(deps: ReadBrowserHostDeps): Storage | undefined;
56
+ export declare function readBrowserHostDocument(deps: ReadBrowserHostDeps): Document | undefined;
57
+ export declare function resolveBrowserHostRandomUUIDFn(deps: ReadBrowserHostDeps): (() => string) | undefined;
@@ -0,0 +1,61 @@
1
+ export function readBrowserHostFromGlobalThis() {
2
+ if (typeof globalThis === 'undefined')
3
+ return {};
4
+ const g = globalThis;
5
+ const win = g.window ?? g;
6
+ const timerGlobal = globalThis;
7
+ const boundSetTimeout = typeof timerGlobal.setTimeout === 'function'
8
+ ? timerGlobal.setTimeout.bind(timerGlobal)
9
+ : undefined;
10
+ const boundClearTimeout = typeof timerGlobal.clearTimeout === 'function'
11
+ ? timerGlobal.clearTimeout.bind(timerGlobal)
12
+ : undefined;
13
+ const boundQueueMicrotask = typeof timerGlobal.queueMicrotask === 'function'
14
+ ? timerGlobal.queueMicrotask.bind(timerGlobal)
15
+ : undefined;
16
+ const resolvedUrl = (typeof g.URL === 'function' ? g.URL : win?.URL);
17
+ const resolvedFetch = typeof g.fetch === 'function' ? g.fetch : win?.fetch?.bind(win);
18
+ return {
19
+ ...g,
20
+ window: win,
21
+ location: g.location ?? win?.location,
22
+ document: g.document ?? win?.document,
23
+ fetch: resolvedFetch,
24
+ URL: resolvedUrl,
25
+ URLConstructor: resolvedUrl,
26
+ getSelection: (g.getSelection ?? win?.getSelection?.bind(win)),
27
+ ClipboardItem: g.ClipboardItem,
28
+ Blob: g.Blob,
29
+ setTimeout: boundSetTimeout,
30
+ clearTimeout: boundClearTimeout,
31
+ queueMicrotask: boundQueueMicrotask,
32
+ matchMedia: win.matchMedia?.bind(win),
33
+ };
34
+ }
35
+ export function readBrowserHostDepsFromGlobalThis() {
36
+ return { host: readBrowserHostFromGlobalThis() };
37
+ }
38
+ export function readOptionalBrowserHostLocalStorage(deps) {
39
+ return deps.host.localStorage;
40
+ }
41
+ export function requireBrowserHostLocalStorage(deps) {
42
+ const ls = deps.host.localStorage;
43
+ if (!ls) {
44
+ throw new Error('localStorage 不可用');
45
+ }
46
+ return ls;
47
+ }
48
+ export function readOptionalBrowserHostSessionStorage(deps) {
49
+ return deps.host.sessionStorage;
50
+ }
51
+ export function readBrowserHostDocument(deps) {
52
+ return deps.host.document;
53
+ }
54
+ export function resolveBrowserHostRandomUUIDFn(deps) {
55
+ const cryptoRef = deps.host.crypto;
56
+ if (cryptoRef && typeof cryptoRef.randomUUID === 'function') {
57
+ return () => cryptoRef.randomUUID();
58
+ }
59
+ return undefined;
60
+ }
61
+ //# sourceMappingURL=readBrowserHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readBrowserHost.js","sourceRoot":"","sources":["../../../src/functions/browser/readBrowserHost.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
1
  import type { CompressImageFileToBoundedJpegDeps } from '../image/compressImageFileToBoundedJpeg';
2
+ import { type ReadBrowserHostDeps } from './readBrowserHost';
3
+ export declare function readBrowserImageCompressDeps(hostDeps: ReadBrowserHostDeps): CompressImageFileToBoundedJpegDeps;
2
4
  export declare function readBrowserImageCompressDepsFromWindow(): CompressImageFileToBoundedJpegDeps;
@@ -1,16 +1,19 @@
1
- export function readBrowserImageCompressDepsFromWindow() {
2
- const win = globalThis;
3
- const doc = globalThis
4
- .document;
5
- if (!win.Image || !win.File || !doc?.createElement || !win.URL?.createObjectURL) {
6
- throw new Error('readBrowserImageCompressDepsFromWindow requires browser environment');
1
+ import { readBrowserHostDepsFromGlobalThis, } from './readBrowserHost.js';
2
+ export function readBrowserImageCompressDeps(hostDeps) {
3
+ const host = hostDeps.host;
4
+ const doc = host.document;
5
+ if (!host.Image || !host.File || !doc?.createElement || !host.URL?.createObjectURL) {
6
+ throw new Error('readBrowserImageCompressDeps requires browser environment');
7
7
  }
8
8
  return {
9
- Image: win.Image,
10
- File: win.File,
11
- createObjectURL: (blob) => win.URL.createObjectURL(blob),
9
+ Image: host.Image,
10
+ File: host.File,
11
+ createObjectURL: (blob) => host.URL.createObjectURL(blob),
12
12
  createElement: doc.createElement,
13
- createImageBitmap: win.createImageBitmap,
13
+ createImageBitmap: host.createImageBitmap,
14
14
  };
15
15
  }
16
+ export function readBrowserImageCompressDepsFromWindow() {
17
+ return readBrowserImageCompressDeps(readBrowserHostDepsFromGlobalThis());
18
+ }
16
19
  //# sourceMappingURL=readBrowserImageCompressDeps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"readBrowserImageCompressDeps.js","sourceRoot":"","sources":["../../../src/functions/browser/readBrowserImageCompressDeps.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,sCAAsC;IACpD,MAAM,GAAG,GAAG,UAKX,CAAA;IACD,MAAM,GAAG,GAAI,UAA+G;SACzH,QAAQ,CAAA;IACX,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,aAAa,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAA;IACxF,CAAC;IACD,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,eAAe,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,GAAG,CAAC,GAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC/D,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;KACzC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"readBrowserImageCompressDeps.js","sourceRoot":"","sources":["../../../src/functions/browser/readBrowserImageCompressDeps.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iCAAiC,GAElC,MAAM,mBAAmB,CAAA;AAG1B,MAAM,UAAU,4BAA4B,CAC1C,QAA6B;IAE7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;IACzB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IAC9E,CAAC;IACD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,eAAe,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,GAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAChE,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;KAC1C,CAAA;AACH,CAAC;AAGD,MAAM,UAAU,sCAAsC;IACpD,OAAO,4BAA4B,CAAC,iCAAiC,EAAE,CAAC,CAAA;AAC1E,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { VueCompositionAPI } from '../../../types/vue.d';
2
+ import type { LassoSelectionEnvironment } from '../../vue-hooks/dom/useLassoSelection';
3
+ import { type ReadBrowserHostDeps } from './readBrowserHost';
4
+ export declare function readBrowserLassoSelectionEnvironment(vue: Pick<Required<VueCompositionAPI>, 'ref'>, hostDeps?: ReadBrowserHostDeps): LassoSelectionEnvironment;
@@ -0,0 +1,23 @@
1
+ import { readBrowserHostDepsFromGlobalThis, } from './readBrowserHost.js';
2
+ export function readBrowserLassoSelectionEnvironment(vue, hostDeps = readBrowserHostDepsFromGlobalThis()) {
3
+ const host = hostDeps.host;
4
+ const win = host.window;
5
+ const doc = host.document;
6
+ return {
7
+ vue,
8
+ window: {
9
+ addEventListener: win.addEventListener.bind(win),
10
+ removeEventListener: win.removeEventListener.bind(win),
11
+ requestAnimationFrame: win.requestAnimationFrame.bind(win),
12
+ cancelAnimationFrame: win.cancelAnimationFrame.bind(win),
13
+ },
14
+ document: {
15
+ addEventListener: doc.addEventListener.bind(doc),
16
+ removeEventListener: doc.removeEventListener.bind(doc),
17
+ body: doc.body,
18
+ getSelection: host.getSelection,
19
+ },
20
+ queueMicrotask: host.queueMicrotask?.bind(host),
21
+ };
22
+ }
23
+ //# sourceMappingURL=readBrowserLassoSelectionEnvironment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readBrowserLassoSelectionEnvironment.js","sourceRoot":"","sources":["../../../src/functions/browser/readBrowserLassoSelectionEnvironment.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,iCAAiC,GAElC,MAAM,mBAAmB,CAAA;AAG1B,MAAM,UAAU,oCAAoC,CAClD,GAA6C,EAC7C,WAAgC,iCAAiC,EAAE;IAEnE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAO,CAAA;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAS,CAAA;IAC1B,OAAO;QACL,GAAG;QACH,MAAM,EAAE;YACN,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;YACtD,qBAAqB,EAAE,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC;YAC1D,oBAAoB,EAAE,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC;SACzD;QACD,QAAQ,EAAE;YACR,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;YACtD,IAAI,EAAE,GAAG,CAAC,IAAqD;YAC/D,YAAY,EAAE,IAAI,CAAC,YAAqE;SACzF;QACD,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC;KAChD,CAAA;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { VueCompositionAPI } from '../../../types/vue.d';
2
+ import type { UseFocusVisibleDeps } from '../../vue-hooks/dom/useFocusVisible';
3
+ import type { UseDelayedTrueDeps } from '../../vue-hooks/time/useDelayedTrue';
4
+ import type { UseFileObjectUrlMapDeps } from '../../vue-hooks/browser/useFileObjectUrlMap';
5
+ import type { UseFileUploadEnvironment } from '../../vue-hooks/browser/useFileUpload';
6
+ import type { DraggableEnvironment } from '../../vue-hooks/dom/useDraggable';
7
+ import type { UseAutoUpdateDeps } from '../../vue-hooks/dom/useAutoUpdate';
8
+ import { type ReadBrowserHostDeps } from './readBrowserHost';
9
+ export declare function readBrowserFocusVisibleDeps(vue: Pick<Required<VueCompositionAPI>, 'ref' | 'onMounted' | 'onUnmounted'>, hostDeps?: ReadBrowserHostDeps): UseFocusVisibleDeps;
10
+ export declare function readBrowserDelayedTrueDeps(vue: Pick<Required<VueCompositionAPI>, 'ref' | 'watch' | 'onUnmounted'>, hostDeps?: ReadBrowserHostDeps): UseDelayedTrueDeps;
11
+ export declare function readBrowserFileObjectUrlMapDeps(vue: Pick<Required<VueCompositionAPI>, 'ref' | 'watch' | 'onBeforeUnmount'>, hostDeps?: ReadBrowserHostDeps): UseFileObjectUrlMapDeps;
12
+ export declare function readBrowserFileUploadDeps(vue: Pick<Required<VueCompositionAPI>, 'ref' | 'shallowRef' | 'onUnmounted'>, hostDeps?: ReadBrowserHostDeps): UseFileUploadEnvironment;
13
+ export declare function readBrowserDraggableDeps(vue: DraggableEnvironment['vue'], hostDeps?: ReadBrowserHostDeps): DraggableEnvironment | undefined;
14
+ export declare function readBrowserAutoUpdateDeps(watchFn: NonNullable<VueCompositionAPI['watch']>, hostDeps?: ReadBrowserHostDeps): UseAutoUpdateDeps;
@@ -0,0 +1,85 @@
1
+ import { readBrowserHostDepsFromGlobalThis, } from './readBrowserHost.js';
2
+ function readBrowserDelayedTrueHostDeps(hostDeps) {
3
+ const host = hostDeps.host;
4
+ const fallbackSetTimeout = ((fn) => {
5
+ fn();
6
+ return 0;
7
+ });
8
+ const fallbackClearTimeout = (() => { });
9
+ return {
10
+ setTimeout: host.setTimeout ?? fallbackSetTimeout,
11
+ clearTimeout: host.clearTimeout ?? fallbackClearTimeout,
12
+ };
13
+ }
14
+ export function readBrowserFocusVisibleDeps(vue, hostDeps = readBrowserHostDepsFromGlobalThis()) {
15
+ return { vue, document: hostDeps.host.document };
16
+ }
17
+ export function readBrowserDelayedTrueDeps(vue, hostDeps = readBrowserHostDepsFromGlobalThis()) {
18
+ return {
19
+ vue,
20
+ host: readBrowserDelayedTrueHostDeps(hostDeps),
21
+ };
22
+ }
23
+ export function readBrowserFileObjectUrlMapDeps(vue, hostDeps = readBrowserHostDepsFromGlobalThis()) {
24
+ const urlApi = hostDeps.host.URL;
25
+ return {
26
+ vue,
27
+ createObjectURL: urlApi
28
+ ? (file) => urlApi.createObjectURL(file)
29
+ : undefined,
30
+ revokeObjectURL: urlApi?.revokeObjectURL.bind(urlApi),
31
+ };
32
+ }
33
+ function readBrowserUrlHostDeps(hostDeps) {
34
+ const urlApi = hostDeps.host.URL;
35
+ const noopCreate = (() => '');
36
+ const noopRevoke = (() => { });
37
+ return {
38
+ createObjectURL: urlApi?.createObjectURL.bind(urlApi) ?? noopCreate,
39
+ revokeObjectURL: urlApi?.revokeObjectURL.bind(urlApi) ?? noopRevoke,
40
+ };
41
+ }
42
+ export function readBrowserFileUploadDeps(vue, hostDeps = readBrowserHostDepsFromGlobalThis()) {
43
+ return {
44
+ vue,
45
+ host: readBrowserUrlHostDeps(hostDeps),
46
+ };
47
+ }
48
+ export function readBrowserDraggableDeps(vue, hostDeps = readBrowserHostDepsFromGlobalThis()) {
49
+ const doc = hostDeps.host.document;
50
+ const win = hostDeps.host.window;
51
+ if (!doc?.addEventListener || !doc.removeEventListener || !doc.body || !win?.requestAnimationFrame) {
52
+ return undefined;
53
+ }
54
+ return {
55
+ addEventListener: doc.addEventListener.bind(doc),
56
+ removeEventListener: doc.removeEventListener.bind(doc),
57
+ body: doc.body,
58
+ requestAnimationFrame: win.requestAnimationFrame.bind(win),
59
+ vue,
60
+ };
61
+ }
62
+ function readBrowserThrottledEventListenerDeps(hostDeps) {
63
+ const host = hostDeps.host;
64
+ const win = host.window ?? host;
65
+ const fallbackSetTimeout = ((fn) => {
66
+ fn();
67
+ return 0;
68
+ });
69
+ const fallbackClearTimeout = (() => { });
70
+ const noopListener = (() => { });
71
+ return {
72
+ addEventListener: win.addEventListener?.bind(win) ?? noopListener,
73
+ removeEventListener: win.removeEventListener?.bind(win) ?? noopListener,
74
+ setTimeout: host.setTimeout ?? fallbackSetTimeout,
75
+ clearTimeout: host.clearTimeout ?? fallbackClearTimeout,
76
+ now: Date.now,
77
+ };
78
+ }
79
+ export function readBrowserAutoUpdateDeps(watchFn, hostDeps = readBrowserHostDepsFromGlobalThis()) {
80
+ return {
81
+ watch: watchFn,
82
+ ...readBrowserThrottledEventListenerDeps(hostDeps),
83
+ };
84
+ }
85
+ //# sourceMappingURL=readBrowserVueHookDeps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readBrowserVueHookDeps.js","sourceRoot":"","sources":["../../../src/functions/browser/readBrowserVueHookDeps.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  import type { Storage } from '../../../references/storage.d';
2
- export declare function requireBrowserLocalStorage(): Storage;
2
+ import { type ReadBrowserHostDeps } from './readBrowserHost';
3
+ export declare function requireBrowserLocalStorage(deps?: ReadBrowserHostDeps): Storage;
@@ -1,8 +1,5 @@
1
- export function requireBrowserLocalStorage() {
2
- const ls = globalThis.localStorage;
3
- if (!ls) {
4
- throw new Error('localStorage 不可用');
5
- }
6
- return ls;
1
+ import { readBrowserHostDepsFromGlobalThis, requireBrowserHostLocalStorage, } from './readBrowserHost.js';
2
+ export function requireBrowserLocalStorage(deps = readBrowserHostDepsFromGlobalThis()) {
3
+ return requireBrowserHostLocalStorage(deps);
7
4
  }
8
5
  //# sourceMappingURL=requireBrowserLocalStorage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"requireBrowserLocalStorage.js","sourceRoot":"","sources":["../../../src/functions/browser/requireBrowserLocalStorage.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,0BAA0B;IACxC,MAAM,EAAE,GAAI,UAAyC,CAAC,YAAY,CAAA;IAClE,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC"}
1
+ {"version":3,"file":"requireBrowserLocalStorage.js","sourceRoot":"","sources":["../../../src/functions/browser/requireBrowserLocalStorage.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iCAAiC,EACjC,8BAA8B,GAE/B,MAAM,mBAAmB,CAAA;AAG1B,MAAM,UAAU,0BAA0B,CACxC,OAA4B,iCAAiC,EAAE;IAE/D,OAAO,8BAA8B,CAAC,IAAI,CAAC,CAAA;AAC7C,CAAC"}
@@ -3,6 +3,11 @@ export declare const CHAT_APPEARANCE_MODE_STORAGE_KEY = "chat.appearance.mode.v1
3
3
  export declare const CHAT_APPEARANCE_MODE_LABELS: Record<ChatAppearanceMode, string>;
4
4
  export declare function isChatAppearanceMode(v: string): v is ChatAppearanceMode;
5
5
  export declare function parseChatAppearanceModeFromStorage(raw: string | null | undefined): ChatAppearanceMode;
6
- export declare function readSystemPrefersDark(): boolean;
6
+ export interface ReadSystemPrefersDarkDeps {
7
+ matchMedia?: (query: string) => {
8
+ matches: boolean;
9
+ };
10
+ }
11
+ export declare function readSystemPrefersDark(deps?: ReadSystemPrefersDarkDeps): boolean;
7
12
  export declare function resolveChatEffectiveTheme(mode: ChatAppearanceMode): 'light' | 'dark';
8
13
  export declare function chatAppearanceModeSubtitle(mode: ChatAppearanceMode): string;
@@ -1,3 +1,4 @@
1
+ import { readBrowserHostDepsFromGlobalThis, } from '../browser/readBrowserHost.js';
1
2
  export const CHAT_APPEARANCE_MODE_STORAGE_KEY = 'chat.appearance.mode.v1';
2
3
  export const CHAT_APPEARANCE_MODE_LABELS = {
3
4
  light: '浅色',
@@ -12,11 +13,12 @@ export function parseChatAppearanceModeFromStorage(raw) {
12
13
  const trimmed = raw?.trim();
13
14
  return trimmed && isChatAppearanceMode(trimmed) ? trimmed : 'system';
14
15
  }
15
- export function readSystemPrefersDark() {
16
- const w = globalThis;
17
- if (!w.matchMedia)
16
+ export function readSystemPrefersDark(deps) {
17
+ const matchMedia = deps?.matchMedia ??
18
+ readBrowserHostDepsFromGlobalThis().host.matchMedia;
19
+ if (!matchMedia)
18
20
  return false;
19
- return w.matchMedia('(prefers-color-scheme: dark)').matches;
21
+ return matchMedia('(prefers-color-scheme: dark)').matches;
20
22
  }
21
23
  export function resolveChatEffectiveTheme(mode) {
22
24
  if (mode === 'dark')
@@ -1 +1 @@
1
- {"version":3,"file":"chatAppearancePrefs.js","sourceRoot":"","sources":["../../../src/functions/chat/chatAppearancePrefs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gCAAgC,GAAG,yBAAyB,CAAA;AAEzE,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;CACb,CAAA;AAED,MAAM,KAAK,GAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;AAExE,MAAM,UAAU,oBAAoB,CAAC,CAAS;IAC5C,OAAQ,KAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,GAA8B;IAE9B,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,CAAA;IAC3B,OAAO,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,CAAC,GAAG,UAA6E,CAAA;IACvF,IAAI,CAAC,CAAC,CAAC,UAAU;QAAE,OAAO,KAAK,CAAA;IAC/B,OAAO,CAAC,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAwB;IAChE,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAA;IAClC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAA;IACpC,OAAO,qBAAqB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAwB;IACjE,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAA;AAC1C,CAAC"}
1
+ {"version":3,"file":"chatAppearancePrefs.js","sourceRoot":"","sources":["../../../src/functions/chat/chatAppearancePrefs.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iCAAiC,GAElC,MAAM,4BAA4B,CAAA;AAEnC,MAAM,CAAC,MAAM,gCAAgC,GAAG,yBAAyB,CAAA;AAEzE,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;CACb,CAAA;AAED,MAAM,KAAK,GAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;AAExE,MAAM,UAAU,oBAAoB,CAAC,CAAS;IAC5C,OAAQ,KAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,GAA8B;IAE9B,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,CAAA;IAC3B,OAAO,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAA;AACtE,CAAC;AAMD,MAAM,UAAU,qBAAqB,CACnC,IAAgC;IAEhC,MAAM,UAAU,GACd,IAAI,EAAE,UAAU;QAChB,iCAAiC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAA;IACrD,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAA;IAC7B,OAAO,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAwB;IAChE,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAA;IAClC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAA;IACpC,OAAO,qBAAqB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAwB;IACjE,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAA;AAC1C,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { ChatAppearanceMode } from '../../../types/chat-appearance';
2
- export declare function createBrowserChatAppearanceModeAccess(): {
2
+ import { type ReadBrowserHostDeps } from '../browser/readBrowserHost';
3
+ export declare function createBrowserChatAppearanceModeAccess(hostDeps?: ReadBrowserHostDeps): {
3
4
  read(): ChatAppearanceMode;
4
5
  write(mode: ChatAppearanceMode): void;
5
6
  };