@weapp-vite/web 2.0.0 → 2.1.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 (310) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +1 -2
  2. package/dist/compiler/wxml/attributes.mjs +12 -4
  3. package/dist/compiler/wxml/attributes.mjs.map +1 -1
  4. package/dist/compiler/wxml/compile.mjs +33 -39
  5. package/dist/compiler/wxml/compile.mjs.map +1 -1
  6. package/dist/compiler/wxml/dependency.mjs +10 -3
  7. package/dist/compiler/wxml/dependency.mjs.map +1 -1
  8. package/dist/compiler/wxml/interpolation.mjs +13 -3
  9. package/dist/compiler/wxml/interpolation.mjs.map +1 -1
  10. package/dist/compiler/wxml/nativeTags.mjs +60 -0
  11. package/dist/compiler/wxml/nativeTags.mjs.map +1 -0
  12. package/dist/compiler/wxml/navigation.mjs +1 -2
  13. package/dist/compiler/wxml/parser.mjs +1 -2
  14. package/dist/compiler/wxml/prepare.mjs +42 -0
  15. package/dist/compiler/wxml/prepare.mjs.map +1 -0
  16. package/dist/compiler/wxml/renderer.mjs +1 -2
  17. package/dist/compiler/wxml/specialNodes.mjs +1 -2
  18. package/dist/compiler/wxml/types.d.mts +0 -2
  19. package/dist/compiler/wxml/unknownTags.mjs +33 -0
  20. package/dist/compiler/wxml/unknownTags.mjs.map +1 -0
  21. package/dist/compiler/wxs.mjs +1 -2
  22. package/dist/css/wxss.d.mts +2 -19
  23. package/dist/css/wxss.mjs +5 -12
  24. package/dist/css/wxss.mjs.map +1 -1
  25. package/dist/index.d.mts +8 -3
  26. package/dist/index.mjs +8 -5
  27. package/dist/plugin/assets.d.mts +1 -2
  28. package/dist/plugin/assets.mjs +1 -2
  29. package/dist/plugin/constants.mjs +5 -4
  30. package/dist/plugin/constants.mjs.map +1 -1
  31. package/dist/plugin/dependencyScan.mjs +1 -2
  32. package/dist/plugin/entry.mjs +6 -4
  33. package/dist/plugin/entry.mjs.map +1 -1
  34. package/dist/plugin/files.mjs +1 -2
  35. package/dist/plugin/hostTypes.d.mts +1 -2
  36. package/dist/plugin/index.d.mts +0 -2
  37. package/dist/plugin/index.mjs +29 -24
  38. package/dist/plugin/index.mjs.map +1 -1
  39. package/dist/plugin/layout.mjs +1 -2
  40. package/dist/plugin/navigation.mjs +1 -2
  41. package/dist/plugin/packageResolution.mjs +1 -2
  42. package/dist/plugin/path.mjs +1 -2
  43. package/dist/plugin/register.mjs +1 -2
  44. package/dist/plugin/scan.mjs +1 -2
  45. package/dist/plugin/scanConfig.mjs +1 -2
  46. package/dist/plugin/scanSfc.mjs +1 -2
  47. package/dist/plugin/sfcHmr.mjs +28 -10
  48. package/dist/plugin/sfcHmr.mjs.map +1 -1
  49. package/dist/plugin/state.mjs +1 -2
  50. package/dist/plugin/styleModule.mjs +1 -2
  51. package/dist/plugin/types.d.mts +2 -3
  52. package/dist/plugin/vueSfc.mjs +1 -2
  53. package/dist/runtime/appShell/container.mjs +1 -2
  54. package/dist/runtime/appShell/tabBar/index.mjs +1 -2
  55. package/dist/runtime/appShell/tabBar/style.mjs +1 -2
  56. package/dist/runtime/appStyle.mjs +1 -2
  57. package/dist/runtime/button/helpers.mjs +1 -2
  58. package/dist/runtime/button/index.d.mts +0 -2
  59. package/dist/runtime/button/index.mjs +1 -2
  60. package/dist/runtime/button/style.mjs +1 -2
  61. package/dist/runtime/component/behavior.mjs +1 -2
  62. package/dist/runtime/component/constants.mjs +1 -2
  63. package/dist/runtime/component/dom.mjs +1 -2
  64. package/dist/runtime/component/element.mjs +9 -2
  65. package/dist/runtime/component/element.mjs.map +1 -1
  66. package/dist/runtime/component/events.mjs +4 -4
  67. package/dist/runtime/component/events.mjs.map +1 -1
  68. package/dist/runtime/component/index.d.mts +0 -2
  69. package/dist/runtime/component/index.mjs +1 -2
  70. package/dist/runtime/component/observers.mjs +1 -2
  71. package/dist/runtime/component/publicInstance.mjs +1 -2
  72. package/dist/runtime/component/relations.mjs +1 -2
  73. package/dist/runtime/component/slots.mjs +1 -2
  74. package/dist/runtime/component/state.mjs +1 -2
  75. package/dist/runtime/component/types.d.mts +0 -2
  76. package/dist/runtime/component/utils.mjs +1 -2
  77. package/dist/runtime/component/virtualHost.mjs +1 -2
  78. package/dist/runtime/componentEvents.mjs +1 -2
  79. package/dist/runtime/dataset.mjs +49 -0
  80. package/dist/runtime/dataset.mjs.map +1 -0
  81. package/dist/runtime/datasetBinding.d.mts +13 -0
  82. package/dist/runtime/datasetBinding.mjs +40 -0
  83. package/dist/runtime/datasetBinding.mjs.map +1 -0
  84. package/dist/runtime/eventBinding.d.mts +1 -2
  85. package/dist/runtime/eventBinding.mjs +1 -2
  86. package/dist/runtime/execution.d.mts +0 -2
  87. package/dist/runtime/execution.mjs +1 -2
  88. package/dist/runtime/host/index.d.mts +0 -2
  89. package/dist/runtime/host/index.mjs +1 -2
  90. package/dist/runtime/host/types.d.mts +0 -2
  91. package/dist/runtime/hostGlobals.d.mts +1 -2
  92. package/dist/runtime/hostGlobals.mjs +1 -2
  93. package/dist/runtime/index.d.mts +8 -3
  94. package/dist/runtime/index.mjs +9 -7
  95. package/dist/runtime/index.mjs.map +1 -1
  96. package/dist/runtime/inlineStyle.d.mts +5 -0
  97. package/dist/runtime/inlineStyle.mjs +21 -0
  98. package/dist/runtime/inlineStyle.mjs.map +1 -0
  99. package/dist/runtime/inputHandlerResult.mjs +1 -2
  100. package/dist/runtime/legacyTemplate/dataset.mjs +53 -0
  101. package/dist/runtime/legacyTemplate/dataset.mjs.map +1 -0
  102. package/dist/runtime/legacyTemplate/dom.mjs +20 -5
  103. package/dist/runtime/legacyTemplate/dom.mjs.map +1 -1
  104. package/dist/runtime/legacyTemplate/expression.mjs +1 -2
  105. package/dist/runtime/legacyTemplate/index.d.mts +0 -2
  106. package/dist/runtime/legacyTemplate/index.mjs +23 -16
  107. package/dist/runtime/legacyTemplate/index.mjs.map +1 -1
  108. package/dist/runtime/legacyTemplate/types.d.mts +0 -2
  109. package/dist/runtime/nativeComponents/canvas/index.mjs +1 -2
  110. package/dist/runtime/nativeComponents/checkbox.mjs +1 -2
  111. package/dist/runtime/nativeComponents/cover/index.mjs +1 -2
  112. package/dist/runtime/nativeComponents/form.d.mts +0 -2
  113. package/dist/runtime/nativeComponents/form.mjs +1 -2
  114. package/dist/runtime/nativeComponents/formControl.mjs +1 -2
  115. package/dist/runtime/nativeComponents/helpers.mjs +1 -2
  116. package/dist/runtime/nativeComponents/icon/helpers.mjs +1 -2
  117. package/dist/runtime/nativeComponents/icon/index.mjs +1 -2
  118. package/dist/runtime/nativeComponents/icon/style.mjs +1 -2
  119. package/dist/runtime/nativeComponents/image.d.mts +0 -2
  120. package/dist/runtime/nativeComponents/image.mjs +1 -2
  121. package/dist/runtime/nativeComponents/index.d.mts +1 -3
  122. package/dist/runtime/nativeComponents/index.mjs +3 -4
  123. package/dist/runtime/nativeComponents/index.mjs.map +1 -1
  124. package/dist/runtime/nativeComponents/input.d.mts +0 -2
  125. package/dist/runtime/nativeComponents/input.mjs +1 -2
  126. package/dist/runtime/nativeComponents/label.mjs +1 -2
  127. package/dist/runtime/nativeComponents/mediaRegistry.mjs +1 -2
  128. package/dist/runtime/nativeComponents/movable/helpers.mjs +1 -2
  129. package/dist/runtime/nativeComponents/movable/index.mjs +1 -2
  130. package/dist/runtime/nativeComponents/navigator.mjs +1 -2
  131. package/dist/runtime/nativeComponents/picker/editors.mjs +1 -2
  132. package/dist/runtime/nativeComponents/picker/helpers.mjs +1 -2
  133. package/dist/runtime/nativeComponents/picker/index.mjs +1 -2
  134. package/dist/runtime/nativeComponents/picker/style.mjs +1 -2
  135. package/dist/runtime/nativeComponents/pickerView/column.mjs +1 -2
  136. package/dist/runtime/nativeComponents/pickerView/helpers.mjs +1 -2
  137. package/dist/runtime/nativeComponents/pickerView/index.mjs +1 -2
  138. package/dist/runtime/nativeComponents/pickerView/style.mjs +1 -2
  139. package/dist/runtime/nativeComponents/primitives.mjs +1 -2
  140. package/dist/runtime/nativeComponents/progress/helpers.mjs +1 -2
  141. package/dist/runtime/nativeComponents/progress/index.mjs +1 -2
  142. package/dist/runtime/nativeComponents/progress/style.mjs +1 -2
  143. package/dist/runtime/nativeComponents/radio.mjs +1 -2
  144. package/dist/runtime/nativeComponents/richText/index.mjs +3 -4
  145. package/dist/runtime/nativeComponents/richText/index.mjs.map +1 -1
  146. package/dist/runtime/nativeComponents/scrollView/boundaries.mjs +62 -0
  147. package/dist/runtime/nativeComponents/scrollView/boundaries.mjs.map +1 -0
  148. package/dist/runtime/nativeComponents/{scrollView.d.mts → scrollView/helpers.d.mts} +4 -5
  149. package/dist/runtime/nativeComponents/scrollView/helpers.mjs +14 -0
  150. package/dist/runtime/nativeComponents/scrollView/helpers.mjs.map +1 -0
  151. package/dist/runtime/nativeComponents/scrollView/index.mjs +193 -0
  152. package/dist/runtime/nativeComponents/scrollView/index.mjs.map +1 -0
  153. package/dist/runtime/nativeComponents/scrollView/position.mjs +43 -0
  154. package/dist/runtime/nativeComponents/scrollView/position.mjs.map +1 -0
  155. package/dist/runtime/nativeComponents/slider/helpers.mjs +1 -2
  156. package/dist/runtime/nativeComponents/slider/index.mjs +1 -2
  157. package/dist/runtime/nativeComponents/slider/style.mjs +1 -2
  158. package/dist/runtime/nativeComponents/style.mjs +1 -2
  159. package/dist/runtime/nativeComponents/swiper/helpers.mjs +1 -2
  160. package/dist/runtime/nativeComponents/swiper/index.mjs +1 -2
  161. package/dist/runtime/nativeComponents/swiper/item.mjs +1 -2
  162. package/dist/runtime/nativeComponents/swiper/style.mjs +1 -2
  163. package/dist/runtime/nativeComponents/switch.d.mts +0 -2
  164. package/dist/runtime/nativeComponents/switch.mjs +1 -2
  165. package/dist/runtime/nativeComponents/textarea.d.mts +0 -2
  166. package/dist/runtime/nativeComponents/textarea.mjs +1 -2
  167. package/dist/runtime/nativeComponents/video/helpers.d.mts +0 -2
  168. package/dist/runtime/nativeComponents/video/helpers.mjs +1 -2
  169. package/dist/runtime/nativeComponents/video/index.mjs +1 -2
  170. package/dist/runtime/nativeComponents/video/style.mjs +1 -2
  171. package/dist/runtime/navigationBar/index.d.mts +0 -2
  172. package/dist/runtime/navigationBar/index.mjs +1 -2
  173. package/dist/runtime/navigationBar/style.mjs +1 -2
  174. package/dist/runtime/pageLayout.d.mts +1 -2
  175. package/dist/runtime/pageLayout.mjs +1 -2
  176. package/dist/runtime/polyfill/ad.mjs +1 -2
  177. package/dist/runtime/polyfill/animation.mjs +1 -2
  178. package/dist/runtime/polyfill/appState.mjs +1 -2
  179. package/dist/runtime/polyfill/async.d.mts +0 -2
  180. package/dist/runtime/polyfill/async.mjs +1 -2
  181. package/dist/runtime/polyfill/auth.mjs +1 -2
  182. package/dist/runtime/polyfill/authApi.mjs +1 -2
  183. package/dist/runtime/polyfill/background.mjs +1 -2
  184. package/dist/runtime/polyfill/canvasContext.mjs +1 -2
  185. package/dist/runtime/polyfill/capability.mjs +1 -2
  186. package/dist/runtime/polyfill/cloud.mjs +1 -2
  187. package/dist/runtime/polyfill/device.mjs +1 -2
  188. package/dist/runtime/polyfill/deviceApi.mjs +1 -2
  189. package/dist/runtime/polyfill/deviceAuthSystemApi.d.mts +0 -2
  190. package/dist/runtime/polyfill/deviceAuthSystemApi.mjs +1 -2
  191. package/dist/runtime/polyfill/eventBus.mjs +1 -2
  192. package/dist/runtime/polyfill/filePicker.mjs +1 -2
  193. package/dist/runtime/polyfill/fileSystemManager.mjs +1 -2
  194. package/dist/runtime/polyfill/files.mjs +1 -2
  195. package/dist/runtime/polyfill/font.mjs +1 -2
  196. package/dist/runtime/polyfill/index.d.mts +4 -4
  197. package/dist/runtime/polyfill/index.mjs +12 -5
  198. package/dist/runtime/polyfill/index.mjs.map +1 -1
  199. package/dist/runtime/polyfill/interaction.mjs +1 -2
  200. package/dist/runtime/polyfill/interactionApi.mjs +1 -2
  201. package/dist/runtime/polyfill/intersectionObserver.mjs +4 -4
  202. package/dist/runtime/polyfill/intersectionObserver.mjs.map +1 -1
  203. package/dist/runtime/polyfill/lifecycleEvents.d.mts +12 -0
  204. package/dist/runtime/polyfill/lifecycleEvents.mjs +67 -0
  205. package/dist/runtime/polyfill/lifecycleEvents.mjs.map +1 -0
  206. package/dist/runtime/polyfill/locale.mjs +1 -2
  207. package/dist/runtime/polyfill/location.mjs +1 -2
  208. package/dist/runtime/polyfill/locationApi.mjs +1 -2
  209. package/dist/runtime/polyfill/mediaActions.mjs +1 -2
  210. package/dist/runtime/polyfill/mediaApi/file.mjs +1 -2
  211. package/dist/runtime/polyfill/mediaApi/info.mjs +1 -2
  212. package/dist/runtime/polyfill/mediaApi/picker.mjs +1 -2
  213. package/dist/runtime/polyfill/mediaApi/preview.mjs +1 -2
  214. package/dist/runtime/polyfill/mediaApi/process.mjs +1 -2
  215. package/dist/runtime/polyfill/mediaInfo.mjs +1 -2
  216. package/dist/runtime/polyfill/mediaPicker.mjs +1 -2
  217. package/dist/runtime/polyfill/mediaProcess.mjs +1 -2
  218. package/dist/runtime/polyfill/menuApi.mjs +5 -3
  219. package/dist/runtime/polyfill/menuApi.mjs.map +1 -1
  220. package/dist/runtime/polyfill/navigationBarRuntime.mjs +1 -2
  221. package/dist/runtime/polyfill/network/request.mjs +1 -2
  222. package/dist/runtime/polyfill/network/requestBridge.mjs +1 -2
  223. package/dist/runtime/polyfill/network/status.mjs +1 -2
  224. package/dist/runtime/polyfill/platformApi.mjs +1 -2
  225. package/dist/runtime/polyfill/platformRuntime.mjs +1 -2
  226. package/dist/runtime/polyfill/routeRuntime/appLifecycle.mjs +1 -2
  227. package/dist/runtime/polyfill/routeRuntime/dom.mjs +1 -2
  228. package/dist/runtime/polyfill/routeRuntime/events.d.mts +0 -2
  229. package/dist/runtime/polyfill/routeRuntime/events.mjs +1 -2
  230. package/dist/runtime/polyfill/routeRuntime/history.d.mts +0 -2
  231. package/dist/runtime/polyfill/routeRuntime/history.mjs +1 -2
  232. package/dist/runtime/polyfill/routeRuntime/lifecycle.mjs +1 -2
  233. package/dist/runtime/polyfill/routeRuntime/options.d.mts +1 -2
  234. package/dist/runtime/polyfill/routeRuntime/options.mjs +1 -2
  235. package/dist/runtime/polyfill/routeRuntime/result.mjs +1 -2
  236. package/dist/runtime/polyfill/routeRuntime/scroll.mjs +37 -6
  237. package/dist/runtime/polyfill/routeRuntime/scroll.mjs.map +1 -1
  238. package/dist/runtime/polyfill/routeRuntime/stack.mjs +1 -2
  239. package/dist/runtime/polyfill/routeRuntime/url.mjs +1 -2
  240. package/dist/runtime/polyfill/routeRuntime.d.mts +2 -2
  241. package/dist/runtime/polyfill/routeRuntime.mjs +14 -5
  242. package/dist/runtime/polyfill/routeRuntime.mjs.map +1 -1
  243. package/dist/runtime/polyfill/runtimeCapabilityApi.mjs +1 -2
  244. package/dist/runtime/polyfill/runtimeDataApi.d.mts +0 -2
  245. package/dist/runtime/polyfill/runtimeDataApi.mjs +1 -2
  246. package/dist/runtime/polyfill/runtimeInfra.mjs +1 -2
  247. package/dist/runtime/polyfill/runtimeOps.mjs +1 -2
  248. package/dist/runtime/polyfill/selectorQuery.mjs +3 -3
  249. package/dist/runtime/polyfill/selectorQuery.mjs.map +1 -1
  250. package/dist/runtime/polyfill/storage.mjs +1 -2
  251. package/dist/runtime/polyfill/storageAsync.mjs +1 -2
  252. package/dist/runtime/polyfill/subscribe.mjs +1 -2
  253. package/dist/runtime/polyfill/system.mjs +1 -2
  254. package/dist/runtime/polyfill/systemApi.mjs +1 -2
  255. package/dist/runtime/polyfill/types/base.d.mts +0 -2
  256. package/dist/runtime/polyfill/types/common.d.mts +0 -2
  257. package/dist/runtime/polyfill/types/lifecycle.d.mts +12 -0
  258. package/dist/runtime/polyfill/types/locationRuntime.d.mts +0 -2
  259. package/dist/runtime/polyfill/types/mediaAuth.d.mts +0 -2
  260. package/dist/runtime/polyfill/types/platformRuntime.d.mts +0 -2
  261. package/dist/runtime/polyfill/types/systemAuth.d.mts +0 -2
  262. package/dist/runtime/polyfill/types/tabBarRuntime.d.mts +0 -2
  263. package/dist/runtime/polyfill/ui.mjs +1 -2
  264. package/dist/runtime/polyfill/uiFeedback.mjs +19 -5
  265. package/dist/runtime/polyfill/uiFeedback.mjs.map +1 -1
  266. package/dist/runtime/polyfill/uiMediaApi.d.mts +8 -2
  267. package/dist/runtime/polyfill/uiMediaApi.mjs +20 -5
  268. package/dist/runtime/polyfill/uiMediaApi.mjs.map +1 -1
  269. package/dist/runtime/polyfill/videoContext.mjs +1 -2
  270. package/dist/runtime/polyfill/vkSession.mjs +1 -2
  271. package/dist/runtime/polyfill/windowResize.mjs +1 -2
  272. package/dist/runtime/polyfill/worker.mjs +1 -2
  273. package/dist/runtime/polyfill.d.mts +4 -2
  274. package/dist/runtime/renderContext.d.mts +0 -2
  275. package/dist/runtime/renderContext.mjs +5 -4
  276. package/dist/runtime/renderContext.mjs.map +1 -1
  277. package/dist/runtime/rpx.d.mts +0 -2
  278. package/dist/runtime/rpx.mjs +6 -6
  279. package/dist/runtime/rpx.mjs.map +1 -1
  280. package/dist/runtime/seo/index.d.mts +0 -2
  281. package/dist/runtime/seo/index.mjs +1 -2
  282. package/dist/runtime/style.d.mts +0 -2
  283. package/dist/runtime/style.mjs +1 -2
  284. package/dist/runtime/template.d.mts +0 -2
  285. package/dist/runtime/utils/object.mjs +1 -2
  286. package/dist/runtime/viewport/index.d.mts +0 -2
  287. package/dist/runtime/viewport/index.mjs +1 -2
  288. package/dist/runtime/viewport/style.mjs +2 -2
  289. package/dist/runtime/viewport/style.mjs.map +1 -1
  290. package/dist/runtime/viewport/types.d.mts +0 -2
  291. package/dist/runtime/warning.d.mts +0 -2
  292. package/dist/runtime/warning.mjs +1 -2
  293. package/dist/runtime/wevu.d.mts +1 -2
  294. package/dist/runtime/wevu.mjs +1 -2
  295. package/dist/shared/nativeComponents.mjs +10 -3
  296. package/dist/shared/nativeComponents.mjs.map +1 -1
  297. package/dist/shared/slugify.mjs +1 -2
  298. package/dist/shared/styleUnits/options.d.mts +24 -0
  299. package/dist/shared/styleUnits/options.mjs +13 -0
  300. package/dist/shared/styleUnits/options.mjs.map +1 -0
  301. package/dist/shared/styleUnits/value.mjs +63 -0
  302. package/dist/shared/styleUnits/value.mjs.map +1 -0
  303. package/dist/shared/tabBar.d.mts +0 -2
  304. package/dist/shared/tabBar.mjs +1 -2
  305. package/dist/shared/wxml.mjs +1 -2
  306. package/package.json +15 -13
  307. package/dist/runtime/nativeComponents/richText/helpers.mjs +0 -230
  308. package/dist/runtime/nativeComponents/richText/helpers.mjs.map +0 -1
  309. package/dist/runtime/nativeComponents/scrollView.mjs +0 -88
  310. package/dist/runtime/nativeComponents/scrollView.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/runtime/nativeComponents/richText/index.ts"],"sourcesContent":["import type { SafeRichTextNode } from './helpers'\nimport { getNativeComponentDescriptor } from '../../../shared/nativeComponents'\nimport { readBooleanAttribute, resolveContainingShadowRoot } from '../helpers'\nimport { ensureNativeComponentStyle } from '../style'\nimport { normalizeRichTextNodes } from './helpers'\n\nconst BaseElement = (globalThis.HTMLElement ?? class {}) as typeof HTMLElement\n\nfunction createRichTextDomNode(node: SafeRichTextNode): globalThis.Node {\n if (node.type === 'text') {\n return document.createTextNode(node.text)\n }\n const element = document.createElement(node.name)\n for (const [name, value] of Object.entries(node.attrs)) {\n element.setAttribute(name, value)\n }\n element.append(...node.children.map(createRichTextDomNode))\n return element\n}\n\nexport class WeappRichText extends BaseElement {\n static observedAttributes = [...getNativeComponentDescriptor('rich-text')!.attributes]\n\n #content?: HTMLDivElement\n #nodes: unknown = ''\n\n get nodes() {\n return this.#nodes\n }\n\n set nodes(value: unknown) {\n if (Object.is(this.#nodes, value)) {\n return\n }\n this.#nodes = value\n this.#renderNodes()\n }\n\n connectedCallback() {\n ensureNativeComponentStyle(resolveContainingShadowRoot(this))\n this.#ensureStructure()\n if (this.#nodes === '') {\n this.#nodes = this.getAttribute('nodes') ?? ''\n }\n this.#syncAttributes()\n this.#renderNodes()\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null) {\n if (name === 'nodes') {\n this.#nodes = newValue ?? ''\n this.#renderNodes()\n return\n }\n this.#syncAttributes()\n }\n\n #ensureStructure() {\n if (this.#content || typeof document === 'undefined') {\n return\n }\n const root = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n const style = document.createElement('style')\n style.textContent = `\n :host { overflow-wrap: break-word; }\n .content { display: block; min-width: 0; }\n img { max-width: 100%; }\n `\n const content = document.createElement('div')\n content.className = 'content'\n content.addEventListener('click', (event) => {\n const target = event.target\n if (target instanceof Element && target.closest('a')) {\n event.preventDefault()\n }\n })\n root.append(style, content)\n this.#content = content\n }\n\n #syncAttributes() {\n if (!this.#content) {\n return\n }\n const space = this.getAttribute('space')\n this.#content.style.whiteSpace = space === 'nbsp' || space === 'ensp' || space === 'emsp'\n ? 'pre-wrap'\n : 'normal'\n this.#content.style.userSelect = readBooleanAttribute(this, 'user-select') ? 'text' : ''\n }\n\n #renderNodes() {\n if (!this.#content || typeof document === 'undefined') {\n return\n }\n this.#content.replaceChildren(...normalizeRichTextNodes(this.#nodes).map(createRichTextDomNode))\n }\n}\n\nexport * from './helpers'\n"],"mappings":";;;;;;AAMA,MAAM,cAAe,WAAW,eAAe,MAAM,CAAC;AAEtD,SAAS,sBAAsB,MAAyC;CACtE,IAAI,KAAK,SAAS,QAChB,OAAO,SAAS,eAAe,KAAK,IAAI;CAE1C,MAAM,UAAU,SAAS,cAAc,KAAK,IAAI;CAChD,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,KAAK,KAAK,GACnD,QAAQ,aAAa,MAAM,KAAK;CAElC,QAAQ,OAAO,GAAG,KAAK,SAAS,IAAI,qBAAqB,CAAC;CAC1D,OAAO;AACT;AAEA,IAAa,gBAAb,cAAmC,YAAY;CAC7C,OAAO,qBAAqB,CAAC,GAAG,6BAA6B,WAAW,CAAC,CAAE,UAAU;CAErF;CACA,SAAkB;CAElB,IAAI,QAAQ;EACV,OAAO,KAAK;CACd;CAEA,IAAI,MAAM,OAAgB;EACxB,IAAI,OAAO,GAAG,KAAK,QAAQ,KAAK,GAC9B;EAEF,KAAK,SAAS;EACd,KAAK,aAAa;CACpB;CAEA,oBAAoB;EAClB,2BAA2B,4BAA4B,IAAI,CAAC;EAC5D,KAAK,iBAAiB;EACtB,IAAI,KAAK,WAAW,IAClB,KAAK,SAAS,KAAK,aAAa,OAAO,KAAK;EAE9C,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACpB;CAEA,yBAAyB,MAAc,WAA0B,UAAyB;EACxF,IAAI,SAAS,SAAS;GACpB,KAAK,SAAS,YAAY;GAC1B,KAAK,aAAa;GAClB;EACF;EACA,KAAK,gBAAgB;CACvB;CAEA,mBAAmB;EACjB,IAAI,KAAK,YAAY,OAAO,aAAa,aACvC;EAEF,MAAM,OAAO,KAAK,cAAc,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;EAClE,MAAM,QAAQ,SAAS,cAAc,OAAO;EAC5C,MAAM,cAAc;;;;;EAKpB,MAAM,UAAU,SAAS,cAAc,KAAK;EAC5C,QAAQ,YAAY;EACpB,QAAQ,iBAAiB,UAAU,UAAU;GAC3C,MAAM,SAAS,MAAM;GACrB,IAAI,kBAAkB,WAAW,OAAO,QAAQ,GAAG,GACjD,MAAM,eAAe;EAEzB,CAAC;EACD,KAAK,OAAO,OAAO,OAAO;EAC1B,KAAK,WAAW;CAClB;CAEA,kBAAkB;EAChB,IAAI,CAAC,KAAK,UACR;EAEF,MAAM,QAAQ,KAAK,aAAa,OAAO;EACvC,KAAK,SAAS,MAAM,aAAa,UAAU,UAAU,UAAU,UAAU,UAAU,SAC/E,aACA;EACJ,KAAK,SAAS,MAAM,aAAa,qBAAqB,MAAM,aAAa,IAAI,SAAS;CACxF;CAEA,eAAe;EACb,IAAI,CAAC,KAAK,YAAY,OAAO,aAAa,aACxC;EAEF,KAAK,SAAS,gBAAgB,GAAG,uBAAuB,KAAK,MAAM,CAAC,CAAC,IAAI,qBAAqB,CAAC;CACjG;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/runtime/nativeComponents/richText/index.ts"],"sourcesContent":["import type { SafeRichTextNode } from '@weapp-core/shared/rich-text'\nimport { normalizeRichTextNodes } from '@weapp-core/shared/rich-text'\nimport { getNativeComponentDescriptor } from '../../../shared/nativeComponents'\nimport { readBooleanAttribute, resolveContainingShadowRoot } from '../helpers'\nimport { ensureNativeComponentStyle } from '../style'\n\nconst BaseElement = (globalThis.HTMLElement ?? class {}) as typeof HTMLElement\n\nfunction createRichTextDomNode(node: SafeRichTextNode): globalThis.Node {\n if (node.type === 'text') {\n return document.createTextNode(node.text)\n }\n const element = document.createElement(node.name)\n for (const [name, value] of Object.entries(node.attrs)) {\n element.setAttribute(name, value)\n }\n element.append(...node.children.map(createRichTextDomNode))\n return element\n}\n\nexport class WeappRichText extends BaseElement {\n static observedAttributes = [...getNativeComponentDescriptor('rich-text')!.attributes]\n\n #content?: HTMLDivElement\n #nodes: unknown = ''\n\n get nodes() {\n return this.#nodes\n }\n\n set nodes(value: unknown) {\n if (Object.is(this.#nodes, value)) {\n return\n }\n this.#nodes = value\n this.#renderNodes()\n }\n\n connectedCallback() {\n ensureNativeComponentStyle(resolveContainingShadowRoot(this))\n this.#ensureStructure()\n if (this.#nodes === '') {\n this.#nodes = this.getAttribute('nodes') ?? ''\n }\n this.#syncAttributes()\n this.#renderNodes()\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null) {\n if (name === 'nodes') {\n this.#nodes = newValue ?? ''\n this.#renderNodes()\n return\n }\n this.#syncAttributes()\n }\n\n #ensureStructure() {\n if (this.#content || typeof document === 'undefined') {\n return\n }\n const root = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n const style = document.createElement('style')\n style.textContent = `\n :host { overflow-wrap: break-word; }\n .content { display: block; min-width: 0; }\n img { max-width: 100%; }\n `\n const content = document.createElement('div')\n content.className = 'content'\n content.addEventListener('click', (event) => {\n const target = event.target\n if (target instanceof Element && target.closest('a')) {\n event.preventDefault()\n }\n })\n root.append(style, content)\n this.#content = content\n }\n\n #syncAttributes() {\n if (!this.#content) {\n return\n }\n const space = this.getAttribute('space')\n this.#content.style.whiteSpace = space === 'nbsp' || space === 'ensp' || space === 'emsp'\n ? 'pre-wrap'\n : 'normal'\n this.#content.style.userSelect = readBooleanAttribute(this, 'user-select') ? 'text' : ''\n }\n\n #renderNodes() {\n if (!this.#content || typeof document === 'undefined') {\n return\n }\n this.#content.replaceChildren(...normalizeRichTextNodes(this.#nodes).map(createRichTextDomNode))\n }\n}\n"],"mappings":";;;;;;AAMA,MAAM,cAAe,WAAW,eAAe,MAAM,CAAC;AAEtD,SAAS,sBAAsB,MAAyC;CACtE,IAAI,KAAK,SAAS,QAChB,OAAO,SAAS,eAAe,KAAK,IAAI;CAE1C,MAAM,UAAU,SAAS,cAAc,KAAK,IAAI;CAChD,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,KAAK,KAAK,GACnD,QAAQ,aAAa,MAAM,KAAK;CAElC,QAAQ,OAAO,GAAG,KAAK,SAAS,IAAI,qBAAqB,CAAC;CAC1D,OAAO;AACT;AAEA,IAAa,gBAAb,cAAmC,YAAY;CAC7C,OAAO,qBAAqB,CAAC,GAAG,6BAA6B,WAAW,CAAC,CAAE,UAAU;CAErF;CACA,SAAkB;CAElB,IAAI,QAAQ;EACV,OAAO,KAAK;CACd;CAEA,IAAI,MAAM,OAAgB;EACxB,IAAI,OAAO,GAAG,KAAK,QAAQ,KAAK,GAC9B;EAEF,KAAK,SAAS;EACd,KAAK,aAAa;CACpB;CAEA,oBAAoB;EAClB,2BAA2B,4BAA4B,IAAI,CAAC;EAC5D,KAAK,iBAAiB;EACtB,IAAI,KAAK,WAAW,IAClB,KAAK,SAAS,KAAK,aAAa,OAAO,KAAK;EAE9C,KAAK,gBAAgB;EACrB,KAAK,aAAa;CACpB;CAEA,yBAAyB,MAAc,WAA0B,UAAyB;EACxF,IAAI,SAAS,SAAS;GACpB,KAAK,SAAS,YAAY;GAC1B,KAAK,aAAa;GAClB;EACF;EACA,KAAK,gBAAgB;CACvB;CAEA,mBAAmB;EACjB,IAAI,KAAK,YAAY,OAAO,aAAa,aACvC;EAEF,MAAM,OAAO,KAAK,cAAc,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;EAClE,MAAM,QAAQ,SAAS,cAAc,OAAO;EAC5C,MAAM,cAAc;;;;;EAKpB,MAAM,UAAU,SAAS,cAAc,KAAK;EAC5C,QAAQ,YAAY;EACpB,QAAQ,iBAAiB,UAAU,UAAU;GAC3C,MAAM,SAAS,MAAM;GACrB,IAAI,kBAAkB,WAAW,OAAO,QAAQ,GAAG,GACjD,MAAM,eAAe;EAEzB,CAAC;EACD,KAAK,OAAO,OAAO,OAAO;EAC1B,KAAK,WAAW;CAClB;CAEA,kBAAkB;EAChB,IAAI,CAAC,KAAK,UACR;EAEF,MAAM,QAAQ,KAAK,aAAa,OAAO;EACvC,KAAK,SAAS,MAAM,aAAa,UAAU,UAAU,UAAU,UAAU,UAAU,SAC/E,aACA;EACJ,KAAK,SAAS,MAAM,aAAa,qBAAqB,MAAM,aAAa,IAAI,SAAS;CACxF;CAEA,eAAe;EACb,IAAI,CAAC,KAAK,YAAY,OAAO,aAAa,aACxC;EAEF,KAAK,SAAS,gBAAgB,GAAG,uBAAuB,KAAK,MAAM,CAAC,CAAC,IAAI,qBAAqB,CAAC;CACjG;AACF"}
@@ -0,0 +1,62 @@
1
+ import { readBooleanAttribute } from "../helpers.mjs";
2
+ import { getRuntimeRpxSize } from "../../rpx.mjs";
3
+
4
+ // src/runtime/nativeComponents/scrollView/boundaries.ts
5
+ const DEFAULT_SCROLL_THRESHOLD = 50;
6
+ const THRESHOLD_VALUE_RE = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(px|rpx)?$/i;
7
+ /** 默认 50px;rpx 与运行时的设备视口和 designWidth 使用同一换算。 */
8
+ function resolveScrollThreshold(element, name) {
9
+ const raw = element.getAttribute(name)?.trim();
10
+ if (!raw) return DEFAULT_SCROLL_THRESHOLD;
11
+ const match = raw.match(THRESHOLD_VALUE_RE);
12
+ const numeric = match ? Number(match[1]) : NaN;
13
+ if (!Number.isFinite(numeric) || numeric < 0) return DEFAULT_SCROLL_THRESHOLD;
14
+ return match?.[2]?.toLowerCase() === "rpx" ? numeric * getRuntimeRpxSize() : numeric;
15
+ }
16
+ function createScrollBoundaryTracker() {
17
+ let boundaries = {
18
+ top: false,
19
+ bottom: false,
20
+ left: false,
21
+ right: false
22
+ };
23
+ return {
24
+ reset() {
25
+ boundaries = {
26
+ top: false,
27
+ bottom: false,
28
+ left: false,
29
+ right: false
30
+ };
31
+ },
32
+ /** 按本轮尺寸重新判断上次位置,在业务回调前提交两轴状态。 */
33
+ collect(element, viewport, previous) {
34
+ const scrollY = readBooleanAttribute(element, "scroll-y") && viewport.scrollHeight > viewport.clientHeight;
35
+ const scrollX = readBooleanAttribute(element, "scroll-x") && viewport.scrollWidth > viewport.clientWidth;
36
+ const lowerThreshold = resolveScrollThreshold(element, "lower-threshold");
37
+ const upperThreshold = resolveScrollThreshold(element, "upper-threshold");
38
+ const bottom = viewport.scrollHeight - viewport.clientHeight - lowerThreshold;
39
+ const right = viewport.scrollWidth - viewport.clientWidth - lowerThreshold;
40
+ const current = {
41
+ top: scrollY && viewport.scrollTop <= upperThreshold,
42
+ bottom: scrollY && viewport.scrollTop >= bottom,
43
+ left: scrollX && viewport.scrollLeft <= upperThreshold,
44
+ right: scrollX && viewport.scrollLeft >= right
45
+ };
46
+ const entered = {
47
+ top: current.top && !(boundaries.top && previous.scrollTop <= upperThreshold),
48
+ bottom: current.bottom && !(boundaries.bottom && previous.scrollTop >= bottom),
49
+ left: current.left && !(boundaries.left && previous.scrollLeft <= upperThreshold),
50
+ right: current.right && !(boundaries.right && previous.scrollLeft >= right)
51
+ };
52
+ boundaries = current;
53
+ const events = [];
54
+ if (entered.bottom || entered.right) events.push(["scrolltolower", entered.right ? "right" : "bottom"]);
55
+ if (entered.top || entered.left) events.push(["scrolltoupper", entered.left ? "left" : "top"]);
56
+ return events;
57
+ }
58
+ };
59
+ }
60
+
61
+ export { createScrollBoundaryTracker };
62
+ //# sourceMappingURL=boundaries.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundaries.mjs","names":[],"sources":["../../../../src/runtime/nativeComponents/scrollView/boundaries.ts"],"sourcesContent":["import type { ScrollPosition } from './helpers'\nimport { getRuntimeRpxSize } from '../../rpx'\nimport { readBooleanAttribute } from '../helpers'\n\nconst DEFAULT_SCROLL_THRESHOLD = 50\nconst THRESHOLD_VALUE_RE = /^([+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:e[+-]?\\d+)?)(px|rpx)?$/i\n\n/** 默认 50px;rpx 与运行时的设备视口和 designWidth 使用同一换算。 */\nfunction resolveScrollThreshold(element: Element, name: string) {\n const raw = element.getAttribute(name)?.trim()\n if (!raw) {\n return DEFAULT_SCROLL_THRESHOLD\n }\n const match = raw.match(THRESHOLD_VALUE_RE)\n const numeric = match ? Number(match[1]) : Number.NaN\n if (!Number.isFinite(numeric) || numeric < 0) {\n return DEFAULT_SCROLL_THRESHOLD\n }\n return match?.[2]?.toLowerCase() === 'rpx' ? numeric * getRuntimeRpxSize() : numeric\n}\n\nexport function createScrollBoundaryTracker() {\n let boundaries = { top: false, bottom: false, left: false, right: false }\n return {\n reset() {\n boundaries = { top: false, bottom: false, left: false, right: false }\n },\n /** 按本轮尺寸重新判断上次位置,在业务回调前提交两轴状态。 */\n collect(element: Element, viewport: HTMLDivElement, previous: ScrollPosition) {\n const scrollY = readBooleanAttribute(element, 'scroll-y') && viewport.scrollHeight > viewport.clientHeight\n const scrollX = readBooleanAttribute(element, 'scroll-x') && viewport.scrollWidth > viewport.clientWidth\n const lowerThreshold = resolveScrollThreshold(element, 'lower-threshold')\n const upperThreshold = resolveScrollThreshold(element, 'upper-threshold')\n const bottom = viewport.scrollHeight - viewport.clientHeight - lowerThreshold\n const right = viewport.scrollWidth - viewport.clientWidth - lowerThreshold\n const current = {\n top: scrollY && viewport.scrollTop <= upperThreshold,\n bottom: scrollY && viewport.scrollTop >= bottom,\n left: scrollX && viewport.scrollLeft <= upperThreshold,\n right: scrollX && viewport.scrollLeft >= right,\n }\n const entered = {\n top: current.top && !(boundaries.top && previous.scrollTop <= upperThreshold),\n bottom: current.bottom && !(boundaries.bottom && previous.scrollTop >= bottom),\n left: current.left && !(boundaries.left && previous.scrollLeft <= upperThreshold),\n right: current.right && !(boundaries.right && previous.scrollLeft >= right),\n }\n boundaries = current\n const events: Array<[string, string]> = []\n if (entered.bottom || entered.right) {\n events.push(['scrolltolower', entered.right ? 'right' : 'bottom'])\n }\n if (entered.top || entered.left) {\n events.push(['scrolltoupper', entered.left ? 'left' : 'top'])\n }\n return events\n },\n }\n}\n"],"mappings":";;;;AAIA,MAAM,2BAA2B;AACjC,MAAM,qBAAqB;;AAG3B,SAAS,uBAAuB,SAAkB,MAAc;CAC9D,MAAM,MAAM,QAAQ,aAAa,IAAI,CAAC,EAAE,KAAK;CAC7C,IAAI,CAAC,KACH,OAAO;CAET,MAAM,QAAQ,IAAI,MAAM,kBAAkB;CAC1C,MAAM,UAAU,QAAQ,OAAO,MAAM,EAAE,IAAI;CAC3C,IAAI,CAAC,OAAO,SAAS,OAAO,KAAK,UAAU,GACzC,OAAO;CAET,OAAO,QAAQ,EAAE,EAAE,YAAY,MAAM,QAAQ,UAAU,kBAAkB,IAAI;AAC/E;AAEA,SAAgB,8BAA8B;CAC5C,IAAI,aAAa;EAAE,KAAK;EAAO,QAAQ;EAAO,MAAM;EAAO,OAAO;CAAM;CACxE,OAAO;EACL,QAAQ;GACN,aAAa;IAAE,KAAK;IAAO,QAAQ;IAAO,MAAM;IAAO,OAAO;GAAM;EACtE;;EAEA,QAAQ,SAAkB,UAA0B,UAA0B;GAC5E,MAAM,UAAU,qBAAqB,SAAS,UAAU,KAAK,SAAS,eAAe,SAAS;GAC9F,MAAM,UAAU,qBAAqB,SAAS,UAAU,KAAK,SAAS,cAAc,SAAS;GAC7F,MAAM,iBAAiB,uBAAuB,SAAS,iBAAiB;GACxE,MAAM,iBAAiB,uBAAuB,SAAS,iBAAiB;GACxE,MAAM,SAAS,SAAS,eAAe,SAAS,eAAe;GAC/D,MAAM,QAAQ,SAAS,cAAc,SAAS,cAAc;GAC5D,MAAM,UAAU;IACd,KAAK,WAAW,SAAS,aAAa;IACtC,QAAQ,WAAW,SAAS,aAAa;IACzC,MAAM,WAAW,SAAS,cAAc;IACxC,OAAO,WAAW,SAAS,cAAc;GAC3C;GACA,MAAM,UAAU;IACd,KAAK,QAAQ,OAAO,EAAE,WAAW,OAAO,SAAS,aAAa;IAC9D,QAAQ,QAAQ,UAAU,EAAE,WAAW,UAAU,SAAS,aAAa;IACvE,MAAM,QAAQ,QAAQ,EAAE,WAAW,QAAQ,SAAS,cAAc;IAClE,OAAO,QAAQ,SAAS,EAAE,WAAW,SAAS,SAAS,cAAc;GACvE;GACA,aAAa;GACb,MAAM,SAAkC,CAAC;GACzC,IAAI,QAAQ,UAAU,QAAQ,OAC5B,OAAO,KAAK,CAAC,iBAAiB,QAAQ,QAAQ,UAAU,QAAQ,CAAC;GAEnE,IAAI,QAAQ,OAAO,QAAQ,MACzB,OAAO,KAAK,CAAC,iBAAiB,QAAQ,OAAO,SAAS,KAAK,CAAC;GAE9D,OAAO;EACT;CACF;AACF"}
@@ -1,8 +1,8 @@
1
- //#region src/runtime/nativeComponents/scrollView.d.ts
2
- export declare function createScrollEventDetail(viewport: Pick<HTMLDivElement, 'scrollHeight' | 'scrollLeft' | 'scrollTop' | 'scrollWidth'>, previous: {
1
+ export interface ScrollPosition {
3
2
  scrollLeft: number;
4
3
  scrollTop: number;
5
- }): {
4
+ }
5
+ export declare function createScrollEventDetail(viewport: Pick<HTMLDivElement, 'scrollHeight' | 'scrollLeft' | 'scrollTop' | 'scrollWidth'>, previous: ScrollPosition): {
6
6
  scrollLeft: number;
7
7
  scrollTop: number;
8
8
  scrollWidth: number;
@@ -10,5 +10,4 @@ export declare function createScrollEventDetail(viewport: Pick<HTMLDivElement, '
10
10
  deltaX: number;
11
11
  deltaY: number;
12
12
  };
13
- //#endregion
14
- //# sourceMappingURL=scrollView.d.mts.map
13
+ //# sourceMappingURL=helpers.d.mts.map
@@ -0,0 +1,14 @@
1
+ // src/runtime/nativeComponents/scrollView/helpers.ts
2
+ function createScrollEventDetail(viewport, previous) {
3
+ return {
4
+ scrollLeft: viewport.scrollLeft,
5
+ scrollTop: viewport.scrollTop,
6
+ scrollWidth: viewport.scrollWidth,
7
+ scrollHeight: viewport.scrollHeight,
8
+ deltaX: viewport.scrollLeft - previous.scrollLeft,
9
+ deltaY: viewport.scrollTop - previous.scrollTop
10
+ };
11
+ }
12
+
13
+ export { createScrollEventDetail };
14
+ //# sourceMappingURL=helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.mjs","names":[],"sources":["../../../../src/runtime/nativeComponents/scrollView/helpers.ts"],"sourcesContent":["export interface ScrollPosition {\n scrollLeft: number\n scrollTop: number\n}\n\nexport function createScrollEventDetail(\n viewport: Pick<HTMLDivElement, 'scrollHeight' | 'scrollLeft' | 'scrollTop' | 'scrollWidth'>,\n previous: ScrollPosition,\n) {\n return {\n scrollLeft: viewport.scrollLeft,\n scrollTop: viewport.scrollTop,\n scrollWidth: viewport.scrollWidth,\n scrollHeight: viewport.scrollHeight,\n deltaX: viewport.scrollLeft - previous.scrollLeft,\n deltaY: viewport.scrollTop - previous.scrollTop,\n }\n}\n"],"mappings":";AAKA,SAAgB,wBACd,UACA,UACA;CACA,OAAO;EACL,YAAY,SAAS;EACrB,WAAW,SAAS;EACpB,aAAa,SAAS;EACtB,cAAc,SAAS;EACvB,QAAQ,SAAS,aAAa,SAAS;EACvC,QAAQ,SAAS,YAAY,SAAS;CACxC;AACF"}
@@ -0,0 +1,193 @@
1
+ import { getNativeComponentDescriptor } from "../../../shared/nativeComponents.mjs";
2
+ import { dispatchMiniProgramEvent, readBooleanAttribute, resolveContainingShadowRoot } from "../helpers.mjs";
3
+ import { ensureNativeComponentStyle } from "../style.mjs";
4
+ import { createScrollBoundaryTracker } from "./boundaries.mjs";
5
+ import { createScrollEventDetail } from "./helpers.mjs";
6
+ import { findScrollTarget, scrollToTarget } from "./position.mjs";
7
+
8
+ // src/runtime/nativeComponents/scrollView/index.ts
9
+ const BaseElement = globalThis.HTMLElement ?? class {};
10
+ const SCROLL_END_DELAY = 150;
11
+ const POSITION_ATTRIBUTES = /* @__PURE__ */ new Set([
12
+ "scroll-into-view",
13
+ "scroll-into-view-offset",
14
+ "scroll-into-view-alignment",
15
+ "scroll-top",
16
+ "scroll-left",
17
+ "scroll-x",
18
+ "scroll-y"
19
+ ]);
20
+ const EVENT_OPTIONS = {
21
+ bubbles: false,
22
+ composed: false
23
+ };
24
+ var WeappScrollView = class extends BaseElement {
25
+ static observedAttributes = [...getNativeComponentDescriptor("scroll-view").attributes];
26
+ #viewport;
27
+ #previous = {
28
+ scrollLeft: 0,
29
+ scrollTop: 0
30
+ };
31
+ #boundaries = createScrollBoundaryTracker();
32
+ #scrolling = false;
33
+ #generation = 0;
34
+ #connectionVersion = 0;
35
+ #scrollEndTimer;
36
+ #childrenObserver;
37
+ #resizeObserver;
38
+ #alignedTarget;
39
+ get scrollTop() {
40
+ return this.#viewport?.scrollTop ?? 0;
41
+ }
42
+ set scrollTop(value) {
43
+ if (this.#viewport) this.#viewport.scrollTop = value;
44
+ }
45
+ get scrollLeft() {
46
+ return this.#viewport?.scrollLeft ?? 0;
47
+ }
48
+ set scrollLeft(value) {
49
+ if (this.#viewport) this.#viewport.scrollLeft = value;
50
+ }
51
+ connectedCallback() {
52
+ ensureNativeComponentStyle(resolveContainingShadowRoot(this));
53
+ const initializePosition = !this.#viewport;
54
+ this.#ensureStructure();
55
+ if (!initializePosition) this.#previous = {
56
+ scrollLeft: this.scrollLeft,
57
+ scrollTop: this.scrollTop
58
+ };
59
+ this.#syncAttributes(void 0, initializePosition);
60
+ this.#childrenObserver ??= new MutationObserver(() => this.#scrollIntoView(true));
61
+ this.#childrenObserver.observe(this, {
62
+ childList: true,
63
+ subtree: true,
64
+ attributes: true,
65
+ attributeFilter: ["id"]
66
+ });
67
+ if (typeof ResizeObserver !== "undefined") {
68
+ this.#resizeObserver ??= new ResizeObserver(() => this.#scrollIntoView(true));
69
+ this.#resizeObserver.observe(this.#viewport);
70
+ }
71
+ }
72
+ disconnectedCallback() {
73
+ this.#connectionVersion += 1;
74
+ this.#generation += 1;
75
+ this.#clearScrollEndTimer();
76
+ this.#scrolling = false;
77
+ this.#boundaries.reset();
78
+ this.#childrenObserver?.disconnect();
79
+ this.#resizeObserver?.disconnect();
80
+ this.#alignedTarget = void 0;
81
+ }
82
+ attributeChangedCallback(name, oldValue, newValue) {
83
+ if (oldValue !== newValue) this.#syncAttributes(name);
84
+ }
85
+ #ensureStructure() {
86
+ if (this.#viewport || typeof document === "undefined") return;
87
+ const root = this.shadowRoot ?? this.attachShadow({ mode: "open" });
88
+ const style = document.createElement("style");
89
+ style.textContent = `
90
+ :host { min-width: 0; min-height: 0; }
91
+ .viewport { width: 100%; height: 100%; overscroll-behavior: contain; }
92
+ .viewport.flex {
93
+ display: inherit;
94
+ flex-direction: inherit;
95
+ flex-wrap: inherit;
96
+ justify-content: inherit;
97
+ align-items: inherit;
98
+ align-content: inherit;
99
+ gap: inherit;
100
+ }
101
+ .viewport.flex > slot { display: contents; }
102
+ .viewport.no-scrollbar { scrollbar-width: none; }
103
+ .viewport.no-scrollbar.scroll-x { scrollbar-width: auto; }
104
+ .viewport.no-scrollbar::-webkit-scrollbar:vertical { display: none; width: 0; }
105
+ `;
106
+ const viewport = document.createElement("div");
107
+ viewport.className = "viewport";
108
+ const slot = document.createElement("slot");
109
+ slot.addEventListener("slotchange", () => this.#scrollIntoView(true));
110
+ viewport.append(slot);
111
+ viewport.addEventListener("scroll", (event) => {
112
+ if (event.target === viewport) this.#handleScroll();
113
+ });
114
+ root.append(style, viewport);
115
+ this.#viewport = viewport;
116
+ }
117
+ #handleScroll() {
118
+ const viewport = this.#viewport;
119
+ if (!viewport || !this.isConnected) return;
120
+ const detail = createScrollEventDetail(viewport, this.#previous);
121
+ const connectionVersion = this.#connectionVersion;
122
+ const boundaries = this.#boundaries.collect(this, viewport, this.#previous);
123
+ this.#previous = {
124
+ scrollLeft: detail.scrollLeft,
125
+ scrollTop: detail.scrollTop
126
+ };
127
+ const started = !this.#scrolling;
128
+ this.#scrolling = true;
129
+ this.#clearScrollEndTimer();
130
+ const generation = ++this.#generation;
131
+ this.#scrollEndTimer = setTimeout(() => {
132
+ if (generation !== this.#generation || !this.isConnected) return;
133
+ this.#scrollEndTimer = void 0;
134
+ this.#scrolling = false;
135
+ dispatchMiniProgramEvent(this, "scrollend", {
136
+ ...detail,
137
+ deltaX: 0,
138
+ deltaY: 0
139
+ }, EVENT_OPTIONS);
140
+ }, SCROLL_END_DELAY);
141
+ if (started) dispatchMiniProgramEvent(this, "scrollstart", detail, EVENT_OPTIONS);
142
+ if (!this.isConnected || connectionVersion !== this.#connectionVersion) return;
143
+ dispatchMiniProgramEvent(this, "scroll", detail, EVENT_OPTIONS);
144
+ for (const [name, direction] of boundaries) {
145
+ if (!this.isConnected || connectionVersion !== this.#connectionVersion) break;
146
+ dispatchMiniProgramEvent(this, name, { direction }, EVENT_OPTIONS);
147
+ }
148
+ }
149
+ #clearScrollEndTimer() {
150
+ if (this.#scrollEndTimer !== void 0) {
151
+ clearTimeout(this.#scrollEndTimer);
152
+ this.#scrollEndTimer = void 0;
153
+ }
154
+ }
155
+ #syncAttributes(changedName, initializePosition = false) {
156
+ const viewport = this.#viewport;
157
+ if (!viewport) return;
158
+ if (!changedName || changedName === "scroll-x") {
159
+ const scrollX = readBooleanAttribute(this, "scroll-x");
160
+ viewport.style.overflowX = scrollX ? "auto" : "hidden";
161
+ viewport.classList.toggle("scroll-x", scrollX);
162
+ }
163
+ if (!changedName || changedName === "scroll-y") viewport.style.overflowY = readBooleanAttribute(this, "scroll-y") ? "auto" : "hidden";
164
+ if (!changedName || changedName === "enable-flex") viewport.classList.toggle("flex", readBooleanAttribute(this, "enable-flex"));
165
+ if (!changedName || changedName === "show-scrollbar" || changedName === "enhanced" || changedName === "scroll-y") {
166
+ const hidden = readBooleanAttribute(this, "scroll-y") && readBooleanAttribute(this, "enhanced") && this.hasAttribute("show-scrollbar") && !readBooleanAttribute(this, "show-scrollbar");
167
+ viewport.classList.toggle("no-scrollbar", hidden);
168
+ }
169
+ if (initializePosition || changedName === "scroll-top") {
170
+ const scrollTop = Number(this.getAttribute("scroll-top"));
171
+ if (Number.isFinite(scrollTop)) viewport.scrollTop = scrollTop;
172
+ }
173
+ if (initializePosition || changedName === "scroll-left") {
174
+ const scrollLeft = Number(this.getAttribute("scroll-left"));
175
+ if (Number.isFinite(scrollLeft)) viewport.scrollLeft = scrollLeft;
176
+ }
177
+ if (!changedName || POSITION_ATTRIBUTES.has(changedName)) this.#scrollIntoView();
178
+ }
179
+ #scrollIntoView(onlyNewTarget = false) {
180
+ const viewport = this.#viewport;
181
+ if (!viewport || !this.isConnected) return;
182
+ const target = findScrollTarget(this);
183
+ if (!target) {
184
+ this.#alignedTarget = void 0;
185
+ return;
186
+ }
187
+ if (onlyNewTarget && target === this.#alignedTarget) return;
188
+ this.#alignedTarget = scrollToTarget(this, viewport, target) ? target : void 0;
189
+ }
190
+ };
191
+
192
+ export { WeappScrollView, createScrollEventDetail };
193
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/runtime/nativeComponents/scrollView/index.ts"],"sourcesContent":["import type { ScrollPosition } from './helpers'\nimport { getNativeComponentDescriptor } from '../../../shared/nativeComponents'\nimport { dispatchMiniProgramEvent, readBooleanAttribute, resolveContainingShadowRoot } from '../helpers'\nimport { ensureNativeComponentStyle } from '../style'\nimport { createScrollBoundaryTracker } from './boundaries'\nimport { createScrollEventDetail } from './helpers'\nimport { findScrollTarget, scrollToTarget } from './position'\n\nexport { createScrollEventDetail } from './helpers'\n\nconst BaseElement = (globalThis.HTMLElement ?? class {}) as typeof HTMLElement\nconst SCROLL_END_DELAY = 150\nconst POSITION_ATTRIBUTES = new Set(['scroll-into-view', 'scroll-into-view-offset', 'scroll-into-view-alignment', 'scroll-top', 'scroll-left', 'scroll-x', 'scroll-y'])\nconst EVENT_OPTIONS = { bubbles: false, composed: false }\n\nexport class WeappScrollView extends BaseElement {\n static observedAttributes = [...getNativeComponentDescriptor('scroll-view')!.attributes]\n\n #viewport?: HTMLDivElement\n #previous: ScrollPosition = { scrollLeft: 0, scrollTop: 0 }\n #boundaries = createScrollBoundaryTracker()\n #scrolling = false\n #generation = 0\n #connectionVersion = 0\n #scrollEndTimer: ReturnType<typeof setTimeout> | undefined\n #childrenObserver?: MutationObserver\n #resizeObserver?: ResizeObserver\n #alignedTarget?: Element\n\n get scrollTop() {\n return this.#viewport?.scrollTop ?? 0\n }\n\n set scrollTop(value: number) {\n if (this.#viewport) {\n this.#viewport.scrollTop = value\n }\n }\n\n get scrollLeft() {\n return this.#viewport?.scrollLeft ?? 0\n }\n\n set scrollLeft(value: number) {\n if (this.#viewport) {\n this.#viewport.scrollLeft = value\n }\n }\n\n connectedCallback() {\n ensureNativeComponentStyle(resolveContainingShadowRoot(this))\n const initializePosition = !this.#viewport\n this.#ensureStructure()\n if (!initializePosition) {\n this.#previous = { scrollLeft: this.scrollLeft, scrollTop: this.scrollTop }\n }\n this.#syncAttributes(undefined, initializePosition)\n this.#childrenObserver ??= new MutationObserver(() => this.#scrollIntoView(true))\n this.#childrenObserver.observe(this, { childList: true, subtree: true, attributes: true, attributeFilter: ['id'] })\n if (typeof ResizeObserver !== 'undefined') {\n this.#resizeObserver ??= new ResizeObserver(() => this.#scrollIntoView(true))\n this.#resizeObserver.observe(this.#viewport!)\n }\n }\n\n disconnectedCallback() {\n this.#connectionVersion += 1\n this.#generation += 1\n this.#clearScrollEndTimer()\n this.#scrolling = false\n this.#boundaries.reset()\n this.#childrenObserver?.disconnect()\n this.#resizeObserver?.disconnect()\n this.#alignedTarget = undefined\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (oldValue !== newValue) {\n this.#syncAttributes(name)\n }\n }\n\n #ensureStructure() {\n if (this.#viewport || typeof document === 'undefined') {\n return\n }\n const root = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n const style = document.createElement('style')\n style.textContent = `\n :host { min-width: 0; min-height: 0; }\n .viewport { width: 100%; height: 100%; overscroll-behavior: contain; }\n .viewport.flex {\n display: inherit;\n flex-direction: inherit;\n flex-wrap: inherit;\n justify-content: inherit;\n align-items: inherit;\n align-content: inherit;\n gap: inherit;\n }\n .viewport.flex > slot { display: contents; }\n .viewport.no-scrollbar { scrollbar-width: none; }\n .viewport.no-scrollbar.scroll-x { scrollbar-width: auto; }\n .viewport.no-scrollbar::-webkit-scrollbar:vertical { display: none; width: 0; }\n `\n const viewport = document.createElement('div')\n viewport.className = 'viewport'\n const slot = document.createElement('slot')\n slot.addEventListener('slotchange', () => this.#scrollIntoView(true))\n viewport.append(slot)\n viewport.addEventListener('scroll', (event) => {\n if (event.target === viewport) {\n this.#handleScroll()\n }\n })\n root.append(style, viewport)\n this.#viewport = viewport\n }\n\n #handleScroll() {\n const viewport = this.#viewport\n if (!viewport || !this.isConnected) {\n return\n }\n const detail = createScrollEventDetail(viewport, this.#previous)\n const connectionVersion = this.#connectionVersion\n const boundaries = this.#boundaries.collect(this, viewport, this.#previous)\n this.#previous = { scrollLeft: detail.scrollLeft, scrollTop: detail.scrollTop }\n const started = !this.#scrolling\n this.#scrolling = true\n this.#clearScrollEndTimer()\n const generation = ++this.#generation\n // 在任何业务回调前登记计时器;重入滚动可直接接管,断连可立即取消。\n this.#scrollEndTimer = setTimeout(() => {\n if (generation !== this.#generation || !this.isConnected) {\n return\n }\n this.#scrollEndTimer = undefined\n this.#scrolling = false\n dispatchMiniProgramEvent(this, 'scrollend', { ...detail, deltaX: 0, deltaY: 0 }, EVENT_OPTIONS)\n }, SCROLL_END_DELAY)\n if (started) {\n dispatchMiniProgramEvent(this, 'scrollstart', detail, EVENT_OPTIONS)\n }\n if (!this.isConnected || connectionVersion !== this.#connectionVersion) {\n return\n }\n dispatchMiniProgramEvent(this, 'scroll', detail, EVENT_OPTIONS)\n for (const [name, direction] of boundaries) {\n if (!this.isConnected || connectionVersion !== this.#connectionVersion) {\n break\n }\n dispatchMiniProgramEvent(this, name, { direction }, EVENT_OPTIONS)\n }\n }\n\n #clearScrollEndTimer() {\n if (this.#scrollEndTimer !== undefined) {\n clearTimeout(this.#scrollEndTimer)\n this.#scrollEndTimer = undefined\n }\n }\n\n #syncAttributes(changedName?: string, initializePosition = false) {\n const viewport = this.#viewport\n if (!viewport) {\n return\n }\n if (!changedName || changedName === 'scroll-x') {\n const scrollX = readBooleanAttribute(this, 'scroll-x')\n viewport.style.overflowX = scrollX ? 'auto' : 'hidden'\n viewport.classList.toggle('scroll-x', scrollX)\n }\n if (!changedName || changedName === 'scroll-y') {\n viewport.style.overflowY = readBooleanAttribute(this, 'scroll-y') ? 'auto' : 'hidden'\n }\n if (!changedName || changedName === 'enable-flex') {\n viewport.classList.toggle('flex', readBooleanAttribute(this, 'enable-flex'))\n }\n if (!changedName || changedName === 'show-scrollbar' || changedName === 'enhanced' || changedName === 'scroll-y') {\n const hidden = readBooleanAttribute(this, 'scroll-y') && readBooleanAttribute(this, 'enhanced')\n && this.hasAttribute('show-scrollbar') && !readBooleanAttribute(this, 'show-scrollbar')\n viewport.classList.toggle('no-scrollbar', hidden)\n }\n if (initializePosition || changedName === 'scroll-top') {\n const scrollTop = Number(this.getAttribute('scroll-top'))\n if (Number.isFinite(scrollTop)) {\n viewport.scrollTop = scrollTop\n }\n }\n if (initializePosition || changedName === 'scroll-left') {\n const scrollLeft = Number(this.getAttribute('scroll-left'))\n if (Number.isFinite(scrollLeft)) {\n viewport.scrollLeft = scrollLeft\n }\n }\n if (!changedName || POSITION_ATTRIBUTES.has(changedName)) {\n this.#scrollIntoView()\n }\n }\n\n #scrollIntoView(onlyNewTarget = false) {\n const viewport = this.#viewport\n if (!viewport || !this.isConnected) {\n return\n }\n const target = findScrollTarget(this)\n if (!target) {\n this.#alignedTarget = undefined\n return\n }\n if (onlyNewTarget && target === this.#alignedTarget) {\n return\n }\n this.#alignedTarget = scrollToTarget(this, viewport, target) ? target : undefined\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { readBooleanAttribute } from "../helpers.mjs";
2
+
3
+ // src/runtime/nativeComponents/scrollView/position.ts
4
+ /** 按原始 id 查找 light DOM,避免将引号、反斜杠等 id 内容拼入选择器。 */
5
+ function findScrollTarget(element) {
6
+ const id = element.getAttribute("scroll-into-view")?.trim();
7
+ return id ? [...element.querySelectorAll("[id]")].find((child) => child.id === id) : void 0;
8
+ }
9
+ function resolveDistance(start, size, viewportSize, alignment) {
10
+ const end = start + size;
11
+ if (alignment === "center") return start - (viewportSize - size) / 2;
12
+ if (alignment === "end") return end - viewportSize;
13
+ if (alignment === "nearest") {
14
+ if (start >= 0 && end <= viewportSize || start < 0 && end > viewportSize) return 0;
15
+ return start < 0 === size <= viewportSize ? start : end - viewportSize;
16
+ }
17
+ return start;
18
+ }
19
+ /** 仅调整启用的轴;默认 start,nearest 对已完整可见的目标保持位置。 */
20
+ function scrollToTarget(element, viewport, target) {
21
+ const alignment = element.getAttribute("scroll-into-view-alignment") ?? "start";
22
+ const offsetValue = Number(element.getAttribute("scroll-into-view-offset"));
23
+ const offset = Number.isFinite(offsetValue) ? offsetValue : 0;
24
+ const viewportRect = viewport.getBoundingClientRect();
25
+ const targetRect = target.getBoundingClientRect();
26
+ const width = viewport.clientWidth || viewportRect.right - viewportRect.left;
27
+ const height = viewport.clientHeight || viewportRect.bottom - viewportRect.top;
28
+ if (readBooleanAttribute(element, "scroll-y") && height <= 0 || readBooleanAttribute(element, "scroll-x") && width <= 0) return false;
29
+ const apply = (axis) => {
30
+ if (!readBooleanAttribute(element, `scroll-${axis}`)) return;
31
+ const vertical = axis === "y";
32
+ const distance = resolveDistance(vertical ? targetRect.top - viewportRect.top - viewport.clientTop : targetRect.left - viewportRect.left - viewport.clientLeft, vertical ? targetRect.bottom - targetRect.top : targetRect.right - targetRect.left, vertical ? height : width, alignment);
33
+ if (alignment === "nearest" && distance === 0) return;
34
+ if (vertical) viewport.scrollTop = Math.max(0, viewport.scrollTop + distance - offset);
35
+ else viewport.scrollLeft = Math.max(0, viewport.scrollLeft + distance - offset);
36
+ };
37
+ apply("y");
38
+ apply("x");
39
+ return true;
40
+ }
41
+
42
+ export { findScrollTarget, scrollToTarget };
43
+ //# sourceMappingURL=position.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.mjs","names":[],"sources":["../../../../src/runtime/nativeComponents/scrollView/position.ts"],"sourcesContent":["import { readBooleanAttribute } from '../helpers'\n\n/** 按原始 id 查找 light DOM,避免将引号、反斜杠等 id 内容拼入选择器。 */\nexport function findScrollTarget(element: Element) {\n const id = element.getAttribute('scroll-into-view')?.trim()\n return id ? [...element.querySelectorAll('[id]')].find(child => child.id === id) : undefined\n}\n\nfunction resolveDistance(start: number, size: number, viewportSize: number, alignment: string) {\n const end = start + size\n if (alignment === 'center') {\n return start - (viewportSize - size) / 2\n }\n if (alignment === 'end') {\n return end - viewportSize\n }\n if (alignment === 'nearest') {\n if ((start >= 0 && end <= viewportSize) || (start < 0 && end > viewportSize)) {\n return 0\n }\n return (start < 0) === (size <= viewportSize) ? start : end - viewportSize\n }\n return start\n}\n\n/** 仅调整启用的轴;默认 start,nearest 对已完整可见的目标保持位置。 */\nexport function scrollToTarget(element: Element, viewport: HTMLDivElement, target: Element) {\n const alignment = element.getAttribute('scroll-into-view-alignment') ?? 'start'\n const offsetValue = Number(element.getAttribute('scroll-into-view-offset'))\n const offset = Number.isFinite(offsetValue) ? offsetValue : 0\n const viewportRect = viewport.getBoundingClientRect()\n const targetRect = target.getBoundingClientRect()\n const width = viewport.clientWidth || viewportRect.right - viewportRect.left\n const height = viewport.clientHeight || viewportRect.bottom - viewportRect.top\n if ((readBooleanAttribute(element, 'scroll-y') && height <= 0)\n || (readBooleanAttribute(element, 'scroll-x') && width <= 0)) {\n return false\n }\n const apply = (axis: 'x' | 'y') => {\n if (!readBooleanAttribute(element, `scroll-${axis}`)) {\n return\n }\n const vertical = axis === 'y'\n const start = vertical\n ? targetRect.top - viewportRect.top - viewport.clientTop\n : targetRect.left - viewportRect.left - viewport.clientLeft\n const size = vertical ? targetRect.bottom - targetRect.top : targetRect.right - targetRect.left\n const distance = resolveDistance(start, size, vertical ? height : width, alignment)\n if (alignment === 'nearest' && distance === 0) {\n return\n }\n if (vertical) {\n viewport.scrollTop = Math.max(0, viewport.scrollTop + distance - offset)\n }\n else {\n viewport.scrollLeft = Math.max(0, viewport.scrollLeft + distance - offset)\n }\n }\n apply('y')\n apply('x')\n return true\n}\n"],"mappings":";;;;AAGA,SAAgB,iBAAiB,SAAkB;CACjD,MAAM,KAAK,QAAQ,aAAa,kBAAkB,CAAC,EAAE,KAAK;CAC1D,OAAO,KAAK,CAAC,GAAG,QAAQ,iBAAiB,MAAM,CAAC,CAAC,CAAC,MAAK,UAAS,MAAM,OAAO,EAAE,IAAI;AACrF;AAEA,SAAS,gBAAgB,OAAe,MAAc,cAAsB,WAAmB;CAC7F,MAAM,MAAM,QAAQ;CACpB,IAAI,cAAc,UAChB,OAAO,SAAS,eAAe,QAAQ;CAEzC,IAAI,cAAc,OAChB,OAAO,MAAM;CAEf,IAAI,cAAc,WAAW;EAC3B,IAAK,SAAS,KAAK,OAAO,gBAAkB,QAAQ,KAAK,MAAM,cAC7D,OAAO;EAET,OAAQ,QAAQ,MAAQ,QAAQ,eAAgB,QAAQ,MAAM;CAChE;CACA,OAAO;AACT;;AAGA,SAAgB,eAAe,SAAkB,UAA0B,QAAiB;CAC1F,MAAM,YAAY,QAAQ,aAAa,4BAA4B,KAAK;CACxE,MAAM,cAAc,OAAO,QAAQ,aAAa,yBAAyB,CAAC;CAC1E,MAAM,SAAS,OAAO,SAAS,WAAW,IAAI,cAAc;CAC5D,MAAM,eAAe,SAAS,sBAAsB;CACpD,MAAM,aAAa,OAAO,sBAAsB;CAChD,MAAM,QAAQ,SAAS,eAAe,aAAa,QAAQ,aAAa;CACxE,MAAM,SAAS,SAAS,gBAAgB,aAAa,SAAS,aAAa;CAC3E,IAAK,qBAAqB,SAAS,UAAU,KAAK,UAAU,KACtD,qBAAqB,SAAS,UAAU,KAAK,SAAS,GAC1D,OAAO;CAET,MAAM,SAAS,SAAoB;EACjC,IAAI,CAAC,qBAAqB,SAAS,UAAU,MAAM,GACjD;EAEF,MAAM,WAAW,SAAS;EAK1B,MAAM,WAAW,gBAJH,WACV,WAAW,MAAM,aAAa,MAAM,SAAS,YAC7C,WAAW,OAAO,aAAa,OAAO,SAAS,YACtC,WAAW,WAAW,SAAS,WAAW,MAAM,WAAW,QAAQ,WAAW,MAC7C,WAAW,SAAS,OAAO,SAAS;EAClF,IAAI,cAAc,aAAa,aAAa,GAC1C;EAEF,IAAI,UACF,SAAS,YAAY,KAAK,IAAI,GAAG,SAAS,YAAY,WAAW,MAAM;OAGvE,SAAS,aAAa,KAAK,IAAI,GAAG,SAAS,aAAa,WAAW,MAAM;CAE7E;CACA,MAAM,GAAG;CACT,MAAM,GAAG;CACT,OAAO;AACT"}
@@ -1,4 +1,4 @@
1
- //#region src/runtime/nativeComponents/slider/helpers.ts
1
+ // src/runtime/nativeComponents/slider/helpers.ts
2
2
  function finiteNumber(value, fallback) {
3
3
  const numeric = Number(value);
4
4
  return Number.isFinite(numeric) ? numeric : fallback;
@@ -23,6 +23,5 @@ function createSliderEventDetail(value) {
23
23
  return { value };
24
24
  }
25
25
 
26
- //#endregion
27
26
  export { createSliderEventDetail, resolveSliderConfig };
28
27
  //# sourceMappingURL=helpers.mjs.map
@@ -5,7 +5,7 @@ import { ensureNativeComponentStyle } from "../style.mjs";
5
5
  import { createSliderEventDetail, resolveSliderConfig } from "./helpers.mjs";
6
6
  import { SLIDER_SHADOW_STYLE } from "./style.mjs";
7
7
 
8
- //#region src/runtime/nativeComponents/slider/index.ts
8
+ // src/runtime/nativeComponents/slider/index.ts
9
9
  const BaseElement = globalThis.HTMLElement ?? class {};
10
10
  var WeappSlider = class extends BaseElement {
11
11
  static observedAttributes = [...getNativeComponentDescriptor("slider").attributes];
@@ -115,6 +115,5 @@ var WeappSlider = class extends BaseElement {
115
115
  }
116
116
  };
117
117
 
118
- //#endregion
119
118
  export { WeappSlider, createSliderEventDetail, resolveSliderConfig };
120
119
  //# sourceMappingURL=index.mjs.map
@@ -1,4 +1,4 @@
1
- //#region src/runtime/nativeComponents/slider/style.ts
1
+ // src/runtime/nativeComponents/slider/style.ts
2
2
  const SLIDER_SHADOW_STYLE = `
3
3
  :host { min-width: 0; }
4
4
  .slider {
@@ -55,6 +55,5 @@ const SLIDER_SHADOW_STYLE = `
55
55
  output[hidden] { display: none; }
56
56
  `;
57
57
 
58
- //#endregion
59
58
  export { SLIDER_SHADOW_STYLE };
60
59
  //# sourceMappingURL=style.mjs.map
@@ -1,7 +1,7 @@
1
1
  import { NATIVE_COMPONENT_DESCRIPTORS } from "../../shared/nativeComponents.mjs";
2
2
  import { injectStyle } from "../style.mjs";
3
3
 
4
- //#region src/runtime/nativeComponents/style.ts
4
+ // src/runtime/nativeComponents/style.ts
5
5
  const NATIVE_COMPONENT_STYLE_ID = "weapp-web-native-component-style";
6
6
  const styleTargets = /* @__PURE__ */ new WeakSet();
7
7
  let sharedSheet;
@@ -36,6 +36,5 @@ function ensureNativeComponentStyle(root) {
36
36
  styleTargets.add(target);
37
37
  }
38
38
 
39
- //#endregion
40
39
  export { NATIVE_COMPONENT_STYLE, ensureNativeComponentStyle };
41
40
  //# sourceMappingURL=style.mjs.map
@@ -1,4 +1,4 @@
1
- //#region src/runtime/nativeComponents/swiper/helpers.ts
1
+ // src/runtime/nativeComponents/swiper/helpers.ts
2
2
  function clampSwiperIndex(index, itemCount) {
3
3
  if (itemCount <= 0) return 0;
4
4
  return Math.min(itemCount - 1, Math.max(0, Math.trunc(index)));
@@ -47,6 +47,5 @@ function resolveSwiperLength(value) {
47
47
  return /^-?\d+(?:\.\d+)?rpx$/i.test(normalized) || /^-?\.\d+rpx$/i.test(normalized) ? `calc(var(--rpx) * ${normalized.slice(0, -3)})` : normalized;
48
48
  }
49
49
 
50
- //#endregion
51
50
  export { clampSwiperIndex, createSwiperChangeDetail, resolveSwipeTarget, resolveSwiperEasing, resolveSwiperIndex, resolveSwiperLength, resolveSwiperNumber, resolveSwiperStep };
52
51
  //# sourceMappingURL=helpers.mjs.map
@@ -4,7 +4,7 @@ import { ensureNativeComponentStyle } from "../style.mjs";
4
4
  import { createSwiperChangeDetail, resolveSwipeTarget, resolveSwiperEasing, resolveSwiperIndex, resolveSwiperLength, resolveSwiperNumber, resolveSwiperStep } from "./helpers.mjs";
5
5
  import { SWIPER_SHADOW_STYLE } from "./style.mjs";
6
6
 
7
- //#region src/runtime/nativeComponents/swiper/index.ts
7
+ // src/runtime/nativeComponents/swiper/index.ts
8
8
  const BaseElement = globalThis.HTMLElement ?? class {};
9
9
  var WeappSwiper = class extends BaseElement {
10
10
  static observedAttributes = [...getNativeComponentDescriptor("swiper").attributes];
@@ -230,6 +230,5 @@ var WeappSwiper = class extends BaseElement {
230
230
  }
231
231
  };
232
232
 
233
- //#endregion
234
233
  export { WeappSwiper };
235
234
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  import { resolveContainingShadowRoot } from "../helpers.mjs";
2
2
  import { ensureNativeComponentStyle } from "../style.mjs";
3
3
 
4
- //#region src/runtime/nativeComponents/swiper/item.ts
4
+ // src/runtime/nativeComponents/swiper/item.ts
5
5
  const BaseElement = globalThis.HTMLElement ?? class {};
6
6
  var WeappSwiperItem = class extends BaseElement {
7
7
  connectedCallback() {
@@ -9,6 +9,5 @@ var WeappSwiperItem = class extends BaseElement {
9
9
  }
10
10
  };
11
11
 
12
- //#endregion
13
12
  export { WeappSwiperItem };
14
13
  //# sourceMappingURL=item.mjs.map
@@ -1,4 +1,4 @@
1
- //#region src/runtime/nativeComponents/swiper/style.ts
1
+ // src/runtime/nativeComponents/swiper/style.ts
2
2
  const SWIPER_SHADOW_STYLE = `
3
3
  :host { position: relative; min-width: 0; min-height: 0; }
4
4
  .viewport { position: relative; box-sizing: border-box; width: 100%; height: 100%; overflow: hidden; touch-action: pan-y; }
@@ -15,6 +15,5 @@ const SWIPER_SHADOW_STYLE = `
15
15
  .indicator[data-active="true"] { background: var(--weapp-swiper-indicator-active-color, #000000); }
16
16
  `;
17
17
 
18
- //#endregion
19
18
  export { SWIPER_SHADOW_STYLE };
20
19
  //# sourceMappingURL=style.mjs.map
@@ -1,6 +1,4 @@
1
- //#region src/runtime/nativeComponents/switch.d.ts
2
1
  export declare function createSwitchEventDetail(checked: boolean): {
3
2
  value: boolean;
4
3
  };
5
- //#endregion
6
4
  //# sourceMappingURL=switch.d.mts.map
@@ -3,7 +3,7 @@ import { connectFormControl, disconnectFormControl } from "./formControl.mjs";
3
3
  import { dispatchMiniProgramEvent, readBooleanAttribute, resolveContainingShadowRoot } from "./helpers.mjs";
4
4
  import { ensureNativeComponentStyle } from "./style.mjs";
5
5
 
6
- //#region src/runtime/nativeComponents/switch.ts
6
+ // src/runtime/nativeComponents/switch.ts
7
7
  const BaseElement = globalThis.HTMLElement ?? class {};
8
8
  function createSwitchEventDetail(checked) {
9
9
  return { value: checked };
@@ -127,6 +127,5 @@ var WeappSwitch = class extends BaseElement {
127
127
  }
128
128
  };
129
129
 
130
- //#endregion
131
130
  export { WeappSwitch, createSwitchEventDetail };
132
131
  //# sourceMappingURL=switch.mjs.map
@@ -1,8 +1,6 @@
1
- //#region src/runtime/nativeComponents/textarea.d.ts
2
1
  export declare function createTextareaLineChangeDetail(textarea: Pick<HTMLTextAreaElement, 'scrollHeight' | 'value'>): {
3
2
  height: number;
4
3
  heightRpx: number;
5
4
  lineCount: number;
6
5
  };
7
- //#endregion
8
6
  //# sourceMappingURL=textarea.d.mts.map
@@ -4,7 +4,7 @@ import { dispatchMiniProgramEvent, readBooleanAttribute, resolveContainingShadow
4
4
  import { ensureNativeComponentStyle } from "./style.mjs";
5
5
  import { createInputEventDetail } from "./input.mjs";
6
6
 
7
- //#region src/runtime/nativeComponents/textarea.ts
7
+ // src/runtime/nativeComponents/textarea.ts
8
8
  const BaseElement = globalThis.HTMLElement ?? class {};
9
9
  function createTextareaLineChangeDetail(textarea) {
10
10
  const height = textarea.scrollHeight;
@@ -139,6 +139,5 @@ var WeappTextarea = class extends BaseElement {
139
139
  }
140
140
  };
141
141
 
142
- //#endregion
143
142
  export { WeappTextarea, createTextareaLineChangeDetail };
144
143
  //# sourceMappingURL=textarea.mjs.map
@@ -1,4 +1,3 @@
1
- //#region src/runtime/nativeComponents/video/helpers.d.ts
2
1
  export declare function resolveVideoObjectFit(value: string | null): "fill" | "cover" | "contain";
3
2
  export declare function createVideoTimeUpdateDetail(currentTime: number, duration: number): {
4
3
  currentTime: number;
@@ -7,5 +6,4 @@ export declare function createVideoTimeUpdateDetail(currentTime: number, duratio
7
6
  export declare function createVideoProgressDetail(bufferedEnd: number, duration: number): {
8
7
  buffered: number;
9
8
  };
10
- //#endregion
11
9
  //# sourceMappingURL=helpers.d.mts.map
@@ -1,4 +1,4 @@
1
- //#region src/runtime/nativeComponents/video/helpers.ts
1
+ // src/runtime/nativeComponents/video/helpers.ts
2
2
  function resolveVideoObjectFit(value) {
3
3
  return value === "fill" || value === "cover" || value === "contain" ? value : "contain";
4
4
  }
@@ -16,6 +16,5 @@ function resolveVideoDirection(videoWidth, videoHeight) {
16
16
  return videoWidth >= videoHeight ? "horizontal" : "vertical";
17
17
  }
18
18
 
19
- //#endregion
20
19
  export { createVideoProgressDetail, createVideoTimeUpdateDetail, resolveVideoDirection, resolveVideoObjectFit };
21
20
  //# sourceMappingURL=helpers.mjs.map
@@ -5,7 +5,7 @@ import { registerNativeMediaElement, unregisterNativeMediaElement } from "../med
5
5
  import { createVideoProgressDetail, createVideoTimeUpdateDetail, resolveVideoDirection, resolveVideoObjectFit } from "./helpers.mjs";
6
6
  import { VIDEO_SHADOW_STYLE } from "./style.mjs";
7
7
 
8
- //#region src/runtime/nativeComponents/video/index.ts
8
+ // src/runtime/nativeComponents/video/index.ts
9
9
  const BaseElement = globalThis.HTMLElement ?? class {};
10
10
  function readFiniteNumber(value) {
11
11
  if (value === null || value.trim() === "") return;
@@ -119,6 +119,5 @@ var WeappVideo = class extends BaseElement {
119
119
  };
120
120
  };
121
121
 
122
- //#endregion
123
122
  export { WeappVideo };
124
123
  //# sourceMappingURL=index.mjs.map