@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.
- package/dist/_virtual/_rolldown/runtime.mjs +1 -2
- package/dist/compiler/wxml/attributes.mjs +12 -4
- package/dist/compiler/wxml/attributes.mjs.map +1 -1
- package/dist/compiler/wxml/compile.mjs +33 -39
- package/dist/compiler/wxml/compile.mjs.map +1 -1
- package/dist/compiler/wxml/dependency.mjs +10 -3
- package/dist/compiler/wxml/dependency.mjs.map +1 -1
- package/dist/compiler/wxml/interpolation.mjs +13 -3
- package/dist/compiler/wxml/interpolation.mjs.map +1 -1
- package/dist/compiler/wxml/nativeTags.mjs +60 -0
- package/dist/compiler/wxml/nativeTags.mjs.map +1 -0
- package/dist/compiler/wxml/navigation.mjs +1 -2
- package/dist/compiler/wxml/parser.mjs +1 -2
- package/dist/compiler/wxml/prepare.mjs +42 -0
- package/dist/compiler/wxml/prepare.mjs.map +1 -0
- package/dist/compiler/wxml/renderer.mjs +1 -2
- package/dist/compiler/wxml/specialNodes.mjs +1 -2
- package/dist/compiler/wxml/types.d.mts +0 -2
- package/dist/compiler/wxml/unknownTags.mjs +33 -0
- package/dist/compiler/wxml/unknownTags.mjs.map +1 -0
- package/dist/compiler/wxs.mjs +1 -2
- package/dist/css/wxss.d.mts +2 -19
- package/dist/css/wxss.mjs +5 -12
- package/dist/css/wxss.mjs.map +1 -1
- package/dist/index.d.mts +8 -3
- package/dist/index.mjs +8 -5
- package/dist/plugin/assets.d.mts +1 -2
- package/dist/plugin/assets.mjs +1 -2
- package/dist/plugin/constants.mjs +5 -4
- package/dist/plugin/constants.mjs.map +1 -1
- package/dist/plugin/dependencyScan.mjs +1 -2
- package/dist/plugin/entry.mjs +6 -4
- package/dist/plugin/entry.mjs.map +1 -1
- package/dist/plugin/files.mjs +1 -2
- package/dist/plugin/hostTypes.d.mts +1 -2
- package/dist/plugin/index.d.mts +0 -2
- package/dist/plugin/index.mjs +29 -24
- package/dist/plugin/index.mjs.map +1 -1
- package/dist/plugin/layout.mjs +1 -2
- package/dist/plugin/navigation.mjs +1 -2
- package/dist/plugin/packageResolution.mjs +1 -2
- package/dist/plugin/path.mjs +1 -2
- package/dist/plugin/register.mjs +1 -2
- package/dist/plugin/scan.mjs +1 -2
- package/dist/plugin/scanConfig.mjs +1 -2
- package/dist/plugin/scanSfc.mjs +1 -2
- package/dist/plugin/sfcHmr.mjs +28 -10
- package/dist/plugin/sfcHmr.mjs.map +1 -1
- package/dist/plugin/state.mjs +1 -2
- package/dist/plugin/styleModule.mjs +1 -2
- package/dist/plugin/types.d.mts +2 -3
- package/dist/plugin/vueSfc.mjs +1 -2
- package/dist/runtime/appShell/container.mjs +1 -2
- package/dist/runtime/appShell/tabBar/index.mjs +1 -2
- package/dist/runtime/appShell/tabBar/style.mjs +1 -2
- package/dist/runtime/appStyle.mjs +1 -2
- package/dist/runtime/button/helpers.mjs +1 -2
- package/dist/runtime/button/index.d.mts +0 -2
- package/dist/runtime/button/index.mjs +1 -2
- package/dist/runtime/button/style.mjs +1 -2
- package/dist/runtime/component/behavior.mjs +1 -2
- package/dist/runtime/component/constants.mjs +1 -2
- package/dist/runtime/component/dom.mjs +1 -2
- package/dist/runtime/component/element.mjs +9 -2
- package/dist/runtime/component/element.mjs.map +1 -1
- package/dist/runtime/component/events.mjs +4 -4
- package/dist/runtime/component/events.mjs.map +1 -1
- package/dist/runtime/component/index.d.mts +0 -2
- package/dist/runtime/component/index.mjs +1 -2
- package/dist/runtime/component/observers.mjs +1 -2
- package/dist/runtime/component/publicInstance.mjs +1 -2
- package/dist/runtime/component/relations.mjs +1 -2
- package/dist/runtime/component/slots.mjs +1 -2
- package/dist/runtime/component/state.mjs +1 -2
- package/dist/runtime/component/types.d.mts +0 -2
- package/dist/runtime/component/utils.mjs +1 -2
- package/dist/runtime/component/virtualHost.mjs +1 -2
- package/dist/runtime/componentEvents.mjs +1 -2
- package/dist/runtime/dataset.mjs +49 -0
- package/dist/runtime/dataset.mjs.map +1 -0
- package/dist/runtime/datasetBinding.d.mts +13 -0
- package/dist/runtime/datasetBinding.mjs +40 -0
- package/dist/runtime/datasetBinding.mjs.map +1 -0
- package/dist/runtime/eventBinding.d.mts +1 -2
- package/dist/runtime/eventBinding.mjs +1 -2
- package/dist/runtime/execution.d.mts +0 -2
- package/dist/runtime/execution.mjs +1 -2
- package/dist/runtime/host/index.d.mts +0 -2
- package/dist/runtime/host/index.mjs +1 -2
- package/dist/runtime/host/types.d.mts +0 -2
- package/dist/runtime/hostGlobals.d.mts +1 -2
- package/dist/runtime/hostGlobals.mjs +1 -2
- package/dist/runtime/index.d.mts +8 -3
- package/dist/runtime/index.mjs +9 -7
- package/dist/runtime/index.mjs.map +1 -1
- package/dist/runtime/inlineStyle.d.mts +5 -0
- package/dist/runtime/inlineStyle.mjs +21 -0
- package/dist/runtime/inlineStyle.mjs.map +1 -0
- package/dist/runtime/inputHandlerResult.mjs +1 -2
- package/dist/runtime/legacyTemplate/dataset.mjs +53 -0
- package/dist/runtime/legacyTemplate/dataset.mjs.map +1 -0
- package/dist/runtime/legacyTemplate/dom.mjs +20 -5
- package/dist/runtime/legacyTemplate/dom.mjs.map +1 -1
- package/dist/runtime/legacyTemplate/expression.mjs +1 -2
- package/dist/runtime/legacyTemplate/index.d.mts +0 -2
- package/dist/runtime/legacyTemplate/index.mjs +23 -16
- package/dist/runtime/legacyTemplate/index.mjs.map +1 -1
- package/dist/runtime/legacyTemplate/types.d.mts +0 -2
- package/dist/runtime/nativeComponents/canvas/index.mjs +1 -2
- package/dist/runtime/nativeComponents/checkbox.mjs +1 -2
- package/dist/runtime/nativeComponents/cover/index.mjs +1 -2
- package/dist/runtime/nativeComponents/form.d.mts +0 -2
- package/dist/runtime/nativeComponents/form.mjs +1 -2
- package/dist/runtime/nativeComponents/formControl.mjs +1 -2
- package/dist/runtime/nativeComponents/helpers.mjs +1 -2
- package/dist/runtime/nativeComponents/icon/helpers.mjs +1 -2
- package/dist/runtime/nativeComponents/icon/index.mjs +1 -2
- package/dist/runtime/nativeComponents/icon/style.mjs +1 -2
- package/dist/runtime/nativeComponents/image.d.mts +0 -2
- package/dist/runtime/nativeComponents/image.mjs +1 -2
- package/dist/runtime/nativeComponents/index.d.mts +1 -3
- package/dist/runtime/nativeComponents/index.mjs +3 -4
- package/dist/runtime/nativeComponents/index.mjs.map +1 -1
- package/dist/runtime/nativeComponents/input.d.mts +0 -2
- package/dist/runtime/nativeComponents/input.mjs +1 -2
- package/dist/runtime/nativeComponents/label.mjs +1 -2
- package/dist/runtime/nativeComponents/mediaRegistry.mjs +1 -2
- package/dist/runtime/nativeComponents/movable/helpers.mjs +1 -2
- package/dist/runtime/nativeComponents/movable/index.mjs +1 -2
- package/dist/runtime/nativeComponents/navigator.mjs +1 -2
- package/dist/runtime/nativeComponents/picker/editors.mjs +1 -2
- package/dist/runtime/nativeComponents/picker/helpers.mjs +1 -2
- package/dist/runtime/nativeComponents/picker/index.mjs +1 -2
- package/dist/runtime/nativeComponents/picker/style.mjs +1 -2
- package/dist/runtime/nativeComponents/pickerView/column.mjs +1 -2
- package/dist/runtime/nativeComponents/pickerView/helpers.mjs +1 -2
- package/dist/runtime/nativeComponents/pickerView/index.mjs +1 -2
- package/dist/runtime/nativeComponents/pickerView/style.mjs +1 -2
- package/dist/runtime/nativeComponents/primitives.mjs +1 -2
- package/dist/runtime/nativeComponents/progress/helpers.mjs +1 -2
- package/dist/runtime/nativeComponents/progress/index.mjs +1 -2
- package/dist/runtime/nativeComponents/progress/style.mjs +1 -2
- package/dist/runtime/nativeComponents/radio.mjs +1 -2
- package/dist/runtime/nativeComponents/richText/index.mjs +3 -4
- package/dist/runtime/nativeComponents/richText/index.mjs.map +1 -1
- package/dist/runtime/nativeComponents/scrollView/boundaries.mjs +62 -0
- package/dist/runtime/nativeComponents/scrollView/boundaries.mjs.map +1 -0
- package/dist/runtime/nativeComponents/{scrollView.d.mts → scrollView/helpers.d.mts} +4 -5
- package/dist/runtime/nativeComponents/scrollView/helpers.mjs +14 -0
- package/dist/runtime/nativeComponents/scrollView/helpers.mjs.map +1 -0
- package/dist/runtime/nativeComponents/scrollView/index.mjs +193 -0
- package/dist/runtime/nativeComponents/scrollView/index.mjs.map +1 -0
- package/dist/runtime/nativeComponents/scrollView/position.mjs +43 -0
- package/dist/runtime/nativeComponents/scrollView/position.mjs.map +1 -0
- package/dist/runtime/nativeComponents/slider/helpers.mjs +1 -2
- package/dist/runtime/nativeComponents/slider/index.mjs +1 -2
- package/dist/runtime/nativeComponents/slider/style.mjs +1 -2
- package/dist/runtime/nativeComponents/style.mjs +1 -2
- package/dist/runtime/nativeComponents/swiper/helpers.mjs +1 -2
- package/dist/runtime/nativeComponents/swiper/index.mjs +1 -2
- package/dist/runtime/nativeComponents/swiper/item.mjs +1 -2
- package/dist/runtime/nativeComponents/swiper/style.mjs +1 -2
- package/dist/runtime/nativeComponents/switch.d.mts +0 -2
- package/dist/runtime/nativeComponents/switch.mjs +1 -2
- package/dist/runtime/nativeComponents/textarea.d.mts +0 -2
- package/dist/runtime/nativeComponents/textarea.mjs +1 -2
- package/dist/runtime/nativeComponents/video/helpers.d.mts +0 -2
- package/dist/runtime/nativeComponents/video/helpers.mjs +1 -2
- package/dist/runtime/nativeComponents/video/index.mjs +1 -2
- package/dist/runtime/nativeComponents/video/style.mjs +1 -2
- package/dist/runtime/navigationBar/index.d.mts +0 -2
- package/dist/runtime/navigationBar/index.mjs +1 -2
- package/dist/runtime/navigationBar/style.mjs +1 -2
- package/dist/runtime/pageLayout.d.mts +1 -2
- package/dist/runtime/pageLayout.mjs +1 -2
- package/dist/runtime/polyfill/ad.mjs +1 -2
- package/dist/runtime/polyfill/animation.mjs +1 -2
- package/dist/runtime/polyfill/appState.mjs +1 -2
- package/dist/runtime/polyfill/async.d.mts +0 -2
- package/dist/runtime/polyfill/async.mjs +1 -2
- package/dist/runtime/polyfill/auth.mjs +1 -2
- package/dist/runtime/polyfill/authApi.mjs +1 -2
- package/dist/runtime/polyfill/background.mjs +1 -2
- package/dist/runtime/polyfill/canvasContext.mjs +1 -2
- package/dist/runtime/polyfill/capability.mjs +1 -2
- package/dist/runtime/polyfill/cloud.mjs +1 -2
- package/dist/runtime/polyfill/device.mjs +1 -2
- package/dist/runtime/polyfill/deviceApi.mjs +1 -2
- package/dist/runtime/polyfill/deviceAuthSystemApi.d.mts +0 -2
- package/dist/runtime/polyfill/deviceAuthSystemApi.mjs +1 -2
- package/dist/runtime/polyfill/eventBus.mjs +1 -2
- package/dist/runtime/polyfill/filePicker.mjs +1 -2
- package/dist/runtime/polyfill/fileSystemManager.mjs +1 -2
- package/dist/runtime/polyfill/files.mjs +1 -2
- package/dist/runtime/polyfill/font.mjs +1 -2
- package/dist/runtime/polyfill/index.d.mts +4 -4
- package/dist/runtime/polyfill/index.mjs +12 -5
- package/dist/runtime/polyfill/index.mjs.map +1 -1
- package/dist/runtime/polyfill/interaction.mjs +1 -2
- package/dist/runtime/polyfill/interactionApi.mjs +1 -2
- package/dist/runtime/polyfill/intersectionObserver.mjs +4 -4
- package/dist/runtime/polyfill/intersectionObserver.mjs.map +1 -1
- package/dist/runtime/polyfill/lifecycleEvents.d.mts +12 -0
- package/dist/runtime/polyfill/lifecycleEvents.mjs +67 -0
- package/dist/runtime/polyfill/lifecycleEvents.mjs.map +1 -0
- package/dist/runtime/polyfill/locale.mjs +1 -2
- package/dist/runtime/polyfill/location.mjs +1 -2
- package/dist/runtime/polyfill/locationApi.mjs +1 -2
- package/dist/runtime/polyfill/mediaActions.mjs +1 -2
- package/dist/runtime/polyfill/mediaApi/file.mjs +1 -2
- package/dist/runtime/polyfill/mediaApi/info.mjs +1 -2
- package/dist/runtime/polyfill/mediaApi/picker.mjs +1 -2
- package/dist/runtime/polyfill/mediaApi/preview.mjs +1 -2
- package/dist/runtime/polyfill/mediaApi/process.mjs +1 -2
- package/dist/runtime/polyfill/mediaInfo.mjs +1 -2
- package/dist/runtime/polyfill/mediaPicker.mjs +1 -2
- package/dist/runtime/polyfill/mediaProcess.mjs +1 -2
- package/dist/runtime/polyfill/menuApi.mjs +5 -3
- package/dist/runtime/polyfill/menuApi.mjs.map +1 -1
- package/dist/runtime/polyfill/navigationBarRuntime.mjs +1 -2
- package/dist/runtime/polyfill/network/request.mjs +1 -2
- package/dist/runtime/polyfill/network/requestBridge.mjs +1 -2
- package/dist/runtime/polyfill/network/status.mjs +1 -2
- package/dist/runtime/polyfill/platformApi.mjs +1 -2
- package/dist/runtime/polyfill/platformRuntime.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime/appLifecycle.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime/dom.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime/events.d.mts +0 -2
- package/dist/runtime/polyfill/routeRuntime/events.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime/history.d.mts +0 -2
- package/dist/runtime/polyfill/routeRuntime/history.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime/lifecycle.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime/options.d.mts +1 -2
- package/dist/runtime/polyfill/routeRuntime/options.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime/result.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime/scroll.mjs +37 -6
- package/dist/runtime/polyfill/routeRuntime/scroll.mjs.map +1 -1
- package/dist/runtime/polyfill/routeRuntime/stack.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime/url.mjs +1 -2
- package/dist/runtime/polyfill/routeRuntime.d.mts +2 -2
- package/dist/runtime/polyfill/routeRuntime.mjs +14 -5
- package/dist/runtime/polyfill/routeRuntime.mjs.map +1 -1
- package/dist/runtime/polyfill/runtimeCapabilityApi.mjs +1 -2
- package/dist/runtime/polyfill/runtimeDataApi.d.mts +0 -2
- package/dist/runtime/polyfill/runtimeDataApi.mjs +1 -2
- package/dist/runtime/polyfill/runtimeInfra.mjs +1 -2
- package/dist/runtime/polyfill/runtimeOps.mjs +1 -2
- package/dist/runtime/polyfill/selectorQuery.mjs +3 -3
- package/dist/runtime/polyfill/selectorQuery.mjs.map +1 -1
- package/dist/runtime/polyfill/storage.mjs +1 -2
- package/dist/runtime/polyfill/storageAsync.mjs +1 -2
- package/dist/runtime/polyfill/subscribe.mjs +1 -2
- package/dist/runtime/polyfill/system.mjs +1 -2
- package/dist/runtime/polyfill/systemApi.mjs +1 -2
- package/dist/runtime/polyfill/types/base.d.mts +0 -2
- package/dist/runtime/polyfill/types/common.d.mts +0 -2
- package/dist/runtime/polyfill/types/lifecycle.d.mts +12 -0
- package/dist/runtime/polyfill/types/locationRuntime.d.mts +0 -2
- package/dist/runtime/polyfill/types/mediaAuth.d.mts +0 -2
- package/dist/runtime/polyfill/types/platformRuntime.d.mts +0 -2
- package/dist/runtime/polyfill/types/systemAuth.d.mts +0 -2
- package/dist/runtime/polyfill/types/tabBarRuntime.d.mts +0 -2
- package/dist/runtime/polyfill/ui.mjs +1 -2
- package/dist/runtime/polyfill/uiFeedback.mjs +19 -5
- package/dist/runtime/polyfill/uiFeedback.mjs.map +1 -1
- package/dist/runtime/polyfill/uiMediaApi.d.mts +8 -2
- package/dist/runtime/polyfill/uiMediaApi.mjs +20 -5
- package/dist/runtime/polyfill/uiMediaApi.mjs.map +1 -1
- package/dist/runtime/polyfill/videoContext.mjs +1 -2
- package/dist/runtime/polyfill/vkSession.mjs +1 -2
- package/dist/runtime/polyfill/windowResize.mjs +1 -2
- package/dist/runtime/polyfill/worker.mjs +1 -2
- package/dist/runtime/polyfill.d.mts +4 -2
- package/dist/runtime/renderContext.d.mts +0 -2
- package/dist/runtime/renderContext.mjs +5 -4
- package/dist/runtime/renderContext.mjs.map +1 -1
- package/dist/runtime/rpx.d.mts +0 -2
- package/dist/runtime/rpx.mjs +6 -6
- package/dist/runtime/rpx.mjs.map +1 -1
- package/dist/runtime/seo/index.d.mts +0 -2
- package/dist/runtime/seo/index.mjs +1 -2
- package/dist/runtime/style.d.mts +0 -2
- package/dist/runtime/style.mjs +1 -2
- package/dist/runtime/template.d.mts +0 -2
- package/dist/runtime/utils/object.mjs +1 -2
- package/dist/runtime/viewport/index.d.mts +0 -2
- package/dist/runtime/viewport/index.mjs +1 -2
- package/dist/runtime/viewport/style.mjs +2 -2
- package/dist/runtime/viewport/style.mjs.map +1 -1
- package/dist/runtime/viewport/types.d.mts +0 -2
- package/dist/runtime/warning.d.mts +0 -2
- package/dist/runtime/warning.mjs +1 -2
- package/dist/runtime/wevu.d.mts +1 -2
- package/dist/runtime/wevu.mjs +1 -2
- package/dist/shared/nativeComponents.mjs +10 -3
- package/dist/shared/nativeComponents.mjs.map +1 -1
- package/dist/shared/slugify.mjs +1 -2
- package/dist/shared/styleUnits/options.d.mts +24 -0
- package/dist/shared/styleUnits/options.mjs +13 -0
- package/dist/shared/styleUnits/options.mjs.map +1 -0
- package/dist/shared/styleUnits/value.mjs +63 -0
- package/dist/shared/styleUnits/value.mjs.map +1 -0
- package/dist/shared/tabBar.d.mts +0 -2
- package/dist/shared/tabBar.mjs +1 -2
- package/dist/shared/wxml.mjs +1 -2
- package/package.json +15 -13
- package/dist/runtime/nativeComponents/richText/helpers.mjs +0 -230
- package/dist/runtime/nativeComponents/richText/helpers.mjs.map +0 -1
- package/dist/runtime/nativeComponents/scrollView.mjs +0 -88
- 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 '
|
|
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
|
-
|
|
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
|
-
//#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|