@qxs-bns/components 0.0.92 → 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.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/es/answer-container/answer-container.mjs +65 -0
  3. package/es/answer-container/answer-container.mjs.map +1 -0
  4. package/es/answer-container/clone.mjs +2 -0
  5. package/es/answer-container/clone.mjs.map +1 -0
  6. package/es/answer-container/normalize.mjs +2 -0
  7. package/es/answer-container/normalize.mjs.map +1 -0
  8. package/es/answer-container/runtime-blank-fill.mjs +39 -0
  9. package/es/answer-container/runtime-blank-fill.mjs.map +1 -0
  10. package/es/answer-container/runtime-choice.mjs +38 -0
  11. package/es/answer-container/runtime-choice.mjs.map +1 -0
  12. package/es/answer-container/runtime-question-base.mjs +43 -0
  13. package/es/answer-container/runtime-question-base.mjs.map +1 -0
  14. package/es/answer-container/runtime-scale.mjs +36 -0
  15. package/es/answer-container/runtime-scale.mjs.map +1 -0
  16. package/es/answer-container/runtime-text-fill.mjs +19 -0
  17. package/es/answer-container/runtime-text-fill.mjs.map +1 -0
  18. package/es/answer-container/styles.mjs +468 -0
  19. package/es/answer-container/styles.mjs.map +1 -0
  20. package/es/entry-answer-container.mjs +2 -0
  21. package/es/entry-answer-container.mjs.map +1 -0
  22. package/es/entry-video-player.mjs +2 -0
  23. package/es/entry-video-player.mjs.map +1 -0
  24. package/es/index.mjs +1 -1
  25. package/es/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.mjs +2 -0
  26. 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
  27. package/es/video-player.mjs +3 -0
  28. package/es/video-player.mjs.map +1 -0
  29. package/es/video-player.theme.mjs +111 -0
  30. package/es/video-player.theme.mjs.map +1 -0
  31. package/lib/answer-container/answer-container.cjs +65 -0
  32. package/lib/answer-container/answer-container.cjs.map +1 -0
  33. package/lib/answer-container/clone.cjs +2 -0
  34. package/lib/answer-container/clone.cjs.map +1 -0
  35. package/lib/answer-container/normalize.cjs +2 -0
  36. package/lib/answer-container/normalize.cjs.map +1 -0
  37. package/lib/answer-container/runtime-blank-fill.cjs +39 -0
  38. package/lib/answer-container/runtime-blank-fill.cjs.map +1 -0
  39. package/lib/answer-container/runtime-choice.cjs +38 -0
  40. package/lib/answer-container/runtime-choice.cjs.map +1 -0
  41. package/lib/answer-container/runtime-question-base.cjs +43 -0
  42. package/lib/answer-container/runtime-question-base.cjs.map +1 -0
  43. package/lib/answer-container/runtime-scale.cjs +36 -0
  44. package/lib/answer-container/runtime-scale.cjs.map +1 -0
  45. package/lib/answer-container/runtime-text-fill.cjs +19 -0
  46. package/lib/answer-container/runtime-text-fill.cjs.map +1 -0
  47. package/lib/answer-container/styles.cjs +468 -0
  48. package/lib/answer-container/styles.cjs.map +1 -0
  49. package/lib/entry-answer-container.cjs +2 -0
  50. package/lib/entry-answer-container.cjs.map +1 -0
  51. package/lib/entry-video-player.cjs +2 -0
  52. package/lib/entry-video-player.cjs.map +1 -0
  53. package/lib/index.cjs +1 -1
  54. package/lib/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.cjs +2 -0
  55. 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
  56. package/lib/video-player.cjs +3 -0
  57. package/lib/video-player.cjs.map +1 -0
  58. package/lib/video-player.theme.cjs +111 -0
  59. package/lib/video-player.theme.cjs.map +1 -0
  60. package/package.json +14 -2
  61. package/types/answer-container/answer-container.d.ts +26 -0
  62. package/types/answer-container/clone.d.ts +1 -0
  63. package/types/answer-container/index.d.ts +12 -0
  64. package/types/answer-container/normalize.d.ts +3 -0
  65. package/types/answer-container/runtime-blank-fill.d.ts +35 -0
  66. package/types/answer-container/runtime-choice.d.ts +44 -0
  67. package/types/answer-container/runtime-question-base.d.ts +39 -0
  68. package/types/answer-container/runtime-scale.d.ts +36 -0
  69. package/types/answer-container/runtime-text-fill.d.ts +32 -0
  70. package/types/answer-container/styles.d.ts +1 -0
  71. package/types/answer-container/types.d.ts +40 -0
  72. package/types/entry-answer-container.d.ts +2 -0
  73. package/types/entry-video-player.d.ts +2 -0
  74. package/types/index.d.ts +2 -0
  75. package/types/video-player.d.ts +44 -0
  76. package/types/video-player.theme.d.ts +12 -0
  77. package/types/video-player.types.d.ts +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-player.mjs","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
+ const p=`
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"/>',o={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"/>')};export{o as videoPlayerIcons,p as videoPlayerTheme};
111
+ //# sourceMappingURL=video-player.theme.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-player.theme.mjs","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":"AACO,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"}
@@ -0,0 +1,65 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("lit"),n=require("lit/decorators.js"),p=require("../base/define.cjs"),d=require("../subject/shared-methods.cjs"),m=require("./normalize.cjs"),S=require("./styles.cjs");var c=Object.defineProperty,g=Object.getOwnPropertyDescriptor,i=(a,e,s,t)=>{for(var r=t>1?void 0:t?g(e,s):e,o=a.length-1,l;o>=0;o--)(l=a[o])&&(r=(t?l(e,s,r):l(r))||r);return t&&r&&c(e,s,r),r};function w(a){return`${a.examId??""}::${a.examIndex??""}`}function u(a){const e=a?.submitAnswer;return e!=null&&String(e).length>0}exports.QxsAnswerContainer=class extends h.LitElement{constructor(){super(...arguments),this.list=[],this.disabled=!1,this.type=!0,this.isShowCorrect=!1,this.isShowBg=!1,this.isShowProgress=!1,this.showSingleRowScaleTitle=!1,this.themeName="default",this.beforeChange=()=>!0,this.answerRowRelationExamAnswerRenderer=null,this._list=[],this._draftRowKeys=new Set}createRenderRoot(){return this}willUpdate(e){if(e.has("list")){const s=m.normalizeAnswerContainerList(this.list);this._list=s.map(t=>{const r=this._list.find(l=>w(l)===w(t));if(!r)return t;const o=w(t);return this._draftRowKeys.has(o)&&!u(t)&&u(r)?{...r,...t,submitAnswer:r.submitAnswer,submitAnswerObj:r.submitAnswerObj}:(this._draftRowKeys.has(o)&&u(t)&&this._draftRowKeys.delete(o),t)})}}addTitleNumber(e){return m.addTitleNumber(e)}reset(){this._draftRowKeys.clear(),this._list=m.normalizeAnswerContainerList(this._list.map(e=>({...e,submitAnswer:null})))}async onSubmit(){const e=Array.from(this.querySelectorAll("qxs-answer-runtime-choice, qxs-answer-runtime-blank-fill, qxs-answer-runtime-text-fill, qxs-answer-runtime-scale"));return Promise.all(e.map(s=>s.onSubmit()))}_onRowChange(e){this._draftRowKeys.delete(w(e)),this._list=this._list.map(s=>{const t=String(s.examId||"")===String(e.examId||""),r=String(s.examIndex||"")===String(e.examIndex||"");return t||r?{...s,...e}:s}),d.emitSubjectEvent(this,"on-change",e)}_onRowDraftChange(e){const s=w(e);this._draftRowKeys.add(s),this._list=this._list.map(t=>{const r=String(t.examId||"")===String(e.examId||""),o=String(t.examIndex||"")===String(e.examIndex||"");return r||o?{...t,...e}:t})}_renderItem(e){const s=e.examTypeEnum||"single";return s==="blank_fill"?h.html`
2
+ <qxs-answer-runtime-blank-fill
3
+ .item=${e}
4
+ .disabled=${this.disabled}
5
+ .type=${this.type}
6
+ .isShowCorrect=${this.isShowCorrect}
7
+ .isShowBg=${this.isShowBg}
8
+ .isShowProgress=${this.isShowProgress}
9
+ .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}
10
+ .themeName=${this.themeName}
11
+ .beforeChange=${this.beforeChange}
12
+ .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}
13
+ @runtime-input=${t=>this._onRowDraftChange(t.detail)}
14
+ @on-change=${t=>this._onRowChange(t.detail)}
15
+ ></qxs-answer-runtime-blank-fill>
16
+ `:s==="text_fill"?h.html`
17
+ <qxs-answer-runtime-text-fill
18
+ .item=${e}
19
+ .disabled=${this.disabled}
20
+ .type=${this.type}
21
+ .isShowCorrect=${this.isShowCorrect}
22
+ .isShowBg=${this.isShowBg}
23
+ .isShowProgress=${this.isShowProgress}
24
+ .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}
25
+ .themeName=${this.themeName}
26
+ .beforeChange=${this.beforeChange}
27
+ .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}
28
+ @runtime-input=${t=>this._onRowDraftChange(t.detail)}
29
+ @on-change=${t=>this._onRowChange(t.detail)}
30
+ ></qxs-answer-runtime-text-fill>
31
+ `:s==="scale"?h.html`
32
+ <qxs-answer-runtime-scale
33
+ .item=${e}
34
+ .disabled=${this.disabled}
35
+ .type=${this.type}
36
+ .isShowCorrect=${this.isShowCorrect}
37
+ .isShowBg=${this.isShowBg}
38
+ .isShowProgress=${this.isShowProgress}
39
+ .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}
40
+ .themeName=${this.themeName}
41
+ .beforeChange=${this.beforeChange}
42
+ .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}
43
+ @on-change=${t=>this._onRowChange(t.detail)}
44
+ ></qxs-answer-runtime-scale>
45
+ `:h.html`
46
+ <qxs-answer-runtime-choice
47
+ .item=${e}
48
+ .disabled=${this.disabled}
49
+ .type=${this.type}
50
+ .isShowCorrect=${this.isShowCorrect}
51
+ .isShowBg=${this.isShowBg}
52
+ .isShowProgress=${this.isShowProgress}
53
+ .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}
54
+ .themeName=${this.themeName}
55
+ .beforeChange=${this.beforeChange}
56
+ .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}
57
+ @on-change=${t=>this._onRowChange(t.detail)}
58
+ ></qxs-answer-runtime-choice>
59
+ `}render(){return h.html`
60
+ <style>${S.answerContainerStyles}</style>
61
+ <div class="qxs-answer-container ${this.themeName}">
62
+ ${this._list.map(e=>this._renderItem(e))}
63
+ </div>
64
+ `}};i([n.property({attribute:!1})],exports.QxsAnswerContainer.prototype,"list",2);i([n.property({type:Boolean})],exports.QxsAnswerContainer.prototype,"disabled",2);i([n.property({type:Boolean})],exports.QxsAnswerContainer.prototype,"type",2);i([n.property({type:Boolean,attribute:"is-show-correct"})],exports.QxsAnswerContainer.prototype,"isShowCorrect",2);i([n.property({type:Boolean,attribute:"is-show-bg"})],exports.QxsAnswerContainer.prototype,"isShowBg",2);i([n.property({type:Boolean,attribute:"is-show-progress"})],exports.QxsAnswerContainer.prototype,"isShowProgress",2);i([n.property({type:Boolean,attribute:"show-single-row-scale-title"})],exports.QxsAnswerContainer.prototype,"showSingleRowScaleTitle",2);i([n.property({type:String,attribute:"theme-name"})],exports.QxsAnswerContainer.prototype,"themeName",2);i([n.property({attribute:!1})],exports.QxsAnswerContainer.prototype,"beforeChange",2);i([n.property({attribute:!1})],exports.QxsAnswerContainer.prototype,"answerRowRelationExamAnswerRenderer",2);i([n.state()],exports.QxsAnswerContainer.prototype,"_list",2);exports.QxsAnswerContainer=i([p.safeCustomElement("qxs-answer-container")],exports.QxsAnswerContainer);
65
+ //# sourceMappingURL=answer-container.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-container.cjs","sources":["../../../../packages/components/src/answer-container/answer-container.ts"],"sourcesContent":["import { html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport { addTitleNumber, normalizeAnswerContainerList } from './normalize'\nimport { answerContainerStyles } from './styles'\nimport type { AnswerRowRelationExamAnswerRenderer, AnswerThemeName, LegacyAnswerContainerItem } from './types'\n\ntype RuntimeElement = HTMLElement & {\n item: LegacyAnswerContainerItem\n type?: boolean\n onSubmit: () => Promise<LegacyAnswerContainerItem>\n reset: () => void\n}\n\nfunction rowKeyOf(item: LegacyAnswerContainerItem) {\n return `${item.examId ?? ''}::${item.examIndex ?? ''}`\n}\n\nfunction hasMeaningfulSubmitAnswer(item: LegacyAnswerContainerItem | undefined) {\n const value = item?.submitAnswer\n return value != null && String(value).length > 0\n}\n\n@safeCustomElement('qxs-answer-container')\nexport class QxsAnswerContainer extends LitElement {\n createRenderRoot() {\n return this\n }\n\n @property({ attribute: false }) list: LegacyAnswerContainerItem[] | LegacyAnswerContainerItem | null = []\n @property({ type: Boolean }) disabled = false\n @property({ type: Boolean }) type = true\n @property({ type: Boolean, attribute: 'is-show-correct' }) isShowCorrect = false\n @property({ type: Boolean, attribute: 'is-show-bg' }) isShowBg = false\n @property({ type: Boolean, attribute: 'is-show-progress' }) isShowProgress = false\n @property({ type: Boolean, attribute: 'show-single-row-scale-title' }) showSingleRowScaleTitle = false\n @property({ type: String, attribute: 'theme-name' }) themeName: AnswerThemeName = 'default'\n @property({ attribute: false }) beforeChange: (row: LegacyAnswerContainerItem, answerItem?: any) => boolean = () => true\n @property({ attribute: false }) answerRowRelationExamAnswerRenderer: AnswerRowRelationExamAnswerRenderer | null = null\n\n @state() private _list: LegacyAnswerContainerItem[] = []\n private _draftRowKeys = new Set<string>()\n\n willUpdate(changed: Map<string, unknown>) {\n if (changed.has('list')) {\n const nextList = normalizeAnswerContainerList(this.list)\n this._list = nextList.map((nextItem) => {\n const currentItem = this._list.find(item => rowKeyOf(item) === rowKeyOf(nextItem))\n if (!currentItem) {\n return nextItem\n }\n\n const rowKey = rowKeyOf(nextItem)\n if (this._draftRowKeys.has(rowKey) && !hasMeaningfulSubmitAnswer(nextItem) && hasMeaningfulSubmitAnswer(currentItem)) {\n return {\n ...currentItem,\n ...nextItem,\n submitAnswer: currentItem.submitAnswer,\n submitAnswerObj: currentItem.submitAnswerObj,\n }\n }\n\n if (this._draftRowKeys.has(rowKey) && hasMeaningfulSubmitAnswer(nextItem)) {\n this._draftRowKeys.delete(rowKey)\n }\n\n return nextItem\n })\n }\n }\n\n addTitleNumber(list: LegacyAnswerContainerItem[]) {\n return addTitleNumber(list)\n }\n\n reset() {\n this._draftRowKeys.clear()\n this._list = normalizeAnswerContainerList(\n this._list.map(item => ({ ...item, submitAnswer: null })),\n )\n }\n\n async onSubmit() {\n const children = Array.from(this.querySelectorAll<RuntimeElement>(\n 'qxs-answer-runtime-choice, qxs-answer-runtime-blank-fill, qxs-answer-runtime-text-fill, qxs-answer-runtime-scale',\n ))\n return Promise.all(children.map(child => child.onSubmit()))\n }\n\n private _onRowChange(changedItem: LegacyAnswerContainerItem) {\n this._draftRowKeys.delete(rowKeyOf(changedItem))\n this._list = this._list.map((item) => {\n const sameExamId = String(item.examId || '') === String(changedItem.examId || '')\n const sameExamIndex = String(item.examIndex || '') === String(changedItem.examIndex || '')\n return sameExamId || sameExamIndex ? { ...item, ...changedItem } : item\n })\n\n emitSubjectEvent(this, 'on-change', changedItem)\n }\n\n private _onRowDraftChange(changedItem: LegacyAnswerContainerItem) {\n const rowKey = rowKeyOf(changedItem)\n this._draftRowKeys.add(rowKey)\n this._list = this._list.map((item) => {\n const sameExamId = String(item.examId || '') === String(changedItem.examId || '')\n const sameExamIndex = String(item.examIndex || '') === String(changedItem.examIndex || '')\n return sameExamId || sameExamIndex ? { ...item, ...changedItem } : item\n })\n }\n\n private _renderItem(item: LegacyAnswerContainerItem) {\n const examTypeEnum = item.examTypeEnum || 'single'\n\n if (examTypeEnum === 'blank_fill') {\n return html`\n <qxs-answer-runtime-blank-fill\n .item=${item}\n .disabled=${this.disabled}\n .type=${this.type}\n .isShowCorrect=${this.isShowCorrect}\n .isShowBg=${this.isShowBg}\n .isShowProgress=${this.isShowProgress}\n .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}\n .themeName=${this.themeName}\n .beforeChange=${this.beforeChange}\n .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}\n @runtime-input=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowDraftChange(event.detail)}\n @on-change=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowChange(event.detail)}\n ></qxs-answer-runtime-blank-fill>\n `\n }\n\n if (examTypeEnum === 'text_fill') {\n return html`\n <qxs-answer-runtime-text-fill\n .item=${item}\n .disabled=${this.disabled}\n .type=${this.type}\n .isShowCorrect=${this.isShowCorrect}\n .isShowBg=${this.isShowBg}\n .isShowProgress=${this.isShowProgress}\n .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}\n .themeName=${this.themeName}\n .beforeChange=${this.beforeChange}\n .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}\n @runtime-input=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowDraftChange(event.detail)}\n @on-change=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowChange(event.detail)}\n ></qxs-answer-runtime-text-fill>\n `\n }\n\n if (examTypeEnum === 'scale') {\n return html`\n <qxs-answer-runtime-scale\n .item=${item}\n .disabled=${this.disabled}\n .type=${this.type}\n .isShowCorrect=${this.isShowCorrect}\n .isShowBg=${this.isShowBg}\n .isShowProgress=${this.isShowProgress}\n .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}\n .themeName=${this.themeName}\n .beforeChange=${this.beforeChange}\n .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}\n @on-change=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowChange(event.detail)}\n ></qxs-answer-runtime-scale>\n `\n }\n\n return html`\n <qxs-answer-runtime-choice\n .item=${item}\n .disabled=${this.disabled}\n .type=${this.type}\n .isShowCorrect=${this.isShowCorrect}\n .isShowBg=${this.isShowBg}\n .isShowProgress=${this.isShowProgress}\n .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}\n .themeName=${this.themeName}\n .beforeChange=${this.beforeChange}\n .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}\n @on-change=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowChange(event.detail)}\n ></qxs-answer-runtime-choice>\n `\n }\n\n render() {\n return html`\n <style>${answerContainerStyles}</style>\n <div class=\"qxs-answer-container ${this.themeName}\">\n ${this._list.map(item => this._renderItem(item))}\n </div>\n `\n }\n}\n\nexport function register() {}\n"],"names":["rowKeyOf","item","hasMeaningfulSubmitAnswer","value","QxsAnswerContainer","LitElement","changed","nextList","normalizeAnswerContainerList","nextItem","currentItem","rowKey","list","addTitleNumber","children","child","changedItem","sameExamId","sameExamIndex","emitSubjectEvent","examTypeEnum","html","event","answerContainerStyles","__decorateClass","property","state","safeCustomElement"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function c(t,r){const n=[];r.set(t,n);for(const o of t)n.push(e(o,r));return n}function i(t,r){const n={};r.set(t,n);for(const o of Reflect.ownKeys(t))Object.getOwnPropertyDescriptor(t,o)?.enumerable&&(n[o]=e(t[o],r));return n}function e(t,r=new WeakMap){return t==null||typeof t!="object"?t:t instanceof Date?new Date(t.getTime()):r.has(t)?r.get(t):Array.isArray(t)?c(t,r):i(t,r)}exports.cloneAnswerValue=e;
2
+ //# sourceMappingURL=clone.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.cjs","sources":["../../../../packages/components/src/answer-container/clone.ts"],"sourcesContent":["function cloneArray(value: unknown[], seen: WeakMap<object, unknown>) {\n const output: unknown[] = []\n seen.set(value, output)\n for (const item of value) {\n output.push(cloneAnswerValue(item, seen))\n }\n return output\n}\n\nfunction cloneObject(value: Record<PropertyKey, unknown>, seen: WeakMap<object, unknown>) {\n const output: Record<PropertyKey, unknown> = {}\n seen.set(value, output)\n\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n if (!descriptor?.enumerable) {\n continue\n }\n output[key] = cloneAnswerValue(value[key], seen)\n }\n\n return output\n}\n\nexport function cloneAnswerValue<T>(value: T, seen = new WeakMap<object, unknown>()): T {\n if (value == null || typeof value !== 'object') {\n return value\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as T\n }\n\n if (seen.has(value as object)) {\n return seen.get(value as object) as T\n }\n\n if (Array.isArray(value)) {\n return cloneArray(value, seen) as T\n }\n\n return cloneObject(value as Record<PropertyKey, unknown>, seen) as T\n}\n"],"names":["cloneArray","value","seen","output","item","cloneAnswerValue","cloneObject","key"],"mappings":"gFAAA,SAASA,EAAWC,EAAkBC,EAAgC,CACpE,MAAMC,EAAoB,CAAA,EAC1BD,EAAK,IAAID,EAAOE,CAAM,EACtB,UAAWC,KAAQH,EACjBE,EAAO,KAAKE,EAAiBD,EAAMF,CAAI,CAAC,EAE1C,OAAOC,CACT,CAEA,SAASG,EAAYL,EAAqCC,EAAgC,CACxF,MAAMC,EAAuC,CAAA,EAC7CD,EAAK,IAAID,EAAOE,CAAM,EAEtB,UAAWI,KAAO,QAAQ,QAAQN,CAAK,EAClB,OAAO,yBAAyBA,EAAOM,CAAG,GAC5C,aAGjBJ,EAAOI,CAAG,EAAIF,EAAiBJ,EAAMM,CAAG,EAAGL,CAAI,GAGjD,OAAOC,CACT,CAEO,SAASE,EAAoBJ,EAAUC,EAAO,IAAI,QAA+B,CACtF,OAAID,GAAS,MAAQ,OAAOA,GAAU,SAC7BA,EAGLA,aAAiB,KACZ,IAAI,KAAKA,EAAM,SAAS,EAG7BC,EAAK,IAAID,CAAe,EACnBC,EAAK,IAAID,CAAe,EAG7B,MAAM,QAAQA,CAAK,EACdD,EAAWC,EAAOC,CAAI,EAGxBI,EAAYL,EAAuCC,CAAI,CAChE"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("./clone.cjs");function i(r){return u.cloneAnswerValue(r)}function s(r){const n=Number(r??0);return Number.isFinite(n)?n:0}function o(r){let n=0;return r.map(t=>{const e=i(t);return e.examTypeEnum&&(n+=1,e.titleIndex=e.titleIndex||n,e.answers=Array.isArray(e.answers)?e.answers:[]),e})}function l(r){const t=(Array.isArray(r)?r:r?[r]:[]).map(e=>i(e)).sort((e,a)=>s(e.examIndex)-s(a.examIndex));return o(t)}exports.addTitleNumber=o;exports.normalizeAnswerContainerList=l;
2
+ //# sourceMappingURL=normalize.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.cjs","sources":["../../../../packages/components/src/answer-container/normalize.ts"],"sourcesContent":["import type { LegacyAnswerContainerItem } from './types'\nimport { cloneAnswerValue } from './clone'\n\nfunction cloneItem<T>(value: T): T {\n return cloneAnswerValue(value)\n}\n\nfunction toNumber(value: unknown) {\n const num = Number(value ?? 0)\n return Number.isFinite(num) ? num : 0\n}\n\nexport function addTitleNumber(list: LegacyAnswerContainerItem[]): LegacyAnswerContainerItem[] {\n let currentTitleIndex = 0\n\n return list.map((item) => {\n const next = cloneItem(item)\n\n if (next.examTypeEnum) {\n currentTitleIndex += 1\n next.titleIndex = next.titleIndex || currentTitleIndex\n next.answers = Array.isArray(next.answers) ? next.answers : []\n }\n\n return next\n })\n}\n\nexport function normalizeAnswerContainerList(\n input: LegacyAnswerContainerItem[] | LegacyAnswerContainerItem | null | undefined,\n): LegacyAnswerContainerItem[] {\n const list = Array.isArray(input)\n ? input\n : input\n ? [input]\n : []\n\n const sorted = list\n .map(item => cloneItem(item))\n .sort((a, b) => toNumber(a.examIndex) - toNumber(b.examIndex))\n\n return addTitleNumber(sorted)\n}\n"],"names":["cloneItem","value","cloneAnswerValue","toNumber","num","addTitleNumber","list","currentTitleIndex","item","next","normalizeAnswerContainerList","input","sorted","a","b"],"mappings":"+GAGA,SAASA,EAAaC,EAAa,CACjC,OAAOC,EAAAA,iBAAiBD,CAAK,CAC/B,CAEA,SAASE,EAASF,EAAgB,CAChC,MAAMG,EAAM,OAAOH,GAAS,CAAC,EAC7B,OAAO,OAAO,SAASG,CAAG,EAAIA,EAAM,CACtC,CAEO,SAASC,EAAeC,EAAgE,CAC7F,IAAIC,EAAoB,EAExB,OAAOD,EAAK,IAAKE,GAAS,CACxB,MAAMC,EAAOT,EAAUQ,CAAI,EAE3B,OAAIC,EAAK,eACPF,GAAqB,EACrBE,EAAK,WAAaA,EAAK,YAAcF,EACrCE,EAAK,QAAU,MAAM,QAAQA,EAAK,OAAO,EAAIA,EAAK,QAAU,CAAA,GAGvDA,CACT,CAAC,CACH,CAEO,SAASC,EACdC,EAC6B,CAO7B,MAAMC,GANO,MAAM,QAAQD,CAAK,EAC5BA,EACAA,EACE,CAACA,CAAK,EACN,CAAA,GAGH,OAAYX,EAAUQ,CAAI,CAAC,EAC3B,KAAK,CAACK,EAAGC,IAAMX,EAASU,EAAE,SAAS,EAAIV,EAASW,EAAE,SAAS,CAAC,EAE/D,OAAOT,EAAeO,CAAM,CAC9B"}
@@ -0,0 +1,39 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("lit"),m=require("lit/decorators.js"),o=require("../base/define.cjs"),h=require("../subject/shared-methods.cjs"),_=require("./runtime-question-base.cjs");var c=Object.defineProperty,d=Object.getOwnPropertyDescriptor,u=(i,t,s,n)=>{for(var e=n>1?void 0:n?d(t,s):t,l=i.length-1,a;l>=0;l--)(a=i[l])&&(e=(n?a(t,s,e):a(e))||e);return n&&e&&c(t,s,e),e};const p="<filter></filter>";function v(i,t){return{row:i,message:t}}function w(i){const t=String(i.title||"").match(/<filter><\/filter>/g)?.length||0,s=Array.isArray(i.answers)?i.answers.length:0;return Math.max(t,s,1)}function b(i){return i.split(p)}exports.QxsAnswerRuntimeBlankFill=class extends _.AnswerRuntimeElement{constructor(){super(...arguments),this._values=[]}syncFromItem(){const t=w(this._item),s=String(this._item.submitAnswer||"").split(",");this._values=Array.from({length:t},(n,e)=>s[e]||"")}_setValue(t,s){this.disabled||!this.beforeChange(this._item,this._item)||(this._values=this._values.map((n,e)=>e===t?s:n),h.emitSubjectEvent(this,"runtime-input",{...this._item,submitAnswer:this._values.join(",")}))}_renderInput(t){const s=this._values[t]||"";return r.html`
2
+ <input
3
+ class="input mgn-l10"
4
+ .value=${s}
5
+ aria-label=${`第 ${t+1} 空`}
6
+ ?disabled=${this.disabled||!this.type}
7
+ @input=${n=>this._setValue(t,n.target.value)}
8
+ />
9
+ `}_renderTitleWithMasks(){const t=String(this._item.title||""),s=b(t);return s.length>1?r.html`
10
+ <span class="qxs-answer-runtime__blank-flow">
11
+ <span class="qxs-answer-runtime__blank-text">${this._item.titleIndex?`${this._item.titleIndex}. `:""}${s[0]||""}</span>
12
+ ${s.slice(1).map((e,l)=>r.html`
13
+ <span class="qxs-answer-runtime__blank-mask">
14
+ <span class="qxs-answer-runtime__blank-mask-index">${l+1}</span>
15
+ </span>
16
+ ${e?r.html`<span class="qxs-answer-runtime__blank-text">${e}</span>`:""}
17
+ `)}
18
+ </span>
19
+ `:null}_renderInputRows(){return r.html`
20
+ <div class="qxs-answer-runtime__answers">
21
+ ${this._values.map((t,s)=>r.html`
22
+ <div class="question-input-box">
23
+ <div class="placeholder-box">
24
+ <span class="required-span">*</span>
25
+ </div>
26
+ <div class="question-input-box__index">${s+1}.</div>
27
+ ${this._renderInput(s)}
28
+ </div>
29
+ `)}
30
+ </div>
31
+ `}_renderReview(){if(!this.disabled||!this.isShowCorrect)return null;const t=this.resultAnswersFromExamResults(),s=String(this._item.analysis||"").trim();return r.html`
32
+ <div class="qxs-answer-runtime__result">
33
+ ${t.length?t.map((n,e)=>r.html`
34
+ <div class="qxs-answer-runtime__result-line">填空${e+1}参考答案为:${n?.correctAnswer||""}</div>
35
+ `):r.html`<span class="qxs-answer-runtime__result-line is-success">本题暂无参考答案</span>`}
36
+ ${s?r.html`<div class="qxs-answer-runtime__result-line is-muted">答题解析:${s}</div>`:""}
37
+ </div>
38
+ `}async onSubmit(){if(!this._values.length||this._values.some(s=>!String(s||"").trim()))throw v(this._item,"请填写答案");const t=this._values.join(",");return{...this._item,submitAnswer:t,submitAnswerObj:{intVal:this._item.examId,stringVal:t}}}reset(){this.updateItem(this.cloneItem()),this.syncFromItem()}render(){const t=this._renderTitleWithMasks();return this.renderShell({shellClassName:"qxs-answer-runtime-blank-fill blank_fill",titleContent:this.renderTitleBlock(t||void 0),answerContent:this._renderInputRows(),resultContent:this._renderReview(),footerContent:this.renderCasePracticeFooter({...this._item,submitAnswer:this._values.join(",")})})}};u([m.state()],exports.QxsAnswerRuntimeBlankFill.prototype,"_values",2);exports.QxsAnswerRuntimeBlankFill=u([o.safeCustomElement("qxs-answer-runtime-blank-fill")],exports.QxsAnswerRuntimeBlankFill);
39
+ //# sourceMappingURL=runtime-blank-fill.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-blank-fill.cjs","sources":["../../../../packages/components/src/answer-container/runtime-blank-fill.ts"],"sourcesContent":["import { html } from 'lit'\nimport { state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport { AnswerRuntimeElement } from './runtime-question-base'\nimport type { AnswerSubmitError } from './types'\n\nconst FILTER_TOKEN = '<filter></filter>'\n\nfunction toError(row: any, message: string): AnswerSubmitError {\n return { row, message }\n}\n\nfunction blankCountFromItem(item: Record<string, any>) {\n const titleCount = String(item.title || '').match(/<filter><\\/filter>/g)?.length || 0\n const answerCount = Array.isArray(item.answers) ? item.answers.length : 0\n return Math.max(titleCount, answerCount, 1)\n}\n\nfunction splitFilterTitle(title: string) {\n return title.split(FILTER_TOKEN)\n}\n\n@safeCustomElement('qxs-answer-runtime-blank-fill')\nexport class QxsAnswerRuntimeBlankFill extends AnswerRuntimeElement {\n @state() private _values: string[] = []\n\n protected syncFromItem() {\n const count = blankCountFromItem(this._item)\n const current = String(this._item.submitAnswer || '').split(',')\n this._values = Array.from({ length: count }, (_, index) => current[index] || '')\n }\n\n private _setValue(index: number, value: string) {\n if (this.disabled || !this.beforeChange(this._item, this._item)) {\n return\n }\n this._values = this._values.map((current, currentIndex) => currentIndex === index ? value : current)\n emitSubjectEvent(this, 'runtime-input', {\n ...this._item,\n submitAnswer: this._values.join(','),\n })\n }\n\n private _renderInput(index: number) {\n const value = this._values[index] || ''\n return html`\n <input\n class=\"input mgn-l10\"\n .value=${value}\n aria-label=${`第 ${index + 1} 空`}\n ?disabled=${this.disabled || !this.type}\n @input=${(event: Event) => this._setValue(index, (event.target as HTMLInputElement).value)}\n />\n `\n }\n\n private _renderTitleWithMasks() {\n const title = String(this._item.title || '')\n const segments = splitFilterTitle(title)\n const hasFilter = segments.length > 1\n\n if (!hasFilter) {\n return null\n }\n\n return html`\n <span class=\"qxs-answer-runtime__blank-flow\">\n <span class=\"qxs-answer-runtime__blank-text\">${this._item.titleIndex ? `${this._item.titleIndex}. ` : ''}${segments[0] || ''}</span>\n ${segments.slice(1).map((segment, index) => html`\n <span class=\"qxs-answer-runtime__blank-mask\">\n <span class=\"qxs-answer-runtime__blank-mask-index\">${index + 1}</span>\n </span>\n ${segment ? html`<span class=\"qxs-answer-runtime__blank-text\">${segment}</span>` : ''}\n `)}\n </span>\n `\n }\n\n private _renderInputRows() {\n return html`\n <div class=\"qxs-answer-runtime__answers\">\n ${this._values.map((value, index) => html`\n <div class=\"question-input-box\">\n <div class=\"placeholder-box\">\n <span class=\"required-span\">*</span>\n </div>\n <div class=\"question-input-box__index\">${index + 1}.</div>\n ${this._renderInput(index)}\n </div>\n `)}\n </div>\n `\n }\n\n private _renderReview() {\n if (!this.disabled || !this.isShowCorrect) {\n return null\n }\n\n const results = this.resultAnswersFromExamResults()\n const analysis = String(this._item.analysis || '').trim()\n\n return html`\n <div class=\"qxs-answer-runtime__result\">\n ${results.length\n ? results.map((result: any, index: number) => html`\n <div class=\"qxs-answer-runtime__result-line\">填空${index + 1}参考答案为:${result?.correctAnswer || ''}</div>\n `)\n : html`<span class=\"qxs-answer-runtime__result-line is-success\">本题暂无参考答案</span>`}\n ${analysis ? html`<div class=\"qxs-answer-runtime__result-line is-muted\">答题解析:${analysis}</div>` : ''}\n </div>\n `\n }\n\n async onSubmit() {\n if (!this._values.length || this._values.some(item => !String(item || '').trim())) {\n throw toError(this._item, '请填写答案')\n }\n\n const submitAnswer = this._values.join(',')\n return {\n ...this._item,\n submitAnswer,\n submitAnswerObj: {\n intVal: this._item.examId,\n stringVal: submitAnswer,\n },\n }\n }\n\n reset() {\n this.updateItem(this.cloneItem())\n this.syncFromItem()\n }\n\n render() {\n const titleWithMasks = this._renderTitleWithMasks()\n\n return this.renderShell({\n shellClassName: 'qxs-answer-runtime-blank-fill blank_fill',\n titleContent: this.renderTitleBlock(titleWithMasks || undefined),\n answerContent: this._renderInputRows(),\n resultContent: this._renderReview(),\n footerContent: this.renderCasePracticeFooter({\n ...this._item,\n submitAnswer: this._values.join(','),\n }),\n })\n }\n}\n\nexport function register() {}\n"],"names":["FILTER_TOKEN","toError","row","message","blankCountFromItem","item","titleCount","answerCount","splitFilterTitle","title","QxsAnswerRuntimeBlankFill","AnswerRuntimeElement","count","current","_","index","value","currentIndex","emitSubjectEvent","html","event","segments","segment","results","analysis","result","submitAnswer","titleWithMasks","__decorateClass","state","safeCustomElement"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("lit"),l=require("lit/decorators.js"),_=require("../base/define.cjs"),d=require("../subject/shared-methods.cjs"),w=require("./runtime-question-base.cjs"),p=require("./clone.cjs");var x=Object.defineProperty,y=Object.getOwnPropertyDescriptor,c=(h,t,e,s)=>{for(var r=s>1?void 0:s?y(t,e):t,n=h.length-1,a;n>=0;n--)(a=h[n])&&(r=(s?a(t,e,r):a(r))||r);return s&&r&&x(t,e,r),r};function u(h,t){return{row:h,message:t}}exports.QxsAnswerRuntimeChoice=class extends w.AnswerRuntimeElement{constructor(){super(...arguments),this.examType="single",this._selectedIds=new Set,this._sortOrder=[]}syncFromItem(){this.examType=this._item.examTypeEnum||"single";const e=String(this._item.submitAnswer||"").split(",").map(s=>s.trim()).filter(Boolean);this._selectedIds=new Set(e),this._sortOrder=this.examType==="sort"?[...e]:[]}_isSelected(t){return this._selectedIds.has(this.answerIdOf(t))}_toggle(t){if(this.disabled||!this.beforeChange(this._item,t))return;const e=this.answerIdOf(t);if(e){if(this.examType==="single"){const s=this._selectedIds.has(e);this._selectedIds=s?new Set:new Set([e])}else if(this.examType==="multiple"){const s=new Set(this._selectedIds);s.has(e)?s.delete(e):s.add(e),this._selectedIds=s}else this._sortOrder.includes(e)?this._sortOrder=this._sortOrder.filter(s=>s!==e):this._sortOrder=[...this._sortOrder,e],this._selectedIds=new Set(this._sortOrder);d.emitSubjectEvent(this,"on-change",this._snapshotRow())}}_currentValue(){return this.examType==="sort"?this._sortOrder.join(","):Array.from(this._selectedIds).join(",")}_validate(){const t=this.examType==="sort"?this._sortOrder.length:this._selectedIds.size,e=Number(this._item.leastAnswerCount||0);if(e>0&&t<e){const s=this.examType==="multiple"?"多选题":"排序题";return u(this._item,`${s}至少选${e}项`)}return t<1?u(this._item,this.examType==="sort"?"请先完成答题":"请选择答案"):null}_selectedSummary(){const t=Array.isArray(this._item.answers)?this._item.answers:[];return(this.examType==="sort"?this._sortOrder:Array.from(this._selectedIds)).map(r=>{const n=t.findIndex(a=>this.answerIdOf(a)===r);return n>=0?this.answerLetter(n):""}).filter(Boolean).join("、")}_snapshotAnswers(){return(Array.isArray(this._item.answers)?this._item.answers:[]).map(e=>{const s=this.answerIdOf(e),r=this._sortOrder.indexOf(s)+1;return{...e,isSelect:this._selectedIds.has(s),sortNum:r>0?r:void 0}})}_snapshotRow(){return{...this._item,answers:this._snapshotAnswers(),submitAnswer:this._currentValue()}}_handleRendererChange(t){const e=p.cloneAnswerValue(this._snapshotRow()),s=typeof t=="function"?t(e)||e:t||e;this.updateItem(s),this.syncFromItem(),d.emitSubjectEvent(this,"on-change",this._snapshotRow())}_correctSummary(){const t=Array.isArray(this._item.answers)?this._item.answers:[],e=this.resultAnswersFromExamResults();return e.length?e.map(s=>{const r=t.findIndex(n=>this.answerIdOf(n)===String(s?.correctAnswer??""));return r>=0?this.answerLetter(r):""}).filter(Boolean).join("、"):t.map((s,r)=>s?.isCorrect?this.answerLetter(r):"").filter(Boolean).join("、")}_renderReview(){if(!this.disabled||!this.isShowCorrect)return null;const t=this._selectedSummary(),e=this._correctSummary(),s=String(this._item.analysis||"").trim();return i.html`
2
+ <div class="qxs-answer-runtime__result">
3
+ ${t?i.html`<span class="qxs-answer-runtime__result-line">已选答案:${t}</span>`:""}
4
+ ${e?i.html`<span class="qxs-answer-runtime__result-line is-danger">本题参考答案为:${e}</span>`:i.html`<span class="qxs-answer-runtime__result-line is-success">本题暂无参考答案</span>`}
5
+ ${s?i.html`<div class="qxs-answer-runtime__result-line is-muted">答题解析:${s}</div>`:""}
6
+ </div>
7
+ `}_renderRelationEntry(t){const e=this.answerIdOf(t),s=this._selectedIds.has(e);if(!t?.needRelationExamAnswer||!s)return i.nothing;const r=this._snapshotRow(),n=this._snapshotAnswers().find(o=>this.answerIdOf(o)===e)||t,a={answerItem:n,row:r,handleChange:o=>this._handleRendererChange(o)};return this.answerRowRelationExamAnswerRenderer?i.html`
8
+ <div class="qxs-answer-runtime__relation-entry">
9
+ ${this.answerRowRelationExamAnswerRenderer(a)}
10
+ </div>
11
+ `:i.html`
12
+ <button
13
+ type="button"
14
+ class="qxs-answer-runtime__relation-action"
15
+ @click=${()=>this.emitRelationExamAnswer("open",n,r)}
16
+ >
17
+ 查看关联题
18
+ </button>
19
+ `}async onSubmit(){const t=this._validate();if(t)throw t;const e=this._currentValue();return{...this._snapshotRow(),submitAnswer:e,submitAnswerObj:{intVal:this._item.examId,stringVal:e}}}reset(){this.updateItem(this.cloneItem()),this.syncFromItem()}render(){const t=Array.isArray(this._item.answers)?this._item.answers:[],e=this.examType==="single"?"radio":"checkbox";return this.renderShell({shellClassName:`qxs-answer-runtime-choice ${this.examType}`,answerContent:i.html`
20
+ <div class="qxs-answer-runtime__answers">
21
+ ${t.map((s,r)=>{const n=this.answerIdOf(s),a=this.answerLabel(s),o=this._isSelected(s),m=this._sortOrder.indexOf(n)+1;return i.html`
22
+ <label class="qxs-answer-runtime__choice exam-answer ${this.themeName==="case-practice"?"answer-item":""} ${o?"is-selected":""} ${this.isShowBg||this.themeName==="case-practice"?"has-background bgCol":""}">
23
+ <input
24
+ type=${e}
25
+ name=${String(this._item.examId||this._item.examIndex||"choice")}
26
+ .checked=${o}
27
+ ?disabled=${this.disabled}
28
+ @click=${()=>this._toggle(s)}
29
+ />
30
+ <span>${this.answerLetter(r)}.</span>
31
+ <span>${a}</span>
32
+ ${this.examType==="sort"&&m>0?i.html`<strong class="sort-num">${m}</strong>`:""}
33
+ </label>
34
+ ${this._renderRelationEntry(s)}
35
+ `})}
36
+ </div>
37
+ `,resultContent:this._renderReview(),footerContent:this.renderCasePracticeFooter(this._snapshotRow())})}};c([l.property({type:String,attribute:"exam-type"})],exports.QxsAnswerRuntimeChoice.prototype,"examType",2);c([l.state()],exports.QxsAnswerRuntimeChoice.prototype,"_selectedIds",2);c([l.state()],exports.QxsAnswerRuntimeChoice.prototype,"_sortOrder",2);exports.QxsAnswerRuntimeChoice=c([_.safeCustomElement("qxs-answer-runtime-choice")],exports.QxsAnswerRuntimeChoice);
38
+ //# sourceMappingURL=runtime-choice.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-choice.cjs","sources":["../../../../packages/components/src/answer-container/runtime-choice.ts"],"sourcesContent":["import { html, nothing } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport { AnswerRuntimeElement } from './runtime-question-base'\nimport type { AnswerSubmitError, LegacyExamType } from './types'\nimport { cloneAnswerValue } from './clone'\n\nfunction toError(row: any, message: string): AnswerSubmitError {\n return { row, message }\n}\n\n@safeCustomElement('qxs-answer-runtime-choice')\nexport class QxsAnswerRuntimeChoice extends AnswerRuntimeElement {\n @property({ type: String, attribute: 'exam-type' }) examType: LegacyExamType = 'single'\n\n @state() private _selectedIds = new Set<string>()\n @state() private _sortOrder: string[] = []\n\n protected syncFromItem() {\n this.examType = (this._item.examTypeEnum as LegacyExamType) || 'single'\n const submitAnswer = String(this._item.submitAnswer || '')\n const ids = submitAnswer.split(',').map(item => item.trim()).filter(Boolean)\n this._selectedIds = new Set(ids)\n this._sortOrder = this.examType === 'sort' ? [...ids] : []\n }\n\n private _isSelected(answer: any) {\n return this._selectedIds.has(this.answerIdOf(answer))\n }\n\n private _toggle(answer: any) {\n if (this.disabled || !this.beforeChange(this._item, answer)) {\n return\n }\n\n const id = this.answerIdOf(answer)\n if (!id) {\n return\n }\n\n if (this.examType === 'single') {\n const isSelected = this._selectedIds.has(id)\n this._selectedIds = isSelected ? new Set() : new Set([id])\n }\n else if (this.examType === 'multiple') {\n const next = new Set(this._selectedIds)\n if (next.has(id)) {\n next.delete(id)\n }\n else {\n next.add(id)\n }\n this._selectedIds = next\n }\n else {\n if (this._sortOrder.includes(id)) {\n this._sortOrder = this._sortOrder.filter(currentId => currentId !== id)\n }\n else {\n this._sortOrder = [...this._sortOrder, id]\n }\n this._selectedIds = new Set(this._sortOrder)\n }\n\n emitSubjectEvent(this, 'on-change', this._snapshotRow())\n }\n\n private _currentValue() {\n return this.examType === 'sort'\n ? this._sortOrder.join(',')\n : Array.from(this._selectedIds).join(',')\n }\n\n private _validate() {\n const count = this.examType === 'sort' ? this._sortOrder.length : this._selectedIds.size\n const least = Number(this._item.leastAnswerCount || 0)\n\n if (least > 0 && count < least) {\n const typeCopy = this.examType === 'multiple' ? '多选题' : '排序题'\n return toError(this._item, `${typeCopy}至少选${least}项`)\n }\n\n if (count < 1) {\n return toError(this._item, this.examType === 'sort' ? '请先完成答题' : '请选择答案')\n }\n\n return null\n }\n\n private _selectedSummary() {\n const answers = Array.isArray(this._item.answers) ? this._item.answers : []\n const ids = this.examType === 'sort' ? this._sortOrder : Array.from(this._selectedIds)\n const letters = ids\n .map((id) => {\n const index = answers.findIndex((answer: any) => this.answerIdOf(answer) === id)\n return index >= 0 ? this.answerLetter(index) : ''\n })\n .filter(Boolean)\n return letters.join('、')\n }\n\n private _snapshotAnswers() {\n const answers = Array.isArray(this._item.answers) ? this._item.answers : []\n return answers.map((answer: any) => {\n const id = this.answerIdOf(answer)\n const sortNum = this._sortOrder.indexOf(id) + 1\n return {\n ...answer,\n isSelect: this._selectedIds.has(id),\n sortNum: sortNum > 0 ? sortNum : undefined,\n }\n })\n }\n\n private _snapshotRow() {\n return {\n ...this._item,\n answers: this._snapshotAnswers(),\n submitAnswer: this._currentValue(),\n }\n }\n\n private _handleRendererChange(\n next?:\n | any\n | ((row: any) => any),\n ) {\n const current = cloneAnswerValue(this._snapshotRow())\n const updated = typeof next === 'function'\n ? next(current) || current\n : next || current\n this.updateItem(updated)\n this.syncFromItem()\n emitSubjectEvent(this, 'on-change', this._snapshotRow())\n }\n\n private _correctSummary() {\n const answers = Array.isArray(this._item.answers) ? this._item.answers : []\n const resultAnswers = this.resultAnswersFromExamResults()\n\n if (resultAnswers.length) {\n return resultAnswers\n .map((result: any) => {\n const index = answers.findIndex((answer: any) => this.answerIdOf(answer) === String(result?.correctAnswer ?? ''))\n return index >= 0 ? this.answerLetter(index) : ''\n })\n .filter(Boolean)\n .join('、')\n }\n\n return answers\n .map((answer: any, index: number) => answer?.isCorrect ? this.answerLetter(index) : '')\n .filter(Boolean)\n .join('、')\n }\n\n private _renderReview() {\n if (!this.disabled || !this.isShowCorrect) {\n return null\n }\n\n const selected = this._selectedSummary()\n const correct = this._correctSummary()\n const analysis = String(this._item.analysis || '').trim()\n\n return html`\n <div class=\"qxs-answer-runtime__result\">\n ${selected ? html`<span class=\"qxs-answer-runtime__result-line\">已选答案:${selected}</span>` : ''}\n ${correct\n ? html`<span class=\"qxs-answer-runtime__result-line is-danger\">本题参考答案为:${correct}</span>`\n : html`<span class=\"qxs-answer-runtime__result-line is-success\">本题暂无参考答案</span>`}\n ${analysis ? html`<div class=\"qxs-answer-runtime__result-line is-muted\">答题解析:${analysis}</div>` : ''}\n </div>\n `\n }\n\n private _renderRelationEntry(answer: any) {\n const answerId = this.answerIdOf(answer)\n const isSelected = this._selectedIds.has(answerId)\n\n if (!answer?.needRelationExamAnswer || !isSelected) {\n return nothing\n }\n\n const row = this._snapshotRow()\n const answerItem = this._snapshotAnswers().find((item: any) => this.answerIdOf(item) === answerId) || answer\n const context = {\n answerItem,\n row,\n handleChange: (next?: any) => this._handleRendererChange(next),\n }\n\n if (this.answerRowRelationExamAnswerRenderer) {\n return html`\n <div class=\"qxs-answer-runtime__relation-entry\">\n ${this.answerRowRelationExamAnswerRenderer(context)}\n </div>\n `\n }\n\n return html`\n <button\n type=\"button\"\n class=\"qxs-answer-runtime__relation-action\"\n @click=${() => this.emitRelationExamAnswer('open', answerItem, row)}\n >\n 查看关联题\n </button>\n `\n }\n\n async onSubmit() {\n const error = this._validate()\n if (error) {\n throw error\n }\n\n const submitAnswer = this._currentValue()\n return {\n ...this._snapshotRow(),\n submitAnswer,\n submitAnswerObj: {\n intVal: this._item.examId,\n stringVal: submitAnswer,\n },\n }\n }\n\n reset() {\n this.updateItem(this.cloneItem())\n this.syncFromItem()\n }\n\n render() {\n const answers = Array.isArray(this._item.answers) ? this._item.answers : []\n const inputType = this.examType === 'single' ? 'radio' : 'checkbox'\n\n return this.renderShell({\n shellClassName: `qxs-answer-runtime-choice ${this.examType}`,\n answerContent: html`\n <div class=\"qxs-answer-runtime__answers\">\n ${answers.map((answer: any, index: number) => {\n const id = this.answerIdOf(answer)\n const label = this.answerLabel(answer)\n const selected = this._isSelected(answer)\n const sortNumber = this._sortOrder.indexOf(id) + 1\n\n return html`\n <label class=\"qxs-answer-runtime__choice exam-answer ${this.themeName === 'case-practice' ? 'answer-item' : ''} ${selected ? 'is-selected' : ''} ${(this.isShowBg || this.themeName === 'case-practice') ? 'has-background bgCol' : ''}\">\n <input\n type=${inputType}\n name=${String(this._item.examId || this._item.examIndex || 'choice')}\n .checked=${selected}\n ?disabled=${this.disabled}\n @click=${() => this._toggle(answer)}\n />\n <span>${this.answerLetter(index)}.</span>\n <span>${label}</span>\n ${this.examType === 'sort' && sortNumber > 0 ? html`<strong class=\"sort-num\">${sortNumber}</strong>` : ''}\n </label>\n ${this._renderRelationEntry(answer)}\n `\n })}\n </div>\n `,\n resultContent: this._renderReview(),\n footerContent: this.renderCasePracticeFooter(this._snapshotRow()),\n })\n }\n}\n\nexport function register() {}\n"],"names":["toError","row","message","QxsAnswerRuntimeChoice","AnswerRuntimeElement","ids","item","answer","id","isSelected","next","currentId","emitSubjectEvent","count","least","typeCopy","answers","index","sortNum","current","cloneAnswerValue","updated","resultAnswers","result","selected","correct","analysis","html","answerId","nothing","answerItem","context","error","submitAnswer","inputType","label","sortNumber","__decorateClass","property","state","safeCustomElement"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("lit"),i=require("lit/decorators.js"),c=require("lit/directives/unsafe-html.js"),p=require("../subject/shared-methods.cjs"),d=require("./clone.cjs");var w=Object.defineProperty,o=(h,e,s,a)=>{for(var r=void 0,u=h.length-1,m;u>=0;u--)(m=h[u])&&(r=m(e,s,r)||r);return r&&w(e,s,r),r};class n extends t.LitElement{constructor(){super(...arguments),this.item={},this.disabled=!1,this.type=!0,this.isShowCorrect=!1,this.isShowBg=!1,this.isShowProgress=!1,this.showSingleRowScaleTitle=!1,this.themeName="default",this.beforeChange=()=>!0,this.answerRowRelationExamAnswerRenderer=null,this._item={}}createRenderRoot(){return this}cloneItem(){return d.cloneAnswerValue(this.item||{})}answerIdOf(e){return String(e?.examAnswerId??e?.answerId??e?.correctAnswer??"")}answerLabel(e){return e?.title||e?.answer||e?.correctAnswer||""}answerLetter(e){return String.fromCharCode(65+e)}titleText(){return`${this._item.titleIndex?`${this._item.titleIndex}. `:""}${this._item.title||""}`.trim()}resultAnswersFromExamResults(){return Array.isArray(this._item.examAnswerResults)?this._item.examAnswerResults:[]}updateItem(e){this._item=e}emitHandleAction(e,s){const a={action:e,row:s};p.emitSubjectEvent(this,"handleAction",a)}emitRelationExamAnswer(e,s,a){const r={action:e,answerItem:s,row:a};p.emitSubjectEvent(this,"relation-exam-answer",r)}renderTitleBlock(e){return t.html`
2
+ <div class="qxs-answer-runtime__heading">
3
+ ${this.isShowProgress&&this._item.examIndex!=null?t.html`<span class="qxs-answer-runtime__progress">第 ${this._item.examIndex} 题</span>`:t.nothing}
4
+ <div class="qxs-answer-runtime__title">${e??this.titleText()}</div>
5
+ </div>
6
+ `}renderShell(e){const{answerContent:s,resultContent:a=null,footerContent:r=null,shellClassName:u="",titleContent:m}=e;return t.html`
7
+ <div data-answer-runtime-row class="exam-body-box qxs-answer-runtime ${u} ${this.themeName}">
8
+ <div class="exam-content-box">
9
+ <div class="exam-title">
10
+ ${m??this.renderTitleBlock()}
11
+ </div>
12
+ <div class="exam-answer-box">
13
+ ${s}
14
+ </div>
15
+ </div>
16
+ ${a?t.html`<div class="answer-result-box">${a}</div>`:t.nothing}
17
+ ${r??t.nothing}
18
+ </div>
19
+ `}renderCasePracticeFooter(e){if(!(this.disabled&&this.themeName==="case-practice")||e?.isShowDiscussionInfo===!1)return t.nothing;const s=e?.answerTruePercent??null,r=s===null||s==="0.00%"?"没有人支持该观点":`有${s}人支持该观点`,u=e?.referenceCommentCount??0,m=(Array.isArray(e?.answers)?e.answers:[]).map(l=>l?.relationType==null||!l?.resultItem?null:{className:l?.resultClass||"",html:l?.relationType===1?l?.resultItem:""}).filter(Boolean);return t.html`
20
+ <div class="qxs-answer-runtime__footer">
21
+ <div class="qxs-answer-runtime__discussion">
22
+ <span>${r}</span>
23
+ <span>${u}人讨论</span>
24
+ <button
25
+ type="button"
26
+ class="qxs-answer-runtime__discussion-action"
27
+ @click=${()=>this.emitHandleAction("discussion",e)}
28
+ >
29
+ 参与讨论
30
+ </button>
31
+ </div>
32
+ ${m.length?t.html`
33
+ <div class="qxs-answer-runtime__answer-relate">
34
+ ${m.map(l=>t.html`
35
+ <div class="qxs-answer-runtime__answer-relate-item ${l.className}">
36
+ ${c.unsafeHTML(l.html)}
37
+ </div>
38
+ `)}
39
+ </div>
40
+ `:t.nothing}
41
+ </div>
42
+ `}willUpdate(e){e.has("item")&&(this.updateItem(this.cloneItem()),this.syncFromItem())}}o([i.property({attribute:!1})],n.prototype,"item");o([i.property({type:Boolean})],n.prototype,"disabled");o([i.property({type:Boolean})],n.prototype,"type");o([i.property({type:Boolean,attribute:"is-show-correct"})],n.prototype,"isShowCorrect");o([i.property({type:Boolean,attribute:"is-show-bg"})],n.prototype,"isShowBg");o([i.property({type:Boolean,attribute:"is-show-progress"})],n.prototype,"isShowProgress");o([i.property({type:Boolean,attribute:"show-single-row-scale-title"})],n.prototype,"showSingleRowScaleTitle");o([i.property({type:String,attribute:"theme-name"})],n.prototype,"themeName");o([i.property({attribute:!1})],n.prototype,"beforeChange");o([i.property({attribute:!1})],n.prototype,"answerRowRelationExamAnswerRenderer");o([i.state()],n.prototype,"_item");exports.AnswerRuntimeElement=n;
43
+ //# sourceMappingURL=runtime-question-base.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-question-base.cjs","sources":["../../../../packages/components/src/answer-container/runtime-question-base.ts"],"sourcesContent":["import { html, LitElement, nothing } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport type { AnswerThemeName, LegacyAnswerContainerItem } from './types'\nimport type { AnswerContainerActionDetail, AnswerContainerRelationDetail, AnswerRowRelationExamAnswerRenderer } from './types'\nimport { cloneAnswerValue } from './clone'\n\nexport abstract class AnswerRuntimeElement extends LitElement {\n createRenderRoot() {\n return this\n }\n\n @property({ attribute: false }) item: LegacyAnswerContainerItem = {}\n @property({ type: Boolean }) disabled = false\n @property({ type: Boolean }) type = true\n @property({ type: Boolean, attribute: 'is-show-correct' }) isShowCorrect = false\n @property({ type: Boolean, attribute: 'is-show-bg' }) isShowBg = false\n @property({ type: Boolean, attribute: 'is-show-progress' }) isShowProgress = false\n @property({ type: Boolean, attribute: 'show-single-row-scale-title' }) showSingleRowScaleTitle = false\n @property({ type: String, attribute: 'theme-name' }) themeName: AnswerThemeName = 'default'\n @property({ attribute: false }) beforeChange: (row: LegacyAnswerContainerItem, answerItem?: any) => boolean = () => true\n @property({ attribute: false }) answerRowRelationExamAnswerRenderer: AnswerRowRelationExamAnswerRenderer | null = null\n\n @state() protected _item: LegacyAnswerContainerItem = {}\n\n protected cloneItem() {\n return cloneAnswerValue(this.item || {})\n }\n\n protected answerIdOf(answer: any) {\n return String(answer?.examAnswerId ?? answer?.answerId ?? answer?.correctAnswer ?? '')\n }\n\n protected answerLabel(answer: any) {\n return answer?.title || answer?.answer || answer?.correctAnswer || ''\n }\n\n protected answerLetter(index: number) {\n return String.fromCharCode(65 + index)\n }\n\n protected titleText() {\n const prefix = this._item.titleIndex ? `${this._item.titleIndex}. ` : ''\n return `${prefix}${this._item.title || ''}`.trim()\n }\n\n protected resultAnswersFromExamResults() {\n if (Array.isArray(this._item.examAnswerResults)) {\n return this._item.examAnswerResults\n }\n return []\n }\n\n protected updateItem(next: LegacyAnswerContainerItem) {\n this._item = next\n }\n\n protected emitHandleAction(action: string, row: LegacyAnswerContainerItem) {\n const detail: AnswerContainerActionDetail = { action, row }\n emitSubjectEvent(this, 'handleAction', detail)\n }\n\n protected emitRelationExamAnswer(action: string, answerItem: Record<string, unknown>, row: LegacyAnswerContainerItem) {\n const detail: AnswerContainerRelationDetail = { action, answerItem, row }\n emitSubjectEvent(this, 'relation-exam-answer', detail)\n }\n\n protected renderTitleBlock(content?: unknown) {\n return html`\n <div class=\"qxs-answer-runtime__heading\">\n ${this.isShowProgress && this._item.examIndex != null\n ? html`<span class=\"qxs-answer-runtime__progress\">第 ${this._item.examIndex} 题</span>`\n : nothing}\n <div class=\"qxs-answer-runtime__title\">${content ?? this.titleText()}</div>\n </div>\n `\n }\n\n protected renderShell(options: {\n answerContent: unknown\n resultContent?: unknown | null\n footerContent?: unknown | null\n shellClassName?: string\n titleContent?: unknown\n }) {\n const {\n answerContent,\n resultContent = null,\n footerContent = null,\n shellClassName = '',\n titleContent,\n } = options\n\n return html`\n <div data-answer-runtime-row class=\"exam-body-box qxs-answer-runtime ${shellClassName} ${this.themeName}\">\n <div class=\"exam-content-box\">\n <div class=\"exam-title\">\n ${titleContent ?? this.renderTitleBlock()}\n </div>\n <div class=\"exam-answer-box\">\n ${answerContent}\n </div>\n </div>\n ${resultContent ? html`<div class=\"answer-result-box\">${resultContent}</div>` : nothing}\n ${footerContent ?? nothing}\n </div>\n `\n }\n\n protected renderCasePracticeFooter(row: LegacyAnswerContainerItem) {\n if (!(this.disabled && this.themeName === 'case-practice')) {\n return nothing\n }\n\n if (row?.isShowDiscussionInfo === false) {\n return nothing\n }\n\n const answerTruePercent = row?.answerTruePercent ?? null\n const hasNoSupport = answerTruePercent === null || answerTruePercent === '0.00%'\n const viewpointDescription = hasNoSupport ? '没有人支持该观点' : `有${answerTruePercent}人支持该观点`\n const referenceCommentCount = row?.referenceCommentCount ?? 0\n const answerRelate = (Array.isArray(row?.answers) ? row.answers : [])\n .map((item: any) => {\n if (item?.relationType == null || !item?.resultItem) {\n return null\n }\n\n return {\n className: item?.resultClass || '',\n html: item?.relationType === 1 ? item?.resultItem : '',\n }\n })\n .filter(Boolean) as Array<{ className: string, html: string }>\n\n return html`\n <div class=\"qxs-answer-runtime__footer\">\n <div class=\"qxs-answer-runtime__discussion\">\n <span>${viewpointDescription}</span>\n <span>${referenceCommentCount}人讨论</span>\n <button\n type=\"button\"\n class=\"qxs-answer-runtime__discussion-action\"\n @click=${() => this.emitHandleAction('discussion', row)}\n >\n 参与讨论\n </button>\n </div>\n ${answerRelate.length\n ? html`\n <div class=\"qxs-answer-runtime__answer-relate\">\n ${answerRelate.map((item) => html`\n <div class=\"qxs-answer-runtime__answer-relate-item ${item.className}\">\n ${unsafeHTML(item.html)}\n </div>\n `)}\n </div>\n `\n : nothing}\n </div>\n `\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (changed.has('item')) {\n this.updateItem(this.cloneItem())\n this.syncFromItem()\n }\n }\n\n protected abstract syncFromItem(): void\n\n abstract onSubmit(): Promise<LegacyAnswerContainerItem>\n\n abstract reset(): void\n}\n"],"names":["AnswerRuntimeElement","LitElement","cloneAnswerValue","answer","index","next","action","row","detail","emitSubjectEvent","answerItem","content","html","nothing","options","answerContent","resultContent","footerContent","shellClassName","titleContent","answerTruePercent","viewpointDescription","referenceCommentCount","answerRelate","item","unsafeHTML","changed","__decorateClass","property","state"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("lit"),h=require("lit/decorators.js"),u=require("../base/define.cjs"),c=require("../subject/shared-methods.cjs"),w=require("./runtime-question-base.cjs");var _=Object.defineProperty,d=Object.getOwnPropertyDescriptor,o=(a,e,s,t)=>{for(var r=t>1?void 0:t?d(e,s):e,m=a.length-1,n;m>=0;m--)(n=a[m])&&(r=(t?n(e,s,r):n(r))||r);return t&&r&&_(e,s,r),r};function p(a,e){return{row:a,message:e}}exports.QxsAnswerRuntimeScale=class extends w.AnswerRuntimeElement{constructor(){super(...arguments),this._rows=[]}syncFromItem(){const e=Array.isArray(this._item.scaleQuestionList)?this._item.scaleQuestionList:[],s=String(this._item.submitAnswer||"").split(",").filter(Boolean);this._rows=e.map((t,r)=>({name:typeof t=="string"?t:t?.name||"",examAnswerId:s[r]||t?.examAnswerId||""}))}_setValue(e,s){this.disabled||!this.beforeChange(this._item,this._rows[e])||(this._rows=this._rows.map((t,r)=>r===e?{...t,examAnswerId:s}:t),c.emitSubjectEvent(this,"on-change",{...this._item,submitAnswer:this._rows.map(t=>t.examAnswerId||"").join(",")}))}_renderReview(){if(!this.disabled||!this.isShowCorrect)return null;const e=String(this._item.analysis||"").trim();return i.html`
2
+ <div class="qxs-answer-runtime__result">
3
+ <span class="qxs-answer-runtime__result-line is-success">本题暂无参考答案</span>
4
+ ${e?i.html`<div class="qxs-answer-runtime__result-line is-muted">答题解析:${e}</div>`:""}
5
+ </div>
6
+ `}_showRowTitleColumn(){if(this.showSingleRowScaleTitle||this._rows.length!==1)return!0;const e=String(this._rows[0]?.name||"").trim(),s=String(this._item?.title||"").trim();return!(e&&s&&e===s)}async onSubmit(){if(this._rows.some(s=>!s.examAnswerId))throw p(this._item,"请先完成答题");const e=this._rows.map(s=>s.examAnswerId||"").join(",");return{...this._item,scaleQuestionList:this._rows.map(s=>({...s})),submitAnswer:e,submitAnswerObj:{intVal:this._item.examId,stringVal:e}}}reset(){this.updateItem(this.cloneItem()),this.syncFromItem()}render(){const e=Array.isArray(this._item.answers)?this._item.answers:[],s=this._showRowTitleColumn();return this.renderShell({shellClassName:"qxs-answer-runtime-scale scale",answerContent:i.html`
7
+ <div class="table-scroll">
8
+ <table>
9
+ <thead>
10
+ <tr>
11
+ ${s?i.html`<th>问题</th>`:""}
12
+ ${e.map(t=>i.html`<th>${this.answerLabel(t)}</th>`)}
13
+ </tr>
14
+ </thead>
15
+ <tbody>
16
+ ${this._rows.map((t,r)=>i.html`
17
+ <tr>
18
+ ${s?i.html`<td class="qxs-answer-runtime-scale__row-title">${t.name}</td>`:""}
19
+ ${e.map(m=>{const n=this.answerIdOf(m),l=`scale-${this._item.examId||"row"}-${r}`;return i.html`
20
+ <td>
21
+ <input
22
+ type="radio"
23
+ name=${l}
24
+ .checked=${String(t.examAnswerId||"")===n}
25
+ ?disabled=${this.disabled}
26
+ @click=${()=>this._setValue(r,n)}
27
+ />
28
+ </td>
29
+ `})}
30
+ </tr>
31
+ `)}
32
+ </tbody>
33
+ </table>
34
+ </div>
35
+ `,resultContent:this._renderReview(),footerContent:this.renderCasePracticeFooter({...this._item,scaleQuestionList:this._rows.map(t=>({...t})),submitAnswer:this._rows.map(t=>t.examAnswerId||"").join(",")})})}};o([h.state()],exports.QxsAnswerRuntimeScale.prototype,"_rows",2);exports.QxsAnswerRuntimeScale=o([u.safeCustomElement("qxs-answer-runtime-scale")],exports.QxsAnswerRuntimeScale);
36
+ //# sourceMappingURL=runtime-scale.cjs.map