{"version":3,"file":"single.mjs","sources":["../../../../packages/components-wc/src/subject/single.ts"],"sourcesContent":["import type { AnswerType } from './types'\nimport { css, html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { uid } from '../base/uid'\nimport { SUB_TEXT_EDITOR_TOOLBAR } from '../editor/toolbar'\nimport { buildSubjectPreviewTitle, buildSubjectSortingTitle, emitSubjectEvent, emitSubjectModelValue, getSubjectImageResources, getSubjectVideoResource, resolveSubjectCategoryLabel, showSubjectToast } from './shared-methods'\nimport { subjectControlResetStyles, subjectFormBaseStyles, subjectHostStyles, subjectPreviewBaseStyles, subjectTextareaStyles } from './shared-styles'\nimport { renderSortingCard, sortingCardStyles } from './sorting-card'\nimport { SubjectTypeLabel } from './types'\n\nexport interface SubjectErrorOptions {\n  message: string\n  code?: string\n  field?: string\n  row?: any\n}\n\nexport class SubjectError extends Error {\n  constructor(\n    message: string,\n    public code: string = 'VALIDATION_ERROR',\n    public field?: string,\n    public row?: any,\n  ) {\n    super(message)\n    this.name = 'SubjectError'\n  }\n\n  static from(options: SubjectErrorOptions): SubjectError {\n    return new SubjectError(options.message, options.code, options.field, options.row)\n  }\n}\n\ninterface Answer {\n  title: string\n  isCorrect: boolean\n  customAnswerId?: string\n  answerId?: string\n  resultItem?: string\n  orderIndex?: number\n  answerRelations?: any[]\n  relationType?: number | null\n}\n\ninterface SubjectSnapshot {\n  title: string\n  answers: Answer[]\n  analysis: string\n  leastAnswerCount: number | null\n  selectedTagList: TagItem[]\n  examExpand: string\n  showRichText: boolean\n  richText: string\n  orderList: string[]\n}\n\nconst iconPlus = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>`\nconst iconRemove = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>`\nconst iconArrow = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"/></svg>`\n\nfunction normalizeTitle(text: string) {\n  return text\n    .replace(/^\\d+\\.\\s*/, '')\n    .replace(/[\\s，,。.!！?？;；:：、'\"“”‘’()（）[\\]【】\\-_/\\\\]+/g, '')\n    .toLowerCase()\n}\n\nexport function trimText(value: unknown) {\n  return String(value ?? '').trim()\n}\n\nexport function trimCommaSeparatedText(value: unknown) {\n  return String(value ?? '')\n    .split(',')\n    .map(item => item.trim())\n    .filter(Boolean)\n    .join(',')\n}\n\n/**\n * 标签项 - 用于关联题目的标签信息\n * @typedef {object} TagItem\n * @property {string|number} tagId - 标签ID\n * @property {string} tagName - 标签名称\n * @property {KnowledgePointInfo[]} [knowledgePointInfos] - 关联的知识点的列表\n */\nexport interface TagItem {\n  tagId: string | number\n  tagName: string\n  knowledgePointInfos?: KnowledgePointInfo[]\n}\n\n/**\n * 知识点信息\n * @typedef {object} KnowledgePointInfo\n * @property {string|number} knowledgePointId - 知识点ID\n * @property {string} knowledgePointName - 知识点名称\n */\nexport interface KnowledgePointInfo {\n  knowledgePointId: string | number\n  knowledgePointName: string\n}\n\n/**\n * 分类选项\n * @typedef {object} Category\n * @property {string|number} categoryId - 分类ID\n * @property {string} title - 分类标题\n */\nexport interface Category {\n  categoryId: string | number\n  title: string\n}\n\n/**\n * 题库搜索结果项\n * @typedef {object} SearchResult\n * @property {string|number} id - 题目ID\n * @property {string} title - 题目标题\n * @property {string} value - 用于搜索框显示的值\n * @property {any} [key: string] - 其他扩展字段\n */\nexport interface SearchResult {\n  id: string | number\n  title: string\n  value: string\n  [key: string]: any\n}\n\n/**\n * 题目资源（图片或视频）\n * @typedef {object} Resource\n * @property {1|2} resourceType - 资源类型：1-图片, 2-视频\n * @property {object} resource - 资源详情\n * @property {string} [resource.url] - 资源URL\n * @property {string} [resource.middle] - 中等尺寸图片URL\n * @property {string} [resource.videoId] - 视频ID\n */\nexport interface Resource {\n  resourceType: 1 | 2\n  resource: {\n    url?: string\n    middle?: string\n    videoId?: string\n    [key: string]: any\n  }\n}\n\n@safeCustomElement('qxs-subject-single')\nexport class QxsSubjectSingle extends LitElement {\n  static styles = [sortingCardStyles, subjectHostStyles, subjectControlResetStyles, subjectPreviewBaseStyles, subjectFormBaseStyles, subjectTextareaStyles, css`\n    .preview-answer { display: flex; flex-direction: column; gap: 10px; margin-top: 18px; }\n    .preview-answer .radio { display: grid; grid-template-columns: auto auto minmax(0, 1fr); column-gap: 10px; row-gap: 3px; align-items: center; }\n    .preview-answer .order { color: #6b7280; font-size: 13px; font-weight: 600; }\n    .preview-answer .answer-main { min-width: 0; display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 8px; }\n    .preview-answer .answer-text { min-width: 0; font-size: 14px; line-height: 1.7; font-weight: 500; color: #303133; }\n    .preview-answer .answer-meta { grid-column: 3; display: flex; flex-wrap: wrap; gap: 8px; font-size: 12px; line-height: 1.6; color: #8b95a7; }\n    .preview-answer .correct { color: #3D61E3; font-weight: 600; }\n    .preview-answer .result-info { color: #8b95a7; }\n\n    .flex { display: flex; }\n    .flex-items-center { display: flex; align-items: center; }\n    .flex-items-start { display: flex; align-items: flex-start; }\n    .flex-justify-end { display: flex; justify-content: flex-end; }\n    .edit-actions {\n      display: flex;\n      justify-content: flex-end;\n      padding-left: 88px;\n    }\n    .edit-inline {\n      display: flex;\n      align-items: center;\n      flex-wrap: wrap;\n      gap: 8px 14px;\n      min-height: 32px;\n    }\n    .edit-note {\n      margin-top: 6px;\n      font-size: 12px;\n      line-height: 1.6;\n      color: #909399;\n    }\n\n    .answer-list { display: flex; flex-direction: column; gap: 10px; }\n    .answer-item {\n      display: flex;\n      align-items: center;\n      flex-wrap: wrap;\n      gap: 8px;\n      border-radius: 4px;\n    }\n    .answer-item .label {\n      min-width: 28px;\n      font-size: 13px;\n      font-weight: 600;\n      color: #6b7280;\n      letter-spacing: 0;\n    }\n    .answer-item .input { flex: 1; min-width: 240px; max-width: 380px; position: relative; display: block; }\n    .answer-item .input input {\n      height: 36px; padding: 0 56px 0 10px;\n      font-size: 13px; line-height: 32px;\n      border: 1px solid #dcdfe6; border-radius: 6px; width: 100%;\n      transition: border-color .2s; box-sizing: border-box;\n    }\n    .answer-item .input input:focus { border-color: #3D61E3; outline: none; }\n    .answer-item .input input:disabled { background: #f5f7fa; color: #c0c4cc; cursor: not-allowed; }\n    .answer-item .input .char-counter {\n      position: absolute; right: 8px; top: 50%; transform: translateY(-50%);\n      font-size: 12px; color: #909399; line-height: 1; pointer-events: none;\n    }\n\n    .answer-item .correct {\n      color: #909399;\n      cursor: pointer;\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      min-height: 20px;\n      white-space: nowrap;\n    }\n    .answer-item .correct:hover { color: #3D61E3; }\n    .answer-item .correct.is-correct { color: #67c23a; }\n    .answer-item .correct input {\n      width: 14px;\n      height: 14px;\n      margin: 0;\n      flex: 0 0 auto;\n      cursor: pointer;\n      accent-color: #3D61E3;\n    }\n    .answer-item .correct .correct-text {\n      display: inline-flex;\n      align-items: center;\n      line-height: 1.2;\n    }\n\n    .answer-item .icon {\n      margin-left: 6px; cursor: pointer; display: inline-flex;\n      align-items: center; justify-content: center;\n      width: 24px; height: 24px; border-radius: 4px;\n      border: 1px solid #dcdfe6; background: #fff; color: #909399;\n      transition: all 0.2s;\n    }\n    .answer-item .icon:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n    .answer-item .icon.disabled { color: #e4e7ed; border-color: #e4e7ed; cursor: not-allowed; }\n\n    .answer-item .link {\n      color: #3D61E3;\n      cursor: pointer;\n      font-size: 12px;\n      white-space: nowrap;\n    }\n    .answer-item .link:hover { color: #2D4CB8; }\n\n    .el-select {\n      width: 150px; height: 34px; border: 1px solid #dcdfe6; border-radius: 6px;\n      padding: 0 8px; font-size: 13px; background: #fff; appearance: none;\n      background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23c0c4cc' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\");\n      background-repeat: no-repeat; background-position: right 8px center;\n    }\n    .el-select:focus { border-color: #3D61E3; outline: none; }\n    .el-select:disabled { background: #f5f7fa; color: #c0c4cc; cursor: not-allowed; }\n\n    .sort-badge { font-weight: bold; color: #3D61E3; margin-left: 10px; }\n\n    .el-link { color: #3D61E3; cursor: pointer; font-size: 12px; background: none; border: none; padding: 0; margin: 0; font-family: inherit; }\n    .el-link:hover { color: #2D4CB8; }\n    .el-link.danger { color: #f56c6c; }\n\n    .value-text { font-size: 13px; color: #606266; white-space: pre-wrap; }\n    .muted-text { font-size: 12px; color: #909399; }\n\n    .search-wrap { position: relative; }\n    .search-dropdown {\n      position: absolute; z-index: 120; left: 0; right: 0; top: calc(100% + 4px);\n      background: #fff; border: 1px solid #e4e7ed; border-radius: 6px;\n      box-shadow: 0 8px 20px rgba(0,0,0,.12); overflow: hidden;\n    }\n    .search-item {\n      padding: 10px 12px; cursor: pointer; transition: background .2s;\n      font-size: 13px; color: #606266; line-height: 1.4;\n    }\n    .search-item:hover { background: #f5f7fa; color: #3D61E3; }\n    .search-empty { padding: 10px 12px; font-size: 12px; color: #909399; }\n\n    .tag-list { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-height: 32px; }\n    .tag-item {\n      display: inline-flex; align-items: center; gap: 4px;\n      padding: 4px 8px; font-size: 12px; line-height: 1;\n      color: #3D61E3; background: #ecf5ff; border: 1px solid #d9ecff; border-radius: 4px;\n    }\n    .tag-item .close { cursor: pointer; color: #909399; }\n    .tag-item .close:hover { color: #f56c6c; }\n    .tag-hint { font-size: 12px; color: #909399; }\n\n    .resource-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 8px; }\n    .resource-summary { font-size: 12px; color: #606266; }\n    .resource-thumbs { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 8px; }\n    .resource-thumb {\n      width: 72px; height: 72px; object-fit: cover; border-radius: 6px;\n      border: 1px solid #e4e7ed; cursor: pointer; background: #f5f7fa;\n    }\n    .resource-video {\n      display: inline-flex; align-items: center; justify-content: center;\n      min-width: 88px; height: 30px; padding: 0 10px; border: 1px solid #dcdfe6; border-radius: 4px;\n      color: #606266; background: #fff; cursor: pointer; font-size: 12px; transition: all .2s;\n    }\n    .resource-video:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n    .media-stage { display: flex; align-items: center; justify-content: center; min-height: 240px; }\n    .media-stage img, .media-stage video { max-width: 100%; max-height: 60vh; border-radius: 6px; }\n    .media-footer { display: flex; justify-content: space-between; align-items: center; gap: 8px; width: 100%; }\n    .media-footer .group { display: flex; gap: 8px; }\n\n    /* Multi-select with tags (Element Plus style) */\n    .multi-select-wrapper { position: relative; }\n    .multi-select {\n      width: 240px; min-height: 36px; border: 1px solid #dcdfe6; border-radius: 6px;\n      padding: 0 30px 0 8px; font-size: 13px; background: #fff; cursor: pointer;\n      display: flex; flex-wrap: nowrap; align-items: center; gap: 4px;\n      transition: border-color .2s; position: relative; overflow: hidden;\n    }\n    .multi-select:hover { border-color: #c0c4cc; }\n    .multi-select.focused { border-color: #3D61E3; }\n    .multi-select.disabled { background: #f5f7fa; cursor: not-allowed; }\n    .multi-select .placeholder { color: #c0c4cc; font-size: 13px; padding: 4px 0; }\n    .multi-select .arrow {\n      position: absolute; right: 8px; top: 50%; transform: translateY(-50%);\n      color: #c0c4cc; display: inline-flex; transition: transform .2s;\n    }\n    .multi-select.focused .arrow { transform: translateY(-50%) rotate(180deg); color: #3D61E3; }\n    .multi-select .tag {\n      display: inline-flex; align-items: center; gap: 2px;\n      background: #f0f2f5; border-radius: 3px; padding: 0 6px; height: 20px;\n      font-size: 12px; color: #606266; line-height: 20px;\n    }\n    .multi-select .tag .tag-close {\n      display: inline-flex; cursor: pointer; color: #909399; margin-left: 2px; line-height: 1;\n    }\n    .multi-select .tag .tag-close:hover { color: #3D61E3; }\n    .multi-select-dropdown {\n      position: absolute; z-index: 100; background: #fff; left: 0; top: 100%; margin-top: 4px;\n      border: 1px solid #e4e7ed; border-radius: 3px;\n      box-shadow: 0 4px 12px rgba(0,0,0,.12); min-width: 240px; max-height: 140px; overflow-y: auto;\n    }\n    .multi-select-option {\n      padding: 4px 12px; font-size: 13px; color: #606266; cursor: pointer;\n      transition: background .2s;\n    }\n    .multi-select-option:hover { background: #f5f7fa; }\n    .multi-select-option.selected { color: #3D61E3; font-weight: 500; }\n\n    @media (max-width: 720px) {\n      .edit-row,\n      .section-row {\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .edit-row > .label,\n      .section-row > .label {\n        min-width: 0;\n        padding-top: 0;\n      }\n\n      .edit-actions {\n        padding-left: 0;\n        justify-content: flex-start;\n      }\n\n      .answer-item .input {\n        min-width: 0;\n        max-width: none;\n        width: 100%;\n      }\n    }\n\n    .modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 9000; display: flex; align-items: center; justify-content: center; }\n    .modal { background: #fff; border-radius: 6px; width: 520px; max-width: 90vw; box-shadow: 0 12px 32px rgba(0,0,0,.12); display: flex; flex-direction: column; }\n    .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px 12px; border-bottom: 1px solid #e4e7ed; }\n    .modal-title { font-size: 14px; font-weight: 600; color: #303133; }\n    .modal-close { background: none; border: none; font-size: 18px; cursor: pointer; color: #909399; padding: 0; line-height: 1; }\n    .modal-close:hover { color: #3D61E3; }\n    .modal-body { padding: 20px; }\n    .modal-body textarea { min-height: 120px; }\n    .modal-footer { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 20px; border-top: 1px solid #e4e7ed; }\n    .modal-footer button { padding: 6px 16px; font-size: 12px; border-radius: 3px; cursor: pointer; border: 1px solid #dcdfe6; background: #fff; color: #606266; }\n    .modal-footer button:hover { color: #3D61E3; border-color: #a0cfff; }\n    .modal-footer button.primary { background: #3D61E3; border-color: #3D61E3; color: #fff; }\n    .modal-footer button.primary:hover { background: #2D4CB8; border-color: #2D4CB8; }\n    .correct-hint-dialog { width: 520px; max-width: min(90vw, 520px); }\n    .correct-hint-dialog .modal-header { padding: 18px 20px 14px; }\n    .correct-hint-dialog .modal-title { font-size: 16px; font-weight: 700; color: #303133; }\n    .correct-hint-dialog .modal-close { display: none; }\n    .correct-hint-dialog .modal-body {\n      padding: 32px 28px 20px;\n      font-size: 14px;\n      line-height: 1.8;\n      color: #303133;\n      text-align: center;\n    }\n    .correct-hint-copy { max-width: 420px; margin: 0 auto; }\n    .correct-hint-highlight { color: #4c6fff; }\n    .correct-hint-dialog .modal-footer {\n      justify-content: center;\n      gap: 12px;\n      padding: 0 28px 28px;\n      border-top: none;\n    }\n    .correct-hint-dialog .modal-footer button {\n      min-width: 120px;\n      height: 36px;\n      padding: 0 18px;\n      font-size: 14px;\n      border-radius: 4px;\n    }\n  `]\n\n  @property({ type: Number, attribute: 'order-index' }) 'order-index' = 0\n  @property({ type: String, attribute: 'subject-prefix' }) 'subject-prefix'?: string\n  @property({ type: Boolean, attribute: 'is-edit' }) 'is-edit' = false\n  @property({ type: Boolean, attribute: 'is-save' }) 'is-save' = false\n  @property({ type: Boolean, attribute: 'is-set' }) 'is-set' = false\n  @property({ type: Boolean, attribute: 'is-set-correct-answer' }) 'is-set-correct-answer' = false\n  @property({ type: Boolean, attribute: 'lock-answer-key' }) lockAnswerKey = false\n  @property({ type: Boolean, attribute: 'is-key' }) 'is-key' = false\n  @property({ type: Boolean, attribute: 'show-action' }) 'show-action' = true\n  @property({ type: Boolean, attribute: 'show-add' }) 'show-add' = true\n  @property({ type: Boolean, attribute: 'hide-add-rich-text' }) 'hide-add-rich-text' = false\n  @property({ type: Boolean, attribute: 'show-rich-text' }) 'show-rich-text' = false\n  @property({ type: Boolean, attribute: 'show-delete-action' }) 'show-delete-action' = true\n  @property({ type: Boolean, attribute: 'show-save-action' }) 'show-save-action' = true\n  @property({ type: Boolean, reflect: true }) sorting = false\n  @property({ type: Boolean, attribute: 'show-answer-setting' }) 'show-answer-setting' = false\n  @property({ type: Boolean, attribute: 'show-key' }) 'show-key' = false\n  @property({ type: Boolean, attribute: 'show-analysis' }) 'show-analysis' = false\n  @property({ attribute: 'question-type', reflect: true }) type: AnswerType = 'single'\n  @property({ type: Number, attribute: 'answer-check-type' }) 'answer-check-type' = 1\n  @property({ type: Number, attribute: 'exam-answer-relation-type' }) 'exam-answer-relation-type' = 0\n  @property({ type: String, attribute: 'rich-text-content' }) 'rich-text-content' = ''\n  @property({ type: String }) analysis = ''\n  @property({ type: Number, attribute: 'least-answer-count' }) 'least-answer-count': number | null = null\n  @property({ type: String, attribute: 'exam-expand' }) 'exam-expand' = ''\n  @property({ type: String, attribute: 'custom-id' }) 'custom-id' = ''\n  @property({ type: Number, attribute: 'exam-id' }) 'exam-id' = 0\n  @property({ type: String, attribute: 'category-id' }) 'category-id' = ''\n  @property({ type: Object, attribute: 'upload-image' }) 'upload-image': (file: File) => Promise<string> = async (file: File) => {\n    return new Promise((resolve, reject) => {\n      const reader = new FileReader()\n      reader.onload = e => resolve(e.target?.result as string)\n      reader.onerror = reject\n      reader.readAsDataURL(file)\n    })\n  }\n\n  @property({ type: Array, attribute: 'answer-list' })\n  get 'answer-list'() { return this._answers }\n\n  set 'answer-list'(v: any) {\n    // 编辑模式下不接受外部更新，避免覆盖用户正在编辑的内容\n    if (this['is-edit']) {\n      return\n    }\n    const arr = Array.isArray(v) ? v : []\n    this._answers = arr.length\n      ? arr.map((a: any) => this._normalizeAnswerItem(a))\n      : [\n          { title: '', isCorrect: false }, { title: '', isCorrect: false },\n          { title: '', isCorrect: false }, { title: '', isCorrect: false },\n        ]\n    this.requestUpdate('answer-list')\n  }\n\n  // ============ 业务接口 Props ============\n  /**\n   * 标签列表 - 用于关联题目的标签信息\n   * @type {TagItem[]}\n   * @description 业务系统传入已选择的标签列表\n   */\n  @property({ type: Array, attribute: 'tag-list' }) 'tag-list': TagItem[] = []\n  /**\n   * 分类列表 - 可用于题目的分类选项\n   * @type {Category[]}\n   * @description 业务系统传入可选的分类列表\n   */\n  @property({ type: Array, attribute: 'category-list' }) 'category-list': Category[] = []\n  /**\n   * AI 推荐答案 - AI 根据题目内容推荐的答案\n   * @type {string}\n   * @description AI 返回的推荐答案，格式如 \"1. 选项A\\n2. 选项B\"\n   */\n  @property({ type: String, attribute: 'ai-answer' }) 'ai-answer' = ''\n  /**\n   * 图片/视频资源列表 - 题目附带的媒体资源\n   * @type {Resource[]}\n   * @description 题目附带图片或视频资源\n   */\n  @property({ type: Array, attribute: 'resource-list' }) 'resource-list': Resource[] = []\n  /**\n   * 是否显示标签功能\n   * @type {boolean}\n   * @default false\n   * @description 业务功能开关，控制是否显示标签选择 UI\n   */\n  @property({ type: Boolean, attribute: 'show-tag' }) 'show-tag' = false\n  /**\n   * 是否显示分类功能\n   * @type {boolean}\n   * @default false\n   * @description 业务功能开关，控制是否显示分类选择 UI\n   */\n  @property({ type: Boolean, attribute: 'show-category' }) 'show-category' = false\n  /**\n   * 是否显示 AI 推荐功能\n   * @type {boolean}\n   * @default false\n   * @description 业务功能开关，控制是否显示 AI 推荐答案 UI\n   */\n  @property({ type: Boolean, attribute: 'show-ai' }) 'show-ai' = false\n  /**\n   * 是否显示资源功能\n   * @type {boolean}\n   * @default false\n   * @description 业务功能开关，控制是否显示图片/视频资源 UI\n   */\n  @property({ type: Boolean, attribute: 'show-resource' }) 'show-resource' = false\n  /**\n   * 是否显示跳题功能\n   * @type {boolean}\n   * @default false\n   * @description 业务功能开关，控制是否显示跳题逻辑设置入口\n   */\n  @property({ type: Boolean, attribute: 'show-jump' }) 'show-jump' = false\n  /**\n   * 跳题状态 - 是否已设置跳题逻辑\n   * @type {boolean}\n   * @default false\n   * @description 标记当前题目是否已设置跳题逻辑\n   */\n  @property({ type: Boolean, attribute: 'has-jump' }) 'has-jump' = false\n  /**\n   * 题库搜索接口地址\n   * @type {string}\n   * @description 题库模糊搜索接口地址，用于题库搜索功能\n   */\n  @property({ type: String, attribute: 'search-api' }) 'search-api' = ''\n  /**\n   * 题库搜索回调函数\n   * @type {Function}\n   * @param {string} query - 搜索关键词\n   * @param {number} answerType - 题目类型：0-单选, 1-多选\n   * @returns {Promise<SearchResult[]>} 搜索结果列表\n   * @description 题库搜索的回调函数，由业务系统实现搜索逻辑\n   */\n  @property({ type: Object, attribute: 'search-handler' }) 'search-handler'?: (query: string, answerType: number) => Promise<SearchResult[]>\n\n  // 双向绑定支持\n  @property({ type: String, attribute: 'model-value' }) 'model-value' = ''\n  @property({ type: Boolean, attribute: 'use-model' }) 'use-model' = false\n\n  @state() private _answers: Answer[] = [\n    { title: '', isCorrect: false }, { title: '', isCorrect: false },\n    { title: '', isCorrect: false }, { title: '', isCorrect: false },\n  ]\n\n  @property({ type: String }) title = ''\n\n  @state() private _title = ''\n  @state() private _analysis = ''\n  @state() private _richText = ''\n  @state() private _showRichText = false\n  @state() private _leastAnswerCount: number | null = null\n  @state() private _answerCheckType = 1\n  @state() private _isKey = false\n  @state() private _orderList: string[] = []\n  @state() private _selectedTagList: TagItem[] = []\n  @state() private _categoryId = ''\n  @state() private _searchResults: SearchResult[] = []\n  @state() private _searchOpen = false\n  @state() private _searchLoading = false\n  @state() private _sortDropdownOpen = false\n  @state() private _imageViewerOpen = false\n  @state() private _imageViewerIndex = 0\n  @state() private _videoViewerOpen = false\n  @state() private _correctHintDialogOpen = false\n  @state() private _hasShownCorrectHint = false\n  @state() private _changeTypeDialogOpen = false\n\n  private _searchTimer: number | null = null\n  private _searchToken = 0\n\n  private readonly TITLE_MAX = 200\n  private readonly ANSWER_MAX = 100\n\n  connectedCallback() {\n    super.connectedCallback()\n    document.addEventListener('click', this._handleDocumentClick)\n    this._syncExternalProps()\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback()\n    document.removeEventListener('click', this._handleDocumentClick)\n    if (this._searchTimer) {\n      window.clearTimeout(this._searchTimer)\n      this._searchTimer = null\n    }\n  }\n\n  private _handleDocumentClick = (e: MouseEvent) => {\n    const path = e.composedPath()\n    const wrapper = this.shadowRoot?.querySelector('.multi-select-wrapper')\n    const searchWrap = this.shadowRoot?.querySelector('.search-wrap')\n    if (wrapper && !path.includes(wrapper)) {\n      this._sortDropdownOpen = false\n    }\n    if (searchWrap && !path.includes(searchWrap)) {\n      this._searchOpen = false\n    }\n    this.requestUpdate()\n  }\n\n  willUpdate(changed: Map<string, unknown>) {\n    if (changed.has('is-edit') && this['is-edit']) { this._syncProps() }\n    if (!this['is-edit'] && (changed.has('title') || changed.has('answer-list') || changed.has('analysis') || changed.has('least-answer-count') || changed.has('answer-check-type') || changed.has('tag-list') || changed.has('category-id') || changed.has('rich-text-content'))) {\n      this._syncExternalProps()\n    }\n    if (changed.has('is-key')) {\n      this._isKey = this['is-key']\n    }\n    if (changed.has('tag-list')) {\n      this._selectedTagList = Array.isArray(this['tag-list']) ? this['tag-list'].map(item => ({ ...item })) : []\n    }\n    if (changed.has('category-id')) {\n      this._categoryId = this['category-id'] ? String(this['category-id']) : ''\n    }\n    if (changed.has('exam-expand') || changed.has('answer-list')) { this._syncExamExpand() }\n    if (changed.has('model-value') && this['use-model']) {\n      this._title = this['model-value']\n    }\n  }\n\n  private _supportsLeastAnswerCount(answerType: AnswerType = this.type) {\n    return answerType === 'multiple' || answerType === 'sort'\n  }\n\n  private _normalizeLeastAnswerCount(value: unknown, answerType: AnswerType = this.type): number | null {\n    if (!this._supportsLeastAnswerCount(answerType) || value === '' || value === null || value === undefined) {\n      return null\n    }\n    const count = Number(value)\n    return Number.isFinite(count) && count > 0 ? count : null\n  }\n\n  private _leastAnswerCountSuffix(value: number | null, answerType: AnswerType = this.type) {\n    if (!this._supportsLeastAnswerCount(answerType) || value === null) {\n      return ''\n    }\n    return `，至少选${value}项${answerType === 'sort' ? '并排序' : ''}`\n  }\n\n  private _normalizeAnswerItem(answer: any): Answer {\n    const next: Answer = {\n      ...answer,\n      title: trimText(answer?.title ?? answer?.answer ?? ''),\n      isCorrect: !!answer?.isCorrect,\n    }\n    const answerId = answer?.answerId ?? answer?.examAnswerId\n    if (answerId !== undefined) {\n      next.answerId = answerId\n    }\n    return next\n  }\n\n  private _syncExternalProps() {\n    this._title = this.title || ''\n    this._analysis = this.analysis || ''\n    this._leastAnswerCount = this._normalizeLeastAnswerCount(this['least-answer-count'])\n    this._answerCheckType = this['answer-check-type'] || 1\n    this._isKey = this['is-key']\n    this._selectedTagList = Array.isArray(this['tag-list']) ? this['tag-list'].map(item => ({ ...item })) : []\n    this._categoryId = this['category-id'] ? String(this['category-id']) : ''\n    this._richText = this['rich-text-content'] || ''\n    this._showRichText = !!this['rich-text-content']\n    if (this['answer-list']?.length) {\n      this._answers = this['answer-list'].map((a: any) => this._normalizeAnswerItem(a))\n    }\n  }\n\n  private _syncProps() {\n    this._title = (this as any).title || ''\n    this._analysis = this.analysis || ''\n    this._leastAnswerCount = this._normalizeLeastAnswerCount(this['least-answer-count'])\n    this._answerCheckType = this['answer-check-type'] || 1\n    this._isKey = this['is-key']\n    this._selectedTagList = Array.isArray(this['tag-list']) ? this['tag-list'].map(item => ({ ...item })) : []\n    this._categoryId = this['category-id'] ? String(this['category-id']) : ''\n    this._richText = this['rich-text-content'] || ''\n    this._showRichText = !!this['rich-text-content']\n    if (this['answer-list']?.length) {\n      this._answers = this['answer-list'].map((a: any) => this._normalizeAnswerItem(a))\n    }\n    this._syncExamExpand()\n  }\n\n  private _syncExamExpand() {\n    if (!this['exam-expand'] || !this['answer-list']?.length) { return }\n    const ids = this['exam-expand'].split(',')\n    const answers = this['answer-list'] as any[]\n    this._orderList = ids.map((id) => {\n      const index = answers.findIndex((answer, answerIndex) =>\n        String(answer.answerId ?? answer.orderIndex ?? (answerIndex + 1)) === String(id),\n      )\n      return index >= 0 ? this._label(index) : ''\n    }).filter(Boolean)\n  }\n\n  private _emit(name: string, detail?: unknown) {\n    emitSubjectEvent(this, name, detail)\n  }\n\n  private _searchAnswerType() {\n    if (this.type === 'single') { return 0 }\n    if (this.type === 'multiple') { return 1 }\n    return 5\n  }\n\n  private _queueSearch(query: string) {\n    if (this._searchTimer) {\n      window.clearTimeout(this._searchTimer)\n      this._searchTimer = null\n    }\n    const keyword = query.trim()\n    if (!keyword || (!this['search-api'] && typeof this['search-handler'] !== 'function')) {\n      this._searchResults = []\n      this._searchOpen = false\n      this._searchLoading = false\n      return\n    }\n    this._searchTimer = window.setTimeout(() => {\n      void this._runSearch(keyword)\n    }, 300)\n  }\n\n  private async _runSearch(query: string) {\n    const currentToken = ++this._searchToken\n    this._searchLoading = true\n    this._searchOpen = true\n    this.requestUpdate()\n    try {\n      let result: SearchResult[] = []\n      if (typeof this['search-handler'] === 'function') {\n        result = await this['search-handler'](query, this._searchAnswerType())\n      }\n      else if (this['search-api']) {\n        const params = new URLSearchParams({\n          searchKey: query,\n          answerType: String(this._searchAnswerType()),\n        })\n        const response = await fetch(`${this['search-api']}${this['search-api'].includes('?') ? '&' : '?'}${params.toString()}`)\n        if (!response.ok) {\n          throw new Error(`HTTP ${response.status}`)\n        }\n        const payload = await response.json()\n        const list = Array.isArray(payload) ? payload : Array.isArray(payload?.data) ? payload.data : []\n        result = list.map((item: any) => ({\n          ...item,\n          value: item?.value || item?.title || '',\n        }))\n      }\n      if (currentToken !== this._searchToken) { return }\n      this._searchResults = Array.isArray(result) ? result : []\n    }\n    catch (error: any) {\n      if (currentToken !== this._searchToken) { return }\n      this._searchResults = []\n      showSubjectToast(error?.message || '题库搜索失败')\n    }\n    finally {\n      if (currentToken === this._searchToken) {\n        this._searchLoading = false\n        this.requestUpdate()\n      }\n    }\n  }\n\n  private _selectSearchResult(item: SearchResult) {\n    const selectedTitle = item.value || item.title || ''\n    this._title = selectedTitle\n    this._searchResults = []\n    this._searchOpen = false\n    if (this['use-model']) {\n      emitSubjectModelValue(this, this._title)\n    }\n    this._emit('title-select', {\n      ...item,\n      id: item.id ?? item.examId ?? item.questionId,\n      title: item.title || selectedTitle,\n      value: selectedTitle,\n      customId: this['custom-id'] || '',\n    })\n  }\n\n  private _applyAiAnswer() {\n    if (!this['ai-answer']?.trim()) {\n      showSubjectToast('暂无 AI 推荐答案')\n      return\n    }\n    const aiTitles = this['ai-answer']\n      .split(/\\r?\\n/)\n      .map(line => normalizeTitle(line))\n      .filter(Boolean)\n    let matched = 0\n    if (this.type === 'single') {\n      let selected = false\n      this._answers = this._answers.map((answer) => {\n        const shouldSelect = !selected && aiTitles.includes(normalizeTitle(answer.title || ''))\n        if (shouldSelect) {\n          selected = true\n          matched++\n        }\n        return { ...answer, isCorrect: shouldSelect }\n      })\n    }\n    else {\n      this._answers = this._answers.map((answer) => {\n        const shouldSelect = aiTitles.includes(normalizeTitle(answer.title || ''))\n        if (shouldSelect) { matched++ }\n        return { ...answer, isCorrect: shouldSelect }\n      })\n    }\n    if (!matched) {\n      showSubjectToast('未找到匹配的选项，请检查选项内容是否一致')\n      return\n    }\n    this.requestUpdate()\n  }\n\n  private _onCategoryChange(value: string) {\n    this._categoryId = value\n    this._emit('category-change', {\n      value,\n      customId: this['custom-id'] || '',\n      examId: this['exam-id'] || 0,\n    })\n  }\n\n  private _setRelation(item: Answer, answerIndex: number) {\n    const answer = item.customAnswerId\n      ? { ...item }\n      : { ...item, customAnswerId: item.answerId || uid() }\n    this._answers = this._answers.map((current, index) => index === answerIndex ? answer : current)\n    this.requestUpdate()\n    this._emit('set-relation', {\n      customId: this['custom-id'] || '',\n      examId: this['exam-id'] || 0,\n      answerIndex,\n      answer,\n    })\n  }\n\n  private _relationLength(relations: any[] = []) {\n    return relations.reduce((count, item) => count + (Array.isArray(item?.relationAnswers) ? item.relationAnswers.length : 0), 0)\n  }\n\n  private _emitEditResultItem(item: Answer, answerIndex: number) {\n    this._emit('edit-result-item', {\n      customId: this['custom-id'] || '',\n      examId: this['exam-id'] || 0,\n      answerIndex,\n      answer: { ...item },\n      resultItem: item.resultItem || '',\n    })\n  }\n\n  private _resultSlotName(index: number) {\n    return `business-result-item-${index}`\n  }\n\n  private _imageResources() {\n    return getSubjectImageResources(this['resource-list'] || [])\n  }\n\n  private _videoResource() {\n    return getSubjectVideoResource(this['resource-list'] || [])\n  }\n\n  private _openImageViewer(index = 0) {\n    if (!this._imageResources().length) { return }\n    this._imageViewerIndex = index\n    this._imageViewerOpen = true\n  }\n\n  private _closeImageViewer() {\n    this._imageViewerOpen = false\n  }\n\n  private _moveImage(step: number) {\n    const images = this._imageResources()\n    if (!images.length) { return }\n    this._imageViewerIndex = (this._imageViewerIndex + step + images.length) % images.length\n  }\n\n  private _openVideoViewer() {\n    if (!this._videoResource()?.url) { return }\n    this._videoViewerOpen = true\n  }\n\n  private _closeVideoViewer() {\n    this._videoViewerOpen = false\n  }\n\n  private _label(i: number) { return String.fromCharCode(65 + i) }\n\n  private get _titlePlaceholder() {\n    return this.type === 'single' ? '单选题' : this.type === 'multiple' ? '多选题' : '排序题'\n  }\n\n  private _setCorrect(item: Answer, val: boolean) {\n    if (this.lockAnswerKey) { return }\n    if (this.type === 'single') {\n      this._answers = this._answers.map(answer => ({\n        ...answer,\n        isCorrect: answer === item ? val : (val ? false : !!answer.isCorrect),\n      }))\n    }\n    else {\n      this._answers = this._answers.map(answer => answer === item\n        ? { ...answer, isCorrect: val }\n        : answer)\n    }\n    this.requestUpdate()\n  }\n\n  private _onTitleInput(e: Event) {\n    const el = e.target as HTMLTextAreaElement\n    if (el.value.length > this.TITLE_MAX) { el.value = el.value.slice(0, this.TITLE_MAX) }\n    this._title = el.value\n    this._queueSearch(this._title)\n    // 双向绑定：通知外部更新\n    if (this['use-model']) {\n      emitSubjectModelValue(this, this._title)\n    }\n  }\n\n  private _onAnswerInput(e: Event, idx: number) {\n    const el = e.target as HTMLInputElement\n    if (el.value.length > this.ANSWER_MAX) { el.value = el.value.slice(0, this.ANSWER_MAX) }\n    this._answers[idx].title = el.value\n    this.requestUpdate()\n  }\n\n  private _addAnswer(index: number) {\n    const arr = [...this._answers]\n    arr.splice(index + 1, 0, { title: '', isCorrect: false, customAnswerId: uid() })\n    this._answers = arr\n  }\n\n  private _deleteAnswer(index: number) {\n    if (this._answers.length < 3) { return }\n    this._answers = this._answers.filter((_, i) => i !== index)\n  }\n\n  private _toggleSortItem(letter: string) {\n    const idx = this._orderList.indexOf(letter)\n    if (idx >= 0) {\n      this._orderList = this._orderList.filter(l => l !== letter)\n    }\n    else {\n      this._orderList = [...this._orderList, letter]\n    }\n    this.requestUpdate()\n  }\n\n  private _removeSortItem(letter: string) {\n    this._orderList = this._orderList.filter(l => l !== letter)\n    this.requestUpdate()\n  }\n\n  private _getSortOrder(index: number): number | null {\n    const pos = this._orderList.indexOf(this._label(index))\n    return pos >= 0 ? pos + 1 : null\n  }\n\n  private _sortAnswerValue(letter: string) {\n    const index = letter.charCodeAt(0) - 65\n    const answer = this._answers[index] as any\n    return answer?.answerId ?? index + 1\n  }\n\n  private _rowMeta() {\n    return {\n      customId: this['custom-id'] || undefined,\n      answerType: this.type,\n      orderIndex: this['order-index'],\n    }\n  }\n\n  private _collectSnapshot(): SubjectSnapshot {\n    const answers = (this['is-edit'] ? this._answers : this['answer-list'] || []).map((answer: any) => ({\n      ...answer,\n      title: trimText(answer?.title ?? answer?.answer ?? ''),\n      isCorrect: !!answer?.isCorrect,\n      resultItem: trimText(answer?.resultItem ?? ''),\n    }))\n    const orderList = this['is-edit']\n      ? [...this._orderList]\n      : (() => {\n          const expand = this['exam-expand']\n          if (!expand) { return [] }\n          return expand.split(',').map((id: string) => {\n            const index = (this['answer-list'] as any[])?.findIndex((answer, answerIndex) =>\n              String(answer.answerId ?? answer.orderIndex ?? (answerIndex + 1)) === String(id),\n            )\n            return index >= 0 ? this._label(index) : ''\n          }).filter(Boolean)\n        })()\n    return {\n      title: trimText(this['is-edit'] ? this._title : (this as any).title || ''),\n      answers,\n      analysis: trimText(this['is-edit'] ? this._analysis : this.analysis || ''),\n      leastAnswerCount: this['is-edit']\n        ? this._leastAnswerCount\n        : this._normalizeLeastAnswerCount(this['least-answer-count']),\n      selectedTagList: Array.isArray(this._selectedTagList) ? [...this._selectedTagList] : [],\n      examExpand: this['is-edit']\n        ? orderList.map((letter: string) => this._sortAnswerValue(letter)).join(',')\n        : (this['exam-expand'] || ''),\n      showRichText: this['is-edit'] ? this._showRichText : !!this['rich-text-content'],\n      richText: this['is-edit'] ? this._richText : this['rich-text-content'] || '',\n      orderList,\n    }\n  }\n\n  private _validateSnapshot(snapshot: SubjectSnapshot, answerType: AnswerType = this.type) {\n    const row = this._rowMeta()\n    const errors: SubjectError[] = []\n\n    if (!snapshot.title) {\n      errors.push(new SubjectError('题目标题不能为空!', 'EMPTY_TITLE', 'title', row))\n    }\n    let isSetCorrectAnswer = false\n    let correctAnswerCount = 0\n\n    snapshot.answers.forEach((answer, index) => {\n      if (!answer.title?.trim()) {\n        errors.push(new SubjectError(`选项${String.fromCharCode(65 + index)}未填写`, 'ANSWER_EMPTY', 'answers', row))\n      }\n      if (answerType !== 'sort' && answer.isCorrect) {\n        isSetCorrectAnswer = true\n        correctAnswerCount++\n      }\n    })\n\n    const titleSet = new Set(snapshot.answers.map(answer => answer.title))\n    if (titleSet.size !== snapshot.answers.length && snapshot.answers.length > 0) {\n      errors.push(new SubjectError('选项不能重复', 'DUPLICATE_ANSWERS', 'answers', row))\n    }\n\n    if (answerType === 'single' && correctAnswerCount > 1) {\n      errors.push(new SubjectError(\n        '此题为单选题，设置了多个推荐/正确选项，请保存时确认是否切换为多选题',\n        'SINGLE_MULTI_CORRECT',\n        'answers',\n        row,\n      ))\n    }\n\n    if (answerType === 'multiple') {\n      if (correctAnswerCount === 1) {\n        errors.push(new SubjectError('请设置至少两个推荐/正确选项', 'CORRECT_COUNT_INVALID', 'answers', row))\n      }\n      if (correctAnswerCount > 0) {\n        isSetCorrectAnswer = true\n      }\n      if (isSetCorrectAnswer && snapshot.leastAnswerCount !== null && correctAnswerCount < snapshot.leastAnswerCount) {\n        errors.push(new SubjectError('至少选几项与推荐/正确选项数不符', 'LEAST_ANSWER_COUNT_INVALID', 'answers', row))\n      }\n    }\n\n    if (answerType === 'sort') {\n      isSetCorrectAnswer = snapshot.orderList.length > 0\n      if (snapshot.leastAnswerCount !== null && snapshot.orderList.length < snapshot.leastAnswerCount) {\n        errors.push(new SubjectError('至少选几项与推荐/正确选项数不符', 'LEAST_ANSWER_COUNT_INVALID', 'orderList', row))\n      }\n    }\n\n    return {\n      errors,\n      isSetCorrectAnswer,\n      correctAnswerCount,\n    }\n  }\n\n  private _serialize(answerType: AnswerType = this.type) {\n    const snapshot = this._collectSnapshot()\n    const { errors, isSetCorrectAnswer } = this._validateSnapshot(snapshot, answerType)\n    if (errors.length) {\n      throw errors[0]\n    }\n    const result: any = {\n      answerType: String(answerType),\n      examTypeEnum: String(answerType),\n      title: snapshot.title,\n      answers: snapshot.answers.map((answer, index) => {\n        const relationType = answer.resultItem\n          ? 1\n          : (Array.isArray(answer.answerRelations) && answer.answerRelations.length ? 2 : null)\n        const next: any = { ...answer, orderIndex: index + 1, answer: answer.title, relationType }\n        if (answer.answerId !== undefined) {\n          next.examAnswerId = answer.answerId\n        }\n        if (relationType === null) {\n          delete next.relationType\n        }\n        return next\n      }),\n      examExpand: snapshot.examExpand,\n      analysis: snapshot.analysis,\n      isSetCorrectAnswer,\n      examRichTextContent: snapshot.showRichText ? snapshot.richText : '',\n    }\n    if (this['exam-answer-relation-type']) {\n      result.examAnswerRelationType = this['exam-answer-relation-type']\n    }\n    if (this._supportsLeastAnswerCount(answerType)) {\n      result.leastAnswerCount = snapshot.leastAnswerCount\n    }\n    if (this['custom-id']) { result.customId = this['custom-id'] }\n    return result\n  }\n\n  private _shouldShowCorrectHint() {\n    if (this.type === 'sort') {\n      return !this._orderList.length\n    }\n    return !this._answers.some(answer => !!answer.isCorrect)\n  }\n\n  private async _finalizeSave() {\n    try {\n      const data = await this.toJSON()\n      this._emit('save', data)\n    }\n    catch (err: any) {\n      showSubjectToast(err.message)\n    }\n  }\n\n  async toJSON(): Promise<any> {\n    return Promise.resolve(this._serialize())\n  }\n\n  validate(): SubjectError[] {\n    return this._validateSnapshot(this._collectSnapshot()).errors\n  }\n\n  setResultItem(answerIndex: number, resultItem: string) {\n    if (answerIndex < 0 || answerIndex >= this._answers.length) {\n      return\n    }\n    this._answers = this._answers.map((answer, index) => index === answerIndex\n      ? { ...answer, resultItem: resultItem || '' }\n      : answer)\n    this.requestUpdate()\n  }\n\n  setAnswerRelation(customAnswerId: string, answerRelations: any) {\n    if (!customAnswerId) {\n      return\n    }\n    this._answers = this._answers.map((answer) => {\n      const currentId = String(answer.customAnswerId ?? answer.answerId ?? '')\n      return currentId === String(customAnswerId)\n        ? { ...answer, answerRelations }\n        : answer\n    })\n    this.requestUpdate()\n  }\n\n  private _renderCorrectHintDialog() {\n    if (!this._correctHintDialogOpen) { return '' }\n    return html`\n      <div class=\"modal-backdrop\" @click=${() => { this._correctHintDialogOpen = false }}>\n        <div class=\"modal correct-hint-dialog\" @click=${(e: Event) => e.stopPropagation()}>\n          <div class=\"modal-header\">\n            <span class=\"modal-title\">温馨提示</span>\n          </div>\n          <div class=\"modal-body\">\n            <div class=\"correct-hint-copy\">\n              为了收集更全面、有价值的数据，建议您为问卷每题设定<span class=\"correct-hint-highlight\">推荐/正确选项</span>。这将助力深入分析，让调研结果更精准、有意义。\n            </div>\n          </div>\n          <div class=\"modal-footer\">\n            <button @click=${async () => {\n              this._hasShownCorrectHint = true\n              this._correctHintDialogOpen = false\n              await this._finalizeSave()\n            }}>完成编辑</button>\n            <button class=\"primary\" @click=${() => { this._correctHintDialogOpen = false }}>去设置</button>\n          </div>\n        </div>\n      </div>\n    `\n  }\n\n  private _renderChangeTypeDialog() {\n    if (!this._changeTypeDialogOpen) { return '' }\n    return html`\n      <div class=\"modal-backdrop\" @click=${() => { this._changeTypeDialogOpen = false }}>\n        <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n          <div class=\"modal-header\">\n            <span class=\"modal-title\">提示</span>\n            <button class=\"modal-close\" @click=${() => { this._changeTypeDialogOpen = false }}>&#x2715;</button>\n          </div>\n          <div class=\"modal-body\">\n            <div class=\"value-text\">此题为单选题，设置了多个推荐/正确选项，是否切换成多选题？</div>\n          </div>\n          <div class=\"modal-footer\">\n            <button @click=${() => { this._changeTypeDialogOpen = false }}>取消</button>\n            <button class=\"primary\" @click=${() => {\n              try {\n                const data = this._serialize('multiple')\n                this._changeTypeDialogOpen = false\n                this._emit('save', data)\n              }\n              catch (error: any) {\n                showSubjectToast(error?.message || '保存失败')\n              }\n            }}>切换</button>\n          </div>\n        </div>\n      </div>\n    `\n  }\n\n  private _renderSearchDropdown() {\n    if (!this['is-edit'] || (!this._searchOpen && !this._searchLoading)) { return '' }\n    return html`\n      <div class=\"search-dropdown\">\n        ${this._searchLoading\n          ? html`<div class=\"search-empty\">搜索中...</div>`\n          : this._searchResults.length\n            ? this._searchResults.map(item => html`\n              <div class=\"search-item\" @click=${() => this._selectSearchResult(item)}>${item.value || item.title}</div>\n            `)\n            : html`<div class=\"search-empty\">暂无匹配题目</div>`}\n      </div>\n    `\n  }\n\n  private _renderCategorySection() {\n    if (!this['show-category']) { return '' }\n    return html`\n      <div class=\"flex-items-start section-row\">\n        <div class=\"label\"><span>分类:</span></div>\n        <div style=\"flex:1\">\n          ${this['is-edit']\n            ? html`\n            <select class=\"el-select\" .value=${String(this._categoryId)}\n              @change=${(e: Event) => this._onCategoryChange((e.target as HTMLSelectElement).value)}>\n              <option value=\"\">选择分类</option>\n              ${this['category-list'].map(item => html`\n                <option value=${String(item.categoryId)} ?selected=${String(item.categoryId) === String(this._categoryId)}>${item.title}</option>\n              `)}\n            </select>\n          `\n            : html`<span class=\"value-text\">${resolveSubjectCategoryLabel(this['category-list'], this._categoryId)}</span>`}\n        </div>\n      </div>\n    `\n  }\n\n  private _renderAiSection() {\n    if (!this['show-ai'] || !['single', 'multiple'].includes(this.type)) { return '' }\n    return html`\n      <div class=\"flex-items-start section-row\">\n        <div class=\"label\"><span>AI推荐:</span></div>\n        <div style=\"flex:1\">\n          <span class=\"value-text\">${this['ai-answer'] || '暂无'}</span>\n          ${this['is-edit']\n            ? html`<div style=\"margin-top:8px\"><span class=\"el-link\" @click=${() => this._applyAiAnswer()}>一键勾选</span></div>`\n            : ''}\n        </div>\n      </div>\n    `\n  }\n\n  private _renderResourceSection() {\n    if (!this['show-resource']) { return '' }\n    const images = this._imageResources()\n    const video = this._videoResource()\n    return html`\n      <div class=\"flex-items-start section-row\">\n        <div class=\"label\"><span>资源:</span></div>\n        <div style=\"flex:1\">\n          <div class=\"resource-summary\">\n            图片 ${images.length} 张${video ? '，含视频资源' : ''}\n          </div>\n          <div class=\"resource-actions\">\n            ${images.length ? html`<span class=\"el-link\" @click=${() => this._openImageViewer(0)}>查看图片</span>` : ''}\n            ${video?.url ? html`<span class=\"el-link\" @click=${() => this._openVideoViewer()}>查看视频</span>` : ''}\n            ${!images.length && !video?.url ? html`<span class=\"muted-text\">暂无资源</span>` : ''}\n          </div>\n          ${images.length\n            ? html`\n            <div class=\"resource-thumbs\">\n              ${images.slice(0, 4).map((src, index) => html`\n                <img class=\"resource-thumb\" src=${src} alt=\"resource\" @click=${() => this._openImageViewer(index)} />\n              `)}\n            </div>\n          `\n            : ''}\n        </div>\n      </div>\n    `\n  }\n\n  private _renderImageViewer() {\n    if (!this._imageViewerOpen) { return '' }\n    const images = this._imageResources()\n    const current = images[this._imageViewerIndex]\n    if (!current) { return '' }\n    return html`\n      <div class=\"modal-backdrop\" @click=${() => this._closeImageViewer()}>\n        <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n          <div class=\"modal-header\">\n            <span class=\"modal-title\">图片预览</span>\n            <button class=\"modal-close\" @click=${() => this._closeImageViewer()}>&#x2715;</button>\n          </div>\n          <div class=\"modal-body\">\n            <div class=\"media-stage\"><img src=${current} alt=\"resource-preview\" /></div>\n          </div>\n          <div class=\"modal-footer\">\n            <div class=\"media-footer\">\n              <span class=\"muted-text\">${this._imageViewerIndex + 1} / ${images.length}</span>\n              <div class=\"group\">\n                ${images.length > 1 ? html`<button @click=${() => this._moveImage(-1)}>上一张</button>` : ''}\n                ${images.length > 1 ? html`<button @click=${() => this._moveImage(1)}>下一张</button>` : ''}\n                <button class=\"primary\" @click=${() => this._closeImageViewer()}>关闭</button>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    `\n  }\n\n  private _renderVideoViewer() {\n    const video = this._videoResource()\n    if (!this._videoViewerOpen || !video?.url) { return '' }\n    return html`\n      <div class=\"modal-backdrop\" @click=${() => this._closeVideoViewer()}>\n        <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n          <div class=\"modal-header\">\n            <span class=\"modal-title\">视频预览</span>\n            <button class=\"modal-close\" @click=${() => this._closeVideoViewer()}>&#x2715;</button>\n          </div>\n          <div class=\"modal-body\">\n            <div class=\"media-stage\">\n              <video src=${video.url} controls playsinline></video>\n            </div>\n          </div>\n          <div class=\"modal-footer\">\n            <button class=\"primary\" @click=${() => this._closeVideoViewer()}>关闭</button>\n          </div>\n        </div>\n      </div>\n    `\n  }\n\n  private async _save(e?: Event) {\n    e?.stopImmediatePropagation()\n    const errors = this.validate()\n    const convertWarning = errors.find(error => error.code === 'SINGLE_MULTI_CORRECT')\n    const blockingErrors = errors.filter(error => error.code !== 'SINGLE_MULTI_CORRECT')\n    if (blockingErrors.length) {\n      showSubjectToast(blockingErrors[0].message)\n      return\n    }\n    if (convertWarning) {\n      this._changeTypeDialogOpen = true\n      return\n    }\n    if (!this._hasShownCorrectHint && this._shouldShowCorrectHint()) {\n      this._correctHintDialogOpen = true\n      return\n    }\n    await this._finalizeSave()\n  }\n\n  private _renderPreview() {\n    const typeSuffix = this.type === 'single'\n      ? '（单选题）'\n      : `（${this._titlePlaceholder}${this._leastAnswerCountSuffix(this._normalizeLeastAnswerCount(this['least-answer-count']))}）`\n    const answers = this['answer-list'] as Answer[]\n    const previewTitle = buildSubjectPreviewTitle(this['subject-prefix'], this['order-index'], (this as any).title || '')\n    return html`\n      <div class=\"preview\">\n        <div class=\"preview-header\">\n          <div class=\"preview-title-row\">\n            <span class=\"title\">${previewTitle}</span>\n            <span class=\"preview-type\">${typeSuffix.replace(/[（）]/g, '')}</span>\n          </div>\n          ${this['show-rich-text'] && this['rich-text-content'] ? html`<div class=\"rich-text\" .innerHTML=${this['rich-text-content']}></div>` : ''}\n        </div>\n        <div class=\"preview-answer\">\n          ${answers.map((a, i) => html`\n            <div class=\"radio\">\n              <input type=\"${this.type === 'sort' ? 'checkbox' : 'radio'}\" .checked=${!!a.isCorrect} disabled />\n              <span class=\"order\">${this._label(i)}.</span>\n              <div class=\"answer-main\">\n                <span class=\"answer-text\">${a.title}</span>\n                ${this.type !== 'sort' && a.isCorrect ? html`<span class=\"correct\">推荐 / 正确选项</span>` : ''}\n              </div>\n              ${this.type !== 'sort' && (\n                this['exam-answer-relation-type'] === 1\n                || this['exam-answer-relation-type'] === 2\n              )\n                ? html`\n                  <div class=\"answer-meta\">\n                    ${this['exam-answer-relation-type'] === 1\n                      ? html`<span class=\"result-info\">${a.resultItem ? '已设置结果项' : '未设置结果项'}</span>`\n                      : ''}\n                    ${this['exam-answer-relation-type'] === 2\n                      ? html`<span class=\"result-info\">${Array.isArray(a.answerRelations) && a.answerRelations.length ? `关联了${this._relationLength(a.answerRelations)}项` : '未设置关联'}</span>`\n                      : ''}\n                  </div>\n                `\n                : ''}\n            </div>\n          `)}\n        </div>\n        ${this['show-category'] && this._categoryId\n          ? html`<div class=\"section-row\"><span class=\"value-text\">分类：${resolveSubjectCategoryLabel(this['category-list'], this._categoryId)}</span></div>`\n          : ''}\n        ${this['show-resource'] ? this._renderResourceSection() : ''}\n      </div>\n    `\n  }\n\n  private _renderSorting() {\n    const title = trimText(this['is-edit'] ? this._title : (this as any).title || '') || '未命名题目'\n    const orderText = buildSubjectSortingTitle(this['subject-prefix'], this['order-index'], title)\n    return renderSortingCard(orderText, SubjectTypeLabel[this.type] || this.type)\n  }\n\n  private _renderEdit() {\n    return html`\n      <div class=\"edit-form\">\n        <div class=\"edit-row\">\n          <div class=\"label\"><span>题目:</span></div>\n          <div class=\"row-body\">\n            <div class=\"el-input search-wrap\">\n              <textarea rows=\"2\" .value=${this._title}\n                maxlength=${this.TITLE_MAX}\n                @input=${(e: Event) => this._onTitleInput(e)}\n                placeholder=\"【${this._titlePlaceholder}】请输入问题\"></textarea>\n              <span class=\"char-counter\">${this._title.length}/${this.TITLE_MAX}</span>\n              ${this._renderSearchDropdown()}\n            </div>\n          </div>\n        </div>\n\n        ${['multiple', 'sort'].includes(this.type)\n          ? html`\n          <div class=\"edit-row section-row\">\n            <div class=\"label\"><span>设置:</span></div>\n            <div class=\"row-body\">\n              <select class=\"el-select\" .value=${this._leastAnswerCount === null ? '' : String(this._leastAnswerCount)} ?disabled=${this.lockAnswerKey}\n                @change=${(e: Event) => {\n                  const value = (e.target as HTMLSelectElement).value\n                  this._leastAnswerCount = this._normalizeLeastAnswerCount(value)\n                }}>\n                <option value=\"\">至少选择几项</option>\n                ${Array.from({ length: Math.max(0, this._answers.length - 1) }, (_, i) => i + 2).map(n => html`\n                  <option value=${n} ?selected=${this._leastAnswerCount === n}>至少选择${n}项</option>\n                `)}\n              </select>\n            </div>\n          </div>\n        `\n          : ''}\n\n        <div class=\"edit-row section-row edit-row--compact\">\n          <div class=\"label\"><span>${this.type === 'sort' ? '排序项:' : '选项:'}</span></div>\n          <div class=\"row-body\">\n            <div class=\"answer-list\">\n              ${this._answers.map((a, i) => html`\n                <div class=\"answer-item\">\n                  <span class=\"label\">${this._label(i)}.</span>\n                  <div class=\"input\">\n                    <input type=\"text\" .value=${a.title}\n                      maxlength=${this.ANSWER_MAX}\n                      @input=${(e: Event) => this._onAnswerInput(e, i)}\n                      placeholder=\"选项${this._label(i)}\" />\n                    <span class=\"char-counter\">${a.title.length}/${this.ANSWER_MAX}</span>\n                  </div>\n\n                  ${this.type === 'sort' && this._getSortOrder(i) !== null\n                    ? html`<span class=\"sort-badge\">第${this._getSortOrder(i)}位</span>`\n                    : ''}\n\n                  ${['single', 'multiple'].includes(this.type)\n                    ? html`\n                    <label class=\"correct ${a.isCorrect ? 'is-correct' : ''}\">\n                      <input type=\"checkbox\" .checked=${a.isCorrect} ?disabled=${this.lockAnswerKey}\n                        @change=${(e: Event) => this._setCorrect(a, (e.target as HTMLInputElement).checked)} />\n                      <span class=\"correct-text\">推荐/正确选项</span>\n                    </label>\n                  `\n                    : ''}\n\n                  <span class=\"icon\"\n                    @click=${() => this._addAnswer(i)}>\n                    ${iconPlus}\n                  </span>\n                  <span class=\"icon ${this._answers.length < 3 ? 'disabled' : ''}\"\n                    @click=${() => this._deleteAnswer(i)}>\n                    ${iconRemove}\n                  </span>\n\n                  ${this['exam-answer-relation-type'] === 1 && this.type !== 'sort'\n                    ? html`\n                    <slot name=${this._resultSlotName(i)}>\n                      <button class=\"el-link\" @click=${() => this._emitEditResultItem(a, i)}>\n                        ${a.resultItem ? '编辑结果' : '添加结果'}\n                      </button>\n                    </slot>\n                  `\n                    : ''}\n\n                  ${this['exam-answer-relation-type'] === 2 && this.type !== 'sort'\n                    ? html`\n                    <button class=\"el-link\" @click=${() => this._setRelation(a, i)}>\n                      ${Array.isArray(a.answerRelations) && a.answerRelations.length ? `关联了${this._relationLength(a.answerRelations)}项` : '关联检查'}\n                    </button>\n                  `\n                    : ''}\n\n                </div>\n              `)}\n            </div>\n          </div>\n        </div>\n\n        ${this.type === 'sort'\n          ? html`\n          <div class=\"edit-row section-row\">\n            <div class=\"label\"><span>排序答案:</span></div>\n            <div class=\"row-body\">\n              <div class=\"multi-select-wrapper\">\n                <div class=\"multi-select ${this._sortDropdownOpen ? 'focused' : ''} ${this.lockAnswerKey ? 'disabled' : ''}\"\n                  @click=${() => { if (!this.lockAnswerKey) { this._sortDropdownOpen = !this._sortDropdownOpen; this.requestUpdate() } }}>\n                  ${this._orderList.length > 0\n                      ? this._orderList.map(l => html`\n                      <span class=\"tag\">\n                        ${l}\n                        <span class=\"tag-close\" @click=${(e: Event) => {\n                          if (this.lockAnswerKey) { return }\n                          e.stopPropagation()\n                          this._removeSortItem(l)\n                        }}>&#x2715;</span>\n                      </span>\n                    `)\n                      : html`<span class=\"placeholder\">请按顺序选择排序答案</span>`\n                  }\n                  <span class=\"arrow\">${iconArrow}</span>\n                </div>\n                ${this._sortDropdownOpen\n                  ? html`\n                  <div class=\"multi-select-dropdown\">\n                    ${this._answers.map((_, i) => html`\n                      <div class=\"multi-select-option ${this._orderList.includes(this._label(i)) ? 'selected' : ''}\"\n                        @click=${() => {\n                          if (this.lockAnswerKey) { return }\n                          this._toggleSortItem(this._label(i))\n                          this.requestUpdate()\n                        }}>\n                        ${this._label(i)}\n                      </div>\n                    `)}\n                  </div>\n                `\n                  : ''}\n              </div>\n            </div>\n          </div>\n        `\n          : ''}\n\n        <slot name=\"business-tag\"></slot>\n\n        ${this._renderCategorySection()}\n\n        ${this._renderAiSection()}\n\n        ${this._renderResourceSection()}\n\n        ${this['show-rich-text'] && this._showRichText\n          ? html`\n          <div class=\"edit-row section-row\">\n            <div class=\"label\"><span>副文本:</span></div>\n            <div class=\"row-body\">\n              <slot name=\"sub-text\">\n                <qxs-blocksuite-editor\n                  .content=${this._richText}\n                  .toolbar=${SUB_TEXT_EDITOR_TOOLBAR}\n                  .upload-image=${this['upload-image']}\n                  ?is-edit=${true}\n                  @input=${(e: CustomEvent) => { this._richText = (e.target as any).getContent() }}\n                ></qxs-blocksuite-editor>\n              </slot>\n              ${!this['show-action']\n                ? html`<div class=\"flex-justify-end\" style=\"margin-top:8px\"><span class=\"el-link danger\" @click=${() => { this._showRichText = false; this._richText = '' }}>删除富文本</span></div>`\n                : ''}\n            </div>\n          </div>\n        `\n          : ''}\n\n        ${this['show-analysis']\n          ? html`\n          <div class=\"edit-row section-row\">\n            <div class=\"label\"><span>解析:</span></div>\n            <div class=\"row-body\">\n              <textarea rows=\"2\" .value=${this._analysis}\n                @input=${(e: Event) => { this._analysis = (e.target as HTMLTextAreaElement).value }}\n                placeholder=\"请输入题目解析\"></textarea>\n            </div>\n          </div>\n        `\n          : ''}\n      </div>\n    `\n  }\n\n  render() {\n    if (this.sorting) {\n      return this._renderSorting()\n    }\n\n    const content = this['is-edit']\n      ? html`<div slot=\"edit\">${this._renderEdit()}</div>`\n      : html`<div slot=\"preview\">${this._renderPreview()}</div>`\n\n    return html`\n      <qxs-subject-layout .show-edit=${this['is-edit']}>\n        ${content}\n        ${this['show-action']\n          ? html`\n          <qxs-subject-action\n            .is-edit=${this['is-edit']}\n            .is-set=${this['is-set']}\n            .show-add=${this['show-add']}\n            .show-rich-text=${this['show-rich-text'] && this._showRichText}\n            .hide-add-rich-text=${!this['show-rich-text'] || this['hide-add-rich-text']}\n            .show-delete-action=${this['show-delete-action']}\n            .show-save-action=${this['show-save-action']}\n            .show-jump=${this['show-jump']}\n            @delete=${() => this._emit('delete')}\n            @save=${this._save}\n            @edit=${() => this._emit('edit')}\n            @move=${(e: CustomEvent) => this._emit('move', e.detail)}\n            @jump=${() => this._emit('jump', {\n              customId: this['custom-id'] || '',\n              examId: this['exam-id'] || 0,\n              answerType: this.type,\n            })}\n            @add=${(e: CustomEvent) => this._emit('add', e.detail)}\n            @on-show-rich-text=${() => {\n              this._showRichText = !this._showRichText\n              if (!this._showRichText) {\n                this._richText = ''\n              }\n            }}\n          ></qxs-subject-action>\n        `\n          : ''}\n        <slot name=\"action\"></slot>\n      </qxs-subject-layout>\n      ${this._renderCorrectHintDialog()}\n      ${this._renderChangeTypeDialog()}\n      ${this._renderImageViewer()}\n      ${this._renderVideoViewer()}\n    `\n  }\n}\n\nexport function register() {}\n"],"names":["SubjectError","Error","constructor","message","code","arguments","length","undefined","field","row","super","this","name","from","options","iconPlus","html","iconRemove","iconArrow","normalizeTitle","text","replace","toLowerCase","trimText","value","String","trim","trimCommaSeparatedText","split","map","item","filter","Boolean","join","QxsSubjectSingle","LitElement","lockAnswerKey","sorting","type","analysis","async","Promise","resolve","reject","reader","FileReader","onload","e","target","result","onerror","readAsDataURL","file","_answers","title","isCorrect","_title","_analysis","_richText","_showRichText","_leastAnswerCount","_answerCheckType","_isKey","_orderList","_selectedTagList","_categoryId","_searchResults","_searchOpen","_searchLoading","_sortDropdownOpen","_imageViewerOpen","_imageViewerIndex","_videoViewerOpen","_correctHintDialogOpen","_hasShownCorrectHint","_changeTypeDialogOpen","_searchTimer","_searchToken","TITLE_MAX","ANSWER_MAX","_handleDocumentClick","path","composedPath","wrapper","shadowRoot","querySelector","searchWrap","includes","requestUpdate","v","arr","Array","isArray","a","_normalizeAnswerItem","connectedCallback","document","addEventListener","_syncExternalProps","disconnectedCallback","removeEventListener","window","clearTimeout","willUpdate","changed","has","_syncProps","_syncExamExpand","_supportsLeastAnswerCount","answerType","_normalizeLeastAnswerCount","count","Number","isFinite","_leastAnswerCountSuffix","answer","next","answerId","examAnswerId","ids","answers","id","index","findIndex","answerIndex","orderIndex","_label","_emit","detail","emitSubjectEvent","_searchAnswerType","_queueSearch","query","keyword","setTimeout","_runSearch","currentToken","params","URLSearchParams","searchKey","response","fetch","toString","ok","status","payload","json","data","error","showSubjectToast","_selectSearchResult","selectedTitle","emitSubjectModelValue","examId","questionId","customId","_applyAiAnswer","aiTitles","line","matched","selected","shouldSelect","_onCategoryChange","_setRelation","customAnswerId","uid","current","_relationLength","reduce","relationAnswers","_emitEditResultItem","resultItem","_resultSlotName","_imageResources","getSubjectImageResources","_videoResource","getSubjectVideoResource","_openImageViewer","_closeImageViewer","_moveImage","step","images","_openVideoViewer","url","_closeVideoViewer","i","fromCharCode","_titlePlaceholder","_setCorrect","val","_onTitleInput","el","slice","_onAnswerInput","idx","_addAnswer","splice","_deleteAnswer","_","_toggleSortItem","letter","indexOf","l","_removeSortItem","_getSortOrder","pos","_sortAnswerValue","charCodeAt","_rowMeta","_collectSnapshot","orderList","expand","leastAnswerCount","selectedTagList","examExpand","showRichText","richText","_validateSnapshot","snapshot","errors","push","isSetCorrectAnswer","correctAnswerCount","forEach","Set","size","_serialize","examTypeEnum","relationType","answerRelations","examRichTextContent","examAnswerRelationType","_shouldShowCorrectHint","some","_finalizeSave","toJSON","err","validate","setResultItem","setAnswerRelation","_renderCorrectHintDialog","stopPropagation","_renderChangeTypeDialog","_renderSearchDropdown","_renderCategorySection","categoryId","resolveSubjectCategoryLabel","_renderAiSection","_renderResourceSection","video","src","_renderImageViewer","_renderVideoViewer","_save","stopImmediatePropagation","convertWarning","find","blockingErrors","_renderPreview","typeSuffix","previewTitle","buildSubjectPreviewTitle","_renderSorting","orderText","buildSubjectSortingTitle","renderSortingCard","SubjectTypeLabel","_renderEdit","Math","max","n","checked","SUB_TEXT_EDITOR_TOOLBAR","getContent","render","content","styles","sortingCardStyles","subjectHostStyles","subjectControlResetStyles","subjectPreviewBaseStyles","subjectFormBaseStyles","subjectTextareaStyles","css","__decorateClass","property","attribute","prototype","reflect","Object","state","safeCustomElement"],"mappings":"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"}