@qxs-bns/components 0.0.93 → 0.0.94
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/LICENSE +21 -0
- package/es/answer-container/answer-container.mjs +65 -0
- package/es/answer-container/answer-container.mjs.map +1 -0
- package/es/answer-container/clone.mjs +2 -0
- package/es/answer-container/clone.mjs.map +1 -0
- package/es/answer-container/normalize.mjs +2 -0
- package/es/answer-container/normalize.mjs.map +1 -0
- package/es/answer-container/runtime-blank-fill.mjs +39 -0
- package/es/answer-container/runtime-blank-fill.mjs.map +1 -0
- package/es/answer-container/runtime-choice.mjs +38 -0
- package/es/answer-container/runtime-choice.mjs.map +1 -0
- package/es/answer-container/runtime-question-base.mjs +43 -0
- package/es/answer-container/runtime-question-base.mjs.map +1 -0
- package/es/answer-container/runtime-scale.mjs +36 -0
- package/es/answer-container/runtime-scale.mjs.map +1 -0
- package/es/answer-container/runtime-text-fill.mjs +19 -0
- package/es/answer-container/runtime-text-fill.mjs.map +1 -0
- package/es/answer-container/styles.mjs +468 -0
- package/es/answer-container/styles.mjs.map +1 -0
- package/es/entry-answer-container.mjs +2 -0
- package/es/entry-answer-container.mjs.map +1 -0
- package/es/entry-video-player.mjs +2 -0
- package/es/entry-video-player.mjs.map +1 -0
- package/es/index.mjs +1 -1
- package/es/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.mjs +2 -0
- package/es/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.mjs.map +1 -0
- package/es/video-player.mjs +3 -0
- package/es/video-player.mjs.map +1 -0
- package/es/video-player.theme.mjs +111 -0
- package/es/video-player.theme.mjs.map +1 -0
- package/lib/answer-container/answer-container.cjs +65 -0
- package/lib/answer-container/answer-container.cjs.map +1 -0
- package/lib/answer-container/clone.cjs +2 -0
- package/lib/answer-container/clone.cjs.map +1 -0
- package/lib/answer-container/normalize.cjs +2 -0
- package/lib/answer-container/normalize.cjs.map +1 -0
- package/lib/answer-container/runtime-blank-fill.cjs +39 -0
- package/lib/answer-container/runtime-blank-fill.cjs.map +1 -0
- package/lib/answer-container/runtime-choice.cjs +38 -0
- package/lib/answer-container/runtime-choice.cjs.map +1 -0
- package/lib/answer-container/runtime-question-base.cjs +43 -0
- package/lib/answer-container/runtime-question-base.cjs.map +1 -0
- package/lib/answer-container/runtime-scale.cjs +36 -0
- package/lib/answer-container/runtime-scale.cjs.map +1 -0
- package/lib/answer-container/runtime-text-fill.cjs +19 -0
- package/lib/answer-container/runtime-text-fill.cjs.map +1 -0
- package/lib/answer-container/styles.cjs +468 -0
- package/lib/answer-container/styles.cjs.map +1 -0
- package/lib/entry-answer-container.cjs +2 -0
- package/lib/entry-answer-container.cjs.map +1 -0
- package/lib/entry-video-player.cjs +2 -0
- package/lib/entry-video-player.cjs.map +1 -0
- package/lib/index.cjs +1 -1
- package/lib/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.cjs +2 -0
- package/lib/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.cjs.map +1 -0
- package/lib/video-player.cjs +3 -0
- package/lib/video-player.cjs.map +1 -0
- package/lib/video-player.theme.cjs +111 -0
- package/lib/video-player.theme.cjs.map +1 -0
- package/package.json +14 -2
- package/types/answer-container/answer-container.d.ts +26 -0
- package/types/answer-container/clone.d.ts +1 -0
- package/types/answer-container/index.d.ts +12 -0
- package/types/answer-container/normalize.d.ts +3 -0
- package/types/answer-container/runtime-blank-fill.d.ts +35 -0
- package/types/answer-container/runtime-choice.d.ts +44 -0
- package/types/answer-container/runtime-question-base.d.ts +39 -0
- package/types/answer-container/runtime-scale.d.ts +36 -0
- package/types/answer-container/runtime-text-fill.d.ts +32 -0
- package/types/answer-container/styles.d.ts +1 -0
- package/types/answer-container/types.d.ts +40 -0
- package/types/entry-answer-container.d.ts +2 -0
- package/types/entry-video-player.d.ts +2 -0
- package/types/index.d.ts +2 -0
- package/types/video-player.d.ts +44 -0
- package/types/video-player.theme.d.ts +12 -0
- package/types/video-player.types.d.ts +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.min.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("lit"),L=require("xgplayer"),E=require("xgplayer-hls"),F=require("./node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.cjs"),b=require("./video-player.theme.cjs");class P extends L{changeFullStyle(e,t,i,n){const l=t instanceof h?t.getAttribute("style"):void 0;try{super.changeFullStyle(e,t,i,n)}finally{t&&l!==void 0&&(l===null?t.removeAttribute("style"):t.setAttribute("style",l))}}}const v=class v extends g.LitElement{constructor(){super(...arguments),this.options={autoplay:!1,muted:!0,controls:!0},this.generation=0,this.lastPosition=null,this.blocked=!1,this.fullscreenDisposed=!1}render(){return g.html`<style>${F.default}${b.videoPlayerTheme}</style><div class="media" data-no-touch-simulate ?data-blocked=${this.blocked}></div><button class="fallback" ?hidden=${!this.blocked}
|
|
2
|
+
aria-label="播放视频" title="播放视频" @click=${()=>{this.play().catch(()=>{})}}>播放</button>`}updated(){this.source&&this.source!==this.applied&&this.setSource(this.source).catch(()=>{})}async setSource(e){this.isConnected&&(this.fullscreenDisposed=!1);const t=++this.generation,i=this.engine?.video;if(this.destroyEngine(),this.source=e,this.applied=e,this.lastPosition=null,this.blocked=!1,this.requestUpdate(),await this.updateComplete,t!==this.generation||!this.isConnected)return;const n=this.renderRoot.querySelector(".media");n.replaceChildren();const l=document.createElement("video"),a=!!l.canPlayType("application/vnd.apple.mpegurl");if(e.format==="mp4"&&!l.canPlayType("video/mp4")){this.report({kind:"unsupported",code:"MP4_UNSUPPORTED"});return}if(e.format==="hls"&&!a&&!E.isSupported()){this.report({kind:"unsupported",code:"HLS_UNSUPPORTED"});return}const s=new P({el:n,mediaEl:i,url:e.url,width:"100%",height:"100%",lang:"zh-cn",autoplay:this.options.autoplay??!1,videoInit:!0,autoplayMuted:!0,muted:this.options.muted??!0,poster:this.options.poster,controls:this.options.controls===!1?!1:{mode:"normal",height:48},playsinline:!0,isLive:e.mode==="live",keyboard:{disableBodyTrigger:!0,...e.mode==="live"?{keyCodeMap:{left:{disable:!0},right:{disable:!0}}}:{}},...e.mode==="live"?{mobile:{gestureX:!1,disablePress:!0}}:{},fullscreen:{target:typeof this.ownerDocument.defaultView?.HTMLElement.prototype.requestFullscreen=="function"?this:n},icons:b.videoPlayerIcons,plugins:e.format==="hls"&&!a?[E]:[],hls:{retryCount:0,pollRetryCount:1,loadTimeout:1e4,manifestLoadTimeout:1e4},playbackRate:e.mode==="vod"?{list:[.75,1,1.25,1.5,2],listType:"middle",heightLimit:!1,toggleMode:"click"}:!1,ignores:["cssfullscreen","pip","download","screenshot","miniscreen",...e.mode==="live"?["progress","playbackrate"]:[]]});this.engine=s,s.video.muted=this.options.muted??!0,s.video.tabIndex=0,s.video.setAttribute("playsinline",""),s.video.setAttribute("webkit-playsinline","");const u=()=>this.engine===s&&this.generation===t&&this.source===e;e.mode==="vod"&&this.options.controls!==!1&&this.bindRateMenuDismissal(s,u);const r=(o,d)=>s.on(o,(...p)=>{u()&&d(...p)});r("loadedmetadata",()=>this.emit("ready",this.snapshot())),r("autoplay_was_prevented",()=>{this.blocked=!0,this.requestUpdate(),this.report({kind:"autoplay",code:"AUTOPLAY_BLOCKED"})});for(const o of["playing","pause","waiting","ended","timeupdate","seeked","ratechange"])r(o,()=>{o==="playing"&&(this.blocked=!1,this.requestUpdate()),this.emit(o,this.snapshot()),(o==="timeupdate"||o==="seeked")&&(this.lastPosition=this.currentPositionMs())});r("seeking",()=>this.emit("seeking",{...this.snapshot(),fromMs:this.lastPosition,toMs:this.currentPositionMs()})),r("volumechange",()=>this.emit("volumechange",{revision:e.revision,muted:s.video.muted,volume:s.video.volume}));const c=this.ownerDocument;let f=this.isNativeFullscreen();const y=o=>{o!==f&&(f=o,this.emit("fullscreenchange",{revision:e.revision,fullscreen:o}))},m=()=>{u()&&(c.fullscreenElement===this&&s.getFullscreen(this).catch(()=>{u()&&this.report({kind:"unknown",code:"FULLSCREEN_SYNC_FAILED"})}),y(this.isNativeFullscreen()))};c.addEventListener("fullscreenchange",m),this.cleanupFullscreen=()=>c.removeEventListener("fullscreenchange",m),r("fullscreen_change",o=>y(!!o||this.isNativeFullscreen())),m(),r("error",o=>{const d=Number(o?.httpCode??o?.originError?.response?.status??o?.ext?.httpCode),p=d>=400&&d<=599,k=s.video.error?.code,w=p||k===2||o?.errorType==="network"?"network":"media";this.report({kind:w,code:"PLAYBACK_FAILED",...p?{httpStatus:d}:{}})})}async play(){const e=this.engine,t=this.source;if(e)try{await e.play()}catch(i){if(this.engine!==e||this.source!==t)return;const n=i instanceof Error&&i.name==="NotAllowedError";throw n&&(this.blocked=!0,this.requestUpdate()),this.report({kind:n?"autoplay":"media",code:n?"AUTOPLAY_BLOCKED":"PLAY_REJECTED"}),i}}pause(){this.engine?.pause()}seek(e){if(this.source?.mode!=="vod")throw new Error("LIVE_SEEK_UNSUPPORTED");const t=this.engine?.video;t&&Number.isFinite(e)&&Number.isFinite(t.duration)&&(t.currentTime=Math.max(0,Math.min(t.duration,e/1e3)))}setRate(e){if(this.source?.mode!=="vod")throw new Error("LIVE_RATE_UNSUPPORTED");if(![.75,1,1.25,1.5,2].includes(e))throw new Error("RATE_UNSUPPORTED");this.engine&&(this.engine.video.playbackRate=e)}setMuted(e){this.engine&&(this.engine.video.muted=e)}setVolume(e){this.engine&&Number.isFinite(e)&&(this.engine.video.volume=Math.max(0,Math.min(1,e)))}async requestFullscreen(){await this.runNativeFullscreen("request")}async exitFullscreen(){await this.runNativeFullscreen("exit")}isNativeFullscreen(){const e=this.ownerDocument.fullscreenElement;return!!e&&(e===this||this.contains(e)||this.renderRoot.contains(e))}async runNativeFullscreen(e){const t=this.ownerDocument;if(e==="exit"&&!this.isNativeFullscreen())return;const i=e==="request"?t.defaultView?.HTMLElement.prototype.requestFullscreen:t.exitFullscreen,n=typeof i=="function",l=this.generation,a=this.source;try{if(!n)throw new Error("FULLSCREEN_UNSUPPORTED");await i.call(e==="request"?this:t),e==="request"&&this.fullscreenDisposed&&this.isNativeFullscreen()&&await t.exitFullscreen()}catch(s){throw this.generation===l&&this.source===a&&this.report({kind:n?"unknown":"unsupported",code:n?`FULLSCREEN_${e.toUpperCase()}_FAILED`:"FULLSCREEN_UNSUPPORTED"}),s}}currentPositionMs(){const e=this.engine?.video.currentTime;return this.source?.mode==="vod"&&e!==void 0&&Number.isFinite(e)?Math.round(e*1e3):null}on(e,t){const i=n=>t(n.detail);return this.addEventListener(`qxs-player-${e}`,i),()=>this.removeEventListener(`qxs-player-${e}`,i)}snapshot(){const e=this.engine?.video.duration;return{revision:this.source?.revision??0,positionMs:this.currentPositionMs(),durationMs:this.source?.mode==="vod"&&e!==void 0&&Number.isFinite(e)?Math.round(e*1e3):null,rate:this.engine?.video.playbackRate??1}}emit(e,t){this.dispatchEvent(new CustomEvent(`qxs-player-${e}`,{detail:t,bubbles:!0,composed:!0}))}report(e){this.emit("error",{...this.snapshot(),error:e})}bindRateMenuDismissal(e,t){const i=this.ownerDocument,n=i.defaultView,l=()=>t()?e.getPlugin("playbackRate"):void 0,a=()=>{const r=l();r?.isActive&&r.toggle(!1)},s=r=>{const c=l();c?.isActive&&!r.composedPath().includes(c.root)&&c.toggle(!1)},u=r=>{r.key==="Escape"&&a()};i.addEventListener("pointerdown",s,!0),i.addEventListener("click",s,!0),i.addEventListener("focusin",s,!0),i.addEventListener("keydown",u,!0),n?.addEventListener("blur",a),this.cleanupRateMenu=()=>{i.removeEventListener("pointerdown",s,!0),i.removeEventListener("click",s,!0),i.removeEventListener("focusin",s,!0),i.removeEventListener("keydown",u,!0),n?.removeEventListener("blur",a)}}destroyEngine(){this.cleanupRateMenu?.(),this.cleanupRateMenu=void 0,this.cleanupFullscreen?.(),this.cleanupFullscreen=void 0;const e=this.engine;this.engine=void 0,e?.recoverFullStyle(e.root,this,"xgplayer-is-fullscreen"),e?.destroy()}dispose(){this.fullscreenDisposed=!0,this.isNativeFullscreen()&&this.exitFullscreen().catch(()=>{}),++this.generation,this.destroyEngine(),this.applied=this.source}disconnectedCallback(){this.dispose(),super.disconnectedCallback()}};v.properties={source:{attribute:!1},options:{attribute:!1}};let h=v;customElements.get("qxs-video-player")||customElements.define("qxs-video-player",h);exports.QxsVideoPlayer=h;
|
|
3
|
+
//# sourceMappingURL=video-player.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-player.cjs","sources":["../../../packages/components/src/video-player.ts"],"sourcesContent":["import type { PlayerError, PlayerEventMap, PlayerOptions, PlayerSnapshot, PlayerSource } from './video-player.types'\nimport { html, LitElement } from 'lit'\nimport Player from 'xgplayer'\nimport HlsPlugin from 'xgplayer-hls'\nimport playerCss from 'xgplayer/dist/index.min.css?inline'\nimport { videoPlayerIcons, videoPlayerTheme } from './video-player.theme'\n\nclass ShadowHostPlayer extends Player {\n override changeFullStyle(root: HTMLElement, target: HTMLElement | null, rootClass: string, parentClass?: string) {\n // The SDK's style serializer drops CSS variables. Native fullscreen already\n // sizes the host, so preserve its inline styles while the SDK styles its root.\n const style = target instanceof QxsVideoPlayer ? target.getAttribute('style') : undefined\n try {\n super.changeFullStyle(root, target, rootClass, parentClass)\n }\n finally {\n if (target && style !== undefined) {\n if (style === null) {\n target.removeAttribute('style')\n }\n else {\n target.setAttribute('style', style)\n }\n }\n }\n }\n}\n\nexport class QxsVideoPlayer extends LitElement {\n static properties = { source: { attribute: false }, options: { attribute: false } }\n source?: PlayerSource\n options: PlayerOptions = { autoplay: false, muted: true, controls: true }\n private engine?: Player\n private generation = 0\n private applied?: PlayerSource\n private lastPosition: number | null = null\n private blocked = false\n private cleanupFullscreen?: () => void\n private cleanupRateMenu?: () => void\n private fullscreenDisposed = false\n\n render() {\n return html`<style>${playerCss}${videoPlayerTheme}</style><div class=\"media\" data-no-touch-simulate ?data-blocked=${this.blocked}></div><button class=\"fallback\" ?hidden=${!this.blocked}\n aria-label=\"播放视频\" title=\"播放视频\" @click=${() => {\n void this.play().catch(() => {})\n }}>播放</button>`\n }\n\n protected updated() {\n if (this.source && this.source !== this.applied) {\n void this.setSource(this.source).catch(() => {})\n }\n }\n\n async setSource(source: PlayerSource): Promise<void> {\n if (this.isConnected) {\n this.fullscreenDisposed = false\n }\n const generation = ++this.generation\n // Autoplay permission may belong to the media element, not the document.\n const mediaEl = this.engine?.video\n this.destroyEngine()\n this.source = source\n this.applied = source\n this.lastPosition = null\n this.blocked = false\n this.requestUpdate()\n await this.updateComplete\n if (generation !== this.generation || !this.isConnected) {\n return\n }\n const host = this.renderRoot.querySelector<HTMLElement>('.media')!\n host.replaceChildren()\n const probe = document.createElement('video')\n const nativeHls = !!probe.canPlayType('application/vnd.apple.mpegurl')\n if (source.format === 'mp4' && !probe.canPlayType('video/mp4')) {\n this.report({ kind: 'unsupported', code: 'MP4_UNSUPPORTED' })\n return\n }\n if (source.format === 'hls' && !nativeHls && !HlsPlugin.isSupported()) {\n this.report({ kind: 'unsupported', code: 'HLS_UNSUPPORTED' })\n return\n }\n const engine = new ShadowHostPlayer({\n el: host, mediaEl, url: source.url, width: '100%', height: '100%', lang: 'zh-cn',\n autoplay: this.options.autoplay ?? false, videoInit: true, autoplayMuted: true, muted: this.options.muted ?? true,\n poster: this.options.poster, controls: this.options.controls === false ? false : { mode: 'normal', height: 48 },\n playsinline: true, isLive: source.mode === 'live',\n keyboard: { disableBodyTrigger: true, ...(source.mode === 'live' ? { keyCodeMap: { left: { disable: true }, right: { disable: true } } } : {}) },\n ...(source.mode === 'live' ? { mobile: { gestureX: false, disablePress: true } } : {}),\n // The custom element's method would hide the SDK's video/prefixed fallback.\n fullscreen: { target: typeof this.ownerDocument.defaultView?.HTMLElement.prototype.requestFullscreen === 'function' ? this : host },\n icons: videoPlayerIcons,\n plugins: source.format === 'hls' && !nativeHls ? [HlsPlugin] : [],\n hls: { retryCount: 0, pollRetryCount: 1, loadTimeout: 10000, manifestLoadTimeout: 10000 },\n playbackRate: source.mode === 'vod' ? { list: [0.75, 1, 1.25, 1.5, 2], listType: 'middle', heightLimit: false, toggleMode: 'click' } : false,\n ignores: ['cssfullscreen', 'pip', 'download', 'screenshot', 'miniscreen', ...(source.mode === 'live' ? ['progress', 'playbackrate'] : [])],\n })\n this.engine = engine\n engine.video.muted = this.options.muted ?? true\n engine.video.tabIndex = 0\n engine.video.setAttribute('playsinline', '')\n engine.video.setAttribute('webkit-playsinline', '')\n const isCurrent = () => this.engine === engine && this.generation === generation && this.source === source\n if (source.mode === 'vod' && this.options.controls !== false) {\n this.bindRateMenuDismissal(engine, isCurrent)\n }\n const listen = (event: string, fn: (...args: any[]) => void) => engine.on(event, (...args) => {\n if (isCurrent()) {\n fn(...args)\n }\n })\n listen('loadedmetadata', () => this.emit('ready', this.snapshot()))\n listen('autoplay_was_prevented', () => {\n this.blocked = true\n this.requestUpdate()\n this.report({ kind: 'autoplay', code: 'AUTOPLAY_BLOCKED' })\n })\n for (const event of ['playing', 'pause', 'waiting', 'ended', 'timeupdate', 'seeked', 'ratechange'] as const) {\n listen(event, () => {\n if (event === 'playing') {\n this.blocked = false\n this.requestUpdate()\n }\n this.emit(event, this.snapshot())\n if (event === 'timeupdate' || event === 'seeked') {\n this.lastPosition = this.currentPositionMs()\n }\n })\n }\n listen('seeking', () => this.emit('seeking', { ...this.snapshot(), fromMs: this.lastPosition, toMs: this.currentPositionMs() }))\n listen('volumechange', () => this.emit('volumechange', { revision: source.revision, muted: engine.video.muted, volume: engine.video.volume }))\n const fullscreenDocument = this.ownerDocument\n let fullscreen = this.isNativeFullscreen()\n const reportFullscreen = (value: boolean) => {\n if (value === fullscreen) {\n return\n }\n fullscreen = value\n this.emit('fullscreenchange', { revision: source.revision, fullscreen: value })\n }\n const onNativeFullscreen = () => {\n if (!isCurrent()) {\n return\n }\n // Only synchronize after native entry. The SDK then takes its already-fullscreen\n // branch; requesting through it beforehand would recurse into this element's API.\n if (fullscreenDocument.fullscreenElement === this) {\n void engine.getFullscreen(this).catch(() => {\n if (isCurrent()) {\n this.report({ kind: 'unknown', code: 'FULLSCREEN_SYNC_FAILED' })\n }\n })\n }\n reportFullscreen(this.isNativeFullscreen())\n }\n fullscreenDocument.addEventListener('fullscreenchange', onNativeFullscreen)\n this.cleanupFullscreen = () => fullscreenDocument.removeEventListener('fullscreenchange', onNativeFullscreen)\n listen('fullscreen_change', (value: boolean) => reportFullscreen(!!value || this.isNativeFullscreen()))\n // A source replacement may create its SDK while the host is already fullscreen.\n onNativeFullscreen()\n listen('error', (error: any) => {\n const status = Number(error?.httpCode ?? error?.originError?.response?.status ?? error?.ext?.httpCode)\n const httpFailure = status >= 400 && status <= 599\n const mediaCode = engine.video.error?.code\n // Native code 4 also occurs for unavailable URLs, including streams returning 404.\n const kind = httpFailure || mediaCode === 2 || error?.errorType === 'network' ? 'network' : 'media'\n this.report({ kind, code: 'PLAYBACK_FAILED', ...(httpFailure ? { httpStatus: status } : {}) })\n })\n }\n\n async play(): Promise<void> {\n const engine = this.engine\n const source = this.source\n if (!engine) {\n return\n }\n try {\n await engine.play()\n }\n catch (error) {\n if (this.engine !== engine || this.source !== source) {\n return\n }\n const blocked = error instanceof Error && error.name === 'NotAllowedError'\n if (blocked) {\n this.blocked = true\n this.requestUpdate()\n }\n this.report({ kind: blocked ? 'autoplay' : 'media', code: blocked ? 'AUTOPLAY_BLOCKED' : 'PLAY_REJECTED' })\n throw error\n }\n }\n\n pause() {\n this.engine?.pause()\n }\n\n seek(positionMs: number) {\n if (this.source?.mode !== 'vod') {\n throw new Error('LIVE_SEEK_UNSUPPORTED')\n }\n const video = this.engine?.video\n if (video && Number.isFinite(positionMs) && Number.isFinite(video.duration)) {\n video.currentTime = Math.max(0, Math.min(video.duration, positionMs / 1000))\n }\n }\n\n setRate(rate: number) {\n if (this.source?.mode !== 'vod') {\n throw new Error('LIVE_RATE_UNSUPPORTED')\n }\n if (![0.75, 1, 1.25, 1.5, 2].includes(rate)) {\n throw new Error('RATE_UNSUPPORTED')\n }\n if (this.engine) {\n this.engine.video.playbackRate = rate\n }\n }\n\n setMuted(muted: boolean) {\n if (this.engine) {\n this.engine.video.muted = muted\n }\n }\n\n setVolume(volume: number) {\n if (this.engine && Number.isFinite(volume)) {\n this.engine.video.volume = Math.max(0, Math.min(1, volume))\n }\n }\n\n async requestFullscreen() {\n await this.runNativeFullscreen('request')\n }\n\n async exitFullscreen() {\n await this.runNativeFullscreen('exit')\n }\n\n private isNativeFullscreen() {\n const element = this.ownerDocument.fullscreenElement\n return !!element && (element === this || this.contains(element) || this.renderRoot.contains(element))\n }\n\n private async runNativeFullscreen(operation: 'request' | 'exit') {\n const fullscreenDocument = this.ownerDocument\n if (operation === 'exit' && !this.isNativeFullscreen()) {\n return\n }\n const native = operation === 'request'\n ? fullscreenDocument.defaultView?.HTMLElement.prototype.requestFullscreen\n : fullscreenDocument.exitFullscreen\n const supported = typeof native === 'function'\n const generation = this.generation\n const source = this.source\n try {\n if (!supported) {\n throw new Error('FULLSCREEN_UNSUPPORTED')\n }\n await native.call(operation === 'request' ? this : fullscreenDocument)\n // Disposal cannot cancel the browser's pending request. Reclaim only this\n // host if it is still disposed; a new source/lifecycle keeps its fullscreen.\n if (operation === 'request' && this.fullscreenDisposed && this.isNativeFullscreen()) {\n await fullscreenDocument.exitFullscreen()\n }\n }\n catch (error) {\n if (this.generation === generation && this.source === source) {\n this.report({ kind: supported ? 'unknown' : 'unsupported', code: supported ? `FULLSCREEN_${operation.toUpperCase()}_FAILED` : 'FULLSCREEN_UNSUPPORTED' })\n }\n throw error\n }\n }\n\n currentPositionMs(): number | null {\n const position = this.engine?.video.currentTime\n return this.source?.mode === 'vod' && position !== undefined && Number.isFinite(position) ? Math.round(position * 1000) : null\n }\n\n on<K extends keyof PlayerEventMap>(event: K, listener: (detail: PlayerEventMap[K]) => void) {\n const handler = (e: Event) => listener((e as CustomEvent<PlayerEventMap[K]>).detail)\n this.addEventListener(`qxs-player-${event}`, handler)\n return () => this.removeEventListener(`qxs-player-${event}`, handler)\n }\n\n private snapshot(): PlayerSnapshot {\n const duration = this.engine?.video.duration\n return { revision: this.source?.revision ?? 0, positionMs: this.currentPositionMs(), durationMs: this.source?.mode === 'vod' && duration !== undefined && Number.isFinite(duration) ? Math.round(duration * 1000) : null, rate: this.engine?.video.playbackRate ?? 1 }\n }\n\n private emit<K extends keyof PlayerEventMap>(event: K, detail: PlayerEventMap[K]) {\n this.dispatchEvent(new CustomEvent(`qxs-player-${event}`, { detail, bubbles: true, composed: true }))\n }\n\n private report(error: PlayerError) {\n this.emit('error', { ...this.snapshot(), error })\n }\n\n private bindRateMenuDismissal(engine: Player, isCurrent: () => boolean) {\n const doc = this.ownerDocument\n const view = doc.defaultView\n const menu = () => isCurrent() ? engine.getPlugin('playbackRate') : undefined\n const close = () => {\n const rate = menu()\n if (rate?.isActive) {\n rate.toggle(false)\n }\n }\n const outside = (event: Event) => {\n const rate = menu()\n // The document sees the custom element as the event target. The composed\n // path preserves the SDK control inside its shadow root, even when the\n // SDK stops propagation or the pointer is over a nested menu option.\n if (rate?.isActive && !event.composedPath().includes(rate.root)) {\n rate.toggle(false)\n }\n }\n const escape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n close()\n }\n }\n doc.addEventListener('pointerdown', outside, true)\n doc.addEventListener('click', outside, true)\n doc.addEventListener('focusin', outside, true)\n doc.addEventListener('keydown', escape, true)\n view?.addEventListener('blur', close)\n this.cleanupRateMenu = () => {\n doc.removeEventListener('pointerdown', outside, true)\n doc.removeEventListener('click', outside, true)\n doc.removeEventListener('focusin', outside, true)\n doc.removeEventListener('keydown', escape, true)\n view?.removeEventListener('blur', close)\n }\n }\n\n private destroyEngine() {\n this.cleanupRateMenu?.()\n this.cleanupRateMenu = undefined\n this.cleanupFullscreen?.()\n this.cleanupFullscreen = undefined\n const old = this.engine\n this.engine = undefined\n // The SDK caches and removes host layout styles during fullscreen. Restore\n // them before losing that cache, without exiting fullscreen during a switch.\n old?.recoverFullStyle(old.root, this, 'xgplayer-is-fullscreen')\n old?.destroy()\n }\n\n dispose() {\n this.fullscreenDisposed = true\n if (this.isNativeFullscreen()) {\n void this.exitFullscreen().catch(() => {})\n }\n ++this.generation\n this.destroyEngine()\n this.applied = this.source\n }\n\n disconnectedCallback() {\n this.dispose()\n super.disconnectedCallback()\n }\n}\n\nif (!customElements.get('qxs-video-player')) {\n customElements.define('qxs-video-player', QxsVideoPlayer)\n}\n"],"names":["ShadowHostPlayer","Player","root","target","rootClass","parentClass","style","QxsVideoPlayer","_QxsVideoPlayer","LitElement","html","playerCss","videoPlayerTheme","source","generation","mediaEl","host","probe","nativeHls","HlsPlugin","engine","videoPlayerIcons","isCurrent","listen","event","fn","args","fullscreenDocument","fullscreen","reportFullscreen","value","onNativeFullscreen","error","status","httpFailure","mediaCode","kind","blocked","positionMs","video","rate","muted","volume","element","operation","native","supported","position","listener","handler","e","duration","detail","doc","view","menu","close","outside","escape","old"],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=`
|
|
2
|
+
:host {
|
|
3
|
+
display:block;width:100%;aspect-ratio:16/9;position:relative;overflow:hidden;
|
|
4
|
+
background:#101416;color:#f5f7f8;container-type:inline-size;
|
|
5
|
+
font-family:"PingFang SC","Microsoft YaHei",system-ui,sans-serif;
|
|
6
|
+
letter-spacing:0;border-radius:var(--qxs-player-radius,12px);
|
|
7
|
+
--player-accent:var(--qxs-player-accent,#e60000);
|
|
8
|
+
}
|
|
9
|
+
:host(:fullscreen) { border-radius:0; }
|
|
10
|
+
.media { position:absolute;inset:0;width:100%;height:100%; }
|
|
11
|
+
.xgplayer { font-family:inherit;background:#101416;color:#f5f7f8; }
|
|
12
|
+
.xgplayer video { object-fit:contain; }
|
|
13
|
+
.xgplayer .xgplayer-controls { min-height:48px;padding:0;background:transparent; }
|
|
14
|
+
.xgplayer .xgplayer-controls::before {
|
|
15
|
+
content:"";position:absolute;inset:auto 0 0;height:120px;pointer-events:none;z-index:-1;
|
|
16
|
+
background:linear-gradient(180deg,transparent 0%,rgba(7,10,13,.38) 40%,rgba(7,10,13,.9) 100%);
|
|
17
|
+
}
|
|
18
|
+
.xgplayer .xg-inner-controls { display:flex;align-items:center;height:44px;bottom:3px;left:12px;right:12px; }
|
|
19
|
+
.xgplayer .xg-left-grid,.xgplayer .xg-right-grid { display:flex;align-items:center;flex-wrap:nowrap;float:none;height:44px;min-width:0; }
|
|
20
|
+
.xgplayer .xg-left-grid { flex:1; }
|
|
21
|
+
.xgplayer .xg-right-grid { flex:none;flex-direction:row;gap:2px; }
|
|
22
|
+
.xgplayer .xg-center-grid { top:-15px;padding:5px 0; }
|
|
23
|
+
.xgplayer .xg-inner-controls xg-icon { flex:none;width:44px;height:44px;margin:0; }
|
|
24
|
+
.xgplayer .xgplayer-icon { display:flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;color:#f5f7f8; }
|
|
25
|
+
.xgplayer .xgplayer-icon svg { width:22px;height:22px;filter:drop-shadow(0 1px 2px rgba(0,0,0,.24)); }
|
|
26
|
+
.xgplayer .xgplayer-icon:hover { color:#fff; }
|
|
27
|
+
.xgplayer .xg-inner-controls .xgplayer-time {
|
|
28
|
+
width:auto;padding:0 6px;white-space:nowrap;font-family:inherit;
|
|
29
|
+
font-size:12px;font-weight:500;line-height:44px;font-variant-numeric:tabular-nums;
|
|
30
|
+
}
|
|
31
|
+
.xgplayer .xgplayer-time span { height:100%;line-height:inherit; }
|
|
32
|
+
.xgplayer .xgplayer-time .time-duration { color:rgba(245,247,248,.65); }
|
|
33
|
+
.xgplayer .xgplayer-playbackrate { order:1; }
|
|
34
|
+
.xgplayer .xgplayer-volume { order:2; }
|
|
35
|
+
.xgplayer .xgplayer-fullscreen { order:3; }
|
|
36
|
+
.xgplayer .xgplayer-icon.btn-text { top:0;transform:none; }
|
|
37
|
+
.xgplayer .xgplayer-icon.btn-text span {
|
|
38
|
+
display:block;min-width:0;width:44px;height:28px;margin:0;padding:0;
|
|
39
|
+
border-radius:6px;background:rgba(255,255,255,.09);font-size:12px;font-weight:500;line-height:28px;
|
|
40
|
+
}
|
|
41
|
+
.xgplayer .xgplayer-progress-outer { height:3px;border-radius:4px; }
|
|
42
|
+
.xgplayer .xgplayer-progress.active .xgplayer-progress-outer { height:4px;margin-bottom:0; }
|
|
43
|
+
.xgplayer .xgplayer-progress-played,.xgplayer .xg-mini-progress xg-mini-progress-played,.xgplayer .xgplayer-drag { background:var(--player-accent); }
|
|
44
|
+
.xgplayer .xgplayer-progress-inner { background:rgba(255,255,255,.2); }
|
|
45
|
+
.xgplayer .xgplayer-progress-cache { background:rgba(255,255,255,.38); }
|
|
46
|
+
.xgplayer .xgplayer-progress-btn,.xgplayer .xgplayer-progress-btn.active {
|
|
47
|
+
width:10px;height:10px;border:0;background:#fff;box-shadow:0 0 0 3px rgba(255,255,255,.15);
|
|
48
|
+
}
|
|
49
|
+
.xgplayer .xgplayer-progress-btn::before { width:6px;height:6px;background:#fff;box-shadow:none; }
|
|
50
|
+
.xgplayer .xg-options-list {
|
|
51
|
+
width:96px;max-height:min(244px,calc(56.25cqw - 65px));box-sizing:border-box;
|
|
52
|
+
padding:4px;border:1px solid rgba(255,255,255,.12);border-radius:10px;
|
|
53
|
+
background:rgba(20,25,29,.96);color:#f5f7f8;opacity:1;
|
|
54
|
+
box-shadow:0 8px 28px rgba(0,0,0,.3);
|
|
55
|
+
overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;
|
|
56
|
+
scrollbar-color:rgba(255,255,255,.25) transparent;
|
|
57
|
+
}
|
|
58
|
+
.xgplayer .xg-options-list li {
|
|
59
|
+
box-sizing:border-box;min-height:32px;line-height:32px;margin:0;padding:0;
|
|
60
|
+
border-radius:6px;color:#dce1e5;font-size:13px;
|
|
61
|
+
}
|
|
62
|
+
.xgplayer .xg-options-list li:first-child,.xgplayer .xg-options-list li:last-child { margin:0; }
|
|
63
|
+
.xgplayer .xg-options-list li:hover { background:rgba(255,255,255,.08);color:#fff; }
|
|
64
|
+
.xgplayer .xg-options-list li.selected { background:rgba(255,255,255,.1);color:var(--player-accent);font-weight:600; }
|
|
65
|
+
.xgplayer .xgplayer-slider { border:1px solid rgba(255,255,255,.12);border-radius:8px;background:rgba(20,25,29,.96); }
|
|
66
|
+
.xgplayer .xgplayer-value-label { border-radius:8px 8px 0 0;background:rgba(20,25,29,.96); }
|
|
67
|
+
.xgplayer .xg-tips { padding:5px 9px;border-radius:6px;background:rgba(20,25,29,.96);font-size:12px; }
|
|
68
|
+
.xgplayer .xgplayer-start { width:64px;height:64px; }
|
|
69
|
+
.xgplayer xg-start-inner {
|
|
70
|
+
display:flex;align-items:center;justify-content:center;box-sizing:border-box;
|
|
71
|
+
border:1px solid rgba(255,255,255,.26);border-radius:50%;
|
|
72
|
+
background:rgba(13,19,23,.72);box-shadow:0 8px 32px rgba(0,0,0,.16);
|
|
73
|
+
}
|
|
74
|
+
.xgplayer .xgplayer-start svg { width:28px;height:28px;color:#fff; }
|
|
75
|
+
.xgplayer.xgplayer-playing .xgplayer-start,.media[data-blocked] .xgplayer-start { display:none; }
|
|
76
|
+
button.fallback {
|
|
77
|
+
position:absolute;z-index:10000;left:50%;bottom:24px;transform:translateX(-50%);
|
|
78
|
+
width:140px;height:44px;border:1px solid rgba(255,255,255,.2);border-radius:22px;
|
|
79
|
+
background:#f5f7f8;color:#101416;font:600 14px/22px "PingFang SC","Microsoft YaHei",system-ui,sans-serif;cursor:pointer;
|
|
80
|
+
}
|
|
81
|
+
button.fallback:focus-visible { outline:2px solid var(--player-accent);outline-offset:4px; }
|
|
82
|
+
button[hidden] { display:none; }
|
|
83
|
+
@container (max-width:360px) {
|
|
84
|
+
.xgplayer .xg-inner-controls { left:6px;right:6px; }
|
|
85
|
+
.xgplayer .xg-right-grid { gap:0; }
|
|
86
|
+
.xgplayer .xg-inner-controls .xgplayer-time { padding:0 2px;font-size:11px; }
|
|
87
|
+
.xgplayer .xgplayer-start { width:52px;height:52px; }
|
|
88
|
+
}
|
|
89
|
+
@container (max-width:300px) {
|
|
90
|
+
.xgplayer .xgplayer-time .time-duration,.xgplayer .xgplayer-time .time-separator { display:none; }
|
|
91
|
+
.xgplayer .xg-options-list.active {
|
|
92
|
+
display:flex;width:222px;max-width:calc(100cqw - 4px);height:46px;max-height:none;
|
|
93
|
+
padding:0;bottom:calc(100% + 4px);
|
|
94
|
+
}
|
|
95
|
+
.xgplayer .xg-options-list li { flex:1;min-width:0;min-height:44px;line-height:44px;font-size:11px; }
|
|
96
|
+
.xgplayer .xgplayer-slider {
|
|
97
|
+
height: min(92px, calc(56.25cqw - 64px));
|
|
98
|
+
}
|
|
99
|
+
.xgplayer .xgplayer-bar {
|
|
100
|
+
height: calc(100% - 16px);
|
|
101
|
+
}
|
|
102
|
+
.xgplayer .xgplayer-drag {
|
|
103
|
+
max-height: 100%;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
@media (prefers-reduced-motion:reduce) {
|
|
107
|
+
.xgplayer .xgplayer-controls,.xgplayer .xgplayer-progress-inner { transition:none; }
|
|
108
|
+
.xgplayer .xgplayer-start.interact xg-start-inner { animation:none; }
|
|
109
|
+
}
|
|
110
|
+
`,e=t=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${t}</svg>`,a=e('<path d="M8 5.5v13l10-6.5z" fill="currentColor" stroke="none"/>'),i=e('<path d="M8 5v14M16 5v14" stroke-width="3"/>'),r='<path d="M11 5 6 9H3v6h3l5 4z"/>',p={play:a,pause:i,startPlay:a,startPause:i,volumeSmall:e(`${r}<path d="M15 9a5 5 0 0 1 0 6"/>`),volumeLarge:e(`${r}<path d="M15 9a5 5 0 0 1 0 6m3-9a9 9 0 0 1 0 12"/>`),volumeMuted:e(`${r}<path d="m16 9 5 6m0-6-5 6"/>`),fullscreen:e('<path d="M8 3H3v5m13-5h5v5M3 16v5h5m13-5v5h-5"/>'),exitFullscreen:e('<path d="M3 8h5V3m13 5h-5V3M8 21v-5H3m13 5v-5h5"/>')};exports.videoPlayerIcons=p;exports.videoPlayerTheme=o;
|
|
111
|
+
//# sourceMappingURL=video-player.theme.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-player.theme.cjs","sources":["../../../packages/components/src/video-player.theme.ts"],"sourcesContent":["// Kept inside the player's shadow root. Hosts can override the two CSS tokens.\nexport const videoPlayerTheme = `\n :host {\n display:block;width:100%;aspect-ratio:16/9;position:relative;overflow:hidden;\n background:#101416;color:#f5f7f8;container-type:inline-size;\n font-family:\"PingFang SC\",\"Microsoft YaHei\",system-ui,sans-serif;\n letter-spacing:0;border-radius:var(--qxs-player-radius,12px);\n --player-accent:var(--qxs-player-accent,#e60000);\n }\n :host(:fullscreen) { border-radius:0; }\n .media { position:absolute;inset:0;width:100%;height:100%; }\n .xgplayer { font-family:inherit;background:#101416;color:#f5f7f8; }\n .xgplayer video { object-fit:contain; }\n .xgplayer .xgplayer-controls { min-height:48px;padding:0;background:transparent; }\n .xgplayer .xgplayer-controls::before {\n content:\"\";position:absolute;inset:auto 0 0;height:120px;pointer-events:none;z-index:-1;\n background:linear-gradient(180deg,transparent 0%,rgba(7,10,13,.38) 40%,rgba(7,10,13,.9) 100%);\n }\n .xgplayer .xg-inner-controls { display:flex;align-items:center;height:44px;bottom:3px;left:12px;right:12px; }\n .xgplayer .xg-left-grid,.xgplayer .xg-right-grid { display:flex;align-items:center;flex-wrap:nowrap;float:none;height:44px;min-width:0; }\n .xgplayer .xg-left-grid { flex:1; }\n .xgplayer .xg-right-grid { flex:none;flex-direction:row;gap:2px; }\n .xgplayer .xg-center-grid { top:-15px;padding:5px 0; }\n .xgplayer .xg-inner-controls xg-icon { flex:none;width:44px;height:44px;margin:0; }\n .xgplayer .xgplayer-icon { display:flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;color:#f5f7f8; }\n .xgplayer .xgplayer-icon svg { width:22px;height:22px;filter:drop-shadow(0 1px 2px rgba(0,0,0,.24)); }\n .xgplayer .xgplayer-icon:hover { color:#fff; }\n .xgplayer .xg-inner-controls .xgplayer-time {\n width:auto;padding:0 6px;white-space:nowrap;font-family:inherit;\n font-size:12px;font-weight:500;line-height:44px;font-variant-numeric:tabular-nums;\n }\n .xgplayer .xgplayer-time span { height:100%;line-height:inherit; }\n .xgplayer .xgplayer-time .time-duration { color:rgba(245,247,248,.65); }\n .xgplayer .xgplayer-playbackrate { order:1; }\n .xgplayer .xgplayer-volume { order:2; }\n .xgplayer .xgplayer-fullscreen { order:3; }\n .xgplayer .xgplayer-icon.btn-text { top:0;transform:none; }\n .xgplayer .xgplayer-icon.btn-text span {\n display:block;min-width:0;width:44px;height:28px;margin:0;padding:0;\n border-radius:6px;background:rgba(255,255,255,.09);font-size:12px;font-weight:500;line-height:28px;\n }\n .xgplayer .xgplayer-progress-outer { height:3px;border-radius:4px; }\n .xgplayer .xgplayer-progress.active .xgplayer-progress-outer { height:4px;margin-bottom:0; }\n .xgplayer .xgplayer-progress-played,.xgplayer .xg-mini-progress xg-mini-progress-played,.xgplayer .xgplayer-drag { background:var(--player-accent); }\n .xgplayer .xgplayer-progress-inner { background:rgba(255,255,255,.2); }\n .xgplayer .xgplayer-progress-cache { background:rgba(255,255,255,.38); }\n .xgplayer .xgplayer-progress-btn,.xgplayer .xgplayer-progress-btn.active {\n width:10px;height:10px;border:0;background:#fff;box-shadow:0 0 0 3px rgba(255,255,255,.15);\n }\n .xgplayer .xgplayer-progress-btn::before { width:6px;height:6px;background:#fff;box-shadow:none; }\n .xgplayer .xg-options-list {\n width:96px;max-height:min(244px,calc(56.25cqw - 65px));box-sizing:border-box;\n padding:4px;border:1px solid rgba(255,255,255,.12);border-radius:10px;\n background:rgba(20,25,29,.96);color:#f5f7f8;opacity:1;\n box-shadow:0 8px 28px rgba(0,0,0,.3);\n overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;\n scrollbar-color:rgba(255,255,255,.25) transparent;\n }\n .xgplayer .xg-options-list li {\n box-sizing:border-box;min-height:32px;line-height:32px;margin:0;padding:0;\n border-radius:6px;color:#dce1e5;font-size:13px;\n }\n .xgplayer .xg-options-list li:first-child,.xgplayer .xg-options-list li:last-child { margin:0; }\n .xgplayer .xg-options-list li:hover { background:rgba(255,255,255,.08);color:#fff; }\n .xgplayer .xg-options-list li.selected { background:rgba(255,255,255,.1);color:var(--player-accent);font-weight:600; }\n .xgplayer .xgplayer-slider { border:1px solid rgba(255,255,255,.12);border-radius:8px;background:rgba(20,25,29,.96); }\n .xgplayer .xgplayer-value-label { border-radius:8px 8px 0 0;background:rgba(20,25,29,.96); }\n .xgplayer .xg-tips { padding:5px 9px;border-radius:6px;background:rgba(20,25,29,.96);font-size:12px; }\n .xgplayer .xgplayer-start { width:64px;height:64px; }\n .xgplayer xg-start-inner {\n display:flex;align-items:center;justify-content:center;box-sizing:border-box;\n border:1px solid rgba(255,255,255,.26);border-radius:50%;\n background:rgba(13,19,23,.72);box-shadow:0 8px 32px rgba(0,0,0,.16);\n }\n .xgplayer .xgplayer-start svg { width:28px;height:28px;color:#fff; }\n .xgplayer.xgplayer-playing .xgplayer-start,.media[data-blocked] .xgplayer-start { display:none; }\n button.fallback {\n position:absolute;z-index:10000;left:50%;bottom:24px;transform:translateX(-50%);\n width:140px;height:44px;border:1px solid rgba(255,255,255,.2);border-radius:22px;\n background:#f5f7f8;color:#101416;font:600 14px/22px \"PingFang SC\",\"Microsoft YaHei\",system-ui,sans-serif;cursor:pointer;\n }\n button.fallback:focus-visible { outline:2px solid var(--player-accent);outline-offset:4px; }\n button[hidden] { display:none; }\n @container (max-width:360px) {\n .xgplayer .xg-inner-controls { left:6px;right:6px; }\n .xgplayer .xg-right-grid { gap:0; }\n .xgplayer .xg-inner-controls .xgplayer-time { padding:0 2px;font-size:11px; }\n .xgplayer .xgplayer-start { width:52px;height:52px; }\n }\n @container (max-width:300px) {\n .xgplayer .xgplayer-time .time-duration,.xgplayer .xgplayer-time .time-separator { display:none; }\n .xgplayer .xg-options-list.active {\n display:flex;width:222px;max-width:calc(100cqw - 4px);height:46px;max-height:none;\n padding:0;bottom:calc(100% + 4px);\n }\n .xgplayer .xg-options-list li { flex:1;min-width:0;min-height:44px;line-height:44px;font-size:11px; }\n .xgplayer .xgplayer-slider {\n height: min(92px, calc(56.25cqw - 64px));\n }\n .xgplayer .xgplayer-bar {\n height: calc(100% - 16px);\n }\n .xgplayer .xgplayer-drag {\n max-height: 100%;\n }\n }\n @media (prefers-reduced-motion:reduce) {\n .xgplayer .xgplayer-controls,.xgplayer .xgplayer-progress-inner { transition:none; }\n .xgplayer .xgplayer-start.interact xg-start-inner { animation:none; }\n }\n`\n\nconst icon = (content: string) => `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${content}</svg>`\nconst play = icon('<path d=\"M8 5.5v13l10-6.5z\" fill=\"currentColor\" stroke=\"none\"/>')\nconst pause = icon('<path d=\"M8 5v14M16 5v14\" stroke-width=\"3\"/>')\nconst speaker = '<path d=\"M11 5 6 9H3v6h3l5 4z\"/>'\n\nexport const videoPlayerIcons = {\n play,\n pause,\n startPlay: play,\n startPause: pause,\n volumeSmall: icon(`${speaker}<path d=\"M15 9a5 5 0 0 1 0 6\"/>`),\n volumeLarge: icon(`${speaker}<path d=\"M15 9a5 5 0 0 1 0 6m3-9a9 9 0 0 1 0 12\"/>`),\n volumeMuted: icon(`${speaker}<path d=\"m16 9 5 6m0-6-5 6\"/>`),\n fullscreen: icon('<path d=\"M8 3H3v5m13-5h5v5M3 16v5h5m13-5v5h-5\"/>'),\n exitFullscreen: icon('<path d=\"M3 8h5V3m13 5h-5V3M8 21v-5H3m13 5v-5h5\"/>'),\n}\n"],"names":["videoPlayerTheme","icon","content","play","pause","speaker","videoPlayerIcons"],"mappings":"gFACO,MAAMA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+G1BC,EAAQC,GAAoB,sLAAsLA,CAAO,SACzNC,EAAOF,EAAK,iEAAiE,EAC7EG,EAAQH,EAAK,8CAA8C,EAC3DI,EAAU,mCAEHC,EAAmB,CAC9B,KAAAH,EACA,MAAAC,EACA,UAAWD,EACX,WAAYC,EACZ,YAAaH,EAAK,GAAGI,CAAO,iCAAiC,EAC7D,YAAaJ,EAAK,GAAGI,CAAO,oDAAoD,EAChF,YAAaJ,EAAK,GAAGI,CAAO,+BAA+B,EAC3D,WAAYJ,EAAK,kDAAkD,EACnE,eAAgBA,EAAK,oDAAoD,CAC3E"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qxs-bns/components",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.94",
|
|
5
5
|
"description": "QXS Business Components - Web Components (framework agnostic)",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://qxs-bns.pages.dev/guide/components/",
|
|
@@ -20,6 +20,11 @@
|
|
|
20
20
|
],
|
|
21
21
|
"sideEffects": true,
|
|
22
22
|
"exports": {
|
|
23
|
+
"./video-player": {
|
|
24
|
+
"types": "./types/entry-video-player.d.ts",
|
|
25
|
+
"import": "./es/entry-video-player.mjs",
|
|
26
|
+
"require": "./lib/entry-video-player.cjs"
|
|
27
|
+
},
|
|
23
28
|
".": {
|
|
24
29
|
"types": "./types/index.d.ts",
|
|
25
30
|
"import": "./es/index.mjs",
|
|
@@ -30,6 +35,11 @@
|
|
|
30
35
|
"import": "./es/entry-subject.mjs",
|
|
31
36
|
"require": "./lib/entry-subject.cjs"
|
|
32
37
|
},
|
|
38
|
+
"./answer-container": {
|
|
39
|
+
"types": "./types/index.d.ts",
|
|
40
|
+
"import": "./es/entry-answer-container.mjs",
|
|
41
|
+
"require": "./lib/entry-answer-container.cjs"
|
|
42
|
+
},
|
|
33
43
|
"./editor": {
|
|
34
44
|
"types": "./types/index.d.ts",
|
|
35
45
|
"import": "./es/entry-editor.mjs",
|
|
@@ -121,6 +131,8 @@
|
|
|
121
131
|
"nanoid": "^5.1.5",
|
|
122
132
|
"sortablejs": "^1.15.7",
|
|
123
133
|
"turndown": "^7.2.1",
|
|
124
|
-
"turndown-plugin-gfm": "^1.0.2"
|
|
134
|
+
"turndown-plugin-gfm": "^1.0.2",
|
|
135
|
+
"xgplayer": "3.0.26",
|
|
136
|
+
"xgplayer-hls": "3.0.26"
|
|
125
137
|
}
|
|
126
138
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import type { AnswerRowRelationExamAnswerRenderer, AnswerThemeName, LegacyAnswerContainerItem } from './types';
|
|
3
|
+
export declare class QxsAnswerContainer extends LitElement {
|
|
4
|
+
createRenderRoot(): this;
|
|
5
|
+
list: LegacyAnswerContainerItem[] | LegacyAnswerContainerItem | null;
|
|
6
|
+
disabled: boolean;
|
|
7
|
+
type: boolean;
|
|
8
|
+
isShowCorrect: boolean;
|
|
9
|
+
isShowBg: boolean;
|
|
10
|
+
isShowProgress: boolean;
|
|
11
|
+
showSingleRowScaleTitle: boolean;
|
|
12
|
+
themeName: AnswerThemeName;
|
|
13
|
+
beforeChange: (row: LegacyAnswerContainerItem, answerItem?: any) => boolean;
|
|
14
|
+
answerRowRelationExamAnswerRenderer: AnswerRowRelationExamAnswerRenderer | null;
|
|
15
|
+
private _list;
|
|
16
|
+
private _draftRowKeys;
|
|
17
|
+
willUpdate(changed: Map<string, unknown>): void;
|
|
18
|
+
addTitleNumber(list: LegacyAnswerContainerItem[]): LegacyAnswerContainerItem[];
|
|
19
|
+
reset(): void;
|
|
20
|
+
onSubmit(): Promise<LegacyAnswerContainerItem[]>;
|
|
21
|
+
private _onRowChange;
|
|
22
|
+
private _onRowDraftChange;
|
|
23
|
+
private _renderItem;
|
|
24
|
+
render(): import("lit").TemplateResult<1>;
|
|
25
|
+
}
|
|
26
|
+
export declare function register(): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cloneAnswerValue<T>(value: T, seen?: WeakMap<object, unknown>): T;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import './runtime-choice';
|
|
2
|
+
import './runtime-blank-fill';
|
|
3
|
+
import './runtime-text-fill';
|
|
4
|
+
import './runtime-scale';
|
|
5
|
+
import './answer-container';
|
|
6
|
+
export { QxsAnswerContainer } from './answer-container';
|
|
7
|
+
export { normalizeAnswerContainerList, addTitleNumber } from './normalize';
|
|
8
|
+
export { QxsAnswerRuntimeChoice } from './runtime-choice';
|
|
9
|
+
export { QxsAnswerRuntimeBlankFill } from './runtime-blank-fill';
|
|
10
|
+
export { QxsAnswerRuntimeTextFill } from './runtime-text-fill';
|
|
11
|
+
export { QxsAnswerRuntimeScale } from './runtime-scale';
|
|
12
|
+
export type { AnswerSubmitError, AnswerThemeName, LegacyAnswerContainerItem, LegacyExamType, } from './types';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { LegacyAnswerContainerItem } from './types';
|
|
2
|
+
export declare function addTitleNumber(list: LegacyAnswerContainerItem[]): LegacyAnswerContainerItem[];
|
|
3
|
+
export declare function normalizeAnswerContainerList(input: LegacyAnswerContainerItem[] | LegacyAnswerContainerItem | null | undefined): LegacyAnswerContainerItem[];
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AnswerRuntimeElement } from './runtime-question-base';
|
|
2
|
+
export declare class QxsAnswerRuntimeBlankFill extends AnswerRuntimeElement {
|
|
3
|
+
private _values;
|
|
4
|
+
protected syncFromItem(): void;
|
|
5
|
+
private _setValue;
|
|
6
|
+
private _renderInput;
|
|
7
|
+
private _renderTitleWithMasks;
|
|
8
|
+
private _renderInputRows;
|
|
9
|
+
private _renderReview;
|
|
10
|
+
onSubmit(): Promise<{
|
|
11
|
+
submitAnswer: string;
|
|
12
|
+
submitAnswerObj: {
|
|
13
|
+
intVal: string | number | undefined;
|
|
14
|
+
stringVal: string;
|
|
15
|
+
};
|
|
16
|
+
examId?: string | number;
|
|
17
|
+
examIndex?: string | number;
|
|
18
|
+
examTypeEnum?: import("./types").LegacyExamType | string;
|
|
19
|
+
titleIndex?: number;
|
|
20
|
+
title?: string;
|
|
21
|
+
type?: boolean;
|
|
22
|
+
isShowProgress?: boolean;
|
|
23
|
+
showSingleRowScaleTitle?: boolean;
|
|
24
|
+
answers?: any[];
|
|
25
|
+
leastAnswerCount?: string | number;
|
|
26
|
+
examAnswerResults?: any[] | string;
|
|
27
|
+
examExpand?: string;
|
|
28
|
+
pageIndex?: string | number | null;
|
|
29
|
+
scaleQuestionList?: any[];
|
|
30
|
+
customBinds?: Record<string, unknown>;
|
|
31
|
+
}>;
|
|
32
|
+
reset(): void;
|
|
33
|
+
render(): import("lit").TemplateResult<1>;
|
|
34
|
+
}
|
|
35
|
+
export declare function register(): void;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { AnswerRuntimeElement } from './runtime-question-base';
|
|
2
|
+
import type { LegacyExamType } from './types';
|
|
3
|
+
export declare class QxsAnswerRuntimeChoice extends AnswerRuntimeElement {
|
|
4
|
+
examType: LegacyExamType;
|
|
5
|
+
private _selectedIds;
|
|
6
|
+
private _sortOrder;
|
|
7
|
+
protected syncFromItem(): void;
|
|
8
|
+
private _isSelected;
|
|
9
|
+
private _toggle;
|
|
10
|
+
private _currentValue;
|
|
11
|
+
private _validate;
|
|
12
|
+
private _selectedSummary;
|
|
13
|
+
private _snapshotAnswers;
|
|
14
|
+
private _snapshotRow;
|
|
15
|
+
private _handleRendererChange;
|
|
16
|
+
private _correctSummary;
|
|
17
|
+
private _renderReview;
|
|
18
|
+
private _renderRelationEntry;
|
|
19
|
+
onSubmit(): Promise<{
|
|
20
|
+
submitAnswer: string;
|
|
21
|
+
submitAnswerObj: {
|
|
22
|
+
intVal: string | number | undefined;
|
|
23
|
+
stringVal: string;
|
|
24
|
+
};
|
|
25
|
+
answers: any[];
|
|
26
|
+
examId?: string | number;
|
|
27
|
+
examIndex?: string | number;
|
|
28
|
+
examTypeEnum?: LegacyExamType | string;
|
|
29
|
+
titleIndex?: number;
|
|
30
|
+
title?: string;
|
|
31
|
+
type?: boolean;
|
|
32
|
+
isShowProgress?: boolean;
|
|
33
|
+
showSingleRowScaleTitle?: boolean;
|
|
34
|
+
leastAnswerCount?: string | number;
|
|
35
|
+
examAnswerResults?: any[] | string;
|
|
36
|
+
examExpand?: string;
|
|
37
|
+
pageIndex?: string | number | null;
|
|
38
|
+
scaleQuestionList?: any[];
|
|
39
|
+
customBinds?: Record<string, unknown>;
|
|
40
|
+
}>;
|
|
41
|
+
reset(): void;
|
|
42
|
+
render(): import("lit").TemplateResult<1>;
|
|
43
|
+
}
|
|
44
|
+
export declare function register(): void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { LitElement, nothing } from 'lit';
|
|
2
|
+
import type { AnswerThemeName, LegacyAnswerContainerItem } from './types';
|
|
3
|
+
import type { AnswerRowRelationExamAnswerRenderer } from './types';
|
|
4
|
+
export declare abstract class AnswerRuntimeElement extends LitElement {
|
|
5
|
+
createRenderRoot(): this;
|
|
6
|
+
item: LegacyAnswerContainerItem;
|
|
7
|
+
disabled: boolean;
|
|
8
|
+
type: boolean;
|
|
9
|
+
isShowCorrect: boolean;
|
|
10
|
+
isShowBg: boolean;
|
|
11
|
+
isShowProgress: boolean;
|
|
12
|
+
showSingleRowScaleTitle: boolean;
|
|
13
|
+
themeName: AnswerThemeName;
|
|
14
|
+
beforeChange: (row: LegacyAnswerContainerItem, answerItem?: any) => boolean;
|
|
15
|
+
answerRowRelationExamAnswerRenderer: AnswerRowRelationExamAnswerRenderer | null;
|
|
16
|
+
protected _item: LegacyAnswerContainerItem;
|
|
17
|
+
protected cloneItem(): LegacyAnswerContainerItem;
|
|
18
|
+
protected answerIdOf(answer: any): string;
|
|
19
|
+
protected answerLabel(answer: any): any;
|
|
20
|
+
protected answerLetter(index: number): string;
|
|
21
|
+
protected titleText(): string;
|
|
22
|
+
protected resultAnswersFromExamResults(): any[];
|
|
23
|
+
protected updateItem(next: LegacyAnswerContainerItem): void;
|
|
24
|
+
protected emitHandleAction(action: string, row: LegacyAnswerContainerItem): void;
|
|
25
|
+
protected emitRelationExamAnswer(action: string, answerItem: Record<string, unknown>, row: LegacyAnswerContainerItem): void;
|
|
26
|
+
protected renderTitleBlock(content?: unknown): import("lit").TemplateResult<1>;
|
|
27
|
+
protected renderShell(options: {
|
|
28
|
+
answerContent: unknown;
|
|
29
|
+
resultContent?: unknown | null;
|
|
30
|
+
footerContent?: unknown | null;
|
|
31
|
+
shellClassName?: string;
|
|
32
|
+
titleContent?: unknown;
|
|
33
|
+
}): import("lit").TemplateResult<1>;
|
|
34
|
+
protected renderCasePracticeFooter(row: LegacyAnswerContainerItem): import("lit").TemplateResult<1> | typeof nothing;
|
|
35
|
+
willUpdate(changed: Map<string, unknown>): void;
|
|
36
|
+
protected abstract syncFromItem(): void;
|
|
37
|
+
abstract onSubmit(): Promise<LegacyAnswerContainerItem>;
|
|
38
|
+
abstract reset(): void;
|
|
39
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AnswerRuntimeElement } from './runtime-question-base';
|
|
2
|
+
export declare class QxsAnswerRuntimeScale extends AnswerRuntimeElement {
|
|
3
|
+
private _rows;
|
|
4
|
+
protected syncFromItem(): void;
|
|
5
|
+
private _setValue;
|
|
6
|
+
private _renderReview;
|
|
7
|
+
private _showRowTitleColumn;
|
|
8
|
+
onSubmit(): Promise<{
|
|
9
|
+
scaleQuestionList: {
|
|
10
|
+
name: string;
|
|
11
|
+
examAnswerId?: string | number;
|
|
12
|
+
}[];
|
|
13
|
+
submitAnswer: string;
|
|
14
|
+
submitAnswerObj: {
|
|
15
|
+
intVal: string | number | undefined;
|
|
16
|
+
stringVal: string;
|
|
17
|
+
};
|
|
18
|
+
examId?: string | number;
|
|
19
|
+
examIndex?: string | number;
|
|
20
|
+
examTypeEnum?: import("./types").LegacyExamType | string;
|
|
21
|
+
titleIndex?: number;
|
|
22
|
+
title?: string;
|
|
23
|
+
type?: boolean;
|
|
24
|
+
isShowProgress?: boolean;
|
|
25
|
+
showSingleRowScaleTitle?: boolean;
|
|
26
|
+
answers?: any[];
|
|
27
|
+
leastAnswerCount?: string | number;
|
|
28
|
+
examAnswerResults?: any[] | string;
|
|
29
|
+
examExpand?: string;
|
|
30
|
+
pageIndex?: string | number | null;
|
|
31
|
+
customBinds?: Record<string, unknown>;
|
|
32
|
+
}>;
|
|
33
|
+
reset(): void;
|
|
34
|
+
render(): import("lit").TemplateResult<1>;
|
|
35
|
+
}
|
|
36
|
+
export declare function register(): void;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AnswerRuntimeElement } from './runtime-question-base';
|
|
2
|
+
export declare class QxsAnswerRuntimeTextFill extends AnswerRuntimeElement {
|
|
3
|
+
private _value;
|
|
4
|
+
protected syncFromItem(): void;
|
|
5
|
+
private _setValue;
|
|
6
|
+
private _renderReview;
|
|
7
|
+
onSubmit(): Promise<{
|
|
8
|
+
submitAnswer: string;
|
|
9
|
+
submitAnswerObj: {
|
|
10
|
+
intVal: string | number | undefined;
|
|
11
|
+
stringVal: string;
|
|
12
|
+
};
|
|
13
|
+
examId?: string | number;
|
|
14
|
+
examIndex?: string | number;
|
|
15
|
+
examTypeEnum?: import("./types").LegacyExamType | string;
|
|
16
|
+
titleIndex?: number;
|
|
17
|
+
title?: string;
|
|
18
|
+
type?: boolean;
|
|
19
|
+
isShowProgress?: boolean;
|
|
20
|
+
showSingleRowScaleTitle?: boolean;
|
|
21
|
+
answers?: any[];
|
|
22
|
+
leastAnswerCount?: string | number;
|
|
23
|
+
examAnswerResults?: any[] | string;
|
|
24
|
+
examExpand?: string;
|
|
25
|
+
pageIndex?: string | number | null;
|
|
26
|
+
scaleQuestionList?: any[];
|
|
27
|
+
customBinds?: Record<string, unknown>;
|
|
28
|
+
}>;
|
|
29
|
+
reset(): void;
|
|
30
|
+
render(): import("lit").TemplateResult<1>;
|
|
31
|
+
}
|
|
32
|
+
export declare function register(): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const answerContainerStyles = "\n.qxs-answer-container {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.qxs-answer-runtime {\n box-sizing: border-box;\n margin-bottom: 15px;\n color: #303133;\n background: transparent;\n}\n\n.exam-content-box {\n padding: 0;\n}\n\n.exam-title {\n font-size: 14px;\n line-height: 1.7;\n font-weight: 700;\n color: #303133;\n word-break: break-word;\n}\n\n.exam-answer-box {\n position: relative;\n margin-top: 8px;\n font-size: 0;\n}\n\n.qxs-answer-runtime__heading {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.qxs-answer-runtime__progress {\n width: fit-content;\n padding: 2px 8px;\n font-size: 11px;\n line-height: 1.4;\n color: #3d61e3;\n background: #eef2ff;\n border-radius: 999px;\n}\n\n.qxs-answer-runtime__title {\n font-size: 14px;\n line-height: 1.7;\n font-weight: 700;\n color: #303133;\n}\n\n.qxs-answer-runtime__blank-flow {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px 6px;\n}\n\n.qxs-answer-runtime__blank-text {\n white-space: pre-wrap;\n}\n\n.qxs-answer-runtime__blank-mask {\n display: inline-flex;\n align-items: center;\n padding: 1px 5px;\n color: #1e1e1e;\n font-weight: 400;\n border-bottom: 1px solid #1e1e1e;\n}\n\n.qxs-answer-runtime__blank-mask-index {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n line-height: 20px;\n font-size: 12px;\n color: #1e1e1e;\n text-align: center;\n border: 1px solid #1e1e1e;\n border-radius: 50%;\n}\n\n.qxs-answer-runtime__answers {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.exam-answer,\n.qxs-answer-runtime__field {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n min-height: 40px;\n margin-top: 2px;\n padding: 10px 12px;\n font-size: 14px;\n line-height: 20px;\n color: #606266;\n border-radius: 4px;\n box-sizing: border-box;\n}\n\n.exam-answer.bgCol,\n.exam-answer.has-background {\n margin-bottom: 5px;\n background: #f0f0f0;\n}\n\n.exam-answer.is-selected,\n.exam-answer.is-select {\n color: #3d61e3;\n background: rgba(162, 185, 255, 0.2);\n}\n\n.exam-answer > span:last-of-type {\n flex: 1;\n}\n\n.sort .exam-answer strong.sort-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n margin-left: auto;\n font-size: 14px;\n font-weight: 600;\n color: #fff;\n background: rgba(61, 97, 227, 0.4);\n border-radius: 50%;\n}\n\n.qxs-answer-runtime__field {\n justify-content: flex-start;\n}\n\n.qxs-answer-runtime__field > span:first-child {\n flex-shrink: 0;\n}\n\n.question-input-box {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n min-height: 45px;\n font-size: 14px;\n}\n\n.placeholder-box {\n width: 10px;\n height: 45px;\n line-height: 45px;\n}\n\n.required-span {\n color: #ff8383;\n}\n\n.question-input-box__index {\n flex-shrink: 0;\n font-size: 14px;\n color: #303133;\n}\n\n.mgn-l10 {\n margin-left: 10px;\n}\n\n.qxs-answer-runtime input[type=\"text\"],\n.qxs-answer-runtime input:not([type]),\n.qxs-answer-runtime textarea {\n width: 100%;\n min-width: 0;\n padding: 9px 12px;\n font: inherit;\n color: #1e1e1e;\n background: transparent;\n border: 1px solid #f0f0f0;\n border-radius: 5px;\n outline: none;\n box-sizing: border-box;\n}\n\n.qxs-answer-runtime textarea,\n.qxs-answer-runtime .textarea-box {\n width: 100%;\n min-height: 100px;\n padding: 10px 12px;\n overflow: auto;\n font-size: 14px;\n line-height: 1.7;\n color: #1e1e1e;\n background: #f5f5f5;\n border: 0;\n border-radius: 5px;\n box-sizing: border-box;\n resize: vertical;\n white-space: pre-wrap;\n}\n\n.qxs-answer-runtime .font-num {\n position: absolute;\n right: 20px;\n bottom: 15px;\n font-size: 12px;\n color: #969696;\n}\n\n.qxs-answer-runtime input:focus,\n.qxs-answer-runtime textarea:focus {\n outline: none;\n border-color: #dcdfe6;\n}\n\n.blank_fill .question-input-box .input {\n padding: 0 0 0 10px;\n font-size: 14px;\n line-height: 20px;\n color: #1e1e1e;\n caret-color: #3d61e3;\n background: transparent;\n border: 0;\n border-bottom: 1px solid #f0f0f0;\n border-radius: 0;\n}\n\n.blank_fill .question-input-box .input:focus {\n border: 0;\n border-bottom: 1px solid #dcdfe6;\n}\n\n.table-scroll {\n width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n}\n\n.qxs-answer-runtime table {\n width: 100%;\n min-width: 100%;\n border-collapse: collapse;\n overflow: hidden;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n background: #f8fafc;\n}\n\n.qxs-answer-runtime th,\n.qxs-answer-runtime td {\n padding: 10px 12px;\n font-size: 12px;\n text-align: center;\n border-bottom: 1px solid #eef2f7;\n}\n\n.qxs-answer-runtime th:first-child,\n.qxs-answer-runtime td:first-child {\n text-align: left;\n}\n\n.qxs-answer-runtime thead th {\n color: #475467;\n font-weight: 500;\n background: #eef2ff;\n}\n\n.qxs-answer-runtime-scale__row-title {\n font-size: 13px;\n font-weight: 500;\n color: #1f2937;\n background: #f8fafc;\n}\n\n.answer-result-box {\n margin-top: 1px;\n padding: 0 10px;\n font-size: 12px;\n}\n\n.qxs-answer-runtime__result,\n.answer-result {\n padding: 15px;\n color: #303133;\n background: #fffbe4;\n}\n\n.answer-select {\n margin-right: 30px;\n font-weight: 700;\n}\n\n.answer-sorce,\n.qxs-answer-runtime__result-line.is-danger {\n color: #f56c6c;\n}\n\n.qxs-answer-runtime__result-line {\n display: block;\n font-size: 12px;\n line-height: 1.8;\n}\n\n.qxs-answer-runtime__result-line.is-success {\n color: #30c691;\n}\n\n.qxs-answer-runtime__result-line.is-muted {\n color: #6e6d6b;\n}\n\n.qxs-answer-runtime__relation-entry {\n margin: -2px 0 8px 0;\n}\n\n.qxs-answer-runtime__relation-action,\n.qxs-answer-runtime__discussion-action {\n padding: 0;\n font: inherit;\n color: #3d61e3;\n text-decoration: none;\n background: transparent;\n border: 0;\n cursor: pointer;\n}\n\n.footer,\n.qxs-answer-runtime__footer {\n margin-top: 9px;\n}\n\n.qxs-answer-runtime__discussion {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px 12px;\n min-height: 40px;\n padding: 0 10px;\n font-size: 14px;\n line-height: 40px;\n color: #5a5a5a;\n background: #f5f5f5;\n border-radius: 2px;\n}\n\n.qxs-answer-runtime__answer-relate {\n padding: 10px 0;\n}\n\n.qxs-answer-runtime__answer-relate-item {\n padding: 2px 0;\n font-size: 14px;\n line-height: 1.7;\n}\n\n.qxs-answer-runtime__answer-relate-item img {\n max-width: 100%;\n height: auto;\n}\n\n.qxs-answer-container.case-practice .qxs-answer-runtime {\n margin-bottom: 0;\n}\n\n.qxs-answer-container.case-practice .exam-title {\n padding-bottom: 10px;\n font-size: 14px;\n}\n\n.qxs-answer-container.case-practice .exam-answer-box,\n.qxs-answer-container.case-practice .exam-content-box {\n padding: 0;\n}\n\n.qxs-answer-container.case-practice .exam-answer.answer-item {\n width: 80%;\n padding: 8px 0;\n margin-top: 0;\n color: #0f0f0f;\n background: transparent;\n}\n\n.qxs-answer-container.case-practice .exam-answer.answer-item.is-selected,\n.qxs-answer-container.case-practice .exam-answer.answer-item.is-select {\n background: transparent;\n}\n\n.qxs-answer-container.case-practice .textarea-box {\n padding: 11px;\n background: #f7f7f7;\n border-radius: 0;\n}\n\n.qxs-answer-container.case-practice .font-num {\n right: 10px;\n bottom: 6px;\n}\n\n@media (max-width: 640px) {\n .qxs-answer-runtime {\n margin-bottom: 12px;\n }\n\n .exam-title,\n .qxs-answer-runtime__title {\n font-size: 15px;\n line-height: 1.75;\n }\n\n .exam-answer-box {\n margin-top: 10px;\n }\n\n .exam-answer,\n .qxs-answer-runtime__field {\n min-height: 44px;\n padding: 11px 12px;\n font-size: 14px;\n }\n\n .qxs-answer-runtime__blank-flow {\n gap: 10px 6px;\n }\n\n .question-input-box {\n min-height: 48px;\n }\n\n .placeholder-box {\n height: 48px;\n line-height: 48px;\n }\n\n .qxs-answer-runtime textarea,\n .qxs-answer-runtime .textarea-box {\n min-height: 112px;\n font-size: 15px;\n }\n\n .qxs-answer-runtime th,\n .qxs-answer-runtime td {\n min-width: 64px;\n padding: 10px 8px;\n }\n\n .qxs-answer-runtime__discussion {\n flex-wrap: wrap;\n align-items: center;\n padding: 8px 10px;\n line-height: 1.6;\n }\n\n .qxs-answer-container.case-practice .exam-answer.answer-item {\n width: 100%;\n }\n}\n";
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type AnswerThemeName = 'default' | 'case-practice';
|
|
2
|
+
export type LegacyExamType = 'single' | 'multiple' | 'blank_fill' | 'sort' | 'scale' | 'text_fill';
|
|
3
|
+
export interface LegacyAnswerContainerItem {
|
|
4
|
+
examId?: string | number;
|
|
5
|
+
examIndex?: string | number;
|
|
6
|
+
examTypeEnum?: LegacyExamType | string;
|
|
7
|
+
titleIndex?: number;
|
|
8
|
+
title?: string;
|
|
9
|
+
type?: boolean;
|
|
10
|
+
isShowProgress?: boolean;
|
|
11
|
+
showSingleRowScaleTitle?: boolean;
|
|
12
|
+
answers?: any[];
|
|
13
|
+
submitAnswer?: string | null;
|
|
14
|
+
leastAnswerCount?: string | number;
|
|
15
|
+
examAnswerResults?: any[] | string;
|
|
16
|
+
examExpand?: string;
|
|
17
|
+
pageIndex?: string | number | null;
|
|
18
|
+
scaleQuestionList?: any[];
|
|
19
|
+
customBinds?: Record<string, unknown>;
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
export interface AnswerSubmitError {
|
|
23
|
+
row: LegacyAnswerContainerItem;
|
|
24
|
+
message: string;
|
|
25
|
+
}
|
|
26
|
+
export interface AnswerContainerRelationDetail {
|
|
27
|
+
action: string;
|
|
28
|
+
answerItem: Record<string, unknown>;
|
|
29
|
+
row: LegacyAnswerContainerItem;
|
|
30
|
+
}
|
|
31
|
+
export interface AnswerContainerActionDetail {
|
|
32
|
+
action: string;
|
|
33
|
+
row: LegacyAnswerContainerItem;
|
|
34
|
+
}
|
|
35
|
+
export interface AnswerRowRelationExamAnswerRendererContext {
|
|
36
|
+
answerItem: Record<string, unknown>;
|
|
37
|
+
row: LegacyAnswerContainerItem;
|
|
38
|
+
handleChange: (next?: LegacyAnswerContainerItem | ((row: LegacyAnswerContainerItem) => LegacyAnswerContainerItem | void)) => void;
|
|
39
|
+
}
|
|
40
|
+
export type AnswerRowRelationExamAnswerRenderer = (context: AnswerRowRelationExamAnswerRendererContext) => unknown;
|
package/types/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import './entry-subject';
|
|
2
|
+
import './entry-answer-container';
|
|
2
3
|
import './entry-editor';
|
|
3
4
|
import './entry-icon';
|
|
4
5
|
import './entry-fixed-action-bar';
|
|
@@ -8,6 +9,7 @@ import './entry-image-upload';
|
|
|
8
9
|
import './entry-data-chart';
|
|
9
10
|
export * from './entry-editor';
|
|
10
11
|
export * from './entry-subject';
|
|
12
|
+
export * from './entry-answer-container';
|
|
11
13
|
export * from './entry-fixed-action-bar';
|
|
12
14
|
export * from './entry-photo-crop-tool';
|
|
13
15
|
export * from './entry-file-upload';
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { PlayerEventMap, PlayerOptions, PlayerSource } from './video-player.types';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
export declare class QxsVideoPlayer extends LitElement {
|
|
4
|
+
static properties: {
|
|
5
|
+
source: {
|
|
6
|
+
attribute: boolean;
|
|
7
|
+
};
|
|
8
|
+
options: {
|
|
9
|
+
attribute: boolean;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
source?: PlayerSource;
|
|
13
|
+
options: PlayerOptions;
|
|
14
|
+
private engine?;
|
|
15
|
+
private generation;
|
|
16
|
+
private applied?;
|
|
17
|
+
private lastPosition;
|
|
18
|
+
private blocked;
|
|
19
|
+
private cleanupFullscreen?;
|
|
20
|
+
private cleanupRateMenu?;
|
|
21
|
+
private fullscreenDisposed;
|
|
22
|
+
render(): import("lit").TemplateResult<1>;
|
|
23
|
+
protected updated(): void;
|
|
24
|
+
setSource(source: PlayerSource): Promise<void>;
|
|
25
|
+
play(): Promise<void>;
|
|
26
|
+
pause(): void;
|
|
27
|
+
seek(positionMs: number): void;
|
|
28
|
+
setRate(rate: number): void;
|
|
29
|
+
setMuted(muted: boolean): void;
|
|
30
|
+
setVolume(volume: number): void;
|
|
31
|
+
requestFullscreen(): Promise<void>;
|
|
32
|
+
exitFullscreen(): Promise<void>;
|
|
33
|
+
private isNativeFullscreen;
|
|
34
|
+
private runNativeFullscreen;
|
|
35
|
+
currentPositionMs(): number | null;
|
|
36
|
+
on<K extends keyof PlayerEventMap>(event: K, listener: (detail: PlayerEventMap[K]) => void): () => void;
|
|
37
|
+
private snapshot;
|
|
38
|
+
private emit;
|
|
39
|
+
private report;
|
|
40
|
+
private bindRateMenuDismissal;
|
|
41
|
+
private destroyEngine;
|
|
42
|
+
dispose(): void;
|
|
43
|
+
disconnectedCallback(): void;
|
|
44
|
+
}
|